@solidxai/core 0.1.6-beta.20 → 0.1.6-beta.22
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/repository/model-metadata.repository.d.ts +6 -1
- package/dist/repository/model-metadata.repository.d.ts.map +1 -1
- package/dist/repository/model-metadata.repository.js +41 -2
- package/dist/repository/model-metadata.repository.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts +1 -4
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +2 -35
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/permission-metadata.service.js +0 -4
- package/dist/services/permission-metadata.service.js.map +1 -1
- package/dist/services/queues/publisher-factory.service.js +0 -1
- package/dist/services/queues/publisher-factory.service.js.map +1 -1
- package/package.json +1 -1
- package/src/repository/model-metadata.repository.ts +45 -2
- package/src/services/model-metadata.service.ts +0 -42
- package/src/services/permission-metadata.service.ts +4 -4
- package/src/services/queues/publisher-factory.service.ts +1 -1
|
@@ -1,8 +1,13 @@
|
|
|
1
|
+
import { Cache } from 'cache-manager';
|
|
1
2
|
import { ModelMetadata } from 'src';
|
|
2
3
|
import { DataSource } from 'typeorm';
|
|
3
4
|
import { SolidBaseRepository } from './solid-base.repository';
|
|
4
5
|
export declare class ModelMetadataRepository extends SolidBaseRepository<ModelMetadata> {
|
|
5
6
|
readonly dataSource: DataSource;
|
|
6
|
-
|
|
7
|
+
private readonly cacheManager;
|
|
8
|
+
constructor(dataSource: DataSource, cacheManager: Cache);
|
|
9
|
+
find(options?: any): Promise<ModelMetadata[]>;
|
|
10
|
+
findOne(options: any): Promise<ModelMetadata | null>;
|
|
11
|
+
private buildCacheKey;
|
|
7
12
|
}
|
|
8
13
|
//# sourceMappingURL=model-metadata.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata.repository.d.ts","sourceRoot":"","sources":["../../src/repository/model-metadata.repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-metadata.repository.d.ts","sourceRoot":"","sources":["../../src/repository/model-metadata.repository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,qBACa,uBAAwB,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAEvE,QAAQ,CAAC,UAAU,EAAE,UAAU;IACR,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAD3C,UAAU,EAAE,UAAU,EACS,YAAY,EAAE,KAAK;IAOzD,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgB7C,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgB1D,OAAO,CAAC,aAAa;CAKxB"}
|
|
@@ -8,21 +8,60 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
11
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
15
|
exports.ModelMetadataRepository = void 0;
|
|
16
|
+
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
13
17
|
const common_1 = require("@nestjs/common");
|
|
18
|
+
const crypto_1 = require("crypto");
|
|
14
19
|
const src_1 = require("..");
|
|
20
|
+
const cache_helper_1 = require("../helpers/cache.helper");
|
|
15
21
|
const typeorm_1 = require("typeorm");
|
|
16
22
|
const solid_base_repository_1 = require("./solid-base.repository");
|
|
17
23
|
let ModelMetadataRepository = class ModelMetadataRepository extends solid_base_repository_1.SolidBaseRepository {
|
|
18
|
-
constructor(dataSource) {
|
|
24
|
+
constructor(dataSource, cacheManager) {
|
|
19
25
|
super(src_1.ModelMetadata, dataSource, null, null);
|
|
20
26
|
this.dataSource = dataSource;
|
|
27
|
+
this.cacheManager = cacheManager;
|
|
28
|
+
}
|
|
29
|
+
async find(options) {
|
|
30
|
+
if (!(0, cache_helper_1.shouldUseCache)()) {
|
|
31
|
+
return super.find(options);
|
|
32
|
+
}
|
|
33
|
+
const cacheKey = this.buildCacheKey('find', options);
|
|
34
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
35
|
+
if (cached !== undefined) {
|
|
36
|
+
return cached;
|
|
37
|
+
}
|
|
38
|
+
const result = await super.find(options);
|
|
39
|
+
await this.cacheManager.set(cacheKey, result);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
async findOne(options) {
|
|
43
|
+
if (!(0, cache_helper_1.shouldUseCache)()) {
|
|
44
|
+
return super.findOne(options);
|
|
45
|
+
}
|
|
46
|
+
const cacheKey = this.buildCacheKey('findOne', options);
|
|
47
|
+
const cached = await this.cacheManager.get(cacheKey);
|
|
48
|
+
if (cached !== undefined) {
|
|
49
|
+
return cached;
|
|
50
|
+
}
|
|
51
|
+
const result = await super.findOne(options);
|
|
52
|
+
await this.cacheManager.set(cacheKey, result);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
buildCacheKey(method, options) {
|
|
56
|
+
const serialized = JSON.stringify(options ?? {});
|
|
57
|
+
const hash = (0, crypto_1.createHash)('sha256').update(serialized).digest('hex');
|
|
58
|
+
return `modelMetadataRepo:${method}:${hash}`;
|
|
21
59
|
}
|
|
22
60
|
};
|
|
23
61
|
exports.ModelMetadataRepository = ModelMetadataRepository;
|
|
24
62
|
exports.ModelMetadataRepository = ModelMetadataRepository = __decorate([
|
|
25
63
|
(0, common_1.Injectable)(),
|
|
26
|
-
|
|
64
|
+
__param(1, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
|
|
65
|
+
__metadata("design:paramtypes", [typeorm_1.DataSource, Object])
|
|
27
66
|
], ModelMetadataRepository);
|
|
28
67
|
//# sourceMappingURL=model-metadata.repository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata.repository.js","sourceRoot":"","sources":["../../src/repository/model-metadata.repository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-metadata.repository.js","sourceRoot":"","sources":["../../src/repository/model-metadata.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAAsD;AACtD,2CAAoD;AAEpD,mCAAoC;AACpC,4BAAoC;AACpC,0DAA0D;AAC1D,qCAAqC;AACrC,mEAA8D;AAGvD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,2CAAkC;IAC3E,YACa,UAAsB,EACS,YAAmB;QAI3D,KAAK,CAAC,mBAAa,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QALpC,eAAU,GAAV,UAAU,CAAY;QACS,iBAAY,GAAZ,YAAY,CAAO;IAK/D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAa;QACpB,IAAI,CAAC,IAAA,6BAAc,GAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAkB,QAAQ,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAY;QACtB,IAAI,CAAC,IAAA,6BAAc,GAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAuB,QAAQ,CAAC,CAAC;QAC3E,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,MAA0B,EAAE,OAAgB;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,qBAAqB,MAAM,IAAI,IAAI,EAAE,CAAC;IACjD,CAAC;CACJ,CAAA;AA/CY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;IAIJ,WAAA,IAAA,eAAM,EAAC,6BAAa,CAAC,CAAA;qCADD,oBAAU;GAF1B,uBAAuB,CA+CnC","sourcesContent":["import { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { Inject, Injectable } from '@nestjs/common';\nimport { Cache } from 'cache-manager';\nimport { createHash } from 'crypto';\nimport { ModelMetadata } from 'src';\nimport { shouldUseCache } from 'src/helpers/cache.helper';\nimport { DataSource } from 'typeorm';\nimport { SolidBaseRepository } from './solid-base.repository';\n\n@Injectable()\nexport class ModelMetadataRepository extends SolidBaseRepository<ModelMetadata> {\n constructor(\n readonly dataSource: DataSource,\n @Inject(CACHE_MANAGER) private readonly cacheManager: Cache,\n // readonly requestContextService: RequestContextService,\n // readonly securityRuleRepository: SecurityRuleRepository,\n ) {\n super(ModelMetadata, dataSource, null, null);\n }\n\n async find(options?: any): Promise<ModelMetadata[]> {\n if (!shouldUseCache()) {\n return super.find(options);\n }\n\n const cacheKey = this.buildCacheKey('find', options);\n const cached = await this.cacheManager.get<ModelMetadata[]>(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = await super.find(options);\n await this.cacheManager.set(cacheKey, result);\n return result;\n }\n\n async findOne(options: any): Promise<ModelMetadata | null> {\n if (!shouldUseCache()) {\n return super.findOne(options);\n }\n\n const cacheKey = this.buildCacheKey('findOne', options);\n const cached = await this.cacheManager.get<ModelMetadata | null>(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const result = await super.findOne(options);\n await this.cacheManager.set(cacheKey, result);\n return result;\n }\n\n private buildCacheKey(method: 'find' | 'findOne', options: unknown): string {\n const serialized = JSON.stringify(options ?? {});\n const hash = createHash('sha256').update(serialized).digest('hex');\n return `modelMetadataRepo:${method}:${hash}`;\n }\n}\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Cache } from 'cache-manager';
|
|
2
1
|
import { DataSource, EntityManager, Repository } from 'typeorm';
|
|
3
2
|
import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
|
|
4
3
|
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
@@ -28,9 +27,8 @@ export declare class ModelMetadataService {
|
|
|
28
27
|
private readonly moduleMetadataHelperService;
|
|
29
28
|
readonly introspectService: SolidIntrospectService;
|
|
30
29
|
private readonly solidTsMorphService;
|
|
31
|
-
private readonly cacheManager;
|
|
32
30
|
private logger;
|
|
33
|
-
constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService
|
|
31
|
+
constructor(modelMetadataRepo: ModelMetadataRepository, fieldMetadataRepo: FieldMetadataRepository, schematicService: SchematicService, dataSource: DataSource, crudHelperService: CrudHelperService, mediaStorageProviderMetadataService: MediaStorageProviderMetadataService, fieldMetadataService: FieldMetadataService, roleService: RoleMetadataService, moduleMetadataHelperService: ModuleMetadataHelperService, introspectService: SolidIntrospectService, solidTsMorphService: SolidTsMorphService);
|
|
34
32
|
find(basicFilterDto: BasicFilterDto): Promise<{
|
|
35
33
|
meta: {
|
|
36
34
|
totalRecords: number;
|
|
@@ -54,7 +52,6 @@ export declare class ModelMetadataService {
|
|
|
54
52
|
records: ModelMetadata[];
|
|
55
53
|
}>;
|
|
56
54
|
findOne(id: any, query?: any): Promise<ModelMetadata>;
|
|
57
|
-
private buildModelBySingularNameCacheKey;
|
|
58
55
|
findOneBySingularName(singularName: string, relations?: {}): Promise<ModelMetadata>;
|
|
59
56
|
findOneByUserKey(singularName: string, relations?: {}): Promise<ModelMetadata>;
|
|
60
57
|
create(createDto: CreateModelMetadataDto): Promise<ModelMetadata>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,7 +47,6 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
48
|
exports.ModelMetadataService = void 0;
|
|
49
49
|
const common_1 = require("@nestjs/common");
|
|
50
|
-
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
51
50
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
52
51
|
const fs = __importStar(require("fs/promises"));
|
|
53
52
|
const path = __importStar(require("path"));
|
|
@@ -58,7 +57,6 @@ const strings_1 = require("@angular-devkit/core/src/utils/strings");
|
|
|
58
57
|
const error_messages_1 = require("../constants/error-messages");
|
|
59
58
|
const disallow_in_production_decorator_1 = require("../decorators/disallow-in-production.decorator");
|
|
60
59
|
const create_field_metadata_dto_1 = require("../dtos/create-field-metadata.dto");
|
|
61
|
-
const cache_helper_1 = require("../helpers/cache.helper");
|
|
62
60
|
const module_metadata_helper_service_1 = require("../helpers/module-metadata-helper.service");
|
|
63
61
|
const field_metadata_repository_1 = require("../repository/field-metadata.repository");
|
|
64
62
|
const model_metadata_repository_1 = require("../repository/model-metadata.repository");
|
|
@@ -74,7 +72,7 @@ const role_metadata_service_1 = require("./role-metadata.service");
|
|
|
74
72
|
const solid_introspect_service_1 = require("./solid-introspect.service");
|
|
75
73
|
const solid_ts_morph_service_1 = require("./solid-ts-morph.service");
|
|
76
74
|
let ModelMetadataService = class ModelMetadataService {
|
|
77
|
-
constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService
|
|
75
|
+
constructor(modelMetadataRepo, fieldMetadataRepo, schematicService, dataSource, crudHelperService, mediaStorageProviderMetadataService, fieldMetadataService, roleService, moduleMetadataHelperService, introspectService, solidTsMorphService) {
|
|
78
76
|
this.modelMetadataRepo = modelMetadataRepo;
|
|
79
77
|
this.fieldMetadataRepo = fieldMetadataRepo;
|
|
80
78
|
this.schematicService = schematicService;
|
|
@@ -86,7 +84,6 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
86
84
|
this.moduleMetadataHelperService = moduleMetadataHelperService;
|
|
87
85
|
this.introspectService = introspectService;
|
|
88
86
|
this.solidTsMorphService = solidTsMorphService;
|
|
89
|
-
this.cacheManager = cacheManager;
|
|
90
87
|
this.logger = new common_1.Logger('ModelMetadataService');
|
|
91
88
|
}
|
|
92
89
|
async find(basicFilterDto) {
|
|
@@ -127,20 +124,7 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
127
124
|
}
|
|
128
125
|
return entity;
|
|
129
126
|
}
|
|
130
|
-
buildModelBySingularNameCacheKey(singularName) {
|
|
131
|
-
return `modelMetadata:singularName:${singularName}`;
|
|
132
|
-
}
|
|
133
127
|
async findOneBySingularName(singularName, relations = {}) {
|
|
134
|
-
const useCache = (0, cache_helper_1.shouldUseCache)();
|
|
135
|
-
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
136
|
-
if (useCache) {
|
|
137
|
-
const cached = await this.cacheManager.get(cacheKey);
|
|
138
|
-
if (cached) {
|
|
139
|
-
this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);
|
|
140
|
-
return cached;
|
|
141
|
-
}
|
|
142
|
-
this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);
|
|
143
|
-
}
|
|
144
128
|
const entity = await this.modelMetadataRepo.findOne({
|
|
145
129
|
where: {
|
|
146
130
|
singularName: singularName,
|
|
@@ -150,22 +134,9 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
150
134
|
if (!entity) {
|
|
151
135
|
throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
152
136
|
}
|
|
153
|
-
if (useCache) {
|
|
154
|
-
await this.cacheManager.set(cacheKey, entity);
|
|
155
|
-
}
|
|
156
137
|
return entity;
|
|
157
138
|
}
|
|
158
139
|
async findOneByUserKey(singularName, relations = {}) {
|
|
159
|
-
const useCache = (0, cache_helper_1.shouldUseCache)();
|
|
160
|
-
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
161
|
-
if (useCache) {
|
|
162
|
-
const cached = await this.cacheManager.get(cacheKey);
|
|
163
|
-
if (cached) {
|
|
164
|
-
this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);
|
|
165
|
-
return cached;
|
|
166
|
-
}
|
|
167
|
-
this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);
|
|
168
|
-
}
|
|
169
140
|
const entity = await this.modelMetadataRepo.findOne({
|
|
170
141
|
where: {
|
|
171
142
|
singularName: singularName,
|
|
@@ -175,9 +146,6 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
175
146
|
if (!entity) {
|
|
176
147
|
throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
177
148
|
}
|
|
178
|
-
if (useCache) {
|
|
179
|
-
await this.cacheManager.set(cacheKey, entity);
|
|
180
|
-
}
|
|
181
149
|
return entity;
|
|
182
150
|
}
|
|
183
151
|
async create(createDto) {
|
|
@@ -1213,7 +1181,6 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
|
|
|
1213
1181
|
(0, common_1.Injectable)(),
|
|
1214
1182
|
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => model_metadata_repository_1.ModelMetadataRepository))),
|
|
1215
1183
|
__param(3, (0, typeorm_1.InjectDataSource)()),
|
|
1216
|
-
__param(11, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
|
|
1217
1184
|
__metadata("design:paramtypes", [model_metadata_repository_1.ModelMetadataRepository,
|
|
1218
1185
|
field_metadata_repository_1.FieldMetadataRepository,
|
|
1219
1186
|
schematic_service_1.SchematicService,
|
|
@@ -1224,6 +1191,6 @@ exports.ModelMetadataService = ModelMetadataService = __decorate([
|
|
|
1224
1191
|
role_metadata_service_1.RoleMetadataService,
|
|
1225
1192
|
module_metadata_helper_service_1.ModuleMetadataHelperService,
|
|
1226
1193
|
solid_introspect_service_1.SolidIntrospectService,
|
|
1227
|
-
solid_ts_morph_service_1.SolidTsMorphService
|
|
1194
|
+
solid_ts_morph_service_1.SolidTsMorphService])
|
|
1228
1195
|
], ModelMetadataService);
|
|
1229
1196
|
//# sourceMappingURL=model-metadata.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-metadata.service.js","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path';\nimport { Cache } from 'cache-manager';\nimport { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadata } from '../entities/model-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify, dasherize } from '@angular-devkit/core/src/utils/strings';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { shouldUseCache } from 'src/helpers/cache.helper';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModelMetaDataDto } from '../dtos/update-model-metadata.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport {\n REFRESH_MODEL_COMMAND,\n REMOVE_FIELDS_COMMAND,\n SchematicService\n} from '../helpers/schematic.service';\nimport { CodeGenerationOptions } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { FieldMetadataService } from './field-metadata.service';\nimport { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { NavigationDto } from 'src/dtos/navigation.dto';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { CRUDService } from './crud.service';\nimport { SolidTsMorphService } from './solid-ts-morph.service';\n\n@Injectable()\nexport class ModelMetadataService {\n private logger = new Logger('ModelMetadataService');\n constructor(\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n private readonly schematicService: SchematicService,\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly crudHelperService: CrudHelperService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n readonly introspectService: SolidIntrospectService,\n private readonly solidTsMorphService: SolidTsMorphService,\n @Inject(CACHE_MANAGER) private readonly cacheManager: Cache,\n\n // No longer used.\n // private readonly generateCodePublihser: GenerateCodePublisherDatabase,\n ) { }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'modelMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModelMetadata> = await this.modelMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async findOne(id: any, query?: any) {\n // const { fields, filters, populate } = basicFilterDto;\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: query?.populate, //FIXME: Check with jenender and change to relations to avoid confusion\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(`#${id}`));\n }\n return entity;\n }\n\n private buildModelBySingularNameCacheKey(singularName: string): string {\n return `modelMetadata:singularName:${singularName}`;\n }\n\n async findOneBySingularName(singularName: string, relations = {}) {\n const useCache = shouldUseCache();\n const cacheKey = this.buildModelBySingularNameCacheKey(singularName);\n\n if (useCache) {\n const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);\n if (cached) {\n this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);\n return cached;\n }\n this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);\n }\n\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n\n if (useCache) {\n await this.cacheManager.set(cacheKey, entity);\n }\n\n return entity;\n }\n\n async findOneByUserKey(singularName: string, relations = {}) {\n const useCache = shouldUseCache();\n const cacheKey = this.buildModelBySingularNameCacheKey(singularName);\n\n if (useCache) {\n const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);\n if (cached) {\n this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);\n return cached;\n }\n this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);\n }\n\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n\n if (useCache) {\n await this.cacheManager.set(cacheKey, entity);\n }\n\n return entity;\n }\n\n async create(createDto: CreateModelMetadataDto) {\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.createInDB(manager, createDto);\n await this.createInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n return model\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n // Iterate through the fields in the createDto & get all the relation fields which have create inverse as true\n private async handleInverseRelationFieldsUpdates(model: ModelMetadata, fieldRepository: Repository<FieldMetadata>, modelRepository: Repository<ModelMetadata>) {\n const fields: FieldMetadata[] = await this.getRelationInverseFields(model.id, fieldRepository);\n\n // Call a function which will iterate through each field and create an inverse field entry for the respective model i.e call updateInverseField on the related model\n for (const field of fields) {\n await this.fieldMetadataService.updateInverseField(field, fieldRepository, modelRepository);\n }\n }\n\n async update(id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n //To DO start the transaction \n // call create In db\n // call createInfile\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.updateInDb(manager, id, updateModelMetaDataDto)\n await this.updateInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n // return model\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModelMetadataDto) {\n\n //Save the model\n const resolvedModule = await this.dataSource\n .getRepository(ModuleMetadata)\n .findOne({\n where: {\n id: createDto['moduleId'],\n },\n relations: {},\n });\n createDto['module'] = resolvedModule;\n\n if (createDto['parentModelId']) {\n const resolvedParentModel = await this.dataSource\n .getRepository(ModelMetadata)\n .findOne({\n where: {\n id: createDto['parentModelId'],\n },\n relations: {},\n });\n createDto['parentModel'] = resolvedParentModel;\n }\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = createDto;\n const modelMetadata = this.modelMetadataRepo.create(modelMetaDataWithoutFields);\n let model = await manager.save(modelMetadata);\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const listViewLayout = [];\n const formViewLayout = [];\n const treeViewLayout = [];\n\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n // console.log(fieldMetadata.displayName);\n // this.logger.debug(fieldMetadata.displayName);\n\n const fieldMetadataObject = this.fieldMetadataRepo.create(fieldMetadata);\n const affectedField = await manager.save(fieldMetadataObject);\n\n if (fieldMetadata.isUserKey) {\n userKeyField = affectedField;\n }\n listViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n formViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n treeViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n const updatedModelMetadataDto = this.modelMetadataRepo.merge(model, modelMetaDataWithoutFields);\n model = await manager.save(updatedModelMetadataDto);\n }\n\n return model;\n }\n\n async createInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n isLegacyTable: model?.isLegacyTable,\n isLegacyTableWithId: model?.isLegacyTableWithId,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n modelMetaData.fields.push(fieldObject);\n }\n // Update the `models` array\n metaData.moduleMetadata.models.push(modelMetaData);\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async updateInDb(manager: EntityManager, id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = updateModelMetaDataDto;\n const modelRepo = manager.getRepository(ModelMetadata);\n const fieldRepo = manager.getRepository(FieldMetadata);\n // 1. Update the model metadata without fields\n let existingModel = await modelRepo.findOne({\n where: {\n singularName: updateModelMetaDataDto.singularName\n },\n relations: [\"fields\", \"module\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n if (!existingModel) {\n throw new Error(ERROR_MESSAGES.MODEL_NOT_FOUND(updateModelMetaDataDto.singularName));\n }\n\n const updatedModel = modelRepo.merge(existingModel, modelMetaDataWithoutFields);\n await modelRepo.save(updatedModel);\n\n const existingFields = existingModel.fields || [];\n const existingFieldIds = existingFields.map((field) => field.id);\n\n // 2. Synchronize fields\n // const userKeyFieldName = updateModelMetaDataDto.userKeyFieldUserKey;\n let userKeyField = null;\n\n const fieldsToSave: FieldMetadata[] = [];\n const fieldsToDelete: FieldMetadata[] = [];\n\n for (const fieldMetadata of fieldsMetadata) {\n if (fieldMetadata.id) {\n // Existing field\n const existingField = existingFields.find((field) => field.id === fieldMetadata.id);\n if (existingField) {\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n Object.assign(existingField, fieldMetadata);\n fieldsToSave.push(existingField);\n }\n } else {\n // New field\n fieldMetadata['model'] = updatedModel;\n\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n const createdField = fieldRepo.create(fieldMetadata);\n fieldsToSave.push(createdField);\n }\n\n // Check for userKeyField\n // if (fieldMetadata.isUserKey) {\n // userKeyField = fieldMetadata;\n // }\n }\n\n // Fields to delete (not in the payload)\n fieldsToDelete.push(...existingFields.filter((field) => !fieldsMetadata.some((f) => f.id === field.id)));\n\n // Save and remove fields\n if (fieldsToSave.length > 0) {\n await fieldRepo.save(fieldsToSave);\n }\n if (fieldsToDelete.length > 0) {\n fieldsToDelete.forEach(field => { field.isMarkedForRemoval = true })\n await fieldRepo.save(fieldsToDelete);\n\n // await this.fieldMetadataRepo.remove(fieldsToDelete);\n }\n\n const finalModel = await modelRepo.findOne({\n where: { id: updatedModel.id },\n relations: [\"fields\", \"userKeyField\"]\n });\n\n // 3. Update model with userKeyField if specified\n const userKeyFields = fieldsMetadata.filter(field => field.isUserKey);\n\n if (userKeyFields.length > 0) {\n const newUserKeyField = userKeyFields[userKeyFields.length - 1];\n const savedUserKeyField = await fieldRepo.findOne({ where: { id: newUserKeyField.id } });\n\n if (savedUserKeyField) {\n finalModel.userKeyField = savedUserKeyField;\n await modelRepo.save(finalModel);\n }\n\n const otherUserKeyFields = userKeyFields.filter(field => field.id !== newUserKeyField.id);\n\n for (const field of otherUserKeyFields) {\n const existingField = await fieldRepo.findOne({ where: { id: field.id } });\n if (existingField) {\n existingField.isUserKey = false;\n await fieldRepo.save(existingField);\n }\n }\n } else {\n if (finalModel.userKeyField) {\n finalModel.userKeyField = null;\n await modelRepo.save(finalModel);\n }\n }\n\n return updatedModel;\n\n }\n\n async updateInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (!field.isSystem) {\n\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n if (field.isMarkedForRemoval) {\n fieldObject.isMarkedForRemoval = true;\n }\n modelMetaData.fields.push(fieldObject);\n }\n }\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelMetaData.singularName\n );\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateDto: UpdateModelMetaDataDto) {\n // First check if module already exists using name\n const existingModelMetadata = await this.modelMetadataRepo.findOne({\n where: {\n singularName: updateDto.singularName\n }\n })\n\n // if found\n if (existingModelMetadata) {\n const updatedModelMetadata = { ...existingModelMetadata, ...updateDto };\n const updatedModel = await this.modelMetadataRepo.save(updatedModelMetadata);\n return updatedModel\n }\n // if not found - create new \n else {\n const modelMetadata = this.modelMetadataRepo.create(updateDto);\n return this.modelMetadataRepo.save(modelMetadata);\n }\n }\n\n async removeBySingularName(singularName: string) {\n try {\n const entity = await this.findOneBySingularName(singularName);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r;\n } catch (error) {\n }\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${ id } not found`);\n // }\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n removedEntities.push(r);\n }\n\n return removedEntities\n }\n\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(modelEntityId: number) {\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: modelEntityId,\n },\n relations: ['module']\n });\n\n if (!modelEntity) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata`);\n return;\n }\n if (modelEntity.id !== modelEntityId) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata id ${modelEntity.id} not matching with the one passed as argument ${modelEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for model: ${modelEntity.singularName} belonging to module: ${modelEntity.module?.name}`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(modelEntity.module?.name);\n if (modulePath) {\n // /Users/harishpatel/Code/javascript/school-fees-portal/solid-api/src/solid-core\n this.logger.log(`Module path: ${modulePath}`);\n\n const filesToDelete = [];\n // <singularName>.entity.ts | The TypeORM model that needs to be deleted. | Automatic\n const entityFilePath = `${modulePath}/entities/${dasherize(modelEntity.singularName)}.entity.ts`;\n filesToDelete.push(entityFilePath);\n this.logger.log(`About to delete entity file path: ${entityFilePath}`);\n\n // <singularName>.create.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const createDtoFilePath = `${modulePath}/dtos/create-${dasherize(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(createDtoFilePath);\n this.logger.log(`About to delete create DTO file path: ${createDtoFilePath}`);\n\n // <singularName>.update.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const updateDtoFilePath = `${modulePath}/dtos/update-${dasherize(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(updateDtoFilePath);\n this.logger.log(`About to delete update DTO file path: ${updateDtoFilePath}`);\n\n // <singularName>.repository.ts | The TypeORM model that needs to be deleted. | Automatic\n const repositoryFilePath = `${modulePath}/repositories/${dasherize(modelEntity.singularName)}.repository.ts`;\n filesToDelete.push(repositoryFilePath);\n this.logger.log(`About to delete repository file path: ${repositoryFilePath}`);\n\n // <singularName>.service.ts | The TypeORM model that needs to be deleted. | Automatic\n const serviceFilePath = `${modulePath}/services/${dasherize(modelEntity.singularName)}.service.ts`;\n filesToDelete.push(serviceFilePath);\n this.logger.log(`About to delete service file path: ${serviceFilePath}`);\n\n // <singularName>.controller.ts | The TypeORM model that needs to be deleted. | Automatic\n const controllerFilePath = `${modulePath}/controllers/${dasherize(modelEntity.singularName)}.controller.ts`;\n filesToDelete.push(controllerFilePath);\n this.logger.log(`About to delete controller file path: ${controllerFilePath}`);\n\n for (let i = 0; i < filesToDelete.length; i++) {\n const fileToDelete = filesToDelete[i];\n try {\n await fs.unlink(fileToDelete);\n this.logger.log(`Deleted file: ${fileToDelete}`);\n } catch (error) {\n this.logger.error(`Error deleting file: ${fileToDelete}`, error);\n }\n }\n }\n\n await this.dataSource.query(\n `CALL cleanup_model_metadata($1, $2)`,\n [modelEntity.singularName, true],\n );\n\n // Delete the permissions, menu, actions & views related to this model.\n // const controllerName = `${classify(modelEntity.singularName)}Controller`;\n // const permissionNames = [\n // `${controllerName}.delete`,\n // `${controllerName}.deleteMany`,\n // `${controllerName}.findOne`,\n // `${controllerName}.findMany`,\n // `${controllerName}.recover`,\n // `${controllerName}.recoverMany`,\n // `${controllerName}.partialUpdate`,\n // `${controllerName}.update`,\n // `${controllerName}.insertMany`,\n // `${controllerName}.create`,\n // ];\n // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);\n // const permissionsToDelete = await permissionsRepo.find({\n // where: { name: In(permissionNames) },\n // relations: ['roles'],\n // });\n\n // Remove role associations first\n // for (const permission of permissionsToDelete) {\n // if (permission.roles?.length) {\n // await this.dataSource\n // .createQueryBuilder()\n // .relation(PermissionMetadata, 'roles')\n // .of(permission) // permission instance or its ID\n // .remove(permission.roles); // remove all linked roles\n // }\n // }\n\n // await permissionsRepo.remove(permissionsToDelete);\n\n // Delete actions\n // const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });\n // await actionRepo.delete({ model: { id: modelEntity.id } });\n\n // // Delete menu items\n // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);\n // if (action) {\n // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });\n // for (let i = 0; i < menuItems.length; i++) {\n // const menuItem = menuItems[i];\n // await menuItemRepo.remove(menuItem);\n // }\n // }\n\n // Delete view \n // const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // await viewRepo.delete({ model: { id: modelEntity.id } })\n\n // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n if (metaData) {\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelEntity.singularName\n );\n\n // Remove the model to be deleted from the metadata\n if (existingModelIndex !== -1) {\n metaData.moduleMetadata.models.splice(existingModelIndex, 1);\n }\n\n // Remove references to this model in the menu, action & view sections.\n metaData.moduleMetadata.menus = metaData.moduleMetadata?.menus?.filter(\n (menu: any) => menu.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.actions = metaData.moduleMetadata?.actions?.filter(\n (action: any) => action.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.views = metaData.moduleMetadata?.views?.filter(\n (view: any) => view.modelUserKey !== modelEntity.singularName\n );\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n // <moduleName>.module.ts | Remove all references and imports of the deleted model files. | Automatic\n if (modulePath) {\n const moduleFilePath = path.resolve(modulePath, `${dasherize(modelEntity.module?.name)}.module.ts`);\n this.logger.log(`Removing model '${modelEntity.singularName}' references from module file: ${moduleFilePath}`);\n try {\n this.solidTsMorphService.begin();\n const modelPathSegment = `/${dasherize(modelEntity.singularName)}.`;\n const { removedIdentifiers } = this.solidTsMorphService.removeImports(\n moduleFilePath,\n spec => spec.includes(modelPathSegment)\n );\n this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);\n await this.solidTsMorphService.commit();\n } catch (error) {\n this.solidTsMorphService.rollback();\n this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);\n }\n }\n\n // - | Drop database table | Removes the database table from the DB, this is a very risky step. Best to review all relations to other models etc and then do this manually | Manual (X)\n\n }\n\n @DisallowInProduction()\n async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {\n const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];\n\n // Generate the code for the passed model\n const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(options);\n affectedModelIds.push(model.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n\n // Generate the code for models which are linked to fields having an inverse relation\n await this.generateCodeForInverseModels(model, options, affectedModelIds, refreshModelCodeOutputLines, removeFieldCodeOutputLines);\n\n // Generate the VAM config for all the affected models\n for (const modelId of affectedModelIds) {\n await this.generateVAMConfig(modelId);\n }\n\n // Return the aggregated code output\n return `${removeFieldCodeOutputLines.join('\\n')} \\n ${refreshModelCodeOutputLines.join('\\n')}`;\n }\n\n private async generateCodeForInverseModels(model: ModelMetadata, options: CodeGenerationOptions, affectedModelIds: any[], refreshModelCodeOutputLines: any[], removeFieldCodeOutputLines: any[]) {\n const coModelSingularNames = model.fields.\n filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)\n .map(field => field.relationCoModelSingularName);\n\n for (const singularName of coModelSingularNames) {\n const coModel = await this.findOneBySingularName(singularName);\n const inverseOptions: CodeGenerationOptions = {\n modelId: coModel.id,\n dryRun: options.dryRun\n };\n const { removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(inverseOptions);\n affectedModelIds.push(coModel.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n }\n }\n\n // Generate the View, Action and Menu configuration for the model\n async generateVAMConfig(modelId: number) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const model = await modelRepository.findOne({\n where: {\n id: modelId\n },\n relations: [\"fields\", \"module\"]\n });\n await this.populateVAMConfigInDb(model);\n await this.populateVAMConfigInFile(model);\n });\n } catch (error) {\n this.logger.error('generateVAMConfig Transaction failed:', error);\n throw error;\n }\n }\n\n private async populateVAMConfigInFile(model: ModelMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const listViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const treeViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const formViewLayoutFields = [];\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n listViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n formViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n treeViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n }\n this.populateVAMConfigInFileInternal(formViewLayoutFields, model, listViewLayoutFields, treeViewLayoutFields, metaData);\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File updation failed for View, action, menus config:', error);\n throw new Error('File updation failed for View, action, menus config'); // Trigger rollback\n }\n }\n\n // Populate the View, Actions and Menus in the config file\n private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {\n const column1Fields = [];\n const column2Fields = [];\n\n // Distribute fields between two columns\n for (let i = 0; i < formViewLayoutFields.length; i++) {\n if (i % 2 === 0) {\n column1Fields.push(formViewLayoutFields[i]);\n } else {\n column2Fields.push(formViewLayoutFields[i]);\n }\n }\n const actionName = `${model.singularName}-list-action`;\n const treeViewActionName = `${model.singularName}-tree-view-action`;\n const listViewName = `${model.singularName}-list-view`;\n const treeViewName = `${model.singularName}-tree-view`;\n const formViewName = `${model.singularName}-form-view`;\n const menuName = `${model.singularName}-menu-item`;\n\n const action = {\n displayName: `${model.displayName} List Action`,\n name: actionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: listViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const treeViewAction = {\n displayName: `${model.displayName} Tree View Action`,\n name: treeViewActionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: treeViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const menu = {\n displayName: `${model.displayName}`,\n name: menuName,\n sequenceNumber: 1,\n actionUserKey: actionName,\n moduleUserKey: `${model.module.name}`,\n parentMenuItemUserKey: \"\",\n iconName: \"\"\n };\n\n const modelListview = {\n name: listViewName,\n displayName: `${model.displayName}`,\n type: \"list\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayoutFields\n }\n };\n\n const modelTreeview = {\n name: treeViewName,\n displayName: `${model.displayName}`,\n type: \"tree\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayoutFields\n }\n };\n\n\n const modelFormView = {\n name: formViewName,\n displayName: `${model.displayName}`,\n type: \"form\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column1Fields\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column2Fields\n }\n ]\n },\n ]\n }\n ]\n }\n };\n\n // Utility function to check if an item with the same name already exists\n const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);\n\n if (notExists(metaData.menus, menuName)) {\n metaData.menus.push(menu);\n }\n\n if (notExists(metaData.actions, actionName)) {\n metaData.actions.push(action);\n }\n\n if (notExists(metaData.actions, treeViewActionName)) {\n metaData.actions.push(treeViewAction);\n }\n\n if (notExists(metaData.views, listViewName)) {\n metaData.views.push(modelListview);\n }\n\n if (notExists(metaData.views, treeViewName)) {\n metaData.views.push(modelTreeview);\n }\n\n if (notExists(metaData.views, formViewName)) {\n metaData.views.push(modelFormView);\n }\n // metaData.menus.push(menu);\n // metaData.actions.push(action);\n // metaData.views.push(modelListview);\n // metaData.views.push(modelFormView);\n }\n\n //Populate the View, Actions and Menus in the database\n private async populateVAMConfigInDb(model: ModelMetadata) {\n const jsonFieldsList = model.fields.filter((field: FieldMetadata) => field.isSystem !== true);\n\n const listViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const treeViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const formViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`\n }\n }));\n\n const midIndex = Math.ceil(formViewLayout.length / 2);\n const firstHalf = formViewLayout.slice(0, midIndex);\n const secondHalf = formViewLayout.slice(midIndex);\n\n const resolvedModule = await this.dataSource.getRepository(ModuleMetadata).findOne({\n where: { id: model.module.id }\n });\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n\n const modelViews = [\n {\n name: `${model.singularName}-list-view`,\n displayName: `${model.displayName}`,\n type: 'list',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-tree-view`,\n displayName: `${model.displayName}`,\n type: 'tree',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-form-view`,\n displayName: `${model.displayName}`,\n type: 'form',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"group-1\", label: \"\", className: \"\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: firstHalf\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: secondHalf\n }\n ]\n }\n ]\n }\n ]\n }, null, 3)\n }\n ];\n\n for (const view of modelViews) {\n const existingView = await viewRepo.findOne({ where: { name: view.name } });\n\n if (!existingView) {\n const createdView = viewRepo.create(view);\n await viewRepo.save(createdView);\n }\n }\n\n let view = await viewRepo.findOne({ where: { name: `${model.singularName}-list-view` } });\n let treeView = await viewRepo.findOne({ where: { name: `${model.singularName}-tree-view` } });\n\n const actionData = {\n displayName: `${model.displayName} List Action`,\n name: `${model.singularName}-list-action`,\n type: \"solid\",\n domain: \"\" as any,\n context: \"\" as any,\n customComponent: \"\",\n customIsModal: true,\n serverEndpoint: \"\",\n view: view,\n module: resolvedModule,\n model: model\n };\n\n const treeViewActionData = {\n displayName: `${model.displayName} Tree View Action`,\n name: `${model.singularName}-tree-view-action`,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n view: treeView,\n module: resolvedModule,\n model: model\n };\n\n let existingAction = await actionRepo.findOne({ where: { name: actionData.name } });\n let existingTreeViewAction = await actionRepo.findOne({ where: { name: treeViewActionData.name } });\n\n if (!existingAction) {\n const createdAction = actionRepo.create(actionData);\n existingAction = await actionRepo.save(createdAction);\n }\n\n if (!existingTreeViewAction) {\n const createdTreeViewAction = actionRepo.create(treeViewActionData);\n existingTreeViewAction = await actionRepo.save(createdTreeViewAction);\n }\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const menuData = {\n displayName: `${model.displayName}`,\n name: `${model.singularName}-menu-item`,\n sequenceNumber: 1,\n action: existingAction,\n module: resolvedModule,\n roles: [adminRole],\n parentMenuItemUserKey: \"\"\n };\n\n let existingMenu = await menuRepo.findOne({ where: { name: menuData.name } });\n\n if (!existingMenu) {\n const createdMenu = menuRepo.create(menuData);\n await menuRepo.save(createdMenu);\n }\n }\n\n async generateCode(options: CodeGenerationOptions) {\n const query = {\n populate: [\"module\", \"fields\"]\n };\n\n const model = options.modelId\n ? await this.findOne(options.modelId, query)\n : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n options.fieldIdsForRemoval = model.fields\n .filter(field => field.isMarkedForRemoval)\n .map(field => field.id);\n\n const refreshModelCodeOutput = await this.generateModelCode(options);\n const removeFieldCodeOuput = await this.generateRemoveFieldsCode(options);\n return { model, removeFieldCodeOuput, refreshModelCodeOutput };\n }\n\n async generateRemoveFieldsCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n if (!options.fieldIdsForRemoval || options.fieldIdsForRemoval.length === 0) {\n return \"\";\n }\n\n const query = {\n populate: [\"module\", \"fields\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Filter out the fields by id\n const fieldsForRemoval = model.fields.filter((field) => options.fieldIdsForRemoval.includes(+field.id));\n const removeOutput = await this.executeRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);\n\n // Remove the fields from the database as well. This also checks, if the field is marked for removal\n fieldsForRemoval.forEach((field: FieldMetadata) => {\n if (field.isMarkedForRemoval) {\n this.fieldMetadataService.delete(field.id);\n }\n });\n\n // Remove the fields from metadata json file \n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === model.singularName\n );\n\n const modelMetaData = metaData.moduleMetadata.models[existingModelIndex];\n\n // Remove fields marked for removal from modelMetaData.fields\n modelMetaData.fields = modelMetaData.fields.filter((field: any) => field.isMarkedForRemoval !== true);\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n return removeOutput;\n }\n\n async generateModelCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n const query = {\n populate: [\"module\", \"fields\", \"parentModel\", \"parentModel.module\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n\n // If a list of field ids or field names is passed for refresh, use these fields only\n if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {\n fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));\n } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {\n fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));\n }\n // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n\n //Execute the schematic command to refresh the model\n const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);\n\n return `${refreshOuput}`;\n }\n\n private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n const output = await this.schematicService.executeSchematicCommand(\n REFRESH_MODEL_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n },\n dryRun\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async executeRemoveFieldsCommand(model: ModelMetadata, fieldsForRemoval: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n if (!fieldsForRemoval || fieldsForRemoval.length === 0) {\n return \"\";\n }\n const output = await this.schematicService.executeSchematicCommand(\n REMOVE_FIELDS_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n fieldNamesForRemoval: fieldsForRemoval.map(field => field.name),\n },\n dryRun\n );\n\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n async updateUserKey(data: any) {\n const { modelName, fieldName } = data;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: modelName },\n relations: ['fields', 'userKeyField'],\n });\n\n if (!model) {\n throw new Error(`Model with name ${modelName} not found`);\n }\n\n if (model.userKeyField) {\n throw new Error(`User key is already set to ${model.userKeyField.name}. No changes were made.`);\n }\n\n const fieldToUpdate = model.fields.find(field => field.name === fieldName);\n if (!fieldToUpdate) {\n throw new Error(`Field with name ${fieldName} not found in model ${modelName}`);\n }\n\n fieldToUpdate.isUserKey = true;\n\n model.userKeyField = fieldToUpdate;\n\n await this.modelMetadataRepo.save(model);\n\n return {\n message: `User key has been successfully updated to ${fieldName}.`,\n success: true\n };\n }\n\n private async getRelationInverseFields(modelId: number, repo: Repository<FieldMetadata>): Promise<FieldMetadata[]> {\n return await repo.find({\n where: {\n model: {\n id: modelId\n },\n type: SolidFieldType.relation,\n relationCreateInverse: true\n },\n relations: {\n model: {\n module: true\n }\n }\n });\n }\n\n async navigation(navigationDto: NavigationDto) {\n const { recordId, modelName, ...basicFilterDto } = navigationDto;\n\n const modelServiceInstanceWrapper =\n this.introspectService.getProvider(`${classify(modelName)}Service`);\n\n if (!modelServiceInstanceWrapper) {\n throw new BadRequestException(\n `Invalid model name (${modelName}) specified in Navigation.`,\n );\n }\n\n const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;\n\n const recs = await modelService.find(basicFilterDto);\n\n // navigation only works for paginated results\n if (!('records' in recs) || !('currentPage' in recs.meta)) {\n return {\n prev: null,\n next: null,\n meta: null,\n };\n }\n\n const { records, meta } = recs;\n\n // --------------------\n // Find record index in page\n // --------------------\n const index = records.findIndex(r => String(r.id) === String(recordId));\n\n if (index === -1) {\n throw new BadRequestException(`Record not found in current page`);\n }\n\n // --------------------\n // Pagination calculations\n // --------------------\n const limit = meta.perPage;\n const currentOffset = (meta.currentPage - 1) * meta.perPage;\n const currentIndexGlobal = currentOffset + index + 1;\n\n\n let prev: { record: any; offset: number; limit: number } | null = null;\n let next: { record: any; offset: number; limit: number } | null = null;\n\n // --------------------\n // PREV\n // --------------------\n if (index > 0) {\n prev = {\n record: records[index - 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.prevPage !== null) {\n const prevOffset = (meta.prevPage - 1) * meta.perPage;\n\n const prevPage = await modelService.find({\n ...basicFilterDto,\n offset: prevOffset,\n limit,\n });\n\n if ('records' in prevPage) {\n const record = prevPage.records.at(-1) ?? null;\n if (record) {\n prev = {\n record,\n offset: prevOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // NEXT\n // --------------------\n if (index < records.length - 1) {\n next = {\n record: records[index + 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.nextPage !== null) {\n const nextOffset = (meta.nextPage - 1) * meta.perPage;\n\n const nextPage = await modelService.find({\n ...basicFilterDto,\n offset: nextOffset,\n limit,\n });\n\n if ('records' in nextPage) {\n const record = nextPage.records[0] ?? null;\n if (record) {\n next = {\n record,\n offset: nextOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // RESPONSE\n // --------------------\n return {\n prev: prev\n ? {\n recordId: prev.record.id,\n offset: prev.offset,\n limit: prev.limit,\n }\n : null,\n\n next: next\n ? {\n recordId: next.record.id,\n offset: next.offset,\n limit: next.limit,\n }\n : null,\n meta: {\n totalRecords: meta.totalRecords,\n perPage: meta.perPage,\n currentPage: meta.currentPage,\n totalPages: meta.totalPages,\n\n currentIndexInPage: index,\n currentIndexGlobal,\n\n hasPrev: !!prev,\n hasNext: !!next,\n\n prevPage: meta.prevPage,\n nextPage: meta.nextPage,\n },\n\n };\n }\n\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-metadata.service.js","sourceRoot":"","sources":["../../src/services/model-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource } from '@nestjs/typeorm';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path';\nimport { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { ModelMetadata } from '../entities/model-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify, dasherize } from '@angular-devkit/core/src/utils/strings';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { SolidFieldType } from 'src/dtos/create-field-metadata.dto';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModelMetaDataDto } from '../dtos/update-model-metadata.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { FieldMetadata } from '../entities/field-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ViewMetadata } from '../entities/view-metadata.entity';\nimport {\n REFRESH_MODEL_COMMAND,\n REMOVE_FIELDS_COMMAND,\n SchematicService\n} from '../helpers/schematic.service';\nimport { CodeGenerationOptions } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { FieldMetadataService } from './field-metadata.service';\nimport { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';\nimport { RoleMetadataService } from './role-metadata.service';\nimport { NavigationDto } from 'src/dtos/navigation.dto';\nimport { SolidIntrospectService } from './solid-introspect.service';\nimport { CRUDService } from './crud.service';\nimport { SolidTsMorphService } from './solid-ts-morph.service';\n\n@Injectable()\nexport class ModelMetadataService {\n private logger = new Logger('ModelMetadataService');\n constructor(\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n // @InjectRepository(FieldMetadata)\n // private readonly fieldMetadataRepo: Repository<FieldMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n private readonly fieldMetadataRepo: FieldMetadataRepository,\n private readonly schematicService: SchematicService,\n @InjectDataSource()\n private readonly dataSource: DataSource,\n private readonly crudHelperService: CrudHelperService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n readonly introspectService: SolidIntrospectService,\n private readonly solidTsMorphService: SolidTsMorphService,\n\n // No longer used.\n // private readonly generateCodePublihser: GenerateCodePublisherDatabase,\n ) { }\n\n async find(basicFilterDto: BasicFilterDto) {\n return this.findMany(basicFilterDto);\n }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'modelMetadata';\n // Extract the required keys from the input query\n let { limit, offset } = basicFilterDto;\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<ModelMetadata> = await this.modelMetadataRepo.createSecurityRuleAwareQueryBuilder(alias)\n qb = await this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n\n // Get the records and the count\n const [entities, count] = await qb.getManyAndCount();\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n const r = {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n return r\n }\n\n async findOne(id: any, query?: any) {\n // const { fields, filters, populate } = basicFilterDto;\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: query?.populate, //FIXME: Check with jenender and change to relations to avoid confusion\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(`#${id}`));\n }\n return entity;\n }\n\n async findOneBySingularName(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async findOneByUserKey(singularName: string, relations = {}) {\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n singularName: singularName,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));\n }\n return entity;\n }\n\n async create(createDto: CreateModelMetadataDto) {\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.createInDB(manager, createDto);\n await this.createInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n return model\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n // Iterate through the fields in the createDto & get all the relation fields which have create inverse as true\n private async handleInverseRelationFieldsUpdates(model: ModelMetadata, fieldRepository: Repository<FieldMetadata>, modelRepository: Repository<ModelMetadata>) {\n const fields: FieldMetadata[] = await this.getRelationInverseFields(model.id, fieldRepository);\n\n // Call a function which will iterate through each field and create an inverse field entry for the respective model i.e call updateInverseField on the related model\n for (const field of fields) {\n await this.fieldMetadataService.updateInverseField(field, fieldRepository, modelRepository);\n }\n }\n\n async update(id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n //To DO start the transaction \n // call create In db\n // call createInfile\n\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const fieldRepository = manager.getRepository(FieldMetadata);\n\n // Step 1: Write initial data to the database\n const model = await this.updateInDb(manager, id, updateModelMetaDataDto)\n await this.updateInFile(model.id, modelRepository);\n\n await this.handleInverseRelationFieldsUpdates(model, fieldRepository, modelRepository);\n\n // return model\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n\n async createInDB(manager: EntityManager, createDto: CreateModelMetadataDto) {\n\n //Save the model\n const resolvedModule = await this.dataSource\n .getRepository(ModuleMetadata)\n .findOne({\n where: {\n id: createDto['moduleId'],\n },\n relations: {},\n });\n createDto['module'] = resolvedModule;\n\n if (createDto['parentModelId']) {\n const resolvedParentModel = await this.dataSource\n .getRepository(ModelMetadata)\n .findOne({\n where: {\n id: createDto['parentModelId'],\n },\n relations: {},\n });\n createDto['parentModel'] = resolvedParentModel;\n }\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = createDto;\n const modelMetadata = this.modelMetadataRepo.create(modelMetaDataWithoutFields);\n let model = await manager.save(modelMetadata);\n\n // iterate over all fields and upsert. \n let userKeyField = null;\n const listViewLayout = [];\n const formViewLayout = [];\n const treeViewLayout = [];\n\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // TODO: resolve model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n // console.log(fieldMetadata.displayName);\n // this.logger.debug(fieldMetadata.displayName);\n\n const fieldMetadataObject = this.fieldMetadataRepo.create(fieldMetadata);\n const affectedField = await manager.save(fieldMetadataObject);\n\n if (fieldMetadata.isUserKey) {\n userKeyField = affectedField;\n }\n listViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n formViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n treeViewLayout.push({ type: \"field\", attrs: { name: `${affectedField.name}` } })\n\n }\n\n // Now that we have created fields & model update the model to stamp the userKeyField. \n if (userKeyField) {\n modelMetaDataWithoutFields['userKeyField'] = userKeyField;\n const updatedModelMetadataDto = this.modelMetadataRepo.merge(model, modelMetaDataWithoutFields);\n model = await manager.save(updatedModelMetadataDto);\n }\n\n return model;\n }\n\n async createInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n isLegacyTable: model?.isLegacyTable,\n isLegacyTableWithId: model?.isLegacyTableWithId,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n modelMetaData.fields.push(fieldObject);\n }\n // Update the `models` array\n metaData.moduleMetadata.models.push(modelMetaData);\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async updateInDb(manager: EntityManager, id: number, updateModelMetaDataDto: UpdateModelMetaDataDto) {\n\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = updateModelMetaDataDto;\n const modelRepo = manager.getRepository(ModelMetadata);\n const fieldRepo = manager.getRepository(FieldMetadata);\n // 1. Update the model metadata without fields\n let existingModel = await modelRepo.findOne({\n where: {\n singularName: updateModelMetaDataDto.singularName\n },\n relations: [\"fields\", \"module\"], //FIXME: Check with jenender and change to relations to avoid confusion\n });\n\n if (!existingModel) {\n throw new Error(ERROR_MESSAGES.MODEL_NOT_FOUND(updateModelMetaDataDto.singularName));\n }\n\n const updatedModel = modelRepo.merge(existingModel, modelMetaDataWithoutFields);\n await modelRepo.save(updatedModel);\n\n const existingFields = existingModel.fields || [];\n const existingFieldIds = existingFields.map((field) => field.id);\n\n // 2. Synchronize fields\n // const userKeyFieldName = updateModelMetaDataDto.userKeyFieldUserKey;\n let userKeyField = null;\n\n const fieldsToSave: FieldMetadata[] = [];\n const fieldsToDelete: FieldMetadata[] = [];\n\n for (const fieldMetadata of fieldsMetadata) {\n if (fieldMetadata.id) {\n // Existing field\n const existingField = existingFields.find((field) => field.id === fieldMetadata.id);\n if (existingField) {\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n Object.assign(existingField, fieldMetadata);\n fieldsToSave.push(existingField);\n }\n } else {\n // New field\n fieldMetadata['model'] = updatedModel;\n\n if (fieldMetadata.mediaStorageProviderId) {\n fieldMetadata['mediaStorageProvider'] = await this.mediaStorageProviderMetadataService.findOne(fieldMetadata.mediaStorageProviderId);\n }\n const createdField = fieldRepo.create(fieldMetadata);\n fieldsToSave.push(createdField);\n }\n\n // Check for userKeyField\n // if (fieldMetadata.isUserKey) {\n // userKeyField = fieldMetadata;\n // }\n }\n\n // Fields to delete (not in the payload)\n fieldsToDelete.push(...existingFields.filter((field) => !fieldsMetadata.some((f) => f.id === field.id)));\n\n // Save and remove fields\n if (fieldsToSave.length > 0) {\n await fieldRepo.save(fieldsToSave);\n }\n if (fieldsToDelete.length > 0) {\n fieldsToDelete.forEach(field => { field.isMarkedForRemoval = true })\n await fieldRepo.save(fieldsToDelete);\n\n // await this.fieldMetadataRepo.remove(fieldsToDelete);\n }\n\n const finalModel = await modelRepo.findOne({\n where: { id: updatedModel.id },\n relations: [\"fields\", \"userKeyField\"]\n });\n\n // 3. Update model with userKeyField if specified\n const userKeyFields = fieldsMetadata.filter(field => field.isUserKey);\n\n if (userKeyFields.length > 0) {\n const newUserKeyField = userKeyFields[userKeyFields.length - 1];\n const savedUserKeyField = await fieldRepo.findOne({ where: { id: newUserKeyField.id } });\n\n if (savedUserKeyField) {\n finalModel.userKeyField = savedUserKeyField;\n await modelRepo.save(finalModel);\n }\n\n const otherUserKeyFields = userKeyFields.filter(field => field.id !== newUserKeyField.id);\n\n for (const field of otherUserKeyFields) {\n const existingField = await fieldRepo.findOne({ where: { id: field.id } });\n if (existingField) {\n existingField.isUserKey = false;\n await fieldRepo.save(existingField);\n }\n }\n } else {\n if (finalModel.userKeyField) {\n finalModel.userKeyField = null;\n await modelRepo.save(finalModel);\n }\n }\n\n return updatedModel;\n\n }\n\n async updateInFile(modelId: any, repo: Repository<ModelMetadata>) {\n try {\n\n const model = await repo.findOne({\n where: {\n id: modelId,\n },\n relations: [\"fields\", \"fields.mediaStorageProvider\", \"module\", \"parentModel\"], //FIXME: Check with jenender and change to relations to avoid confusion\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n });\n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const modelMetaData = {\n singularName: model.singularName,\n pluralName: model.pluralName,\n displayName: model.displayName,\n description: model.description,\n dataSource: model.dataSource,\n dataSourceType: model.dataSourceType,\n tableName: model.tableName,\n userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,\n isChild: model?.isChild,\n parentModelUserKey: model?.parentModel?.singularName,\n enableAuditTracking: model?.enableAuditTracking,\n enableSoftDelete: model?.enableSoftDelete,\n draftPublishWorkflow: model?.draftPublishWorkflow,\n internationalisation: model?.internationalisation,\n fields: []\n }\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (!field.isSystem) {\n\n const fieldObject: Record<string, any> = await this.fieldMetadataService.createFieldConfig(field);\n if (field.isMarkedForRemoval) {\n fieldObject.isMarkedForRemoval = true;\n }\n modelMetaData.fields.push(fieldObject);\n }\n }\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelMetaData.singularName\n );\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback\n }\n }\n\n async upsert(updateDto: UpdateModelMetaDataDto) {\n // First check if module already exists using name\n const existingModelMetadata = await this.modelMetadataRepo.findOne({\n where: {\n singularName: updateDto.singularName\n }\n })\n\n // if found\n if (existingModelMetadata) {\n const updatedModelMetadata = { ...existingModelMetadata, ...updateDto };\n const updatedModel = await this.modelMetadataRepo.save(updatedModelMetadata);\n return updatedModel\n }\n // if not found - create new \n else {\n const modelMetadata = this.modelMetadataRepo.create(updateDto);\n return this.modelMetadataRepo.save(modelMetadata);\n }\n }\n\n async removeBySingularName(singularName: string) {\n try {\n const entity = await this.findOneBySingularName(singularName);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r;\n } catch (error) {\n }\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.modelMetadataRepo.findOne({\n where: {\n //@ts-ignore\n id: id,\n }\n });\n // if (!entity) {\n // throw new Error(`Entity with id ${ id } not found`);\n // }\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n removedEntities.push(r);\n }\n\n return removedEntities\n }\n\n async remove(id: number) {\n const entity = await this.findOne(id);\n await this.cleanupOnDelete(entity.id);\n const r = await this.modelMetadataRepo.remove(entity);\n return r\n }\n\n async cleanupOnDelete(modelEntityId: number) {\n const modelEntity = await this.modelMetadataRepo.findOne({\n where: {\n // @ts-ignore\n id: modelEntityId,\n },\n relations: ['module']\n });\n\n if (!modelEntity) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata`);\n return;\n }\n if (modelEntity.id !== modelEntityId) {\n this.logger.log(`Invalid modelEntityId: ${modelEntityId} unable to resolve model metadata id ${modelEntity.id} not matching with the one passed as argument ${modelEntityId}`);\n return;\n }\n\n this.logger.log(`Cleaning up for model: ${modelEntity.singularName} belonging to module: ${modelEntity.module?.name}`);\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(modelEntity.module?.name);\n if (modulePath) {\n // /Users/harishpatel/Code/javascript/school-fees-portal/solid-api/src/solid-core\n this.logger.log(`Module path: ${modulePath}`);\n\n const filesToDelete = [];\n // <singularName>.entity.ts | The TypeORM model that needs to be deleted. | Automatic\n const entityFilePath = `${modulePath}/entities/${dasherize(modelEntity.singularName)}.entity.ts`;\n filesToDelete.push(entityFilePath);\n this.logger.log(`About to delete entity file path: ${entityFilePath}`);\n\n // <singularName>.create.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const createDtoFilePath = `${modulePath}/dtos/create-${dasherize(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(createDtoFilePath);\n this.logger.log(`About to delete create DTO file path: ${createDtoFilePath}`);\n\n // <singularName>.update.dto.ts | The TypeORM model that needs to be deleted. | Automatic\n const updateDtoFilePath = `${modulePath}/dtos/update-${dasherize(modelEntity.singularName)}.dto.ts`;\n filesToDelete.push(updateDtoFilePath);\n this.logger.log(`About to delete update DTO file path: ${updateDtoFilePath}`);\n\n // <singularName>.repository.ts | The TypeORM model that needs to be deleted. | Automatic\n const repositoryFilePath = `${modulePath}/repositories/${dasherize(modelEntity.singularName)}.repository.ts`;\n filesToDelete.push(repositoryFilePath);\n this.logger.log(`About to delete repository file path: ${repositoryFilePath}`);\n\n // <singularName>.service.ts | The TypeORM model that needs to be deleted. | Automatic\n const serviceFilePath = `${modulePath}/services/${dasherize(modelEntity.singularName)}.service.ts`;\n filesToDelete.push(serviceFilePath);\n this.logger.log(`About to delete service file path: ${serviceFilePath}`);\n\n // <singularName>.controller.ts | The TypeORM model that needs to be deleted. | Automatic\n const controllerFilePath = `${modulePath}/controllers/${dasherize(modelEntity.singularName)}.controller.ts`;\n filesToDelete.push(controllerFilePath);\n this.logger.log(`About to delete controller file path: ${controllerFilePath}`);\n\n for (let i = 0; i < filesToDelete.length; i++) {\n const fileToDelete = filesToDelete[i];\n try {\n await fs.unlink(fileToDelete);\n this.logger.log(`Deleted file: ${fileToDelete}`);\n } catch (error) {\n this.logger.error(`Error deleting file: ${fileToDelete}`, error);\n }\n }\n }\n\n await this.dataSource.query(\n `CALL cleanup_model_metadata($1, $2)`,\n [modelEntity.singularName, true],\n );\n\n // Delete the permissions, menu, actions & views related to this model.\n // const controllerName = `${classify(modelEntity.singularName)}Controller`;\n // const permissionNames = [\n // `${controllerName}.delete`,\n // `${controllerName}.deleteMany`,\n // `${controllerName}.findOne`,\n // `${controllerName}.findMany`,\n // `${controllerName}.recover`,\n // `${controllerName}.recoverMany`,\n // `${controllerName}.partialUpdate`,\n // `${controllerName}.update`,\n // `${controllerName}.insertMany`,\n // `${controllerName}.create`,\n // ];\n // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);\n // const permissionsToDelete = await permissionsRepo.find({\n // where: { name: In(permissionNames) },\n // relations: ['roles'],\n // });\n\n // Remove role associations first\n // for (const permission of permissionsToDelete) {\n // if (permission.roles?.length) {\n // await this.dataSource\n // .createQueryBuilder()\n // .relation(PermissionMetadata, 'roles')\n // .of(permission) // permission instance or its ID\n // .remove(permission.roles); // remove all linked roles\n // }\n // }\n\n // await permissionsRepo.remove(permissionsToDelete);\n\n // Delete actions\n // const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });\n // await actionRepo.delete({ model: { id: modelEntity.id } });\n\n // // Delete menu items\n // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);\n // if (action) {\n // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });\n // for (let i = 0; i < menuItems.length; i++) {\n // const menuItem = menuItems[i];\n // await menuItemRepo.remove(menuItem);\n // }\n // }\n\n // Delete view \n // const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // await viewRepo.delete({ model: { id: modelEntity.id } })\n\n // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n if (metaData) {\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === modelEntity.singularName\n );\n\n // Remove the model to be deleted from the metadata\n if (existingModelIndex !== -1) {\n metaData.moduleMetadata.models.splice(existingModelIndex, 1);\n }\n\n // Remove references to this model in the menu, action & view sections.\n metaData.moduleMetadata.menus = metaData.moduleMetadata?.menus?.filter(\n (menu: any) => menu.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.actions = metaData.moduleMetadata?.actions?.filter(\n (action: any) => action.modelUserKey !== modelEntity.singularName\n );\n metaData.moduleMetadata.views = metaData.moduleMetadata?.views?.filter(\n (view: any) => view.modelUserKey !== modelEntity.singularName\n );\n\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n }\n\n // <moduleName>.module.ts | Remove all references and imports of the deleted model files. | Automatic\n if (modulePath) {\n const moduleFilePath = path.resolve(modulePath, `${dasherize(modelEntity.module?.name)}.module.ts`);\n this.logger.log(`Removing model '${modelEntity.singularName}' references from module file: ${moduleFilePath}`);\n try {\n this.solidTsMorphService.begin();\n const modelPathSegment = `/${dasherize(modelEntity.singularName)}.`;\n const { removedIdentifiers } = this.solidTsMorphService.removeImports(\n moduleFilePath,\n spec => spec.includes(modelPathSegment)\n );\n this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);\n await this.solidTsMorphService.commit();\n } catch (error) {\n this.solidTsMorphService.rollback();\n this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);\n }\n }\n\n // - | Drop database table | Removes the database table from the DB, this is a very risky step. Best to review all relations to other models etc and then do this manually | Manual (X)\n\n }\n\n @DisallowInProduction()\n async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {\n const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];\n\n // Generate the code for the passed model\n const { model, removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(options);\n affectedModelIds.push(model.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n\n // Generate the code for models which are linked to fields having an inverse relation\n await this.generateCodeForInverseModels(model, options, affectedModelIds, refreshModelCodeOutputLines, removeFieldCodeOutputLines);\n\n // Generate the VAM config for all the affected models\n for (const modelId of affectedModelIds) {\n await this.generateVAMConfig(modelId);\n }\n\n // Return the aggregated code output\n return `${removeFieldCodeOutputLines.join('\\n')} \\n ${refreshModelCodeOutputLines.join('\\n')}`;\n }\n\n private async generateCodeForInverseModels(model: ModelMetadata, options: CodeGenerationOptions, affectedModelIds: any[], refreshModelCodeOutputLines: any[], removeFieldCodeOutputLines: any[]) {\n const coModelSingularNames = model.fields.\n filter(field => field.type === SolidFieldType.relation && field.relationCreateInverse === true)\n .map(field => field.relationCoModelSingularName);\n\n for (const singularName of coModelSingularNames) {\n const coModel = await this.findOneBySingularName(singularName);\n const inverseOptions: CodeGenerationOptions = {\n modelId: coModel.id,\n dryRun: options.dryRun\n };\n const { removeFieldCodeOuput, refreshModelCodeOutput } = await this.generateCode(inverseOptions);\n affectedModelIds.push(coModel.id);\n refreshModelCodeOutputLines.push(refreshModelCodeOutput);\n removeFieldCodeOutputLines.push(removeFieldCodeOuput);\n }\n }\n\n // Generate the View, Action and Menu configuration for the model\n async generateVAMConfig(modelId: number) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n const modelRepository = manager.getRepository(ModelMetadata);\n const model = await modelRepository.findOne({\n where: {\n id: modelId\n },\n relations: [\"fields\", \"module\"]\n });\n await this.populateVAMConfigInDb(model);\n await this.populateVAMConfigInFile(model);\n });\n } catch (error) {\n this.logger.error('generateVAMConfig Transaction failed:', error);\n throw error;\n }\n }\n\n private async populateVAMConfigInFile(model: ModelMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n const listViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const treeViewLayoutFields = [{ type: \"field\", attrs: { name: `id` } }];\n const formViewLayoutFields = [];\n\n for (let i = 0; i < model.fields.length; i++) {\n const field = model.fields[i];\n if (field.isSystem) continue;\n listViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n formViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n treeViewLayoutFields.push({ type: \"field\", attrs: { name: `${field.name}` } })\n }\n this.populateVAMConfigInFileInternal(formViewLayoutFields, model, listViewLayoutFields, treeViewLayoutFields, metaData);\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File updation failed for View, action, menus config:', error);\n throw new Error('File updation failed for View, action, menus config'); // Trigger rollback\n }\n }\n\n // Populate the View, Actions and Menus in the config file\n private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {\n const column1Fields = [];\n const column2Fields = [];\n\n // Distribute fields between two columns\n for (let i = 0; i < formViewLayoutFields.length; i++) {\n if (i % 2 === 0) {\n column1Fields.push(formViewLayoutFields[i]);\n } else {\n column2Fields.push(formViewLayoutFields[i]);\n }\n }\n const actionName = `${model.singularName}-list-action`;\n const treeViewActionName = `${model.singularName}-tree-view-action`;\n const listViewName = `${model.singularName}-list-view`;\n const treeViewName = `${model.singularName}-tree-view`;\n const formViewName = `${model.singularName}-form-view`;\n const menuName = `${model.singularName}-menu-item`;\n\n const action = {\n displayName: `${model.displayName} List Action`,\n name: actionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: listViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const treeViewAction = {\n displayName: `${model.displayName} Tree View Action`,\n name: treeViewActionName,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: treeViewName,\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`\n };\n\n const menu = {\n displayName: `${model.displayName}`,\n name: menuName,\n sequenceNumber: 1,\n actionUserKey: actionName,\n moduleUserKey: `${model.module.name}`,\n parentMenuItemUserKey: \"\",\n iconName: \"\"\n };\n\n const modelListview = {\n name: listViewName,\n displayName: `${model.displayName}`,\n type: \"list\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayoutFields\n }\n };\n\n const modelTreeview = {\n name: treeViewName,\n displayName: `${model.displayName}`,\n type: \"tree\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [\n 10,\n 25,\n 50\n ],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayoutFields\n }\n };\n\n\n const modelFormView = {\n name: formViewName,\n displayName: `${model.displayName}`,\n type: \"form\",\n context: \"{}\",\n moduleUserKey: `${model.module.name}`,\n modelUserKey: `${model.singularName}`,\n layout: {\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column1Fields\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: column2Fields\n }\n ]\n },\n ]\n }\n ]\n }\n };\n\n // Utility function to check if an item with the same name already exists\n const notExists = (arr: any[], name: string) => !arr.some(item => item.name === name);\n\n if (notExists(metaData.menus, menuName)) {\n metaData.menus.push(menu);\n }\n\n if (notExists(metaData.actions, actionName)) {\n metaData.actions.push(action);\n }\n\n if (notExists(metaData.actions, treeViewActionName)) {\n metaData.actions.push(treeViewAction);\n }\n\n if (notExists(metaData.views, listViewName)) {\n metaData.views.push(modelListview);\n }\n\n if (notExists(metaData.views, treeViewName)) {\n metaData.views.push(modelTreeview);\n }\n\n if (notExists(metaData.views, formViewName)) {\n metaData.views.push(modelFormView);\n }\n // metaData.menus.push(menu);\n // metaData.actions.push(action);\n // metaData.views.push(modelListview);\n // metaData.views.push(modelFormView);\n }\n\n //Populate the View, Actions and Menus in the database\n private async populateVAMConfigInDb(model: ModelMetadata) {\n const jsonFieldsList = model.fields.filter((field: FieldMetadata) => field.isSystem !== true);\n\n const listViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const treeViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`,\n isSearchable: true,\n }\n }));\n\n const formViewLayout = jsonFieldsList.map(field => ({\n type: \"field\",\n attrs: {\n name: `${field.name}`\n }\n }));\n\n const midIndex = Math.ceil(formViewLayout.length / 2);\n const firstHalf = formViewLayout.slice(0, midIndex);\n const secondHalf = formViewLayout.slice(midIndex);\n\n const resolvedModule = await this.dataSource.getRepository(ModuleMetadata).findOne({\n where: { id: model.module.id }\n });\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n\n const modelViews = [\n {\n name: `${model.singularName}-list-view`,\n displayName: `${model.displayName}`,\n type: 'list',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"list\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: listViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-tree-view`,\n displayName: `${model.displayName}`,\n type: 'tree',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"tree\",\n attrs: {\n pagination: true,\n pageSizeOptions: [10, 25, 50],\n enableGlobalSearch: true,\n create: true,\n edit: true,\n delete: true\n },\n children: treeViewLayout\n }, null, 3)\n },\n {\n name: `${model.singularName}-form-view`,\n displayName: `${model.displayName}`,\n type: 'form',\n context: \"{}\",\n module: resolvedModule,\n model: model,\n layout: JSON.stringify({\n type: \"form\",\n attrs: { name: \"form-1\", label: `${model.displayName}`, className: \"grid\" },\n children: [\n {\n type: \"sheet\",\n attrs: { name: \"sheet-1\" },\n children: [\n {\n type: \"row\",\n attrs: { name: \"group-1\", label: \"\", className: \"\" },\n children: [\n {\n type: \"column\",\n attrs: { name: \"group-1\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: firstHalf\n },\n {\n type: \"column\",\n attrs: { name: \"group-2\", label: \"\", className: \"col-12 sm:col-12 md:col-6 lg:col-6\" },\n children: secondHalf\n }\n ]\n }\n ]\n }\n ]\n }, null, 3)\n }\n ];\n\n for (const view of modelViews) {\n const existingView = await viewRepo.findOne({ where: { name: view.name } });\n\n if (!existingView) {\n const createdView = viewRepo.create(view);\n await viewRepo.save(createdView);\n }\n }\n\n let view = await viewRepo.findOne({ where: { name: `${model.singularName}-list-view` } });\n let treeView = await viewRepo.findOne({ where: { name: `${model.singularName}-tree-view` } });\n\n const actionData = {\n displayName: `${model.displayName} List Action`,\n name: `${model.singularName}-list-action`,\n type: \"solid\",\n domain: \"\" as any,\n context: \"\" as any,\n customComponent: \"\",\n customIsModal: true,\n serverEndpoint: \"\",\n view: view,\n module: resolvedModule,\n model: model\n };\n\n const treeViewActionData = {\n displayName: `${model.displayName} Tree View Action`,\n name: `${model.singularName}-tree-view-action`,\n type: \"solid\",\n domain: \"\",\n context: \"\",\n customComponent: ``,\n customIsModal: true,\n serverEndpoint: \"\",\n view: treeView,\n module: resolvedModule,\n model: model\n };\n\n let existingAction = await actionRepo.findOne({ where: { name: actionData.name } });\n let existingTreeViewAction = await actionRepo.findOne({ where: { name: treeViewActionData.name } });\n\n if (!existingAction) {\n const createdAction = actionRepo.create(actionData);\n existingAction = await actionRepo.save(createdAction);\n }\n\n if (!existingTreeViewAction) {\n const createdTreeViewAction = actionRepo.create(treeViewActionData);\n existingTreeViewAction = await actionRepo.save(createdTreeViewAction);\n }\n\n const adminRole = await this.roleService.findRoleByName('Admin');\n\n const menuData = {\n displayName: `${model.displayName}`,\n name: `${model.singularName}-menu-item`,\n sequenceNumber: 1,\n action: existingAction,\n module: resolvedModule,\n roles: [adminRole],\n parentMenuItemUserKey: \"\"\n };\n\n let existingMenu = await menuRepo.findOne({ where: { name: menuData.name } });\n\n if (!existingMenu) {\n const createdMenu = menuRepo.create(menuData);\n await menuRepo.save(createdMenu);\n }\n }\n\n async generateCode(options: CodeGenerationOptions) {\n const query = {\n populate: [\"module\", \"fields\"]\n };\n\n const model = options.modelId\n ? await this.findOne(options.modelId, query)\n : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n options.fieldIdsForRemoval = model.fields\n .filter(field => field.isMarkedForRemoval)\n .map(field => field.id);\n\n const refreshModelCodeOutput = await this.generateModelCode(options);\n const removeFieldCodeOuput = await this.generateRemoveFieldsCode(options);\n return { model, removeFieldCodeOuput, refreshModelCodeOutput };\n }\n\n async generateRemoveFieldsCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n if (!options.fieldIdsForRemoval || options.fieldIdsForRemoval.length === 0) {\n return \"\";\n }\n\n const query = {\n populate: [\"module\", \"fields\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n //Filter out the fields by id\n const fieldsForRemoval = model.fields.filter((field) => options.fieldIdsForRemoval.includes(+field.id));\n const removeOutput = await this.executeRemoveFieldsCommand(model, fieldsForRemoval, options.dryRun);\n\n // Remove the fields from the database as well. This also checks, if the field is marked for removal\n fieldsForRemoval.forEach((field: FieldMetadata) => {\n if (field.isMarkedForRemoval) {\n this.fieldMetadataService.delete(field.id);\n }\n });\n\n // Remove the fields from metadata json file \n\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(model.module.name);\n const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n // Check if the model already exists in `models`\n const existingModelIndex = metaData.moduleMetadata.models.findIndex(\n (existingModel: any) => existingModel.singularName === model.singularName\n );\n\n const modelMetaData = metaData.moduleMetadata.models[existingModelIndex];\n\n // Remove fields marked for removal from modelMetaData.fields\n modelMetaData.fields = modelMetaData.fields.filter((field: any) => field.isMarkedForRemoval !== true);\n\n if (existingModelIndex !== -1) {\n // Update the existing model\n metaData.moduleMetadata.models[existingModelIndex] = modelMetaData;\n } else {\n // Add the new model\n metaData.moduleMetadata.models.push(modelMetaData);\n }\n\n // Write the updated object back to the file\n const updatedContent = JSON.stringify(metaData, null, 2);\n await fs.writeFile(filePath, updatedContent);\n\n return removeOutput;\n }\n\n async generateModelCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.modelId && !options.modelUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n\n const query = {\n populate: [\"module\", \"fields\", \"parentModel\", \"parentModel.module\"]\n };\n const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);\n\n let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n\n // If a list of field ids or field names is passed for refresh, use these fields only\n if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {\n fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));\n } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {\n fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));\n }\n // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n\n //Execute the schematic command to refresh the model\n const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);\n\n return `${refreshOuput}`;\n }\n\n private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);\n const output = await this.schematicService.executeSchematicCommand(\n REFRESH_MODEL_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n },\n dryRun\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async executeRemoveFieldsCommand(model: ModelMetadata, fieldsForRemoval: FieldMetadata[], dryRun: boolean = false): Promise<string> {\n if (!fieldsForRemoval || fieldsForRemoval.length === 0) {\n return \"\";\n }\n const output = await this.schematicService.executeSchematicCommand(\n REMOVE_FIELDS_COMMAND,\n {\n module: model.module.name,\n model: model.singularName,\n fieldNamesForRemoval: fieldsForRemoval.map(field => field.name),\n },\n dryRun\n );\n\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n async updateUserKey(data: any) {\n const { modelName, fieldName } = data;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: modelName },\n relations: ['fields', 'userKeyField'],\n });\n\n if (!model) {\n throw new Error(`Model with name ${modelName} not found`);\n }\n\n if (model.userKeyField) {\n throw new Error(`User key is already set to ${model.userKeyField.name}. No changes were made.`);\n }\n\n const fieldToUpdate = model.fields.find(field => field.name === fieldName);\n if (!fieldToUpdate) {\n throw new Error(`Field with name ${fieldName} not found in model ${modelName}`);\n }\n\n fieldToUpdate.isUserKey = true;\n\n model.userKeyField = fieldToUpdate;\n\n await this.modelMetadataRepo.save(model);\n\n return {\n message: `User key has been successfully updated to ${fieldName}.`,\n success: true\n };\n }\n\n private async getRelationInverseFields(modelId: number, repo: Repository<FieldMetadata>): Promise<FieldMetadata[]> {\n return await repo.find({\n where: {\n model: {\n id: modelId\n },\n type: SolidFieldType.relation,\n relationCreateInverse: true\n },\n relations: {\n model: {\n module: true\n }\n }\n });\n }\n\n async navigation(navigationDto: NavigationDto) {\n const { recordId, modelName, ...basicFilterDto } = navigationDto;\n\n const modelServiceInstanceWrapper =\n this.introspectService.getProvider(`${classify(modelName)}Service`);\n\n if (!modelServiceInstanceWrapper) {\n throw new BadRequestException(\n `Invalid model name (${modelName}) specified in Navigation.`,\n );\n }\n\n const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;\n\n const recs = await modelService.find(basicFilterDto);\n\n // navigation only works for paginated results\n if (!('records' in recs) || !('currentPage' in recs.meta)) {\n return {\n prev: null,\n next: null,\n meta: null,\n };\n }\n\n const { records, meta } = recs;\n\n // --------------------\n // Find record index in page\n // --------------------\n const index = records.findIndex(r => String(r.id) === String(recordId));\n\n if (index === -1) {\n throw new BadRequestException(`Record not found in current page`);\n }\n\n // --------------------\n // Pagination calculations\n // --------------------\n const limit = meta.perPage;\n const currentOffset = (meta.currentPage - 1) * meta.perPage;\n const currentIndexGlobal = currentOffset + index + 1;\n\n\n let prev: { record: any; offset: number; limit: number } | null = null;\n let next: { record: any; offset: number; limit: number } | null = null;\n\n // --------------------\n // PREV\n // --------------------\n if (index > 0) {\n prev = {\n record: records[index - 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.prevPage !== null) {\n const prevOffset = (meta.prevPage - 1) * meta.perPage;\n\n const prevPage = await modelService.find({\n ...basicFilterDto,\n offset: prevOffset,\n limit,\n });\n\n if ('records' in prevPage) {\n const record = prevPage.records.at(-1) ?? null;\n if (record) {\n prev = {\n record,\n offset: prevOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // NEXT\n // --------------------\n if (index < records.length - 1) {\n next = {\n record: records[index + 1],\n offset: currentOffset,\n limit,\n };\n } else if (meta.nextPage !== null) {\n const nextOffset = (meta.nextPage - 1) * meta.perPage;\n\n const nextPage = await modelService.find({\n ...basicFilterDto,\n offset: nextOffset,\n limit,\n });\n\n if ('records' in nextPage) {\n const record = nextPage.records[0] ?? null;\n if (record) {\n next = {\n record,\n offset: nextOffset,\n limit,\n };\n }\n }\n }\n\n // --------------------\n // RESPONSE\n // --------------------\n return {\n prev: prev\n ? {\n recordId: prev.record.id,\n offset: prev.offset,\n limit: prev.limit,\n }\n : null,\n\n next: next\n ? {\n recordId: next.record.id,\n offset: next.offset,\n limit: next.limit,\n }\n : null,\n meta: {\n totalRecords: meta.totalRecords,\n perPage: meta.perPage,\n currentPage: meta.currentPage,\n totalPages: meta.totalPages,\n\n currentIndexInPage: index,\n currentIndexGlobal,\n\n hasPrev: !!prev,\n hasNext: !!next,\n\n prevPage: meta.prevPage,\n nextPage: meta.nextPage,\n },\n\n };\n }\n\n\n}\n"]}
|
|
@@ -43,11 +43,9 @@ let PermissionMetadataService = PermissionMetadataService_1 = class PermissionMe
|
|
|
43
43
|
const cacheKey = this.buildPermissionsByRoleCacheKey(role);
|
|
44
44
|
const hit = await this.cacheManager.get(cacheKey);
|
|
45
45
|
if (hit) {
|
|
46
|
-
this.logger.debug(`Cache hit for findAllUsingRoles: key=${cacheKey}`);
|
|
47
46
|
cached.push(...hit);
|
|
48
47
|
}
|
|
49
48
|
else {
|
|
50
|
-
this.logger.debug(`Cache miss for findAllUsingRoles: key=${cacheKey}`);
|
|
51
49
|
uncachedRoles.push(role);
|
|
52
50
|
}
|
|
53
51
|
}
|
|
@@ -82,10 +80,8 @@ let PermissionMetadataService = PermissionMetadataService_1 = class PermissionMe
|
|
|
82
80
|
if (useCache) {
|
|
83
81
|
const hit = await this.cacheManager.get(cacheKey);
|
|
84
82
|
if (hit) {
|
|
85
|
-
this.logger.debug(`Cache hit for permissionExistsInRole: key=${cacheKey}`);
|
|
86
83
|
return hit.filter(p => p.name === permission);
|
|
87
84
|
}
|
|
88
|
-
this.logger.debug(`Cache miss for permissionExistsInRole: key=${cacheKey}`);
|
|
89
85
|
}
|
|
90
86
|
const fromDb = await this.repo.find({
|
|
91
87
|
where: { roles: { name: role } },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission-metadata.service.js","sourceRoot":"","sources":["../../src/services/permission-metadata.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,yDAAsD;AACtD,uCAAyC;AACzC,6CAAsD;AAEtD,iDAAwD;AACxD,0DAA0D;AAC1D,qCAA4C;AAG5C,iGAA6F;AAItF,IAAM,yBAAyB,iCAA/B,MAAM,yBAA0B,SAAQ,0BAA+B;IAE5E,YAEE,aAAqC,EAG5B,IAAkC,EAClC,SAAoB,EACN,YAAoC;QAE3D,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,YAAY,EAAC,SAAS,CAAC,CAAC;QAPhE,kBAAa,GAAb,aAAa,CAAe;QAG5B,SAAI,GAAJ,IAAI,CAA8B;QAClC,cAAS,GAAT,SAAS,CAAW;QACW,iBAAY,GAAZ,YAAY,CAAO;QAR5C,WAAM,GAAG,IAAI,eAAM,CAAC,2BAAyB,CAAC,IAAI,CAAC,CAAC;IAWrE,CAAC;IAEO,8BAA8B,CAAC,QAAgB;QACrD,OAAO,oBAAoB,QAAQ,EAAE,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,KAAe;QACrC,MAAM,QAAQ,GAAG,IAAA,6BAAc,GAAE,CAAC;QAClC,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAuB,QAAQ,CAAC,CAAC;gBACxE,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"permission-metadata.service.js","sourceRoot":"","sources":["../../src/services/permission-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Inject, Injectable, Logger } from '@nestjs/common';\nimport { CACHE_MANAGER } from '@nestjs/cache-manager';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { Cache } from 'cache-manager';\nimport { CRUDService } from 'src/services/crud.service';\nimport { shouldUseCache } from 'src/helpers/cache.helper';\nimport { EntityManager, In } from 'typeorm';\n\n\nimport { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\n\n@Injectable()\nexport class PermissionMetadataService extends CRUDService<PermissionMetadata> {\n private readonly logger = new Logger(PermissionMetadataService.name);\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(PermissionMetadata, 'default')\n // readonly repo: Repository<PermissionMetadata>,\n readonly repo: PermissionMetadataRepository,\n readonly moduleRef: ModuleRef,\n @Inject(CACHE_MANAGER) private readonly cacheManager: Cache,\n ) {\n super(entityManager, repo, 'permissionMetadata', 'solid-core',moduleRef);\n }\n\n private buildPermissionsByRoleCacheKey(roleName: string): string {\n return `permissions:role:${roleName}`;\n }\n\n async findAllUsingRoles(roles: string[]): Promise<PermissionMetadata[]> {\n const useCache = shouldUseCache();\n const cached: PermissionMetadata[] = [];\n const uncachedRoles: string[] = [];\n\n if (useCache) {\n for (const role of roles) {\n const cacheKey = this.buildPermissionsByRoleCacheKey(role);\n const hit = await this.cacheManager.get<PermissionMetadata[]>(cacheKey);\n if (hit) {\n // this.logger.debug(`Cache hit for findAllUsingRoles: key=${cacheKey}`);\n cached.push(...hit);\n } else {\n // this.logger.debug(`Cache miss for findAllUsingRoles: key=${cacheKey}`);\n uncachedRoles.push(role);\n }\n }\n } else {\n uncachedRoles.push(...roles);\n }\n\n if (uncachedRoles.length === 0) {\n return cached;\n }\n\n const fromDb = await this.repo.find({\n where: { roles: { name: In(uncachedRoles) } },\n relations: { roles: true },\n });\n\n if (useCache) {\n for (const role of uncachedRoles) {\n const permsForRole = fromDb.filter(p => p.roles?.some(r => r.name === role));\n await this.cacheManager.set(this.buildPermissionsByRoleCacheKey(role), permsForRole);\n }\n }\n\n const seen = new Set<number>();\n return [...cached, ...fromDb].filter(p => {\n if (seen.has(p.id)) return false;\n seen.add(p.id);\n return true;\n });\n }\n\n async permissionExistsInRole(role: string, permission: string): Promise<PermissionMetadata[]> {\n const useCache = shouldUseCache();\n const cacheKey = this.buildPermissionsByRoleCacheKey(role);\n\n if (useCache) {\n const hit = await this.cacheManager.get<PermissionMetadata[]>(cacheKey);\n if (hit) {\n // this.logger.debug(`Cache hit for permissionExistsInRole: key=${cacheKey}`);\n return hit.filter(p => p.name === permission);\n }\n // this.logger.debug(`Cache miss for permissionExistsInRole: key=${cacheKey}`);\n }\n\n const fromDb = await this.repo.find({\n where: { roles: { name: role } },\n relations: { roles: true },\n });\n\n if (useCache) {\n await this.cacheManager.set(cacheKey, fromDb);\n }\n\n return fromDb.filter(p => p.name === permission);\n }\n\n}\n\n"]}
|
|
@@ -34,7 +34,6 @@ let PublisherFactory = PublisherFactory_1 = class PublisherFactory {
|
|
|
34
34
|
throw new Error(`Unable to locate publisher with name ${resolvedPublisherName}`);
|
|
35
35
|
}
|
|
36
36
|
const typedActualPublisher = actualPublisherToUse.instance;
|
|
37
|
-
this.logger.debug(`Resolved publisher with name ${actualPublisherToUse.name}, and with options: ${JSON.stringify(typedActualPublisher.options())}`);
|
|
38
37
|
return typedActualPublisher.publish(message);
|
|
39
38
|
}
|
|
40
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher-factory.service.js","sourceRoot":"","sources":["../../../src/services/queues/publisher-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,2CAA4C;AAG5C,oEAAkE;AAClE,0EAAqE;AAI9D,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAGzB,YAEI,yBAAkE;QAAjD,8BAAyB,GAAzB,yBAAyB,CAAwB;QAJrD,WAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAM5D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,aAAqB,EAAE,WAAoB;QAC/E,IAAI,kBAAkB,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,UAAU,CAAC;QACxF,IAAI,qBAAqB,GAAG,GAAG,aAAa,GAAG,IAAA,kBAAQ,EAAC,kBAAkB,CAAC,EAAE,CAAC;QAG9E,IAAI,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAExB,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAMrF,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,qBAAqB,EAAE,CAAC,CAAC;QACrF,CAAC;QAGD,MAAM,oBAAoB,GAAsB,oBAAoB,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"publisher-factory.service.js","sourceRoot":"","sources":["../../../src/services/queues/publisher-factory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,2CAA4C;AAG5C,oEAAkE;AAClE,0EAAqE;AAI9D,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAGzB,YAEI,yBAAkE;QAAjD,8BAAyB,GAAzB,yBAAyB,CAAwB;QAJrD,WAAM,GAAG,IAAI,eAAM,CAAC,kBAAgB,CAAC,IAAI,CAAC,CAAC;IAM5D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAwB,EAAE,aAAqB,EAAE,WAAoB;QAC/E,IAAI,kBAAkB,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,UAAU,CAAC;QACxF,IAAI,qBAAqB,GAAG,GAAG,aAAa,GAAG,IAAA,kBAAQ,EAAC,kBAAkB,CAAC,EAAE,CAAC;QAG9E,IAAI,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAExB,oBAAoB,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAMrF,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,qBAAqB,EAAE,CAAC,CAAC;QACrF,CAAC;QAGD,MAAM,oBAAoB,GAAsB,oBAAoB,CAAC,QAAQ,CAAC;QAG9E,OAAO,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;CACJ,CAAA;AAlCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;IAKJ,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,iDAAsB,CAAC,CAAC,CAAA;qCACL,iDAAsB;GAL7D,gBAAgB,CAkC5B","sourcesContent":["import { forwardRef, Inject, Logger } from '@nestjs/common';\nimport { Injectable } from '@nestjs/common';\n\nimport { QueueMessage, QueuePublisher } from 'src/interfaces/mq';\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { SolidIntrospectService } from '../solid-introspect.service';\n\n\n@Injectable()\nexport class PublisherFactory<T> {\n private readonly logger = new Logger(PublisherFactory.name);\n\n constructor(\n @Inject(forwardRef(() => SolidIntrospectService))\n private readonly solidIntrospectionService: SolidIntrospectService\n ) {\n }\n\n async publish(message: QueueMessage<T>, publisherName: string, brokerToUse?: string): Promise<string> {\n let defaultBrokerToUse = brokerToUse || process.env.QUEUES_DEFAULT_BROKER || \"database\";\n let resolvedPublisherName = `${publisherName}${classify(defaultBrokerToUse)}`;\n\n // Register all ISolidDatabaseModules implementations\n let actualPublisherToUse = this.solidIntrospectionService.getProvider(resolvedPublisherName);\n if (!actualPublisherToUse) {\n // Relaxed extra check in place to make sure we do not have to refactor old publishers or publishers named without the ____RabbitMq or ____Database convention\n actualPublisherToUse = this.solidIntrospectionService.getProvider(publisherName);\n\n // Extra check in place to make sure we do not have to refactor old publishers which have been created earlier. \n // if (defaultBrokerToUse === 'rabbitmq') {\n // actualPublisherToUse = this.solidIntrospectionService.getProvider(publisherName);\n // }\n }\n if (!actualPublisherToUse) {\n throw new Error(`Unable to locate publisher with name ${resolvedPublisherName}`);\n }\n\n // type safe\n const typedActualPublisher: QueuePublisher<T> = actualPublisherToUse.instance;\n // this.logger.debug(`Resolved publisher with name ${actualPublisherToUse.name}, and with options: ${JSON.stringify(typedActualPublisher.options())}`);\n\n return typedActualPublisher.publish(message);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@solidxai/core",
|
|
3
|
-
"version": "0.1.6-beta.
|
|
3
|
+
"version": "0.1.6-beta.22",
|
|
4
4
|
"description": "This module is a NestJS module containing all the required core providers required by a Solid application",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CACHE_MANAGER } from '@nestjs/cache-manager';
|
|
2
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
3
|
+
import { Cache } from 'cache-manager';
|
|
4
|
+
import { createHash } from 'crypto';
|
|
2
5
|
import { ModelMetadata } from 'src';
|
|
6
|
+
import { shouldUseCache } from 'src/helpers/cache.helper';
|
|
3
7
|
import { DataSource } from 'typeorm';
|
|
4
8
|
import { SolidBaseRepository } from './solid-base.repository';
|
|
5
9
|
|
|
@@ -7,9 +11,48 @@ import { SolidBaseRepository } from './solid-base.repository';
|
|
|
7
11
|
export class ModelMetadataRepository extends SolidBaseRepository<ModelMetadata> {
|
|
8
12
|
constructor(
|
|
9
13
|
readonly dataSource: DataSource,
|
|
14
|
+
@Inject(CACHE_MANAGER) private readonly cacheManager: Cache,
|
|
10
15
|
// readonly requestContextService: RequestContextService,
|
|
11
16
|
// readonly securityRuleRepository: SecurityRuleRepository,
|
|
12
17
|
) {
|
|
13
18
|
super(ModelMetadata, dataSource, null, null);
|
|
14
19
|
}
|
|
15
|
-
|
|
20
|
+
|
|
21
|
+
async find(options?: any): Promise<ModelMetadata[]> {
|
|
22
|
+
if (!shouldUseCache()) {
|
|
23
|
+
return super.find(options);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const cacheKey = this.buildCacheKey('find', options);
|
|
27
|
+
const cached = await this.cacheManager.get<ModelMetadata[]>(cacheKey);
|
|
28
|
+
if (cached !== undefined) {
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const result = await super.find(options);
|
|
33
|
+
await this.cacheManager.set(cacheKey, result);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async findOne(options: any): Promise<ModelMetadata | null> {
|
|
38
|
+
if (!shouldUseCache()) {
|
|
39
|
+
return super.findOne(options);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const cacheKey = this.buildCacheKey('findOne', options);
|
|
43
|
+
const cached = await this.cacheManager.get<ModelMetadata | null>(cacheKey);
|
|
44
|
+
if (cached !== undefined) {
|
|
45
|
+
return cached;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const result = await super.findOne(options);
|
|
49
|
+
await this.cacheManager.set(cacheKey, result);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private buildCacheKey(method: 'find' | 'findOne', options: unknown): string {
|
|
54
|
+
const serialized = JSON.stringify(options ?? {});
|
|
55
|
+
const hash = createHash('sha256').update(serialized).digest('hex');
|
|
56
|
+
return `modelMetadataRepo:${method}:${hash}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
|
|
2
|
-
import { CACHE_MANAGER } from '@nestjs/cache-manager';
|
|
3
2
|
import { InjectDataSource } from '@nestjs/typeorm';
|
|
4
3
|
import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
|
|
5
4
|
import * as path from 'path';
|
|
6
|
-
import { Cache } from 'cache-manager';
|
|
7
5
|
import { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';
|
|
8
6
|
import { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';
|
|
9
7
|
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
@@ -14,7 +12,6 @@ import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
|
14
12
|
import { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';
|
|
15
13
|
import { SolidFieldType } from 'src/dtos/create-field-metadata.dto';
|
|
16
14
|
import { PermissionMetadata } from 'src/entities/permission-metadata.entity';
|
|
17
|
-
import { shouldUseCache } from 'src/helpers/cache.helper';
|
|
18
15
|
import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
|
|
19
16
|
import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
|
|
20
17
|
import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
|
|
@@ -60,7 +57,6 @@ export class ModelMetadataService {
|
|
|
60
57
|
private readonly moduleMetadataHelperService: ModuleMetadataHelperService,
|
|
61
58
|
readonly introspectService: SolidIntrospectService,
|
|
62
59
|
private readonly solidTsMorphService: SolidTsMorphService,
|
|
63
|
-
@Inject(CACHE_MANAGER) private readonly cacheManager: Cache,
|
|
64
60
|
|
|
65
61
|
// No longer used.
|
|
66
62
|
// private readonly generateCodePublihser: GenerateCodePublisherDatabase,
|
|
@@ -116,23 +112,7 @@ export class ModelMetadataService {
|
|
|
116
112
|
return entity;
|
|
117
113
|
}
|
|
118
114
|
|
|
119
|
-
private buildModelBySingularNameCacheKey(singularName: string): string {
|
|
120
|
-
return `modelMetadata:singularName:${singularName}`;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
115
|
async findOneBySingularName(singularName: string, relations = {}) {
|
|
124
|
-
const useCache = shouldUseCache();
|
|
125
|
-
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
126
|
-
|
|
127
|
-
if (useCache) {
|
|
128
|
-
const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);
|
|
129
|
-
if (cached) {
|
|
130
|
-
this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);
|
|
131
|
-
return cached;
|
|
132
|
-
}
|
|
133
|
-
this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
116
|
const entity = await this.modelMetadataRepo.findOne({
|
|
137
117
|
where: {
|
|
138
118
|
singularName: singularName,
|
|
@@ -142,27 +122,10 @@ export class ModelMetadataService {
|
|
|
142
122
|
if (!entity) {
|
|
143
123
|
throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
144
124
|
}
|
|
145
|
-
|
|
146
|
-
if (useCache) {
|
|
147
|
-
await this.cacheManager.set(cacheKey, entity);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
125
|
return entity;
|
|
151
126
|
}
|
|
152
127
|
|
|
153
128
|
async findOneByUserKey(singularName: string, relations = {}) {
|
|
154
|
-
const useCache = shouldUseCache();
|
|
155
|
-
const cacheKey = this.buildModelBySingularNameCacheKey(singularName);
|
|
156
|
-
|
|
157
|
-
if (useCache) {
|
|
158
|
-
const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);
|
|
159
|
-
if (cached) {
|
|
160
|
-
this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);
|
|
161
|
-
return cached;
|
|
162
|
-
}
|
|
163
|
-
this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
129
|
const entity = await this.modelMetadataRepo.findOne({
|
|
167
130
|
where: {
|
|
168
131
|
singularName: singularName,
|
|
@@ -172,11 +135,6 @@ export class ModelMetadataService {
|
|
|
172
135
|
if (!entity) {
|
|
173
136
|
throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND(singularName));
|
|
174
137
|
}
|
|
175
|
-
|
|
176
|
-
if (useCache) {
|
|
177
|
-
await this.cacheManager.set(cacheKey, entity);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
138
|
return entity;
|
|
181
139
|
}
|
|
182
140
|
|
|
@@ -40,10 +40,10 @@ export class PermissionMetadataService extends CRUDService<PermissionMetadata> {
|
|
|
40
40
|
const cacheKey = this.buildPermissionsByRoleCacheKey(role);
|
|
41
41
|
const hit = await this.cacheManager.get<PermissionMetadata[]>(cacheKey);
|
|
42
42
|
if (hit) {
|
|
43
|
-
this.logger.debug(`Cache hit for findAllUsingRoles: key=${cacheKey}`);
|
|
43
|
+
// this.logger.debug(`Cache hit for findAllUsingRoles: key=${cacheKey}`);
|
|
44
44
|
cached.push(...hit);
|
|
45
45
|
} else {
|
|
46
|
-
this.logger.debug(`Cache miss for findAllUsingRoles: key=${cacheKey}`);
|
|
46
|
+
// this.logger.debug(`Cache miss for findAllUsingRoles: key=${cacheKey}`);
|
|
47
47
|
uncachedRoles.push(role);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -82,10 +82,10 @@ export class PermissionMetadataService extends CRUDService<PermissionMetadata> {
|
|
|
82
82
|
if (useCache) {
|
|
83
83
|
const hit = await this.cacheManager.get<PermissionMetadata[]>(cacheKey);
|
|
84
84
|
if (hit) {
|
|
85
|
-
this.logger.debug(`Cache hit for permissionExistsInRole: key=${cacheKey}`);
|
|
85
|
+
// this.logger.debug(`Cache hit for permissionExistsInRole: key=${cacheKey}`);
|
|
86
86
|
return hit.filter(p => p.name === permission);
|
|
87
87
|
}
|
|
88
|
-
this.logger.debug(`Cache miss for permissionExistsInRole: key=${cacheKey}`);
|
|
88
|
+
// this.logger.debug(`Cache miss for permissionExistsInRole: key=${cacheKey}`);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
const fromDb = await this.repo.find({
|
|
@@ -37,7 +37,7 @@ export class PublisherFactory<T> {
|
|
|
37
37
|
|
|
38
38
|
// type safe
|
|
39
39
|
const typedActualPublisher: QueuePublisher<T> = actualPublisherToUse.instance;
|
|
40
|
-
this.logger.debug(`Resolved publisher with name ${actualPublisherToUse.name}, and with options: ${JSON.stringify(typedActualPublisher.options())}`);
|
|
40
|
+
// this.logger.debug(`Resolved publisher with name ${actualPublisherToUse.name}, and with options: ${JSON.stringify(typedActualPublisher.options())}`);
|
|
41
41
|
|
|
42
42
|
return typedActualPublisher.publish(message);
|
|
43
43
|
}
|