Skip to content

Commit 1b27c51

Browse files
authored
Merge pull request #79 from oslabs-beta/master
SeeQR 8.0
2 parents 70f5ac2 + c6aacc7 commit 1b27c51

39 files changed

+44780
-11700
lines changed

Diff for: README.md

+46-58
Large diffs are not rendered by default.

Diff for: assets/readmeImages/config_demo.gif

2.48 MB
Loading

Diff for: assets/readmeImages/config_demo2.gif

1.02 MB
Loading

Diff for: assets/readmeImages/gifs/create_db.gif

-2.36 MB
Binary file not shown.

Diff for: assets/readmeImages/gifs/create_db3.gif

1.66 MB
Loading

Diff for: backend/BE_types.ts

+25
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface ColumnObj {
1717
export interface dbDetails {
1818
db_name: string;
1919
db_size: string;
20+
db_type: DBType;
2021
}
2122
export interface TableDetails {
2223
table_catalog: string;
@@ -26,6 +27,7 @@ export interface TableDetails {
2627
columns?: ColumnObj[];
2728
}
2829
export interface DBList {
30+
databaseConnected: boolean[];
2931
databaseList: dbDetails[];
3032
tableList: TableDetails[];
3133
}
@@ -36,3 +38,26 @@ export type BackendObjType = {
3638
database: string;
3739
updates: UpdatesObjType;
3840
};
41+
42+
export enum DBType {
43+
Postgres = 'pg',
44+
MySQL = 'mysql'
45+
}
46+
47+
export enum LogType {
48+
SUCCESS = 'SUCCESS',
49+
ERROR = 'ERROR',
50+
WARNING = 'WARNING',
51+
NORMAL = 'NORMAL',
52+
SEND = 'SEND',
53+
RECEIVE = 'RECEIVE'
54+
}
55+
56+
export interface DocConfigFile {
57+
mysql_user: string,
58+
mysql_pass: string,
59+
mysql_port: number | string,
60+
pg_user: string,
61+
pg_pass: string,
62+
pg_port: number | string
63+
}

Diff for: backend/DummyD/dummyDataMain.ts

+14-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import faker from 'faker';
2-
import { ColumnObj, DummyRecords } from '../BE_types';
2+
import { ColumnObj, DummyRecords, LogType } from '../BE_types';
3+
import logger from '../Logging/masterlog';
34

45
const db = require('../models');
56

@@ -70,11 +71,11 @@ type GenerateDummyData = (tableInfo: ColumnObj[], numRows: number) => Promise<Du
7071

7172
const generateDummyData: GenerateDummyData = async (tableInfo: ColumnObj[], numRows: number) => {
7273
// assuming primary key is serial, get all the column names except for the column with the primary key
73-
const columnNames = tableInfo.reduce((acc: string[], curr: ColumnObj) => {
74-
// if (curr.constraint_type !== 'PRIMARY KEY')
75-
acc.push(curr.column_name);
76-
return acc;
77-
}, []);
74+
const columnNames: Array<string> = [];
75+
for(let i = 0; i < tableInfo.length; i++) {
76+
columnNames.push(tableInfo[i].column_name);
77+
}
78+
7879
const dummyRecords: DummyRecords = [columnNames];
7980

8081
// generate dummy records for each row
@@ -104,9 +105,13 @@ const generateDummyData: GenerateDummyData = async (tableInfo: ColumnObj[], numR
104105
if (typeof chosenPrimaryValue === 'string') row.push(`'${chosenPrimaryValue}'`);
105106
else row.push(chosenPrimaryValue);
106107
}
107-
else return new Error('There was an error while retrieving a valid foreign key.');
108-
} catch(err) {
109-
return err;
108+
else{
109+
logger('There was an error while retrieving a valid foreign key while generating dummy data.', LogType.ERROR);
110+
throw new Error('There was an error while retrieving a valid foreign key.');
111+
}
112+
}
113+
catch(err) {
114+
throw err;
110115
}
111116
}
112117
}

Diff for: backend/Logging/masterlog.ts

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/* eslint-disable func-names */
2+
/* eslint-disable @typescript-eslint/no-unused-vars */
3+
import { LogType } from '../BE_types';
4+
5+
interface Logger {
6+
log: (message: string, logType?: LogType, opt1?: any, opt2?: any) => void;
7+
}
8+
9+
// Helper functions!
10+
const saveLogMessage = (message) => {
11+
const time = new Date().toLocaleDateString('en-US', { timeZone: 'UTC' });
12+
};
13+
14+
// Export
15+
const logger = function (
16+
message: string,
17+
logType: LogType = LogType.NORMAL,
18+
opt1?,
19+
opt2?
20+
) {
21+
// Code for the log color
22+
let colorCode = 0;
23+
24+
// Prefix for the message
25+
let logString: any = logType;
26+
27+
switch (logType) {
28+
case LogType.ERROR: // RED
29+
colorCode = 31;
30+
break;
31+
32+
case LogType.SUCCESS: // GREEN
33+
colorCode = 32;
34+
break;
35+
36+
case LogType.WARNING: // YELLOW
37+
colorCode = 33;
38+
break;
39+
40+
case LogType.RECEIVE: // BLUE
41+
colorCode = 34;
42+
logString = 'SERVER_IPC_RECEIVE';
43+
break;
44+
45+
case LogType.SEND: // MAGENTA
46+
colorCode = 35;
47+
logString = 'SERVER_IPC_SEND';
48+
break;
49+
50+
case LogType.NORMAL: // WHITE (And change logType string)
51+
colorCode = 0;
52+
logString = 'LOG';
53+
break;
54+
55+
default:
56+
colorCode = 0;
57+
break;
58+
}
59+
60+
let moreText = '';
61+
62+
if (opt1) moreText += JSON.stringify(opt1);
63+
if (opt2) moreText += JSON.stringify(opt2);
64+
65+
console.log(
66+
`\u001b[1;${colorCode}m ${`[${logType}] ${message + moreText}`}` +
67+
`\u001b[1;0m`
68+
);
69+
saveLogMessage(`[${logType}] ${message}`);
70+
};
71+
72+
export default logger;

Diff for: backend/_documentsConfig.ts

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/* eslint-disable no-throw-literal */
2+
/* eslint-disable no-shadow */
3+
/* eslint-disable object-shorthand */
4+
// import path from 'path';
5+
import fs from 'fs';
6+
import os from 'os';
7+
import { DBType, DocConfigFile, LogType } from './BE_types';
8+
import logger from './Logging/masterlog';
9+
10+
const home = `${os.homedir()}/Documents/SeeQR`;
11+
const configFile = `config.json`;
12+
const configPath = `${home}/${configFile}`;
13+
14+
const writeConfigDefault = function (): DocConfigFile {
15+
logger('Could not find config file. Creating default', LogType.WARNING);
16+
17+
const defaultFile: DocConfigFile = {
18+
mysql_user: 'mysql',
19+
mysql_pass: 'mysql',
20+
mysql_port: 3306,
21+
pg_user: 'postgres',
22+
pg_pass: 'postgres',
23+
pg_port: 5432
24+
};
25+
26+
fs.writeFileSync(configPath, JSON.stringify(defaultFile));
27+
28+
return defaultFile;
29+
};
30+
31+
const readConfigFile = function (): DocConfigFile {
32+
if (fs.existsSync(configPath)) {
33+
try {
34+
const text = fs.readFileSync(configPath, 'utf-8');
35+
return JSON.parse(text) as DocConfigFile;
36+
} catch (err: any) {
37+
throw `Error parsing config file: ${err.message}`;
38+
}
39+
} else {
40+
return writeConfigDefault();
41+
}
42+
};
43+
44+
interface DocConfig {
45+
getConfigFolder: () => string;
46+
getCredentials: (dbType: DBType) => { user: string; pass: string, port: number | string };
47+
getFullConfig: () => Object;
48+
saveConfig: (config: Object) => void;
49+
}
50+
51+
const docConfig: DocConfig = {
52+
getConfigFolder: function () {
53+
if (fs.existsSync(home)) {
54+
logger(`Found documents directory: ${home}`, LogType.SUCCESS);
55+
} else {
56+
logger(
57+
`Could not find documents directory. Creating at: ${home}`,
58+
LogType.WARNING
59+
);
60+
fs.mkdirSync(home);
61+
}
62+
return home;
63+
},
64+
65+
getCredentials: function (dbType: DBType) {
66+
this.getConfigFolder();
67+
68+
let configFile: DocConfigFile;
69+
try {
70+
configFile = readConfigFile();
71+
} catch (err: any) {
72+
logger(err.message, LogType.WARNING);
73+
return { user: 'none', pass: 'none', port: 1 };
74+
}
75+
76+
if (dbType === DBType.Postgres) {
77+
return { user: configFile.pg_user, pass: configFile.pg_pass, port: configFile.pg_port };
78+
}
79+
if (dbType === DBType.MySQL) {
80+
return { user: configFile.mysql_user, pass: configFile.mysql_pass, port: configFile.mysql_port };
81+
}
82+
logger('Could not get credentials of DBType: ', LogType.ERROR, dbType);
83+
return { user: 'none', pass: 'none', port: 1 };
84+
},
85+
86+
getFullConfig: function() {
87+
this.getConfigFolder();
88+
let configFile: DocConfigFile;
89+
try {
90+
configFile = readConfigFile();
91+
return configFile;
92+
} catch (err: any) {
93+
logger(err.message, LogType.WARNING);
94+
return {
95+
mysql_user: 'Failed to retrieve data.', mysql_pass: 'Failed to retrieve data.', mysql_port: 'Failed to retrieve data.',
96+
pg_user: 'Failed to retrieve data.', pg_pass: 'Failed to retrieve data.', pg_port: 'Failed to retrieve data.'
97+
};
98+
}
99+
},
100+
101+
saveConfig: function(config: Object) {
102+
try {
103+
fs.writeFileSync(configPath, JSON.stringify(config));
104+
logger('Saved new config: ', LogType.NORMAL, config);
105+
} catch(err: any) {
106+
logger(err.message, LogType.WARNING);
107+
}
108+
109+
}
110+
};
111+
112+
module.exports = docConfig;

0 commit comments

Comments
 (0)