rez_core 6.5.75 → 6.5.77
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/constant/db-data-type.constant.d.ts +30 -0
- package/dist/constant/db-data-type.constant.js +59 -0
- package/dist/constant/db-data-type.constant.js.map +1 -0
- package/dist/constant/storage-type.constant.d.ts +4 -0
- package/dist/constant/storage-type.constant.js +9 -0
- package/dist/constant/storage-type.constant.js.map +1 -0
- package/dist/module/eav/controller/eav.controller.d.ts +21 -0
- package/dist/module/eav/controller/eav.controller.js +127 -0
- package/dist/module/eav/controller/eav.controller.js.map +1 -0
- package/dist/module/eav/dto/eav-operation.dto.d.ts +20 -0
- package/dist/module/eav/dto/eav-operation.dto.js +75 -0
- package/dist/module/eav/dto/eav-operation.dto.js.map +1 -0
- package/dist/module/eav/eav.module.d.ts +2 -0
- package/dist/module/eav/eav.module.js +84 -0
- package/dist/module/eav/eav.module.js.map +1 -0
- package/dist/module/eav/entity/eav-boolean.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-boolean.entity.js +48 -0
- package/dist/module/eav/entity/eav-boolean.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-date.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-date.entity.js +48 -0
- package/dist/module/eav/entity/eav-date.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-decimal.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-decimal.entity.js +48 -0
- package/dist/module/eav/entity/eav-decimal.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-int.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-int.entity.js +48 -0
- package/dist/module/eav/entity/eav-int.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-json.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-json.entity.js +48 -0
- package/dist/module/eav/entity/eav-json.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-text.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-text.entity.js +48 -0
- package/dist/module/eav/entity/eav-text.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-time.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-time.entity.js +48 -0
- package/dist/module/eav/entity/eav-time.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-timestamp.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-timestamp.entity.js +48 -0
- package/dist/module/eav/entity/eav-timestamp.entity.js.map +1 -0
- package/dist/module/eav/entity/eav-varchar.entity.d.ts +9 -0
- package/dist/module/eav/entity/eav-varchar.entity.js +48 -0
- package/dist/module/eav/entity/eav-varchar.entity.js.map +1 -0
- package/dist/module/eav/interface/eav-strategy.interface.d.ts +8 -0
- package/dist/module/eav/interface/eav-strategy.interface.js +3 -0
- package/dist/module/eav/interface/eav-strategy.interface.js.map +1 -0
- package/dist/module/eav/repository/eav-boolean.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-boolean.repository.js +57 -0
- package/dist/module/eav/repository/eav-boolean.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-date.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-date.repository.js +57 -0
- package/dist/module/eav/repository/eav-date.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-decimal.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-decimal.repository.js +57 -0
- package/dist/module/eav/repository/eav-decimal.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-int.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-int.repository.js +57 -0
- package/dist/module/eav/repository/eav-int.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-json.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-json.repository.js +57 -0
- package/dist/module/eav/repository/eav-json.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-text.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-text.repository.js +57 -0
- package/dist/module/eav/repository/eav-text.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-time.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-time.repository.js +57 -0
- package/dist/module/eav/repository/eav-time.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-timestamp.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-timestamp.repository.js +57 -0
- package/dist/module/eav/repository/eav-timestamp.repository.js.map +1 -0
- package/dist/module/eav/repository/eav-varchar.repository.d.ts +13 -0
- package/dist/module/eav/repository/eav-varchar.repository.js +57 -0
- package/dist/module/eav/repository/eav-varchar.repository.js.map +1 -0
- package/dist/module/eav/service/eav-boolean.service.d.ts +12 -0
- package/dist/module/eav/service/eav-boolean.service.js +59 -0
- package/dist/module/eav/service/eav-boolean.service.js.map +1 -0
- package/dist/module/eav/service/eav-date.service.d.ts +12 -0
- package/dist/module/eav/service/eav-date.service.js +59 -0
- package/dist/module/eav/service/eav-date.service.js.map +1 -0
- package/dist/module/eav/service/eav-decimal.service.d.ts +12 -0
- package/dist/module/eav/service/eav-decimal.service.js +59 -0
- package/dist/module/eav/service/eav-decimal.service.js.map +1 -0
- package/dist/module/eav/service/eav-factory.service.d.ts +26 -0
- package/dist/module/eav/service/eav-factory.service.js +81 -0
- package/dist/module/eav/service/eav-factory.service.js.map +1 -0
- package/dist/module/eav/service/eav-int.service.d.ts +12 -0
- package/dist/module/eav/service/eav-int.service.js +59 -0
- package/dist/module/eav/service/eav-int.service.js.map +1 -0
- package/dist/module/eav/service/eav-json.service.d.ts +12 -0
- package/dist/module/eav/service/eav-json.service.js +59 -0
- package/dist/module/eav/service/eav-json.service.js.map +1 -0
- package/dist/module/eav/service/eav-text.service.d.ts +12 -0
- package/dist/module/eav/service/eav-text.service.js +59 -0
- package/dist/module/eav/service/eav-text.service.js.map +1 -0
- package/dist/module/eav/service/eav-time.service.d.ts +12 -0
- package/dist/module/eav/service/eav-time.service.js +59 -0
- package/dist/module/eav/service/eav-time.service.js.map +1 -0
- package/dist/module/eav/service/eav-timestamp.service.d.ts +12 -0
- package/dist/module/eav/service/eav-timestamp.service.js +59 -0
- package/dist/module/eav/service/eav-timestamp.service.js.map +1 -0
- package/dist/module/eav/service/eav-varchar.service.d.ts +12 -0
- package/dist/module/eav/service/eav-varchar.service.js +59 -0
- package/dist/module/eav/service/eav-varchar.service.js.map +1 -0
- package/dist/module/eav/service/eav.service.d.ts +14 -0
- package/dist/module/eav/service/eav.service.js +65 -0
- package/dist/module/eav/service/eav.service.js.map +1 -0
- package/dist/module/enterprise/entity/brand.entity.d.ts +0 -0
- package/dist/module/enterprise/entity/brand.entity.js +1 -0
- package/dist/module/enterprise/entity/brand.entity.js.map +1 -0
- package/dist/module/enterprise/entity/school.entity.d.ts +0 -0
- package/dist/module/enterprise/entity/school.entity.js +1 -0
- package/dist/module/enterprise/entity/school.entity.js.map +1 -0
- package/dist/module/enterprise/repository/brand.repository.d.ts +0 -0
- package/dist/module/enterprise/repository/brand.repository.js +1 -0
- package/dist/module/enterprise/repository/brand.repository.js.map +1 -0
- package/dist/module/meta/entity/brand-profile.entity.d.ts +3 -0
- package/dist/module/meta/entity/brand-profile.entity.js +18 -0
- package/dist/module/meta/entity/brand-profile.entity.js.map +1 -0
- package/dist/module/meta/entity/dynamic.entity.d.ts +3 -0
- package/dist/module/meta/entity/dynamic.entity.js +8 -0
- package/dist/module/meta/entity/dynamic.entity.js.map +1 -0
- package/dist/module/meta/entity/field-group.entity.d.ts +0 -0
- package/dist/module/meta/entity/field-group.entity.js +1 -0
- package/dist/module/meta/entity/field-group.entity.js.map +1 -0
- package/dist/module/meta/entity/school.entity.d.ts +8 -0
- package/dist/module/meta/entity/school.entity.js +44 -0
- package/dist/module/meta/entity/school.entity.js.map +1 -0
- package/dist/module/meta/entity/schoolAddress.entity.d.ts +9 -0
- package/dist/module/meta/entity/schoolAddress.entity.js +48 -0
- package/dist/module/meta/entity/schoolAddress.entity.js.map +1 -0
- package/dist/module/meta/entity/section-master.entity.d.ts +0 -0
- package/dist/module/meta/entity/section-master.entity.js +1 -0
- package/dist/module/meta/entity/section-master.entity.js.map +1 -0
- package/dist/module/meta/entity/user-app-mapping.entity.d.ts +0 -0
- package/dist/module/meta/entity/user-app-mapping.entity.js +1 -0
- package/dist/module/meta/entity/user-app-mapping.entity.js.map +1 -0
- package/dist/resources/dev.properties.yaml +31 -0
- package/dist/resources/local.properties.yaml +27 -0
- package/dist/resources/uat.properties.yaml +31 -0
- package/dist/table.config.d.ts +3 -3
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/app.module.ts +3 -1
- package/src/constant/db-data-type.constant.ts +81 -0
- package/src/constant/storage-type.constant.ts +4 -0
- package/src/module/eav/EAV_USAGE_GUIDE.md +351 -0
- package/src/module/eav/controller/eav.controller.ts +119 -0
- package/src/module/eav/dto/eav-operation.dto.ts +62 -0
- package/src/module/eav/eav.module.ts +80 -0
- package/src/module/eav/entity/eav-boolean.entity.ts +26 -0
- package/src/module/eav/entity/eav-date.entity.ts +25 -0
- package/src/module/eav/entity/eav-decimal.entity.ts +25 -0
- package/src/module/eav/entity/eav-int.entity.ts +25 -0
- package/src/module/eav/entity/eav-json.entity.ts +25 -0
- package/src/module/eav/entity/eav-text.entity.ts +25 -0
- package/src/module/eav/entity/eav-time.entity.ts +25 -0
- package/src/module/eav/entity/eav-timestamp.entity.ts +25 -0
- package/src/module/eav/entity/eav-varchar.entity.ts +25 -0
- package/src/module/eav/interface/eav-strategy.interface.ts +32 -0
- package/src/module/eav/repository/eav-boolean.repository.ts +67 -0
- package/src/module/eav/repository/eav-date.repository.ts +67 -0
- package/src/module/eav/repository/eav-decimal.repository.ts +67 -0
- package/src/module/eav/repository/eav-int.repository.ts +67 -0
- package/src/module/eav/repository/eav-json.repository.ts +67 -0
- package/src/module/eav/repository/eav-text.repository.ts +67 -0
- package/src/module/eav/repository/eav-time.repository.ts +67 -0
- package/src/module/eav/repository/eav-timestamp.repository.ts +67 -0
- package/src/module/eav/repository/eav-varchar.repository.ts +67 -0
- package/src/module/eav/service/eav-boolean.service.ts +64 -0
- package/src/module/eav/service/eav-date.service.ts +64 -0
- package/src/module/eav/service/eav-decimal.service.ts +64 -0
- package/src/module/eav/service/eav-factory.service.ts +93 -0
- package/src/module/eav/service/eav-int.service.ts +64 -0
- package/src/module/eav/service/eav-json.service.ts +64 -0
- package/src/module/eav/service/eav-text.service.ts +64 -0
- package/src/module/eav/service/eav-time.service.ts +64 -0
- package/src/module/eav/service/eav-timestamp.service.ts +64 -0
- package/src/module/eav/service/eav-varchar.service.ts +65 -0
- package/src/module/eav/service/eav.service.ts +116 -0
- package/src/module/listmaster/service/list-master-item.service.ts +11 -61
- package/src/module/meta/controller/entity.controller.ts +2 -10
- package/src/module/meta/entity/base-entity.entity.ts +3 -0
- package/src/module/meta/entity/dynamic.entity.ts +4 -0
- package/src/module/meta/entity/entity-master.entity.ts +16 -52
- package/src/module/meta/service/entity-master.service.ts +135 -6
- package/src/module/meta/service/media-data.service.ts +0 -206
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DataSource, Repository } from 'typeorm';
|
|
1
|
+
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { DataSource, EntityManager, Repository } from 'typeorm';
|
|
3
3
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
4
4
|
import { EntityMaster } from '../entity/entity-master.entity';
|
|
5
5
|
import { EntityMasterRepository } from '../repository/entity-master.repository';
|
|
6
6
|
import { ListMasterService } from 'src/module/listmaster/service/list-master.service';
|
|
7
7
|
import { SavedFilterRepositoryService } from 'src/module/filter/repository/saved-filter.repository';
|
|
8
8
|
import { AttributeMasterRepository } from '../repository/attribute-master.repository';
|
|
9
|
+
import { StorageType } from '../../../constant/storage-type.constant';
|
|
10
|
+
import { BaseEntity } from '../entity/base-entity.entity';
|
|
11
|
+
import { UserData } from '../../user/entity/user.entity';
|
|
12
|
+
import { EntityDynamicService } from './entity-dynamic.service';
|
|
9
13
|
|
|
10
14
|
@Injectable()
|
|
11
15
|
export class EntityMasterService {
|
|
@@ -15,17 +19,143 @@ export class EntityMasterService {
|
|
|
15
19
|
private attributeMasterRepo: AttributeMasterRepository,
|
|
16
20
|
private entityMasterRepo: EntityMasterRepository,
|
|
17
21
|
private readonly dataSource: DataSource,
|
|
22
|
+
@Inject('EntityDynamicService')
|
|
23
|
+
private readonly entityService: EntityDynamicService,
|
|
18
24
|
@Inject('ListMasterService')
|
|
19
25
|
private readonly listMasterService: ListMasterService,
|
|
20
26
|
private readonly savedFilterRepoService: SavedFilterRepositoryService,
|
|
21
|
-
) {
|
|
27
|
+
) {
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Override createEntity to add dynamic table creation for SELF storage type
|
|
32
|
+
*/
|
|
33
|
+
async createEntity(
|
|
34
|
+
entityData: BaseEntity,
|
|
35
|
+
loggedInUser: UserData | null,
|
|
36
|
+
manager?: EntityManager | null,
|
|
37
|
+
) {
|
|
38
|
+
// Cast to EntityMaster to access specific fields
|
|
39
|
+
const entityMasterData = entityData as unknown as EntityMaster;
|
|
40
|
+
|
|
41
|
+
// Validate required fields for entity master
|
|
42
|
+
if (!entityMasterData.mapped_entity_type) {
|
|
43
|
+
throw new BadRequestException('mapped_entity_type is required');
|
|
44
|
+
}
|
|
45
|
+
if (!entityMasterData.app_id) {
|
|
46
|
+
throw new BadRequestException('app_id is required');
|
|
47
|
+
}
|
|
48
|
+
if (!entityMasterData.storage_type) {
|
|
49
|
+
throw new BadRequestException('storage_type is required');
|
|
50
|
+
}
|
|
51
|
+
if (!entityMasterData.db_table_name) {
|
|
52
|
+
throw new BadRequestException('db_table_name is required');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Validate that table name doesn't already exist
|
|
56
|
+
const existingByTable = await this.getEntityByTableName(entityMasterData.db_table_name);
|
|
57
|
+
if (existingByTable) {
|
|
58
|
+
throw new BadRequestException(
|
|
59
|
+
`Table with name "${entityMasterData.db_table_name}" already exists`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Validate that mapped_entity_type doesn't already exist for this enterprise
|
|
64
|
+
if (loggedInUser) {
|
|
65
|
+
const existingByType = await this.entityMasterRepository.findOne({
|
|
66
|
+
where: {
|
|
67
|
+
mapped_entity_type: entityMasterData.mapped_entity_type,
|
|
68
|
+
enterprise_id: loggedInUser.enterprise_id,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
if (existingByType) {
|
|
72
|
+
throw new BadRequestException(
|
|
73
|
+
`Entity with mapped_entity_type "${entityMasterData.mapped_entity_type}" already exists`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Create table if storage_type is SELF
|
|
79
|
+
if (entityMasterData.storage_type === StorageType.SELF) {
|
|
80
|
+
await this.createDatabaseTable(
|
|
81
|
+
entityMasterData.db_table_name,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Call parent createEntity method to handle standard entity creation
|
|
86
|
+
return await this.entityService.createEntity(entityData, loggedInUser);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Create a database table with all BaseEntity columns
|
|
91
|
+
*/
|
|
92
|
+
private async createDatabaseTable(
|
|
93
|
+
tableName: string,
|
|
94
|
+
): Promise<void> {
|
|
95
|
+
const queryRunner = this.dataSource.createQueryRunner();
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
await queryRunner.connect();
|
|
99
|
+
|
|
100
|
+
// Check if table already exists
|
|
101
|
+
const tableExists = await queryRunner.hasTable(tableName);
|
|
102
|
+
if (tableExists) {
|
|
103
|
+
throw new BadRequestException(`Table "${tableName}" already exists in database`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Create table with all BaseEntity columns
|
|
107
|
+
const createTableQuery = `
|
|
108
|
+
CREATE TABLE ${tableName} (
|
|
109
|
+
id BIGSERIAL PRIMARY KEY,
|
|
110
|
+
entity_type VARCHAR(50),
|
|
111
|
+
code VARCHAR(100),
|
|
112
|
+
name VARCHAR(255),
|
|
113
|
+
description VARCHAR(1000),
|
|
114
|
+
status VARCHAR(50),
|
|
115
|
+
seq_no BIGINT,
|
|
116
|
+
created_by BIGINT,
|
|
117
|
+
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
118
|
+
modified_by BIGINT,
|
|
119
|
+
modified_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
120
|
+
enterprise_id INTEGER,
|
|
121
|
+
level_type VARCHAR(25),
|
|
122
|
+
level_id INTEGER,
|
|
123
|
+
parent_type VARCHAR(100),
|
|
124
|
+
parent_id BIGINT
|
|
125
|
+
)
|
|
126
|
+
`;
|
|
127
|
+
|
|
128
|
+
await queryRunner.query(createTableQuery);
|
|
129
|
+
|
|
130
|
+
// Create indexes for common query patterns
|
|
131
|
+
await queryRunner.query(
|
|
132
|
+
`CREATE INDEX idx_${tableName}_entity_type ON ${tableName}(entity_type)`,
|
|
133
|
+
);
|
|
134
|
+
await queryRunner.query(
|
|
135
|
+
`CREATE INDEX idx_${tableName}_code ON ${tableName}(code)`,
|
|
136
|
+
);
|
|
137
|
+
await queryRunner.query(
|
|
138
|
+
`CREATE INDEX idx_${tableName}_enterprise ON ${tableName}(enterprise_id)`,
|
|
139
|
+
);
|
|
140
|
+
await queryRunner.query(
|
|
141
|
+
`CREATE INDEX idx_${tableName}_parent ON ${tableName}(parent_type, parent_id)`,
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new BadRequestException(
|
|
146
|
+
`Failed to create table "${tableName}": ${error.message}`,
|
|
147
|
+
);
|
|
148
|
+
} finally {
|
|
149
|
+
await queryRunner.release();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
22
152
|
|
|
23
153
|
async getEntityById(id: number): Promise<EntityMaster | null> {
|
|
24
154
|
return this.entityMasterRepo.getEntityById(id);
|
|
25
155
|
}
|
|
26
156
|
|
|
27
|
-
async getAllEntityDropDown(entity_type:string,loggedInUser): Promise<{ label: string; value: any }[]>{
|
|
28
|
-
return this.entityMasterRepo.getAllEntityDropdownData(entity_type,loggedInUser);
|
|
157
|
+
async getAllEntityDropDown(entity_type: string, loggedInUser): Promise<{ label: string; value: any }[]> {
|
|
158
|
+
return this.entityMasterRepo.getAllEntityDropdownData(entity_type, loggedInUser);
|
|
29
159
|
}
|
|
30
160
|
|
|
31
161
|
async getEntityData(
|
|
@@ -167,5 +297,4 @@ export class EntityMasterService {
|
|
|
167
297
|
);
|
|
168
298
|
}
|
|
169
299
|
|
|
170
|
-
|
|
171
300
|
}
|
|
@@ -236,212 +236,6 @@ export class MediaDataService extends EntityServiceImpl {
|
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
238
|
|
|
239
|
-
public async buildUploadPathGenericdd(
|
|
240
|
-
mappedEntityType: string,
|
|
241
|
-
loggedInUser,
|
|
242
|
-
mappedEntityId?: number,
|
|
243
|
-
parentId?: number,
|
|
244
|
-
parentType?: string,
|
|
245
|
-
) {
|
|
246
|
-
// 1️⃣ Fetch entity metadata
|
|
247
|
-
const entityMaster = await this.entityMasterService.getEntityData(
|
|
248
|
-
mappedEntityType,
|
|
249
|
-
loggedInUser,
|
|
250
|
-
);
|
|
251
|
-
if (!entityMaster) {
|
|
252
|
-
throw new Error(`Entity master not found for ${mappedEntityType}`);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
let pathTemplate = entityMaster.doc_upload_path ?? '';
|
|
256
|
-
const entityOverwrite = entityMaster.overwrite_path ?? 0;
|
|
257
|
-
|
|
258
|
-
if (!pathTemplate) {
|
|
259
|
-
throw new Error(`doc_upload_path not defined for ${mappedEntityType}`);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// 2️⃣ Prepare replacement map
|
|
263
|
-
const replacements: Record<string, string | null> = {};
|
|
264
|
-
|
|
265
|
-
// --- ORG ---
|
|
266
|
-
const organizationRepo =
|
|
267
|
-
this.reflectionHelper.getRepoService('OrganizationData');
|
|
268
|
-
let organizationData = await organizationRepo.findOne({
|
|
269
|
-
where: {
|
|
270
|
-
id: loggedInUser.organization_id,
|
|
271
|
-
},
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
replacements['org_code'] = organizationData.code;
|
|
275
|
-
|
|
276
|
-
// --- LEVEL CODE ---
|
|
277
|
-
// Priority: If parent is provided, use parent for level_code; otherwise use normal logic
|
|
278
|
-
let levelEntityId: number;
|
|
279
|
-
let levelEntityType: string;
|
|
280
|
-
|
|
281
|
-
if (parentId && parentType) {
|
|
282
|
-
// When parent is provided, parent becomes the level_code
|
|
283
|
-
levelEntityId = parentId;
|
|
284
|
-
levelEntityType = parentType;
|
|
285
|
-
} else {
|
|
286
|
-
// Normal logic: determine which entity to use for level_code
|
|
287
|
-
levelEntityId = entityOverwrite ? mappedEntityId : loggedInUser.level_id;
|
|
288
|
-
levelEntityType = entityOverwrite
|
|
289
|
-
? mappedEntityType
|
|
290
|
-
: loggedInUser.level_type;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// Get entity data for level_code
|
|
294
|
-
const getEntityData = await this.entityMasterService.getEntityData(
|
|
295
|
-
levelEntityType,
|
|
296
|
-
loggedInUser,
|
|
297
|
-
);
|
|
298
|
-
|
|
299
|
-
if (!getEntityData) return null;
|
|
300
|
-
const levelEntityDataResult = await this.entityManager.query(
|
|
301
|
-
`SELECT *
|
|
302
|
-
FROM ${getEntityData?.db_table_name}
|
|
303
|
-
WHERE id = $1`,
|
|
304
|
-
[levelEntityId],
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
const levelEntityData = levelEntityDataResult[0] || null;
|
|
308
|
-
|
|
309
|
-
if (levelEntityData?.code) {
|
|
310
|
-
replacements['level_code'] = levelEntityData.code; // universal alias
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// --- MAPPED ENTITY CODE (when parent is provided) ---
|
|
314
|
-
// When parent is provided, the mapped entity becomes an additional level
|
|
315
|
-
if (parentId && parentType && mappedEntityId && mappedEntityType) {
|
|
316
|
-
const mappedEntityKey = `${mappedEntityType.toLowerCase()}_code`;
|
|
317
|
-
const mappedEntityData = await super.getEntityData(
|
|
318
|
-
mappedEntityType,
|
|
319
|
-
mappedEntityId,
|
|
320
|
-
loggedInUser,
|
|
321
|
-
);
|
|
322
|
-
if (mappedEntityData?.code) {
|
|
323
|
-
replacements[mappedEntityKey] = mappedEntityData.code;
|
|
324
|
-
|
|
325
|
-
// Modify path template to include mapped entity
|
|
326
|
-
// Example: ${org_code}/${level_code} becomes ${org_code}/${level_code}/${tem_code}
|
|
327
|
-
const mappedVariable = `\${${mappedEntityKey}}`;
|
|
328
|
-
if (!pathTemplate.includes(mappedVariable)) {
|
|
329
|
-
pathTemplate = pathTemplate + `/${mappedVariable}`;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// --- TEMPLATE CODE (if parent is provided) ---
|
|
335
|
-
// Special handling for template_code when parent_id and parent_type are provided
|
|
336
|
-
if (parentId && parentType) {
|
|
337
|
-
// const templateEntityData = await super.getEntityData(
|
|
338
|
-
// parentType,
|
|
339
|
-
// parentId,
|
|
340
|
-
// loggedInUser,
|
|
341
|
-
// );
|
|
342
|
-
|
|
343
|
-
// Get entity data for level_code
|
|
344
|
-
const getEntityData = await this.entityMasterService.getEntityData(
|
|
345
|
-
mappedEntityType,
|
|
346
|
-
loggedInUser,
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
if (!getEntityData) return null;
|
|
350
|
-
const levelEntityDataResult = await this.entityManager.query(
|
|
351
|
-
`SELECT *
|
|
352
|
-
FROM ${getEntityData?.db_table_name}
|
|
353
|
-
WHERE id = $1`,
|
|
354
|
-
[mappedEntityId],
|
|
355
|
-
);
|
|
356
|
-
|
|
357
|
-
if (
|
|
358
|
-
levelEntityDataResult?.[0].code &&
|
|
359
|
-
parentType != 'SCH' &&
|
|
360
|
-
loggedInUser.level_type != 'SCH'
|
|
361
|
-
) {
|
|
362
|
-
replacements['template_code'] = levelEntityDataResult[0].code;
|
|
363
|
-
// If we have parent template, modify the path to include it
|
|
364
|
-
pathTemplate = '${org_code}/template/${template_code}';
|
|
365
|
-
} else {
|
|
366
|
-
const getEntityData = await this.entityMasterService.getEntityData(
|
|
367
|
-
mappedEntityType,
|
|
368
|
-
loggedInUser,
|
|
369
|
-
);
|
|
370
|
-
|
|
371
|
-
if (!getEntityData) return null;
|
|
372
|
-
const levelEntityDataResult = await this.entityManager.query(
|
|
373
|
-
`SELECT *
|
|
374
|
-
FROM ${getEntityData?.db_table_name}
|
|
375
|
-
WHERE id = $1`,
|
|
376
|
-
[mappedEntityId],
|
|
377
|
-
);
|
|
378
|
-
|
|
379
|
-
replacements['template_code'] = levelEntityDataResult?.[0].code;
|
|
380
|
-
|
|
381
|
-
pathTemplate = '${org_code}/${level_code}/template/${template_code}';
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// --- Dynamic variables inside path ---
|
|
386
|
-
const matches = pathTemplate.match(/\$\{(\w+)\}/g) || [];
|
|
387
|
-
|
|
388
|
-
for (const variable of matches) {
|
|
389
|
-
const key = variable.replace(/\$\{|\}/g, '');
|
|
390
|
-
if (replacements[key]) continue; // already resolved
|
|
391
|
-
|
|
392
|
-
if (key === 'org_code') continue; // already set
|
|
393
|
-
if (key === 'level_code') continue; // already set above
|
|
394
|
-
if (key === 'template_code') continue; // handled above if parent is provided
|
|
395
|
-
|
|
396
|
-
if (key.endsWith('_code')) {
|
|
397
|
-
// derive entity type dynamically
|
|
398
|
-
const entityType = key.replace('_code', '').toUpperCase();
|
|
399
|
-
|
|
400
|
-
let entityId: number | undefined;
|
|
401
|
-
|
|
402
|
-
// Special handling for template_code - use parent if available, otherwise mapped entity
|
|
403
|
-
if (key === 'template_code') {
|
|
404
|
-
if (parentType?.toUpperCase() === 'TEMPLATE' && parentId) {
|
|
405
|
-
entityId = parentId;
|
|
406
|
-
} else if (mappedEntityType === 'TEMPLATE') {
|
|
407
|
-
entityId = mappedEntityId;
|
|
408
|
-
}
|
|
409
|
-
} else {
|
|
410
|
-
// For other _code variables, check if parent matches the entity type
|
|
411
|
-
if (parentType?.toUpperCase() === entityType && parentId) {
|
|
412
|
-
entityId = parentId;
|
|
413
|
-
} else if (mappedEntityType === entityType) {
|
|
414
|
-
entityId = mappedEntityId;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
// Generic lookup
|
|
419
|
-
if (entityId) {
|
|
420
|
-
const entityData = await super.getEntityData(
|
|
421
|
-
entityType,
|
|
422
|
-
entityId,
|
|
423
|
-
loggedInUser,
|
|
424
|
-
);
|
|
425
|
-
replacements[key] = entityData?.code ?? null;
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
// --- ORG special case ---
|
|
431
|
-
// If ORG level & overwrite = 0 → use org_code, otherwise use the mapped entity's code
|
|
432
|
-
if (loggedInUser.level_type === 'ORG' && entityOverwrite === 0) {
|
|
433
|
-
// When overwrite is 0 and user is ORG level, but we want to use mapped entity
|
|
434
|
-
// Don't set level_code to null - it should already be set above based on entityOverwrite logic
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
// 3️⃣ Final substitution and cleanup
|
|
438
|
-
if (pathTemplate) {
|
|
439
|
-
const finalPath = this.resolveUploadPath(pathTemplate, replacements);
|
|
440
|
-
return finalPath;
|
|
441
|
-
}
|
|
442
|
-
return null;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
239
|
public async buildUploadPathGeneric(
|
|
446
240
|
mappedEntityType: string,
|
|
447
241
|
loggedInUser,
|