@reldens/storage 0.44.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
const { FileHandler } = require('@reldens/server-utils');
|
|
8
|
-
const {
|
|
8
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
9
9
|
const { ObjectionJsDataServer } = require('./objection-js/objection-js-data-server');
|
|
10
10
|
const { MikroOrmDataServer } = require('./mikro-orm/mikro-orm-data-server');
|
|
11
11
|
const { PrismaDataServer } = require('./prisma/prisma-data-server');
|
|
@@ -61,7 +61,7 @@ class EntitiesGenerator
|
|
|
61
61
|
}
|
|
62
62
|
let entityClassName = sc.capitalizedCamelCase(tableName)+'Entity';
|
|
63
63
|
let titleProperty = this.determineTitleProperty(tableData.columns);
|
|
64
|
-
for(let columnName
|
|
64
|
+
for(let columnName of Object.keys(tableData.columns)){
|
|
65
65
|
tableData.columns[columnName].tableName = tableName;
|
|
66
66
|
}
|
|
67
67
|
let propertiesConfig = this.generatePropertiesConfig(tableData.columns, titleProperty);
|
|
@@ -76,16 +76,19 @@ class EntitiesGenerator
|
|
|
76
76
|
}
|
|
77
77
|
let editPropertiesRemoval = this.getEditPropertiesRemoval(fieldsToRemoveFromEdit);
|
|
78
78
|
let listPropertiesDeclaration = this.getListPropertiesDeclaration(tableData.columns);
|
|
79
|
+
let showPropertiesDeclaration = this.getShowPropertiesDeclaration(tableData.columns);
|
|
79
80
|
let needsSc = listPropertiesDeclaration.includes('sc.removeFromArray')
|
|
80
|
-
|| editPropertiesRemoval.includes('sc.removeFromArray')
|
|
81
|
+
|| editPropertiesRemoval.includes('sc.removeFromArray')
|
|
82
|
+
|| showPropertiesDeclaration.includes('sc.removeFromArray');
|
|
81
83
|
let scRequire = needsSc ? '\nconst { sc } = require(\'@reldens/utils\');' : '';
|
|
82
84
|
let replacements = {
|
|
83
85
|
entityClassName,
|
|
84
86
|
propertiesConfig,
|
|
85
87
|
titlePropertyDeclaration,
|
|
86
88
|
titlePropertyReturn,
|
|
87
|
-
|
|
89
|
+
showPropertiesDeclaration,
|
|
88
90
|
editPropertiesRemoval,
|
|
91
|
+
listPropertiesDeclaration,
|
|
89
92
|
scRequire
|
|
90
93
|
};
|
|
91
94
|
let entityContent = this.applyReplacements(entityTemplateContent, replacements);
|
|
@@ -105,14 +108,30 @@ class EntitiesGenerator
|
|
|
105
108
|
return true;
|
|
106
109
|
}
|
|
107
110
|
|
|
111
|
+
getFieldsToRemoveFromList(columns)
|
|
112
|
+
{
|
|
113
|
+
let fieldsToRemove = [];
|
|
114
|
+
for(let columnName of Object.keys(columns)){
|
|
115
|
+
let column = columns[columnName];
|
|
116
|
+
let type = column.type.toLowerCase();
|
|
117
|
+
if(['text', 'json', 'tinytext', 'mediumtext', 'longtext'].includes(type)){
|
|
118
|
+
fieldsToRemove.push(columnName);
|
|
119
|
+
}
|
|
120
|
+
if('password' === columnName.toLowerCase()){
|
|
121
|
+
fieldsToRemove.push(columnName);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return fieldsToRemove;
|
|
125
|
+
}
|
|
126
|
+
|
|
108
127
|
getEditPropertiesRemoval(fieldsToRemove)
|
|
109
128
|
{
|
|
110
129
|
if(1 === fieldsToRemove.length){
|
|
111
|
-
return 'let editProperties = [...
|
|
130
|
+
return 'let editProperties = [...propertiesKeys];\n editProperties.splice(editProperties.indexOf(\''+
|
|
112
131
|
fieldsToRemove[0]
|
|
113
132
|
+'\'), 1);';
|
|
114
133
|
}
|
|
115
|
-
return 'let editProperties = sc.removeFromArray([...
|
|
134
|
+
return 'let editProperties = sc.removeFromArray([...propertiesKeys], [\''+fieldsToRemove.join('\', \'')+'\']);';
|
|
116
135
|
}
|
|
117
136
|
|
|
118
137
|
determineTitleProperty(columns)
|
|
@@ -135,7 +154,7 @@ class EntitiesGenerator
|
|
|
135
154
|
generatePropertiesConfig(columns, titleProperty)
|
|
136
155
|
{
|
|
137
156
|
let propertiesConfig = [];
|
|
138
|
-
for(let columnName
|
|
157
|
+
for(let columnName of Object.keys(columns)){
|
|
139
158
|
let column = columns[columnName];
|
|
140
159
|
let propertyKey = titleProperty && columnName === titleProperty ? '[titleProperty]' : columnName;
|
|
141
160
|
if('id' === columnName){
|
|
@@ -247,31 +266,53 @@ class EntitiesGenerator
|
|
|
247
266
|
return refTableName;
|
|
248
267
|
}
|
|
249
268
|
|
|
250
|
-
|
|
269
|
+
getShowPropertiesDeclaration(columns)
|
|
251
270
|
{
|
|
252
|
-
let
|
|
253
|
-
if(0 ===
|
|
254
|
-
return 'let
|
|
271
|
+
let passwordFields = this.getPasswordFields(columns);
|
|
272
|
+
if(0 === passwordFields.length){
|
|
273
|
+
return 'let showProperties = propertiesKeys;';
|
|
255
274
|
}
|
|
256
|
-
if(1 ===
|
|
257
|
-
return 'let
|
|
258
|
-
|
|
275
|
+
if(1 === passwordFields.length){
|
|
276
|
+
return 'let showProperties = [...propertiesKeys];\n showProperties.splice(showProperties.indexOf(\''+
|
|
277
|
+
passwordFields[0]+
|
|
259
278
|
'\'), 1);';
|
|
260
279
|
}
|
|
261
|
-
return 'let
|
|
280
|
+
return 'let showProperties = sc.removeFromArray([...propertiesKeys], [\''+passwordFields.join('\', \'')+'\']);';
|
|
262
281
|
}
|
|
263
282
|
|
|
264
|
-
|
|
283
|
+
getPasswordFields(columns)
|
|
265
284
|
{
|
|
266
|
-
let
|
|
267
|
-
for(let columnName
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if(['text', 'json', 'tinytext', 'mediumtext', 'longtext'].includes(type)){
|
|
271
|
-
fieldsToRemove.push(columnName);
|
|
285
|
+
let passwordFields = [];
|
|
286
|
+
for(let columnName of Object.keys(columns)){
|
|
287
|
+
if('password' === columnName.toLowerCase()){
|
|
288
|
+
passwordFields.push(columnName);
|
|
272
289
|
}
|
|
273
290
|
}
|
|
274
|
-
return
|
|
291
|
+
return passwordFields;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
getEditPropertiesRemoval(fieldsToRemove)
|
|
295
|
+
{
|
|
296
|
+
if(1 === fieldsToRemove.length){
|
|
297
|
+
return 'let editProperties = [...propertiesKeys];\n editProperties.splice(editProperties.indexOf(\''+
|
|
298
|
+
fieldsToRemove[0]
|
|
299
|
+
+'\'), 1);';
|
|
300
|
+
}
|
|
301
|
+
return 'let editProperties = sc.removeFromArray([...propertiesKeys], [\''+fieldsToRemove.join('\', \'')+'\']);';
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
getListPropertiesDeclaration(columns)
|
|
305
|
+
{
|
|
306
|
+
let fieldsToRemove = this.getFieldsToRemoveFromList(columns);
|
|
307
|
+
if(0 === fieldsToRemove.length){
|
|
308
|
+
return 'let listProperties = propertiesKeys;';
|
|
309
|
+
}
|
|
310
|
+
if(1 === fieldsToRemove.length){
|
|
311
|
+
return 'let listProperties = [...propertiesKeys];\n listProperties.splice(listProperties.indexOf(\''+
|
|
312
|
+
fieldsToRemove[0]+
|
|
313
|
+
'\'), 1);';
|
|
314
|
+
}
|
|
315
|
+
return 'let listProperties = sc.removeFromArray([...propertiesKeys], [\''+fieldsToRemove.join('\', \'')+'\']);';
|
|
275
316
|
}
|
|
276
317
|
|
|
277
318
|
async generateModelFile(tableName, tableData, driverKey)
|
|
@@ -324,7 +365,7 @@ class EntitiesGenerator
|
|
|
324
365
|
{
|
|
325
366
|
if('mikro-orm' === driverKey){
|
|
326
367
|
let entityProps = [];
|
|
327
|
-
for(let columnName
|
|
368
|
+
for(let columnName of Object.keys(columns)){
|
|
328
369
|
let column = columns[columnName];
|
|
329
370
|
let isPrimary = 'PRI' === column.key;
|
|
330
371
|
let type = TypeMapper.mapDbTypeToJsType(column.type);
|
|
@@ -342,7 +383,7 @@ class EntitiesGenerator
|
|
|
342
383
|
}
|
|
343
384
|
if('prisma' === driverKey){
|
|
344
385
|
let prismaProps = [];
|
|
345
|
-
for(let columnName
|
|
386
|
+
for(let columnName of Object.keys(columns)){
|
|
346
387
|
let column = columns[columnName];
|
|
347
388
|
let prismaType = TypeMapper.mapDbTypeToPrismaType(column.type);
|
|
348
389
|
let isPrimary = 'PRI' === column.key;
|
|
@@ -391,7 +432,7 @@ class EntitiesGenerator
|
|
|
391
432
|
getRequireStatements()
|
|
392
433
|
{
|
|
393
434
|
let requireStatements = [];
|
|
394
|
-
for(let tableName
|
|
435
|
+
for(let tableName of Object.keys(this.generatedEntities)){
|
|
395
436
|
let entity = this.generatedEntities[tableName];
|
|
396
437
|
let nameWithoutExtension = entity.entityFileName.replace('.js', '');
|
|
397
438
|
requireStatements.push(
|
|
@@ -404,13 +445,9 @@ class EntitiesGenerator
|
|
|
404
445
|
getEntitiesConfigExport()
|
|
405
446
|
{
|
|
406
447
|
let entitiesConfigExport = [];
|
|
407
|
-
for(let tableName
|
|
448
|
+
for(let tableName of Object.keys(this.generatedEntities)){
|
|
408
449
|
let entity = this.generatedEntities[tableName];
|
|
409
|
-
|
|
410
|
-
let capitalizedCase = sc.capitalizedCamelCase(tableName);
|
|
411
|
-
entitiesConfigExport.push(
|
|
412
|
-
camelCaseKey+': '+entity.entityClassName+'.propertiesConfig({parentItemLabel: \''+capitalizedCase+'\'})'
|
|
413
|
-
);
|
|
450
|
+
entitiesConfigExport.push(sc.camelCase(tableName)+': '+entity.entityClassName+'.propertiesConfig()');
|
|
414
451
|
}
|
|
415
452
|
return entitiesConfigExport.join(',\n ');
|
|
416
453
|
}
|
|
@@ -440,7 +477,7 @@ class EntitiesGenerator
|
|
|
440
477
|
getTranslationLabels()
|
|
441
478
|
{
|
|
442
479
|
let labels = [];
|
|
443
|
-
for(let tableName
|
|
480
|
+
for(let tableName of Object.keys(this.generatedEntities)){
|
|
444
481
|
let humanReadable = tableName.split('_').map(word => word.charAt(0).toUpperCase()+word.slice(1)).join(' ');
|
|
445
482
|
labels.push('\''+tableName+'\': \''+humanReadable+'\'');
|
|
446
483
|
}
|
|
@@ -477,7 +514,7 @@ class EntitiesGenerator
|
|
|
477
514
|
getRegisteredModels(driverKey)
|
|
478
515
|
{
|
|
479
516
|
let registeredModels = [];
|
|
480
|
-
for(let tableName
|
|
517
|
+
for(let tableName of Object.keys(this.generatedEntities)){
|
|
481
518
|
let entity = this.generatedEntities[tableName];
|
|
482
519
|
if(driverKey !== entity.driverKey){
|
|
483
520
|
continue;
|
|
@@ -492,7 +529,7 @@ class EntitiesGenerator
|
|
|
492
529
|
getRegisteredEntitiesObject(driverKey)
|
|
493
530
|
{
|
|
494
531
|
let registeredEntitiesObject = [];
|
|
495
|
-
for(let tableName
|
|
532
|
+
for(let tableName of Object.keys(this.generatedEntities)){
|
|
496
533
|
let entity = this.generatedEntities[tableName];
|
|
497
534
|
if(driverKey !== entity.driverKey){
|
|
498
535
|
continue;
|
|
@@ -511,7 +548,6 @@ class EntitiesGenerator
|
|
|
511
548
|
return result;
|
|
512
549
|
}
|
|
513
550
|
|
|
514
|
-
|
|
515
551
|
async generate()
|
|
516
552
|
{
|
|
517
553
|
if(!this.server){
|
|
@@ -540,7 +576,7 @@ class EntitiesGenerator
|
|
|
540
576
|
Logger.critical('Failed to fetch driver key.');
|
|
541
577
|
return false;
|
|
542
578
|
}
|
|
543
|
-
for(let tableName
|
|
579
|
+
for(let tableName of Object.keys(tables)){
|
|
544
580
|
let tableData = tables[tableName];
|
|
545
581
|
await this.generateEntityFile(tableName, tableData);
|
|
546
582
|
await this.generateModelFile(tableName, tableData, driverKey);
|
|
@@ -14,7 +14,8 @@ class {{entityClassName}} extends EntityProperties
|
|
|
14
14
|
let properties = {
|
|
15
15
|
{{propertiesConfig}}
|
|
16
16
|
};
|
|
17
|
-
let
|
|
17
|
+
let propertiesKeys = Object.keys(properties);
|
|
18
|
+
{{showPropertiesDeclaration}}
|
|
18
19
|
{{editPropertiesRemoval}}
|
|
19
20
|
{{listPropertiesDeclaration}}
|
|
20
21
|
return {
|
|
@@ -64,7 +64,7 @@ class MySQLTablesProvider
|
|
|
64
64
|
' AND REFERENCED_TABLE_NAME IS NOT NULL;';
|
|
65
65
|
|
|
66
66
|
let foreignKeysResult = await server.rawQuery(foreignKeysQuery);
|
|
67
|
-
if(!sc.isArray(foreignKeysResult) || 0
|
|
67
|
+
if(!sc.isArray(foreignKeysResult) || 0 === foreignKeysResult.length){
|
|
68
68
|
return tables;
|
|
69
69
|
}
|
|
70
70
|
for(let row of foreignKeysResult){
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
const { BaseDataServer } = require('../base-data-server');
|
|
8
8
|
const { PrismaDriver } = require('./prisma-driver');
|
|
9
9
|
const { MySQLTablesProvider } = require('../mysql-tables-provider');
|
|
10
|
+
const { PrismaClient } = require('@prisma/client');
|
|
10
11
|
const { Logger } = require('@reldens/utils');
|
|
11
12
|
|
|
12
13
|
class PrismaDataServer extends BaseDataServer
|
|
@@ -24,7 +25,6 @@ class PrismaDataServer extends BaseDataServer
|
|
|
24
25
|
return this.initialized;
|
|
25
26
|
}
|
|
26
27
|
try {
|
|
27
|
-
let { PrismaClient } = require('@prisma/client');
|
|
28
28
|
this.prisma = new PrismaClient({
|
|
29
29
|
log: this.debug ? ['query', 'info', 'warn', 'error'] : ['error']
|
|
30
30
|
});
|
|
@@ -93,6 +93,7 @@ class PrismaDataServer extends BaseDataServer
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
if(0 === results.length){
|
|
96
|
+
Logger.error('Statement results length is zero.', results);
|
|
96
97
|
return false;
|
|
97
98
|
}
|
|
98
99
|
return 1 === results.length ? results[0] : results;
|
|
@@ -104,10 +105,19 @@ class PrismaDataServer extends BaseDataServer
|
|
|
104
105
|
|
|
105
106
|
async executeStatement(statement)
|
|
106
107
|
{
|
|
107
|
-
|
|
108
|
+
let trimmedStatement = statement.trim().toUpperCase();
|
|
109
|
+
if(trimmedStatement.startsWith('SELECT')){
|
|
108
110
|
return await this.prisma.$queryRawUnsafe(statement);
|
|
109
111
|
}
|
|
110
|
-
|
|
112
|
+
let result = await this.prisma.$executeRawUnsafe(statement);
|
|
113
|
+
if(
|
|
114
|
+
trimmedStatement.startsWith('CREATE')
|
|
115
|
+
|| trimmedStatement.startsWith('ALTER')
|
|
116
|
+
|| trimmedStatement.startsWith('DROP')
|
|
117
|
+
){
|
|
118
|
+
return { affectedRows: result };
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
111
121
|
}
|
|
112
122
|
|
|
113
123
|
splitSqlStatements(sqlContent)
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
const { BaseDriver } = require('../base-driver');
|
|
8
8
|
const { ErrorManager, Logger, sc } = require('@reldens/utils');
|
|
9
|
+
const { Prisma } = require('@prisma/client');
|
|
9
10
|
|
|
10
11
|
class PrismaDriver extends BaseDriver
|
|
11
12
|
{
|
|
@@ -14,30 +15,35 @@ class PrismaDriver extends BaseDriver
|
|
|
14
15
|
{
|
|
15
16
|
super(props);
|
|
16
17
|
if(!props.prisma){
|
|
17
|
-
|
|
18
|
+
Logger.critical('Missing Prisma client on Prisma driver.');
|
|
19
|
+
return false;
|
|
18
20
|
}
|
|
19
21
|
if(!props.model){
|
|
20
|
-
|
|
22
|
+
Logger.critical('Missing Prisma model on Prisma driver.');
|
|
23
|
+
return false;
|
|
21
24
|
}
|
|
22
25
|
if(!props.server){
|
|
23
|
-
|
|
26
|
+
Logger.critical('Missing Server Driver on Prisma driver.');
|
|
27
|
+
return false;
|
|
24
28
|
}
|
|
25
29
|
this.prisma = props.prisma;
|
|
26
30
|
this.model = props.model;
|
|
27
31
|
this.server = props.server;
|
|
28
32
|
this.requiredFields = [];
|
|
29
33
|
this.fieldTypes = {};
|
|
34
|
+
this.idFieldType = 'String';
|
|
30
35
|
this.initFieldMetadata();
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
initFieldMetadata()
|
|
34
39
|
{
|
|
35
40
|
try {
|
|
36
|
-
let dmmf = this.prisma.
|
|
41
|
+
let dmmf = this.prisma._runtimeDataModel || Prisma.dmmf?.datamodel;
|
|
37
42
|
if(!dmmf){
|
|
38
43
|
return;
|
|
39
44
|
}
|
|
40
|
-
let
|
|
45
|
+
let modelName = this.tableName().toLowerCase();
|
|
46
|
+
let modelInfo = dmmf.models?.[modelName] || dmmf.models?.find(m => m.name.toLowerCase() === modelName);
|
|
41
47
|
if(!modelInfo){
|
|
42
48
|
return;
|
|
43
49
|
}
|
|
@@ -46,12 +52,29 @@ class PrismaDriver extends BaseDriver
|
|
|
46
52
|
this.requiredFields.push(field.name);
|
|
47
53
|
}
|
|
48
54
|
this.fieldTypes[field.name] = field.type;
|
|
55
|
+
if(field.isId){
|
|
56
|
+
this.idFieldType = field.type;
|
|
57
|
+
}
|
|
49
58
|
}
|
|
50
59
|
} catch(error) {
|
|
51
60
|
Logger.warning('Could not initialize field metadata: '+error.message);
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
63
|
|
|
64
|
+
castIdValue(id)
|
|
65
|
+
{
|
|
66
|
+
if(null === id || undefined === id){
|
|
67
|
+
return id;
|
|
68
|
+
}
|
|
69
|
+
if('Int' === this.idFieldType || 'BigInt' === this.idFieldType){
|
|
70
|
+
let numericId = Number(id);
|
|
71
|
+
if(!isNaN(numericId)){
|
|
72
|
+
return numericId;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return String(id);
|
|
76
|
+
}
|
|
77
|
+
|
|
55
78
|
databaseName()
|
|
56
79
|
{
|
|
57
80
|
return this.config.database || '';
|
|
@@ -69,7 +92,7 @@ class PrismaDriver extends BaseDriver
|
|
|
69
92
|
|
|
70
93
|
tableName()
|
|
71
94
|
{
|
|
72
|
-
return this.model.
|
|
95
|
+
return this.model.name || '';
|
|
73
96
|
}
|
|
74
97
|
|
|
75
98
|
property(propertyName)
|
|
@@ -80,14 +103,46 @@ class PrismaDriver extends BaseDriver
|
|
|
80
103
|
prepareData(params)
|
|
81
104
|
{
|
|
82
105
|
let data = {...params};
|
|
83
|
-
for(let key
|
|
106
|
+
for(let key of Object.keys(data)){
|
|
84
107
|
if('status' === key && 'number' === typeof data[key]){
|
|
85
108
|
data[key] = String(data[key]);
|
|
86
109
|
}
|
|
110
|
+
if(this.isDateTimeField(key)){
|
|
111
|
+
data[key] = this.convertToDate(data[key], key);
|
|
112
|
+
}
|
|
87
113
|
}
|
|
88
114
|
return data;
|
|
89
115
|
}
|
|
90
116
|
|
|
117
|
+
isDateTimeField(fieldName)
|
|
118
|
+
{
|
|
119
|
+
let fieldType = this.fieldTypes[fieldName];
|
|
120
|
+
return fieldType === 'DateTime' || fieldType === 'Date';
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
convertToDate(dateValue, fieldName)
|
|
124
|
+
{
|
|
125
|
+
if(dateValue instanceof Date){
|
|
126
|
+
return dateValue;
|
|
127
|
+
}
|
|
128
|
+
if(!dateValue || '' === dateValue){
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
let dateString = String(dateValue);
|
|
132
|
+
if(dateString.match(/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/)){
|
|
133
|
+
return new Date(dateString.replace(' ', 'T') + 'Z');
|
|
134
|
+
}
|
|
135
|
+
if(dateString.match(/^\d{4}-\d{2}-\d{2}$/)){
|
|
136
|
+
return new Date(dateString + 'T00:00:00Z');
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
return new Date(dateString);
|
|
140
|
+
} catch(error) {
|
|
141
|
+
Logger.warning('Failed to convert date value: '+dateString);
|
|
142
|
+
return dateValue;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
91
146
|
ensureRequiredFields(data)
|
|
92
147
|
{
|
|
93
148
|
let missingFields = [];
|
|
@@ -102,6 +157,42 @@ class PrismaDriver extends BaseDriver
|
|
|
102
157
|
return data;
|
|
103
158
|
}
|
|
104
159
|
|
|
160
|
+
processFilters(filters)
|
|
161
|
+
{
|
|
162
|
+
if(!sc.isObject(filters)){
|
|
163
|
+
return filters;
|
|
164
|
+
}
|
|
165
|
+
let processedFilters = {};
|
|
166
|
+
for(let key of Object.keys(filters)){
|
|
167
|
+
let value = filters[key];
|
|
168
|
+
if(sc.hasOwn(value, 'operator') && sc.hasOwn(value, 'value')){
|
|
169
|
+
let operatorValue = value.value;
|
|
170
|
+
if('id' === key && sc.isArray(operatorValue)){
|
|
171
|
+
operatorValue = operatorValue.map(id => this.castIdValue(id));
|
|
172
|
+
}
|
|
173
|
+
if('id' === key && !sc.isArray(operatorValue)){
|
|
174
|
+
operatorValue = this.castIdValue(operatorValue);
|
|
175
|
+
}
|
|
176
|
+
processedFilters[key] = this.applyOperator(operatorValue, value.operator);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if(sc.isObject(value) && !sc.isArray(value)){
|
|
180
|
+
processedFilters[key] = this.processFilters(value);
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if('id' === key && sc.isArray(value)){
|
|
184
|
+
processedFilters[key] = value.map(id => this.castIdValue(id));
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if('id' === key){
|
|
188
|
+
processedFilters[key] = this.castIdValue(value);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
processedFilters[key] = value;
|
|
192
|
+
}
|
|
193
|
+
return processedFilters;
|
|
194
|
+
}
|
|
195
|
+
|
|
105
196
|
async create(params)
|
|
106
197
|
{
|
|
107
198
|
try {
|
|
@@ -130,12 +221,12 @@ class PrismaDriver extends BaseDriver
|
|
|
130
221
|
let relationData = params[relation];
|
|
131
222
|
if(sc.isArray(relationData)){
|
|
132
223
|
createData.data[relation] = {
|
|
133
|
-
connect: relationData.map(item => ({id: item.id}))
|
|
224
|
+
connect: relationData.map(item => ({id: this.castIdValue(item.id)}))
|
|
134
225
|
};
|
|
135
226
|
continue;
|
|
136
227
|
}
|
|
137
228
|
createData.data[relation] = {
|
|
138
|
-
connect: {id: relationData.id}
|
|
229
|
+
connect: {id: this.castIdValue(relationData.id)}
|
|
139
230
|
};
|
|
140
231
|
}
|
|
141
232
|
}
|
|
@@ -150,8 +241,9 @@ class PrismaDriver extends BaseDriver
|
|
|
150
241
|
{
|
|
151
242
|
try {
|
|
152
243
|
let preparedData = this.prepareData(updatePatch);
|
|
244
|
+
let processedFilters = this.processFilters(filters);
|
|
153
245
|
return await this.model.updateMany({
|
|
154
|
-
where:
|
|
246
|
+
where: processedFilters,
|
|
155
247
|
data: preparedData
|
|
156
248
|
});
|
|
157
249
|
} catch(error) {
|
|
@@ -178,13 +270,14 @@ class PrismaDriver extends BaseDriver
|
|
|
178
270
|
async updateById(id, params)
|
|
179
271
|
{
|
|
180
272
|
try {
|
|
181
|
-
let
|
|
273
|
+
let castedId = this.castIdValue(id);
|
|
274
|
+
let found = await this.loadById(castedId);
|
|
182
275
|
if(!found){
|
|
183
276
|
return false;
|
|
184
277
|
}
|
|
185
278
|
let preparedData = this.prepareData(params);
|
|
186
279
|
return await this.model.update({
|
|
187
|
-
where: {id},
|
|
280
|
+
where: {id: castedId},
|
|
188
281
|
data: preparedData
|
|
189
282
|
});
|
|
190
283
|
} catch(error) {
|
|
@@ -199,12 +292,13 @@ class PrismaDriver extends BaseDriver
|
|
|
199
292
|
let preparedData = this.prepareData(params);
|
|
200
293
|
let existing = false;
|
|
201
294
|
if(params.id){
|
|
202
|
-
|
|
295
|
+
let castedId = this.castIdValue(params.id);
|
|
296
|
+
existing = await this.loadById(castedId);
|
|
203
297
|
if(existing){
|
|
204
298
|
let patch = Object.assign({}, preparedData);
|
|
205
299
|
delete patch.id;
|
|
206
300
|
return await this.model.update({
|
|
207
|
-
where: {id:
|
|
301
|
+
where: {id: castedId},
|
|
208
302
|
data: patch
|
|
209
303
|
});
|
|
210
304
|
}
|
|
@@ -213,7 +307,7 @@ class PrismaDriver extends BaseDriver
|
|
|
213
307
|
let existing = await this.loadOne(filters);
|
|
214
308
|
if(existing){
|
|
215
309
|
return await this.model.update({
|
|
216
|
-
where: {id: existing.id},
|
|
310
|
+
where: {id: this.castIdValue(existing.id)},
|
|
217
311
|
data: preparedData
|
|
218
312
|
});
|
|
219
313
|
}
|
|
@@ -228,8 +322,9 @@ class PrismaDriver extends BaseDriver
|
|
|
228
322
|
async delete(filters = {})
|
|
229
323
|
{
|
|
230
324
|
try {
|
|
325
|
+
let processedFilters = this.processFilters(filters);
|
|
231
326
|
return await this.model.deleteMany({
|
|
232
|
-
where:
|
|
327
|
+
where: processedFilters
|
|
233
328
|
});
|
|
234
329
|
} catch(error) {
|
|
235
330
|
Logger.error('Delete error: '+error.message);
|
|
@@ -240,12 +335,13 @@ class PrismaDriver extends BaseDriver
|
|
|
240
335
|
async deleteById(id)
|
|
241
336
|
{
|
|
242
337
|
try {
|
|
243
|
-
let
|
|
338
|
+
let castedId = this.castIdValue(id);
|
|
339
|
+
let found = await this.loadById(castedId);
|
|
244
340
|
if(!found){
|
|
245
341
|
return false;
|
|
246
342
|
}
|
|
247
343
|
return await this.model.delete({
|
|
248
|
-
where: {id}
|
|
344
|
+
where: {id: castedId}
|
|
249
345
|
});
|
|
250
346
|
} catch(error) {
|
|
251
347
|
Logger.error('Delete by ID error: '+error.message);
|
|
@@ -256,8 +352,9 @@ class PrismaDriver extends BaseDriver
|
|
|
256
352
|
async count(filters)
|
|
257
353
|
{
|
|
258
354
|
try {
|
|
355
|
+
let processedFilters = this.processFilters(filters);
|
|
259
356
|
return await this.model.count({
|
|
260
|
-
where:
|
|
357
|
+
where: processedFilters
|
|
261
358
|
});
|
|
262
359
|
} catch(error) {
|
|
263
360
|
Logger.error('Count error: '+error.message);
|
|
@@ -268,8 +365,9 @@ class PrismaDriver extends BaseDriver
|
|
|
268
365
|
async countWithRelations(filters, relations)
|
|
269
366
|
{
|
|
270
367
|
try {
|
|
368
|
+
let processedFilters = this.processFilters(filters);
|
|
271
369
|
let query = {
|
|
272
|
-
where:
|
|
370
|
+
where: processedFilters
|
|
273
371
|
};
|
|
274
372
|
if(sc.isArray(relations) && 0 < relations.length){
|
|
275
373
|
query.include = this.buildIncludeObject(relations);
|
|
@@ -308,8 +406,9 @@ class PrismaDriver extends BaseDriver
|
|
|
308
406
|
async load(filters)
|
|
309
407
|
{
|
|
310
408
|
try {
|
|
409
|
+
let processedFilters = this.processFilters(filters);
|
|
311
410
|
let query = this.buildQueryOptions();
|
|
312
|
-
query.where =
|
|
411
|
+
query.where = processedFilters;
|
|
313
412
|
return await this.model.findMany(query);
|
|
314
413
|
} catch(error) {
|
|
315
414
|
Logger.error('Load error: '+error.message);
|
|
@@ -320,8 +419,9 @@ class PrismaDriver extends BaseDriver
|
|
|
320
419
|
async loadWithRelations(filters, relations)
|
|
321
420
|
{
|
|
322
421
|
try {
|
|
422
|
+
let processedFilters = this.processFilters(filters);
|
|
323
423
|
let query = this.buildQueryOptions();
|
|
324
|
-
query.where =
|
|
424
|
+
query.where = processedFilters;
|
|
325
425
|
if(sc.isArray(relations) && 0 < relations.length){
|
|
326
426
|
query.include = this.buildIncludeObject(relations);
|
|
327
427
|
}
|
|
@@ -364,8 +464,9 @@ class PrismaDriver extends BaseDriver
|
|
|
364
464
|
async loadById(id)
|
|
365
465
|
{
|
|
366
466
|
try {
|
|
467
|
+
let castedId = this.castIdValue(id);
|
|
367
468
|
return await this.model.findUnique({
|
|
368
|
-
where: {id}
|
|
469
|
+
where: {id: castedId}
|
|
369
470
|
});
|
|
370
471
|
} catch(error) {
|
|
371
472
|
Logger.error('Load by ID error: '+error.message);
|
|
@@ -376,8 +477,9 @@ class PrismaDriver extends BaseDriver
|
|
|
376
477
|
async loadByIdWithRelations(id, relations)
|
|
377
478
|
{
|
|
378
479
|
try {
|
|
480
|
+
let castedId = this.castIdValue(id);
|
|
379
481
|
let query = {
|
|
380
|
-
where: {id}
|
|
482
|
+
where: {id: castedId}
|
|
381
483
|
};
|
|
382
484
|
if(sc.isArray(relations) && 0 < relations.length){
|
|
383
485
|
query.include = this.buildIncludeObject(relations);
|
|
@@ -392,9 +494,10 @@ class PrismaDriver extends BaseDriver
|
|
|
392
494
|
async loadByIds(ids)
|
|
393
495
|
{
|
|
394
496
|
try {
|
|
497
|
+
let castedIds = ids.map(id => this.castIdValue(id));
|
|
395
498
|
return await this.model.findMany({
|
|
396
499
|
where: {
|
|
397
|
-
id: {in:
|
|
500
|
+
id: {in: castedIds}
|
|
398
501
|
}
|
|
399
502
|
});
|
|
400
503
|
} catch(error) {
|
|
@@ -406,8 +509,9 @@ class PrismaDriver extends BaseDriver
|
|
|
406
509
|
async loadOne(filters)
|
|
407
510
|
{
|
|
408
511
|
try {
|
|
512
|
+
let processedFilters = this.processFilters(filters);
|
|
409
513
|
let query = this.buildQueryOptions(false);
|
|
410
|
-
query.where =
|
|
514
|
+
query.where = processedFilters;
|
|
411
515
|
return await this.model.findFirst(query);
|
|
412
516
|
} catch(error) {
|
|
413
517
|
Logger.error('Load one error: '+error.message);
|
|
@@ -418,8 +522,9 @@ class PrismaDriver extends BaseDriver
|
|
|
418
522
|
async loadOneWithRelations(filters, relations)
|
|
419
523
|
{
|
|
420
524
|
try {
|
|
525
|
+
let processedFilters = this.processFilters(filters);
|
|
421
526
|
let query = this.buildQueryOptions(false);
|
|
422
|
-
query.where =
|
|
527
|
+
query.where = processedFilters;
|
|
423
528
|
if(sc.isArray(relations) && 0 < relations.length){
|
|
424
529
|
query.include = this.buildIncludeObject(relations);
|
|
425
530
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reldens/storage",
|
|
3
3
|
"scope": "@reldens",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.46.0",
|
|
5
5
|
"description": "Reldens - Storage",
|
|
6
6
|
"author": "Damian A. Pastorini",
|
|
7
7
|
"license": "MIT",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@mikro-orm/mongodb": "^6.4.15",
|
|
47
47
|
"@mikro-orm/mysql": "^6.4.15",
|
|
48
48
|
"@prisma/client": "^6.8.2",
|
|
49
|
-
"@reldens/server-utils": "^0.
|
|
49
|
+
"@reldens/server-utils": "^0.17.0",
|
|
50
50
|
"@reldens/utils": "^0.47.0",
|
|
51
51
|
"knex": "^3.1.0",
|
|
52
52
|
"mysql": "^2.18.1",
|