Skip to content

Commit 326728d

Browse files
authored
Merge pull request #56 from oslabs-beta/stephen-crud
Stephen crud
2 parents 4a37282 + 144fbdf commit 326728d

File tree

8 files changed

+341
-302
lines changed

8 files changed

+341
-302
lines changed

server/controllers/helperFunctions/universal.helpers.ts

Lines changed: 111 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,42 @@
11
import { RequestHandler, Request, Response, NextFunction } from 'express';
22
import { DataSource } from 'typeorm';
33

4-
// const tableNameFormat = (req: Request, dbDataSource: DataSource, tableNameFormat: string) => {
5-
// const { db_type, username } = req.session
6-
// let tableName = '';
7-
// switch (db_type) {
8-
// case 'oracle':
9-
// tableName = `"${(username as string).toUpperCase()}"."${deleteTableData.tableName}"`;
10-
// break;
11-
// case 'mssql':
12-
// const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
13-
// tableName = `${schemaName[0].SchemaName}.${deleteTableData.tableName}`;
14-
// break;
15-
// default:
16-
// tableName = deleteTableData.tableName;
17-
// break;
18-
// };
19-
// return tableName
20-
// }
4+
5+
6+
const tableNameFormat = async (req: Request, dbDataSource: DataSource) => {
7+
const { db_type, username } = req.session;
8+
const { tableName } = req.body;
9+
10+
// let newTableName = '';
11+
// if (tableName.substring(0, 7) === '.public') {
12+
// newTableName = tableName.slice(7)
13+
// } else {
14+
// newTableName = tableName
15+
// };
16+
17+
let tableNameFormat = '';
18+
switch (db_type) {
19+
case 'oracle':
20+
tableNameFormat = `"${(username as string).toUpperCase()}"."${tableName}"`;
21+
break;
22+
case 'mssql':
23+
const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
24+
tableNameFormat = `${schemaName[0].SchemaName}.${tableName}`;
25+
break;
26+
default:
27+
tableNameFormat = tableName;
28+
break;
29+
};
30+
return tableNameFormat;
31+
};
32+
33+
interface NewColumn {
34+
name: string,
35+
type: string,
36+
isNullable: boolean,
37+
isPrimary: boolean,
38+
defaultValue: any,
39+
};
2140

2241
//---------------CONNECT TO THE DATABASE-----------------------------------------------------------------------------------------
2342

@@ -102,11 +121,12 @@ export const dbConnect = async (req: Request) => {
102121

103122
export const addNewDbRow: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
104123
const dbDataSource = await dbConnect(req);
105-
const { db_type, username } = req.session;
106-
const { newRow, tableName } = req.body;
124+
const { db_type } = req.session;
125+
const { newRow } = req.body;
107126

108127
try{
109-
const tableNameAdd: string = db_type === 'oracle' ? `"${(username as string).toUpperCase()}"."${tableName}"` : tableName;
128+
// const tableNameAdd: string = db_type === 'oracle' ? `"${(username as string).toUpperCase()}"."${tableName}"` : tableName;
129+
const tableNameAdd = await Promise.resolve(tableNameFormat(req, dbDataSource));
110130
const newSqlRow: {[key: string]: string} = newRow as {};
111131

112132
const keys: string = db_type === 'oracle' ? Object.keys(newSqlRow).map(key => `"${key}"`).join(", ") : Object.keys(newSqlRow).join(", ");
@@ -152,6 +172,8 @@ export const updateRow: RequestHandler = async (req: Request, _res: Response, ne
152172
break;
153173
};
154174

175+
//const tableNameUpdate = await Promise.resolve(tableNameFormat(req, dbDataSource));
176+
155177
const updateKeys = Object.keys(newRow);
156178
const updateValues = Object.values(newRow);
157179
let oracleKeyValueString = '';
@@ -186,23 +208,25 @@ export const updateRow: RequestHandler = async (req: Request, _res: Response, ne
186208

187209
export const deleteRow: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
188210
const dbDataSource = await dbConnect(req);
189-
const { db_type, username } = req.session;
190-
const { tableName, primaryKey, value, deletedRow } = req.body
211+
const { db_type } = req.session;
212+
const { primaryKey, value, deletedRow } = req.body
191213

192214
try{
193-
let tableNameDelete = '';
194-
switch (db_type) {
195-
case 'oracle':
196-
tableNameDelete = `"${(username as string).toUpperCase()}"."${tableName}"`;
197-
break;
198-
case 'mssql':
199-
const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
200-
tableNameDelete = `${schemaName[0].SchemaName}.${tableName}`;
201-
break;
202-
default:
203-
tableNameDelete = tableName;
204-
break;
205-
};
215+
// let tableNameDelete = '';
216+
// switch (db_type) {
217+
// case 'oracle':
218+
// tableNameDelete = `"${(username as string).toUpperCase()}"."${tableName}"`;
219+
// break;
220+
// case 'mssql':
221+
// const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
222+
// tableNameDelete = `${schemaName[0].SchemaName}.${tableName}`;
223+
// break;
224+
// default:
225+
// tableNameDelete = tableName;
226+
// break;
227+
// };
228+
229+
const tableNameDelete = await Promise.resolve(tableNameFormat(req, dbDataSource));
206230

207231
if (primaryKey){
208232
// Deleting a row that has a PK
@@ -246,34 +270,52 @@ export const deleteRow: RequestHandler = async (req: Request, _res: Response, ne
246270

247271
export const addNewDbColumn: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
248272
const dbDataSource = await dbConnect(req);
249-
const { db_type, username } = req.session;
250-
const { defaultValue, isNullable, isPrimary, name, type, tableName } = req.body;
273+
const { db_type } = req.session;
274+
const { columnData } = req.body;
275+
console.log('req.body: ', req.body)
251276

252277
try{
253-
let tableNameAddColumn = '';
254-
switch (db_type) {
255-
case 'oracle':
256-
tableNameAddColumn = `"${(username as string).toUpperCase()}"."${tableName}"`;
257-
break;
258-
case 'mssql':
259-
const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
260-
tableNameAddColumn = `${schemaName[0].SchemaName}.${tableName}`;
261-
break;
262-
default:
263-
tableNameAddColumn = tableName;
264-
break;
265-
};
278+
const tableNameAddColumn = await Promise.resolve(tableNameFormat(req, dbDataSource));
279+
console.log('tableNameAddColumn: ', tableNameAddColumn)
280+
281+
let keyValueString: string = '';
282+
let repeatingKeyValueString: string = '';
283+
let newColumnString: string = ''
284+
285+
columnData.forEach((el: NewColumn) => {
286+
if (db_type === 'mssql' || db_type === 'oracle') {
287+
repeatingKeyValueString += `ALTER TABLE ${tableNameAddColumn} ADD "${el.name}" ${el.type === 'AUTO_INCREMENT' ? 'INT' : el.type}${el.isPrimary ? ' PRIMARY KEY' : ''}${el.isNullable ? '' : ' NOT NULL'}${el.defaultValue ? ` DEFAULT ${el.defaultValue}` : ''}${el.type === 'AUTO_INCREMENT' ? ' AUTO_INCREMENT' : ''}; `
288+
} else {
289+
keyValueString += `ADD${db_type === 'postgres' ? ' COLUMN' : '' } ${ db_type === 'mysql' ? `${el.name}` : `"${el.name}"`} ${el.type === 'AUTO_INCREMENT' ? 'INT' : el.type}${el.isPrimary ? ' PRIMARY KEY' : ''}${el.isNullable ? '' : ' NOT NULL'}${el.defaultValue ? ` DEFAULT ${el.defaultValue}` : ''}${el.type === 'AUTO_INCREMENT' ? ' AUTO_INCREMENT' : ''}, `
290+
};
291+
});
266292

267-
const addedNewColumn: Promise<unknown> = await dbDataSource.query(`
268-
ALTER TABLE ${tableNameAddColumn}
269-
ADD${db_type === 'postgres' ? ' COLUMN' : '' } "${name}" ${type === 'AUTO_INCREMENT' ? 'INT' : type}${isPrimary ? ' PRIMARY KEY' : ''}${isNullable ? '' : 'NOT NULL'}${defaultValue ? ` DEFAULT ${defaultValue}` : ''}${type === ' AUTO_INCREMENT' ? 'AUTO_INCREMENT' : ''}
270-
`);
293+
if (db_type === 'mssql' || db_type === 'oracle') {
294+
newColumnString = repeatingKeyValueString.slice(0, -1);
295+
} else {
296+
newColumnString = keyValueString.slice(0, -2);
297+
}
271298

272-
dbDataSource.destroy();
273-
console.log('Database has been disconnected');
274-
console.log('addedForeignKey in helper: ', addedNewColumn);
275-
return addedNewColumn;
299+
if (db_type === 'mssql') {
300+
const addedNewColumn: Promise<unknown> = await dbDataSource.query(`
301+
${repeatingKeyValueString}
302+
`);
303+
304+
await dbDataSource.destroy();
305+
console.log('Database has been disconnected');
306+
console.log('addedForeignKey in helper: ', addedNewColumn);
307+
return addedNewColumn;
308+
} else {
309+
const addedNewColumn: Promise<unknown> = await dbDataSource.query(`
310+
ALTER TABLE ${tableNameAddColumn}
311+
${newColumnString}
312+
`);
276313

314+
await dbDataSource.destroy();
315+
console.log('Database has been disconnected');
316+
console.log('addedForeignKey in helper: ', addedNewColumn);
317+
return addedNewColumn;
318+
}
277319
} catch (err: unknown) {
278320
console.log('Error occurred in the addedForeignKey middleware: ', err);
279321
dbDataSource.destroy();
@@ -297,6 +339,7 @@ export const updateDbColumn: RequestHandler = async (req: Request, _res: Respons
297339
const tableName: string = db_type === 'oracle' ? `"${(username as string).toUpperCase()}"."${slicedTableName}"` :
298340
db_type === 'mssql' ? `${schemaName[0].SchemaName}.${slicedTableName}` : updateColumnData.tableName;
299341

342+
300343
const updatedColumn: Promise<unknown> = await dbDataSource.query(`
301344
ALTER TABLE ${tableName}
302345
${db_type === 'postgres' || db_type === 'microsoft' ? 'ALTER COLUMN' : 'MODIFY' } "${updateColumnData.columnName}" ${updateColumnData.dataType} ${db_type === 'postgres' ? updateColumnData.constraintName : null} ${updateColumnData.constraintExpression}
@@ -319,23 +362,11 @@ export const updateDbColumn: RequestHandler = async (req: Request, _res: Respons
319362

320363
export const deleteColumn: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
321364
const dbDataSource = await dbConnect(req)
322-
const { db_type, username } = req.session
323-
const { tableName, columnName } = req.body
365+
const { db_type } = req.session
366+
const { columnName } = req.body
324367

325368
try{
326-
let columnTableNameDelete = '';
327-
switch (db_type) {
328-
case 'oracle':
329-
columnTableNameDelete = `"${(username as string).toUpperCase()}"."${tableName}"`;
330-
break;
331-
case 'mssql':
332-
const schemaName: {[SchemaName: string]: string}[] = await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`);
333-
columnTableNameDelete = `${schemaName[0].SchemaName}.${tableName}`;
334-
break;
335-
default:
336-
columnTableNameDelete = tableName;
337-
break;
338-
};
369+
const columnTableNameDelete = await Promise.resolve(tableNameFormat(req, dbDataSource));
339370

340371
const deletedColumn: Promise<unknown> = await dbDataSource.query(`
341372
ALTER TABLE ${columnTableNameDelete}
@@ -360,31 +391,11 @@ export const deleteColumn: RequestHandler = async (req: Request, _res: Response,
360391

361392
export const addNewTable: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
362393
const dbDataSource = await dbConnect(req)
363-
const { db_type, username } = req.session
364-
const { newTableName, newColumns } = req.body
365-
366-
interface NewColumn {
367-
name: string,
368-
type: string,
369-
isNullable: boolean,
370-
isPrimary: boolean,
371-
defaultValue: any,
372-
};
394+
const { newColumns } = req.body
373395

374396
try{
375-
let tableName = '';
376-
switch (db_type) {
377-
case 'oracle':
378-
tableName = `"${(username as string).toUpperCase()}"."${newTableName}"`;
379-
break;
380-
case 'mssql':
381-
const schemaName = db_type === 'mssql' ? await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`) : '';
382-
tableName = `${schemaName[0].SchemaName}.${newTableName}`;
383-
break;
384-
default:
385-
tableName = newTableName;
386-
break;
387-
}
397+
const tableNameNewTable = await Promise.resolve(tableNameFormat(req, dbDataSource));
398+
388399

389400
let keyValueString: string = '';
390401
newColumns.forEach((el: NewColumn) => {
@@ -394,7 +405,7 @@ export const addNewTable: RequestHandler = async (req: Request, _res: Response,
394405
const newTableColumnString: string = keyValueString.slice(0, -2);
395406

396407
await dbDataSource.query(`
397-
CREATE TABLE ${tableName} (
408+
CREATE TABLE ${tableNameNewTable} (
398409
${newTableColumnString}
399410
)`
400411
);
@@ -570,21 +581,14 @@ export const addForeignKey: RequestHandler = async (req: Request, _res: Response
570581

571582
export const removeForeignKey: RequestHandler = async (req: Request, _res: Response, next: NextFunction,) => {
572583
const dbDataSource = await dbConnect(req);
573-
const { db_type, username } = req.session;
584+
const { db_type } = req.session;
574585

575586
try{
587+
const removeForeignKeyTableName = await Promise.resolve(tableNameFormat(req, dbDataSource));
576588
const removeForeignKeyData: {[key: string]: string } = req.body;
577589

578-
const schemaName = db_type === 'mssql' ? await dbDataSource.query(`SELECT SCHEMA_NAME() AS SchemaName;`) : '';
579-
580-
const foreignKeyTableName = removeForeignKeyData.PrimaryKeyTableName.slice(7, removeForeignKeyData.PrimaryKeyTableName.length + 1);
581-
const microsoftPrimaryTableName = `${schemaName[0].SchemaName}.${foreignKeyTableName}`;
582-
583-
const tableName: string = db_type === 'oracle' ? `"${(username as string).toUpperCase()}"."${foreignKeyTableName}"` :
584-
db_type === 'mssql' ? `${microsoftPrimaryTableName}` : removeForeignKeyData.tableName;
585-
586590
const removedForeignKey: Promise<unknown> = await dbDataSource.query(`
587-
ALTER TABLE ${tableName}
591+
ALTER TABLE ${removeForeignKeyTableName}
588592
DROP ${db_type === 'mysql' ? 'FOREIGN KEY' : 'CONSTRAINT'} ${removeForeignKeyData.constraintName}
589593
`);
590594

server/controllers/oauth.controller.ts

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ import dotenv from 'dotenv';
33
import log from '../logger/index';
44
dotenv.config();
55

6-
7-
8-
9-
export const getGoogleAccesToken: RequestHandler = (req: Request, res:Response, next:NextFunction)=> {
6+
export const getGoogleAccesToken: RequestHandler = (req: Request, res: Response, next: NextFunction) => {
107

118
type code = string;
129
type state = string|null;
@@ -21,16 +18,16 @@ export const getGoogleAccesToken: RequestHandler = (req: Request, res:Response,
2118
}
2219

2320
type Options = {
24-
code:string,
25-
client_id:string,
26-
client_secret:string ,
27-
redirect_uri:string,
28-
grant_type:string
21+
code: string,
22+
client_id: string,
23+
client_secret: string ,
24+
redirect_uri: string,
25+
grant_type: string,
2926
}
3027

3128

32-
const options:Options = {
33-
code:code,
29+
const options: Options = {
30+
code: code,
3431
client_id: process.env[`${type}_OAUTH_CLIENT_ID`] as string,
3532
client_secret: process.env[`${type}_OAUTH_CLIENT_SECRET`] as string,
3633
redirect_uri:process.env[`${type}_OAUTH_REDIRECT_URI`] as string,
@@ -76,7 +73,7 @@ type Options = {
7673
export const getUserInfo:RequestHandler = async (req:Request, res:Response, next:NextFunction) => {
7774
const {access_token, expires_in, refresh_token, token_type, id_token,type} = res.locals.token;
7875
try{
79-
let data:any;
76+
let data: any;
8077
// For Github Oauth
8178
let userInfo:{};
8279
if(type === 'GITHUB'){
@@ -105,13 +102,6 @@ export const getUserInfo:RequestHandler = async (req:Request, res:Response, next
105102
log:`error exist in oauth.controller.ts in getUserInfo middleware: ${err}`,
106103
status: 500,
107104
message:`error occurred ${err}`
108-
})
109-
}
110-
111-
112-
113-
114-
115-
116-
117-
}
105+
});
106+
};
107+
};

src/Types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export type DataNode = {
106106

107107
export type TableTuple =
108108
[ TableKey: string,
109-
ColumnData: { [ColumnName: string]: ColumnDataForDataTable }];
109+
ColumnData: { [ColumnName: string]: ColumnSchema }];
110110

111111
export interface dataSourceConnection {
112112
type: string,

src/components/DBDisplay/Sidebar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React, { useState, ReactNode } from 'react';
33
import axios from 'axios';
44
import Tippy from '@tippyjs/react';
55
import 'tippy.js/dist/tippy.css';
6-
import informationIcon from '../../../images/informationSqIcon.png'
6+
import informationIcon from '../../../images/informationIcon2.png'
77

88
// Components Imported;
99
import useCredentialsStore from '../../store/credentialsStore';

0 commit comments

Comments
 (0)