Skip to content

Commit 4f5bbd9

Browse files
Merge branch 'profile-structure-ux' of https://github.com/karinakharchenko/rocketadmin into profile-structure-ux
2 parents d08de29 + 1b64ce5 commit 4f5bbd9

File tree

3 files changed

+67
-51
lines changed

3 files changed

+67
-51
lines changed

shared-code/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
"tunnel-ssh": "5.2.0"
3838
},
3939
"optionalDependencies": {
40-
"ibm_db": "3.3.0"
40+
"ibm_db": "3.3.4"
4141
},
4242
"devDependencies": {
4343
"@types/oracledb": "^6.10.1",

shared-code/src/data-access-layer/data-access-objects/data-access-object-ibmdb2.ts

Lines changed: 57 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as csv from 'csv';
22
import getPort from 'get-port';
3-
import { Database, Pool } from 'ibm_db';
3+
import { Database, Pool, SQLParam } from 'ibm_db';
44
import { nanoid } from 'nanoid';
55
import { Readable, Stream } from 'node:stream';
66
import { LRUStorage } from '../../caching/lru-storage.js';
@@ -15,6 +15,7 @@ import { ForeignKeyDS } from '../shared/data-structures/foreign-key.ds.js';
1515
import { FoundRowsDS } from '../shared/data-structures/found-rows.ds.js';
1616
import { PrimaryKeyDS } from '../shared/data-structures/primary-key.ds.js';
1717
import { ReferencedTableNamesAndColumnsDS } from '../shared/data-structures/referenced-table-names-columns.ds.js';
18+
import { RowsPaginationDS } from '../shared/data-structures/rows-pagination.ds.js';
1819
import { TableSettingsDS } from '../shared/data-structures/table-settings.ds.js';
1920
import { TableStructureDS } from '../shared/data-structures/table-structure.ds.js';
2021
import { TableDS } from '../shared/data-structures/table.ds.js';
@@ -24,6 +25,21 @@ import { FilterCriteriaEnum } from '../../shared/enums/filter-criteria.enum.js';
2425
import { IDataAccessObject } from '../../shared/interfaces/data-access-object.interface.js';
2526
import { BasicDataAccessObject } from './basic-data-access-object.js';
2627

28+
interface IbmDb2Row {
29+
COLUMN_NAME: string;
30+
DATA_TYPE: string;
31+
CONSTRAINT_NAME?: string;
32+
REFERENCED_TABLE_NAME?: string;
33+
REFERENCED_COLUMN_NAME?: string;
34+
IS_NULLABLE?: string;
35+
COLUMN_DEFAULT?: string;
36+
CHARACTER_MAXIMUM_LENGTH?: number;
37+
TABLE_NAME?: string;
38+
TABLE_TYPE?: string;
39+
REFERENCING_TABLE_NAME?: string;
40+
REFERENCING_COLUMN_NAME?: string;
41+
}
42+
2743
export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDataAccessObject {
2844
public async addRowInTable(
2945
tableName: string,
@@ -51,7 +67,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
5167
const placeholders = Object.keys(row)
5268
.map(() => '?')
5369
.join(', ');
54-
const values = Object.values(row);
70+
const values = Object.values(row) as SQLParam[];
5571
const query = `
5672
INSERT INTO ${this.connection.schema.toUpperCase()}.${tableName.toUpperCase()} (${columns})
5773
VALUES (${placeholders})
@@ -67,8 +83,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
6783
.map((key) => `${key} = ?`)
6884
.join(' AND ')}
6985
`;
70-
const result = await connectionToDb.query(selectQuery, Object.values(row));
71-
return result[0];
86+
const result = await connectionToDb.query(selectQuery, Object.values(row) as SQLParam[]);
87+
return result[0] as Record<string, unknown>;
7288
}
7389
return row;
7490
}
@@ -86,7 +102,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
86102
DELETE FROM ${this.connection.schema.toUpperCase()}.${tableName.toUpperCase()}
87103
WHERE ${whereClause}
88104
`;
89-
const params = Object.values(primaryKey);
105+
const params = Object.values(primaryKey) as SQLParam[];
90106
await connectionToDb.query(query, params);
91107
return primaryKey;
92108
}
@@ -111,8 +127,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
111127
FROM ${schemaName}.${tableName.toUpperCase()}
112128
WHERE ${referencedFieldName} IN (${placeholders})
113129
`;
114-
const result = connectionToDb.query(query, [...fieldValues]);
115-
return result;
130+
const result = await connectionToDb.query(query, [...fieldValues] as SQLParam[]);
131+
return result as Record<string, unknown>[];
116132
}
117133

118134
public async getRowByPrimaryKey(
@@ -136,9 +152,9 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
136152
FROM ${this.connection.schema.toUpperCase()}.${tableName.toUpperCase()}
137153
WHERE ${whereClause}
138154
`;
139-
const params = Object.values(primaryKey);
155+
const params = Object.values(primaryKey) as SQLParam[];
140156
const result = await connectionToDb.query(query, params);
141-
return result[0];
157+
return result[0] as Record<string, unknown>;
142158
}
143159

144160
public async bulkGetRowsFromTableByPrimaryKeys(
@@ -168,7 +184,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
168184
})
169185
.join(' OR ');
170186

171-
const flatPrimaryKeysValues = primaryKeys.flatMap(Object.values);
187+
const flatPrimaryKeysValues = primaryKeys.flatMap(Object.values) as SQLParam[];
172188

173189
const query = `
174190
SELECT ${selectFields}
@@ -177,7 +193,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
177193
`;
178194

179195
const results = await connectionToDb.query(query, flatPrimaryKeysValues);
180-
return results;
196+
return results as Record<string, unknown>[];
181197
}
182198

183199
public async getRowsFromTable(
@@ -214,7 +230,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
214230
const lastPage = Math.ceil(rowsCount / perPage);
215231
let rowsRO: FoundRowsDS;
216232

217-
const queryParams: unknown[] = [];
233+
const queryParams: SQLParam[] = [];
218234

219235
if (autocompleteFields?.value && autocompleteFields.fields.length > 0) {
220236
const validatedAutocompleteFields = autocompleteFields.fields.filter((field) => availableFields.includes(field));
@@ -229,8 +245,8 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
229245
const rows = await connectionToDb.query(autocompleteQuery, autocompleteParams);
230246

231247
rowsRO = {
232-
data: rows,
233-
pagination: {} as any,
248+
data: rows as Record<string, unknown>[],
249+
pagination: {} as RowsPaginationDS,
234250
large_dataset: large_dataset,
235251
};
236252
return rowsRO;
@@ -272,7 +288,7 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
272288
.map((filterObject) => {
273289
switch (filterObject.criteria) {
274290
case FilterCriteriaEnum.eq:
275-
queryParams.push(filterObject.value);
291+
queryParams.push(filterObject.value as SQLParam);
276292
return `${filterObject.field} = ?`;
277293
case FilterCriteriaEnum.startswith:
278294
queryParams.push(`${filterObject.value}%`);
@@ -281,16 +297,16 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
281297
queryParams.push(`%${filterObject.value}`);
282298
return `${filterObject.field} LIKE ?`;
283299
case FilterCriteriaEnum.gt:
284-
queryParams.push(filterObject.value);
300+
queryParams.push(filterObject.value as SQLParam);
285301
return `${filterObject.field} > ?`;
286302
case FilterCriteriaEnum.lt:
287-
queryParams.push(filterObject.value);
303+
queryParams.push(filterObject.value as SQLParam);
288304
return `${filterObject.field} < ?`;
289305
case FilterCriteriaEnum.lte:
290-
queryParams.push(filterObject.value);
306+
queryParams.push(filterObject.value as SQLParam);
291307
return `${filterObject.field} <= ?`;
292308
case FilterCriteriaEnum.gte:
293-
queryParams.push(filterObject.value);
309+
queryParams.push(filterObject.value as SQLParam);
294310
return `${filterObject.field} >= ?`;
295311
case FilterCriteriaEnum.contains:
296312
queryParams.push(`%${filterObject.value}%`);
@@ -324,13 +340,13 @@ export class DataAccessObjectIbmDb2 extends BasicDataAccessObject implements IDa
324340
const rows = await connectionToDb.query(rowsQuery, queryParams);
325341

326342
rowsRO = {
327-
data: rows,
343+
data: rows as Record<string, unknown>[],
328344
pagination: {
329345
total: rowsCount,
330346
lastPage: lastPage,
331347
perPage: perPage,
332348
currentPage: page,
333-
} as any,
349+
},
334350
large_dataset: large_dataset,
335351
};
336352
return rowsRO;
@@ -372,7 +388,7 @@ ORDER BY
372388
this.connection.schema.toUpperCase(),
373389
]);
374390

375-
const resultKeys = foreignKeys.map((foreignKey: any) => {
391+
const resultKeys = (foreignKeys as unknown as IbmDb2Row[]).map((foreignKey) => {
376392
return {
377393
column_name: foreignKey.COLUMN_NAME,
378394
constraint_name: foreignKey.CONSTRAINT_NAME,
@@ -402,7 +418,7 @@ ORDER BY
402418
this.connection.schema.toUpperCase(),
403419
]);
404420

405-
const resultKeys = primaryKeys.map((primaryKey: any) => {
421+
const resultKeys = (primaryKeys as unknown as IbmDb2Row[]).map((primaryKey) => {
406422
return {
407423
column_name: primaryKey.COLUMN_NAME,
408424
data_type: primaryKey.DATA_TYPE as string,
@@ -422,7 +438,7 @@ ORDER BY
422438
`;
423439
const tables = await connectionToDb.query(query, [this.connection.schema.toUpperCase()]);
424440

425-
return tables.map((table: any) => {
441+
return (tables as unknown as IbmDb2Row[]).map((table) => {
426442
return {
427443
tableName: table.TABLE_NAME,
428444
isView: table.TABLE_TYPE === 'V',
@@ -449,7 +465,7 @@ ORDER BY
449465
this.connection.schema.toUpperCase(),
450466
]);
451467

452-
return tableStructure.map((column: any) => {
468+
return (tableStructure as unknown as IbmDb2Row[]).map((column) => {
453469
return {
454470
allow_null: column.IS_NULLABLE === 'Y',
455471
column_default: column.COLUMN_DEFAULT,
@@ -518,16 +534,16 @@ ORDER BY
518534
SET ${setClause}
519535
WHERE ${whereClause}
520536
`;
521-
const params = [...Object.values(row), ...Object.values(primaryKey)];
537+
const params = [...Object.values(row), ...Object.values(primaryKey)] as SQLParam[];
522538
await connectionToDb.query(query, params);
523539

524540
const selectQuery = `
525541
SELECT *
526542
FROM ${this.connection.schema.toUpperCase()}.${tableName.toUpperCase()}
527543
WHERE ${whereClause}
528544
`;
529-
const result = await connectionToDb.query(selectQuery, Object.values(primaryKey));
530-
return result[0];
545+
const result = await connectionToDb.query(selectQuery, Object.values(primaryKey) as SQLParam[]);
546+
return result[0] as Record<string, unknown>;
531547
}
532548

533549
public async bulkUpdateRowsInTable(
@@ -588,7 +604,7 @@ ORDER BY
588604
]);
589605
results.push({
590606
referenced_on_column_name: primaryColumn.column_name,
591-
referenced_by: foreignKeys.map((foreignKey: any) => {
607+
referenced_by: (foreignKeys as unknown as IbmDb2Row[]).map((foreignKey) => {
592608
return {
593609
table_name: foreignKey.REFERENCING_TABLE_NAME,
594610
column_name: foreignKey.REFERENCING_COLUMN_NAME,
@@ -610,7 +626,7 @@ ORDER BY
610626
this.connection.schema.toUpperCase(),
611627
tableName.toUpperCase(),
612628
]);
613-
return tableData[0].TABLE_TYPE === 'V';
629+
return (tableData[0] as unknown as IbmDb2Row).TABLE_TYPE === 'V';
614630
}
615631

616632
public async getTableRowsStream(
@@ -620,12 +636,12 @@ ORDER BY
620636
perPage: number,
621637
searchedFieldValue: string,
622638
filteringFields: FilteringFieldsDS[],
623-
): Promise<Stream & AsyncIterable<any>> {
639+
): Promise<Stream & AsyncIterable<Record<string, unknown>>> {
624640
const { large_dataset } = await this.getRowsCount(tableName, this.connection.schema);
625641
if (large_dataset) {
626642
throw new Error(ERROR_MESSAGES.DATA_IS_TO_LARGE);
627643
}
628-
const rowsResult = (await this.getRowsFromTable(
644+
const rowsResult = await this.getRowsFromTable(
629645
tableName,
630646
settings,
631647
page,
@@ -634,8 +650,8 @@ ORDER BY
634650
filteringFields,
635651
null,
636652
null,
637-
)) as any;
638-
return rowsResult.data;
653+
);
654+
return rowsResult.data as unknown as Stream & AsyncIterable<Record<string, unknown>>;
639655
}
640656

641657
public async getRowsCount(
@@ -666,7 +682,7 @@ ORDER BY
666682
`;
667683
const fastCountParams = [tableName, tableSchema];
668684
const fastCountQueryResult = await connectionToDb.query(fastCountQuery, fastCountParams);
669-
const fastCount = fastCountQueryResult[0].CARD;
685+
const fastCount = (fastCountQueryResult[0] as Record<string, number>).CARD;
670686
return fastCount;
671687
}
672688

@@ -676,9 +692,9 @@ ORDER BY
676692
stream.push(null);
677693

678694
const parser = stream.pipe(csv.parse({ columns: true }));
679-
const results: any[] = [];
695+
const results: Record<string, unknown>[] = [];
680696
for await (const record of parser) {
681-
results.push(record);
697+
results.push(record as Record<string, unknown>);
682698
}
683699
await Promise.allSettled(
684700
results.map(async (row) => {
@@ -690,10 +706,10 @@ ORDER BY
690706
public async executeRawQuery(query: string): Promise<Array<Record<string, unknown>>> {
691707
const connectionToDb = await this.getConnectionToDatabase();
692708
const result = await connectionToDb.query(query);
693-
return result;
709+
return result as Record<string, unknown>[];
694710
}
695711

696-
private async getConnectionToDatabase(): Promise<Database> {
712+
private getConnectionToDatabase(): Promise<Database> {
697713
if (this.connection.ssh) {
698714
return this.createTunneledConnection(this.connection);
699715
}
@@ -718,9 +734,9 @@ ORDER BY
718734
return databaseConnection;
719735
}
720736

721-
private async createTunneledConnection(connection: ConnectionParams): Promise<Database> {
737+
private createTunneledConnection(connection: ConnectionParams): Promise<Database> {
722738
const connectionCopy = { ...connection };
723-
return new Promise<Database>(async (resolve, reject): Promise<Database> => {
739+
return new Promise<Database>(async (resolve, reject) => {
724740
const cachedTnl = LRUStorage.getTunnelCache(connectionCopy);
725741
if (cachedTnl?.database && cachedTnl.server && cachedTnl.client && cachedTnl.database.connected) {
726742
resolve(cachedTnl.database);

yarn.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3970,7 +3970,7 @@ __metadata:
39703970
cassandra-driver: ^4.8.0
39713971
csv: ^6.4.1
39723972
get-port: ^7.1.0
3973-
ibm_db: 3.3.0
3973+
ibm_db: 3.3.4
39743974
jsonwebtoken: ^9.0.3
39753975
knex: ^3.1.0
39763976
lru-cache: ^11.2.6
@@ -6115,7 +6115,7 @@ __metadata:
61156115
languageName: node
61166116
linkType: hard
61176117

6118-
"axios@npm:^1.13.2, axios@npm:^1.13.5, axios@npm:^1.7.4":
6118+
"axios@npm:^1.12.0, axios@npm:^1.13.2, axios@npm:^1.13.5":
61196119
version: 1.13.5
61206120
resolution: "axios@npm:1.13.5"
61216121
dependencies:
@@ -8483,20 +8483,20 @@ __metadata:
84838483
languageName: node
84848484
linkType: hard
84858485

8486-
"ibm_db@npm:3.3.0":
8487-
version: 3.3.0
8488-
resolution: "ibm_db@npm:3.3.0"
8486+
"ibm_db@npm:3.3.4":
8487+
version: 3.3.4
8488+
resolution: "ibm_db@npm:3.3.4"
84898489
dependencies:
84908490
adm-zip: ^0.5.16
8491-
axios: ^1.7.4
8491+
axios: ^1.12.0
84928492
big-integer: ^1.6.51
84938493
bindings: ^1.5.0
84948494
fs-extra: ^11.1.1
84958495
lodash: ^4.17.21
8496-
nan: ^2.22.0
8496+
nan: ^2.23.0
84978497
q: ^1.5.1
84988498
targz: ^1.0.1
8499-
checksum: 7a266c6bd5bbc9ba3d3fd83c82e7b207f704be72a80ceeed1b8f22fc05ebeb65e6baada7e6ca9710c773f48cb2a1a53ddc7a593eacf7b0d5b5f376696007bc5b
8499+
checksum: 3ac61a91a91770a269705db7e4bc2a165641b8586f7ea0f5a64e435a2dae2dac24ddb188c351faff05fc3062569cec8e7d5c707746e07d2331e4ccd4a960a187
85008500
languageName: node
85018501
linkType: hard
85028502

@@ -9984,7 +9984,7 @@ __metadata:
99849984
languageName: node
99859985
linkType: hard
99869986

9987-
"nan@npm:^2.19.0, nan@npm:^2.22.0, nan@npm:^2.23.0":
9987+
"nan@npm:^2.19.0, nan@npm:^2.23.0":
99889988
version: 2.24.0
99899989
resolution: "nan@npm:2.24.0"
99909990
dependencies:

0 commit comments

Comments
 (0)