rez_core 5.0.10 → 5.0.12
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.
- package/dist/module/meta/service/entity-dynamic.service.js +86 -90
- package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
- package/dist/module/meta/service/entity-service-impl.service.js +2 -2
- package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/module/meta/service/entity-dynamic.service.ts +107 -118
- package/src/module/meta/service/entity-service-impl.service.ts +3 -3
package/package.json
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { level } from 'winston';
|
|
2
1
|
import { BadRequestException, Injectable } from '@nestjs/common';
|
|
3
|
-
import {
|
|
4
|
-
ENTITYTYPE_ENTITYMASTER,
|
|
5
|
-
STATUS_ACTIVE,
|
|
6
|
-
} from 'src/constant/global.constant';
|
|
2
|
+
import { STATUS_ACTIVE } from 'src/constant/global.constant';
|
|
7
3
|
import { DataSource } from 'typeorm';
|
|
8
4
|
import { UserData } from 'src/module/user/entity/user.entity';
|
|
9
5
|
import { MediaDataService } from './media-data.service';
|
|
10
6
|
import { ResolverService } from './resolver.service';
|
|
11
7
|
import { ConfigService } from '@nestjs/config';
|
|
12
|
-
import { EntityMasterService } from './entity-master.service';
|
|
13
8
|
import { EntityMasterRepository } from '../repository/entity-master.repository';
|
|
14
9
|
|
|
15
10
|
@Injectable()
|
|
@@ -20,7 +15,8 @@ export class EntityDynamicService {
|
|
|
20
15
|
private readonly resolverService: ResolverService,
|
|
21
16
|
private readonly configService: ConfigService,
|
|
22
17
|
private readonly entityMasterRepo: EntityMasterRepository,
|
|
23
|
-
) {
|
|
18
|
+
) {
|
|
19
|
+
}
|
|
24
20
|
|
|
25
21
|
// -----------------------------
|
|
26
22
|
async createEntity(
|
|
@@ -38,7 +34,10 @@ export class EntityDynamicService {
|
|
|
38
34
|
);
|
|
39
35
|
|
|
40
36
|
const statusList = await this.dataSource.query(
|
|
41
|
-
`SELECT id
|
|
37
|
+
`SELECT id
|
|
38
|
+
FROM frm_list_master_items
|
|
39
|
+
WHERE code = $1
|
|
40
|
+
AND organization_id = $2`,
|
|
42
41
|
[STATUS_ACTIVE, loggedInUser?.organization_id || 0],
|
|
43
42
|
);
|
|
44
43
|
|
|
@@ -59,8 +58,8 @@ export class EntityDynamicService {
|
|
|
59
58
|
if (!entityData.code && loggedInUser) {
|
|
60
59
|
const result = await this.dataSource.query(
|
|
61
60
|
`SELECT MAX(CAST(SUBSTRING(code, LENGTH(entity_type) + 1) AS UNSIGNED)) AS max_seq_no
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
FROM ${tableName}
|
|
62
|
+
WHERE entity_type = $1`,
|
|
64
63
|
[entityData.entity_type],
|
|
65
64
|
);
|
|
66
65
|
|
|
@@ -142,7 +141,8 @@ export class EntityDynamicService {
|
|
|
142
141
|
|
|
143
142
|
const placeholders = columns.map(() => '?').join(', ');
|
|
144
143
|
const escapedColumns = columns.map((col) => `\`${col}\``).join(', ');
|
|
145
|
-
const insertQuery = `INSERT INTO
|
|
144
|
+
const insertQuery = `INSERT INTO ${tableName} (${escapedColumns})
|
|
145
|
+
VALUES (${placeholders})`;
|
|
146
146
|
|
|
147
147
|
const result = await this.dataSource.query(insertQuery, values);
|
|
148
148
|
return result;
|
|
@@ -159,7 +159,10 @@ export class EntityDynamicService {
|
|
|
159
159
|
const organizationId = loggedInUser.organization_id;
|
|
160
160
|
|
|
161
161
|
const getRelation = await this.dataSource.query(
|
|
162
|
-
`SELECT *
|
|
162
|
+
`SELECT *
|
|
163
|
+
FROM frm_entity_relation
|
|
164
|
+
WHERE organization_id = $1
|
|
165
|
+
AND source_entity_type = $2`,
|
|
163
166
|
[organizationId, entityType],
|
|
164
167
|
);
|
|
165
168
|
|
|
@@ -200,7 +203,9 @@ export class EntityDynamicService {
|
|
|
200
203
|
);
|
|
201
204
|
|
|
202
205
|
await this.dataSource.query(
|
|
203
|
-
`INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type,
|
|
206
|
+
`INSERT INTO frm_entity_relation_data (organization_id, source_entity_id, source_entity_type,
|
|
207
|
+
target_entity_id, target_entity_type, relation_type)
|
|
208
|
+
VALUES ($1, $2, $3, $4, $5, $6)`,
|
|
204
209
|
[
|
|
205
210
|
organizationId,
|
|
206
211
|
mainID,
|
|
@@ -236,8 +241,10 @@ export class EntityDynamicService {
|
|
|
236
241
|
);
|
|
237
242
|
|
|
238
243
|
const relatedEntities = await this.dataSource.query(
|
|
239
|
-
`SELECT *
|
|
240
|
-
|
|
244
|
+
`SELECT *
|
|
245
|
+
FROM frm_entity_relation_data
|
|
246
|
+
WHERE source_entity_id = $1
|
|
247
|
+
AND target_entity_type IN (SELECT target_entity_type FROM frm_entity_relation WHERE source_entity_type = $2)`,
|
|
241
248
|
[id, entityType],
|
|
242
249
|
);
|
|
243
250
|
|
|
@@ -308,7 +315,10 @@ export class EntityDynamicService {
|
|
|
308
315
|
|
|
309
316
|
if (mappedEntities) {
|
|
310
317
|
const getRelationDefs = await this.dataSource.query(
|
|
311
|
-
`SELECT *
|
|
318
|
+
`SELECT *
|
|
319
|
+
FROM frm_entity_relation
|
|
320
|
+
WHERE organization_id = $1
|
|
321
|
+
AND source_entity_type = $2`,
|
|
312
322
|
[organizationId, entityType],
|
|
313
323
|
);
|
|
314
324
|
|
|
@@ -327,7 +337,11 @@ export class EntityDynamicService {
|
|
|
327
337
|
|
|
328
338
|
// Delete previous relations and related entities
|
|
329
339
|
const existingRelationsForType = await this.dataSource.query(
|
|
330
|
-
`SELECT *
|
|
340
|
+
`SELECT *
|
|
341
|
+
FROM frm_entity_relation_data
|
|
342
|
+
WHERE source_entity_type = $1
|
|
343
|
+
AND source_entity_id = $2
|
|
344
|
+
AND target_entity_type = $3`,
|
|
331
345
|
[entityType, id, targetEntityType],
|
|
332
346
|
);
|
|
333
347
|
|
|
@@ -384,9 +398,10 @@ export class EntityDynamicService {
|
|
|
384
398
|
|
|
385
399
|
// Insert relation as per new entity created
|
|
386
400
|
await this.dataSource.query(
|
|
387
|
-
`INSERT INTO frm_entity_relation_data
|
|
388
|
-
|
|
389
|
-
|
|
401
|
+
`INSERT INTO frm_entity_relation_data
|
|
402
|
+
(organization_id, source_entity_id, source_entity_type, target_entity_id, target_entity_type,
|
|
403
|
+
relation_type)
|
|
404
|
+
VALUES ($1, $2, $3, $4, $5, $6)`,
|
|
390
405
|
[
|
|
391
406
|
organizationId,
|
|
392
407
|
id,
|
|
@@ -435,100 +450,59 @@ export class EntityDynamicService {
|
|
|
435
450
|
const organizationId = loggedInUser.organization_id;
|
|
436
451
|
|
|
437
452
|
const tableName = await this.getTableName(entityType, organizationId);
|
|
438
|
-
const validAttributes = await this.getAttributeCodes(
|
|
439
|
-
entityType,
|
|
440
|
-
organizationId,
|
|
441
|
-
);
|
|
453
|
+
const validAttributes = await this.getAttributeCodes(entityType, organizationId);
|
|
442
454
|
|
|
443
455
|
const updates: string[] = [];
|
|
444
456
|
const values: any[] = [];
|
|
457
|
+
let idx = 1;
|
|
445
458
|
|
|
459
|
+
// Auto fields
|
|
446
460
|
entityData.modified_date = new Date();
|
|
447
461
|
if (loggedInUser) {
|
|
448
462
|
entityData.modified_by = loggedInUser.id;
|
|
463
|
+
|
|
449
464
|
if (!entityData.organization_id && entityData.entity_type !== 'ORG')
|
|
450
465
|
entityData.organization_id = loggedInUser.organization_id;
|
|
466
|
+
|
|
451
467
|
if (!entityData.enterprise_id)
|
|
452
468
|
entityData.enterprise_id = loggedInUser.enterprise_id;
|
|
453
469
|
}
|
|
454
470
|
|
|
455
|
-
// Set parent_id if mainID is provided
|
|
456
471
|
if (mainID) {
|
|
457
472
|
entityData.parent_id = mainID;
|
|
458
473
|
}
|
|
459
474
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
attribute_key: 'modified_date',
|
|
475
|
-
db_datatype: 'datetime',
|
|
476
|
-
element_type: 'date',
|
|
477
|
-
is_hidden: false,
|
|
478
|
-
},
|
|
479
|
-
{
|
|
480
|
-
attribute_key: 'modified_by',
|
|
481
|
-
db_datatype: 'int',
|
|
482
|
-
element_type: 'number',
|
|
483
|
-
is_hidden: false,
|
|
484
|
-
},
|
|
485
|
-
{
|
|
486
|
-
attribute_key: 'organization_id',
|
|
487
|
-
db_datatype: 'int',
|
|
488
|
-
element_type: 'number',
|
|
489
|
-
is_hidden: false,
|
|
490
|
-
},
|
|
491
|
-
{
|
|
492
|
-
attribute_key: 'enterprise_id',
|
|
493
|
-
db_datatype: 'int',
|
|
494
|
-
element_type: 'number',
|
|
495
|
-
is_hidden: false,
|
|
496
|
-
},
|
|
497
|
-
{
|
|
498
|
-
attribute_key: 'level_type',
|
|
499
|
-
db_datatype: 'varchar',
|
|
500
|
-
element_type: 'text',
|
|
501
|
-
is_hidden: false,
|
|
502
|
-
},
|
|
503
|
-
{ attribute_key: 'level_id', db_datatype: 'int', element_type: 'number', is_hidden: false },
|
|
504
|
-
{ attribute_key: 'status', db_datatype: 'varchar', element_type: 'text', is_hidden: false },
|
|
505
|
-
{
|
|
506
|
-
attribute_key: 'entity_type',
|
|
507
|
-
db_datatype: 'varchar',
|
|
508
|
-
element_type: 'text',
|
|
509
|
-
is_hidden: false,
|
|
510
|
-
},
|
|
511
|
-
{ attribute_key: 'code', db_datatype: 'varchar', element_type: 'text', is_hidden: false },
|
|
512
|
-
{
|
|
513
|
-
attribute_key: 'parent_id',
|
|
514
|
-
db_datatype: 'int',
|
|
515
|
-
element_type: 'number',
|
|
516
|
-
is_hidden: false,
|
|
517
|
-
},
|
|
475
|
+
// Add bypass columns if needed
|
|
476
|
+
const bypassColumns = [
|
|
477
|
+
'created_date',
|
|
478
|
+
'created_by',
|
|
479
|
+
'modified_date',
|
|
480
|
+
'modified_by',
|
|
481
|
+
'organization_id',
|
|
482
|
+
'enterprise_id',
|
|
483
|
+
'level_type',
|
|
484
|
+
'level_id',
|
|
485
|
+
'status',
|
|
486
|
+
'entity_type',
|
|
487
|
+
'code',
|
|
488
|
+
'parent_id',
|
|
518
489
|
];
|
|
519
490
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
491
|
+
for (const col of bypassColumns) {
|
|
492
|
+
if (!validAttributes.some((attr) => attr.attribute_key === col)) {
|
|
493
|
+
validAttributes.push({
|
|
494
|
+
attribute_key: col,
|
|
495
|
+
db_datatype: 'text',
|
|
496
|
+
element_type: 'text',
|
|
497
|
+
is_hidden: false,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
}
|
|
528
501
|
|
|
502
|
+
// Build SET clause
|
|
529
503
|
for (const key of Object.keys(entityData)) {
|
|
530
504
|
if (validAttributes.some((attr) => attr.attribute_key === key)) {
|
|
531
|
-
updates.push(
|
|
505
|
+
updates.push(`${key} = $${idx++}`);
|
|
532
506
|
values.push(entityData[key]);
|
|
533
507
|
}
|
|
534
508
|
}
|
|
@@ -537,11 +511,17 @@ export class EntityDynamicService {
|
|
|
537
511
|
throw new Error('No valid attributes to update.');
|
|
538
512
|
}
|
|
539
513
|
|
|
540
|
-
|
|
541
|
-
|
|
514
|
+
// WHERE clause placeholder
|
|
515
|
+
const idPlaceholder = `$${idx}`;
|
|
516
|
+
values.push(id);
|
|
542
517
|
|
|
543
|
-
const
|
|
544
|
-
|
|
518
|
+
const updateQuery = `
|
|
519
|
+
UPDATE ${tableName}
|
|
520
|
+
SET ${updates.join(', ')}
|
|
521
|
+
WHERE id = ${idPlaceholder}
|
|
522
|
+
`;
|
|
523
|
+
|
|
524
|
+
return await this.dataSource.query(updateQuery, values);
|
|
545
525
|
}
|
|
546
526
|
|
|
547
527
|
async getEntityByDataSource(
|
|
@@ -564,7 +544,9 @@ export class EntityDynamicService {
|
|
|
564
544
|
const columns = validAttributes
|
|
565
545
|
.map((attr) => `${attr.attribute_key}`)
|
|
566
546
|
.join(', ');
|
|
567
|
-
const selectQuery = `SELECT ${columns}
|
|
547
|
+
const selectQuery = `SELECT ${columns}
|
|
548
|
+
FROM ${dataSource}
|
|
549
|
+
WHERE id = $1`;
|
|
568
550
|
|
|
569
551
|
const result = await this.dataSource.query(selectQuery, [id]);
|
|
570
552
|
if (!result.length) return null;
|
|
@@ -585,15 +567,16 @@ export class EntityDynamicService {
|
|
|
585
567
|
row[attr.attribute_key] =
|
|
586
568
|
row[attr.attribute_key] != null
|
|
587
569
|
? await this.mediaDataService.getMediaDownloadUrl(
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
570
|
+
Number(row[attr.attribute_key]),
|
|
571
|
+
loggedInUser,
|
|
572
|
+
)
|
|
591
573
|
: null;
|
|
592
574
|
}
|
|
593
575
|
}
|
|
594
576
|
|
|
595
577
|
return row;
|
|
596
578
|
}
|
|
579
|
+
|
|
597
580
|
// -----------------------------
|
|
598
581
|
//TODO : make it normal getEntity function make another function if for resolve data
|
|
599
582
|
async getEntity(
|
|
@@ -616,7 +599,9 @@ export class EntityDynamicService {
|
|
|
616
599
|
const columns = validAttributes
|
|
617
600
|
.map((attr) => `${attr.attribute_key}`)
|
|
618
601
|
.join(', ');
|
|
619
|
-
const selectQuery = `SELECT ${columns}
|
|
602
|
+
const selectQuery = `SELECT ${columns}
|
|
603
|
+
FROM ${tableName}
|
|
604
|
+
WHERE id = $1`;
|
|
620
605
|
|
|
621
606
|
const result = await this.dataSource.query(selectQuery, [id]);
|
|
622
607
|
if (!result.length) return null;
|
|
@@ -637,9 +622,9 @@ export class EntityDynamicService {
|
|
|
637
622
|
row[attr.attribute_key] =
|
|
638
623
|
row[attr.attribute_key] != null
|
|
639
624
|
? await this.mediaDataService.getMediaDownloadUrl(
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
625
|
+
Number(row[attr.attribute_key]),
|
|
626
|
+
loggedInUser,
|
|
627
|
+
)
|
|
643
628
|
: null;
|
|
644
629
|
}
|
|
645
630
|
}
|
|
@@ -667,16 +652,15 @@ export class EntityDynamicService {
|
|
|
667
652
|
entityType: string,
|
|
668
653
|
organizationId: string,
|
|
669
654
|
): Promise<string> {
|
|
670
|
-
const result = await this.dataSource.query(
|
|
671
|
-
`SELECT db_table_name FROM frm_entity_master WHERE organization_id = $1 AND mapped_entity_type = $2`,
|
|
672
|
-
[organizationId, entityType],
|
|
673
|
-
);
|
|
674
655
|
|
|
675
|
-
|
|
656
|
+
let entityMaster = await this.entityMasterRepo.getEntityByMappedEntityType(entityType, organizationId);
|
|
657
|
+
|
|
658
|
+
if (!entityMaster) {
|
|
676
659
|
console.log(`Entity type '${entityType}' not found in frm_entity_master`);
|
|
660
|
+
throw new BadRequestException();
|
|
677
661
|
}
|
|
678
662
|
|
|
679
|
-
return
|
|
663
|
+
return entityMaster.db_table_name;
|
|
680
664
|
}
|
|
681
665
|
|
|
682
666
|
private async getAttributeCodes(
|
|
@@ -719,7 +703,9 @@ export class EntityDynamicService {
|
|
|
719
703
|
|
|
720
704
|
const tableName = await this.getTableName(entityType, organizationId);
|
|
721
705
|
|
|
722
|
-
const deleteQuery = `DELETE
|
|
706
|
+
const deleteQuery = `DELETE
|
|
707
|
+
FROM \`${tableName}\`
|
|
708
|
+
WHERE id = $1`;
|
|
723
709
|
const result = await this.dataSource.query(deleteQuery, [id]);
|
|
724
710
|
return result;
|
|
725
711
|
}
|
|
@@ -732,7 +718,9 @@ export class EntityDynamicService {
|
|
|
732
718
|
): Promise<any> {
|
|
733
719
|
const organizationId = loggedInUser.organization_id;
|
|
734
720
|
|
|
735
|
-
let query = `SELECT name as label,mapped_entity_type as value
|
|
721
|
+
let query = `SELECT name as label, mapped_entity_type as value
|
|
722
|
+
FROM frm_entity_master
|
|
723
|
+
WHERE organization_id = $1`;
|
|
736
724
|
const params = [organizationId];
|
|
737
725
|
|
|
738
726
|
if (appcode) {
|
|
@@ -749,9 +737,10 @@ export class EntityDynamicService {
|
|
|
749
737
|
|
|
750
738
|
// 1. Get db_table_name from entity master
|
|
751
739
|
const result = await this.dataSource.query(
|
|
752
|
-
`SELECT db_table_name
|
|
753
|
-
|
|
754
|
-
|
|
740
|
+
`SELECT db_table_name
|
|
741
|
+
FROM frm_entity_master
|
|
742
|
+
WHERE mapped_entity_type = $1
|
|
743
|
+
AND organization_id = $2`,
|
|
755
744
|
[entityType, organizationId],
|
|
756
745
|
);
|
|
757
746
|
|
|
@@ -766,8 +755,8 @@ export class EntityDynamicService {
|
|
|
766
755
|
// 2. Get current max sequence number from that table
|
|
767
756
|
const seqResult = await this.dataSource.query(
|
|
768
757
|
`SELECT MAX(CAST(SUBSTRING(code, LENGTH(entity_type) + 1) AS UNSIGNED)) AS max_seq_no
|
|
769
|
-
|
|
770
|
-
|
|
758
|
+
FROM \`${tableName}\`
|
|
759
|
+
WHERE entity_type = $1`,
|
|
771
760
|
[entityType],
|
|
772
761
|
);
|
|
773
762
|
|
|
@@ -825,7 +814,7 @@ export class EntityDynamicService {
|
|
|
825
814
|
|
|
826
815
|
async queryWithSchema(sql: string, params: any[] = []) {
|
|
827
816
|
await this.dataSource.query('BEGIN');
|
|
828
|
-
const schema = this.configService.get<string>('DB_SCHEMA')
|
|
817
|
+
const schema = this.configService.get<string>('DB_SCHEMA');
|
|
829
818
|
await this.dataSource.query(`SET LOCAL search_path TO ${schema}`);
|
|
830
819
|
const result = await this.dataSource.query(sql, params);
|
|
831
820
|
await this.dataSource.query('COMMIT');
|
|
@@ -102,9 +102,9 @@ export class EntityServiceImpl implements EntityService<BaseEntity> {
|
|
|
102
102
|
const statusList = await repo.query(
|
|
103
103
|
`SELECT id
|
|
104
104
|
FROM frm_list_master_items
|
|
105
|
-
WHERE code =
|
|
106
|
-
AND organization_id =
|
|
107
|
-
[STATUS_ACTIVE, loggedInUser?.organization_id ||
|
|
105
|
+
WHERE code = $1
|
|
106
|
+
AND organization_id = $2`,
|
|
107
|
+
[STATUS_ACTIVE, loggedInUser?.organization_id || 0],
|
|
108
108
|
);
|
|
109
109
|
|
|
110
110
|
console.log('Status List:', statusList); // Debug log
|