1
1
import { RequestHandler , Request , Response , NextFunction } from 'express' ;
2
2
import { DataSource } from 'typeorm' ;
3
3
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
+ } ;
21
40
22
41
//---------------CONNECT TO THE DATABASE-----------------------------------------------------------------------------------------
23
42
@@ -102,11 +121,12 @@ export const dbConnect = async (req: Request) => {
102
121
103
122
export const addNewDbRow : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
104
123
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 ;
107
126
108
127
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 ) ) ;
110
130
const newSqlRow : { [ key : string ] : string } = newRow as { } ;
111
131
112
132
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
152
172
break ;
153
173
} ;
154
174
175
+ //const tableNameUpdate = await Promise.resolve(tableNameFormat(req, dbDataSource));
176
+
155
177
const updateKeys = Object . keys ( newRow ) ;
156
178
const updateValues = Object . values ( newRow ) ;
157
179
let oracleKeyValueString = '' ;
@@ -186,23 +208,25 @@ export const updateRow: RequestHandler = async (req: Request, _res: Response, ne
186
208
187
209
export const deleteRow : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
188
210
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
191
213
192
214
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 ) ) ;
206
230
207
231
if ( primaryKey ) {
208
232
// Deleting a row that has a PK
@@ -246,34 +270,52 @@ export const deleteRow: RequestHandler = async (req: Request, _res: Response, ne
246
270
247
271
export const addNewDbColumn : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
248
272
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 )
251
276
252
277
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
+ } ) ;
266
292
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
+ }
271
298
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
+ ` ) ;
276
313
314
+ await dbDataSource . destroy ( ) ;
315
+ console . log ( 'Database has been disconnected' ) ;
316
+ console . log ( 'addedForeignKey in helper: ' , addedNewColumn ) ;
317
+ return addedNewColumn ;
318
+ }
277
319
} catch ( err : unknown ) {
278
320
console . log ( 'Error occurred in the addedForeignKey middleware: ' , err ) ;
279
321
dbDataSource . destroy ( ) ;
@@ -297,6 +339,7 @@ export const updateDbColumn: RequestHandler = async (req: Request, _res: Respons
297
339
const tableName : string = db_type === 'oracle' ? `"${ ( username as string ) . toUpperCase ( ) } "."${ slicedTableName } "` :
298
340
db_type === 'mssql' ? `${ schemaName [ 0 ] . SchemaName } .${ slicedTableName } ` : updateColumnData . tableName ;
299
341
342
+
300
343
const updatedColumn : Promise < unknown > = await dbDataSource . query ( `
301
344
ALTER TABLE ${ tableName }
302
345
${ 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
319
362
320
363
export const deleteColumn : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
321
364
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
324
367
325
368
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 ) ) ;
339
370
340
371
const deletedColumn : Promise < unknown > = await dbDataSource . query ( `
341
372
ALTER TABLE ${ columnTableNameDelete }
@@ -360,31 +391,11 @@ export const deleteColumn: RequestHandler = async (req: Request, _res: Response,
360
391
361
392
export const addNewTable : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
362
393
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
373
395
374
396
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
+
388
399
389
400
let keyValueString : string = '' ;
390
401
newColumns . forEach ( ( el : NewColumn ) => {
@@ -394,7 +405,7 @@ export const addNewTable: RequestHandler = async (req: Request, _res: Response,
394
405
const newTableColumnString : string = keyValueString . slice ( 0 , - 2 ) ;
395
406
396
407
await dbDataSource . query ( `
397
- CREATE TABLE ${ tableName } (
408
+ CREATE TABLE ${ tableNameNewTable } (
398
409
${ newTableColumnString }
399
410
)`
400
411
) ;
@@ -570,21 +581,14 @@ export const addForeignKey: RequestHandler = async (req: Request, _res: Response
570
581
571
582
export const removeForeignKey : RequestHandler = async ( req : Request , _res : Response , next : NextFunction , ) => {
572
583
const dbDataSource = await dbConnect ( req ) ;
573
- const { db_type, username } = req . session ;
584
+ const { db_type } = req . session ;
574
585
575
586
try {
587
+ const removeForeignKeyTableName = await Promise . resolve ( tableNameFormat ( req , dbDataSource ) ) ;
576
588
const removeForeignKeyData : { [ key : string ] : string } = req . body ;
577
589
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
-
586
590
const removedForeignKey : Promise < unknown > = await dbDataSource . query ( `
587
- ALTER TABLE ${ tableName }
591
+ ALTER TABLE ${ removeForeignKeyTableName }
588
592
DROP ${ db_type === 'mysql' ? 'FOREIGN KEY' : 'CONSTRAINT' } ${ removeForeignKeyData . constraintName }
589
593
` ) ;
590
594
0 commit comments