@solidxai/core 0.1.6-beta.20 → 0.1.6-beta.21
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/services/model-metadata.service.js +0 -4
- 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/package.json +1 -1
- package/src/services/model-metadata.service.ts +4 -4
- package/src/services/permission-metadata.service.ts +4 -4
|
@@ -136,10 +136,8 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
136
136
|
if (useCache) {
|
|
137
137
|
const cached = await this.cacheManager.get(cacheKey);
|
|
138
138
|
if (cached) {
|
|
139
|
-
this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);
|
|
140
139
|
return cached;
|
|
141
140
|
}
|
|
142
|
-
this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);
|
|
143
141
|
}
|
|
144
142
|
const entity = await this.modelMetadataRepo.findOne({
|
|
145
143
|
where: {
|
|
@@ -161,10 +159,8 @@ let ModelMetadataService = class ModelMetadataService {
|
|
|
161
159
|
if (useCache) {
|
|
162
160
|
const cached = await this.cacheManager.get(cacheKey);
|
|
163
161
|
if (cached) {
|
|
164
|
-
this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);
|
|
165
162
|
return cached;
|
|
166
163
|
}
|
|
167
|
-
this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);
|
|
168
164
|
}
|
|
169
165
|
const entity = await this.modelMetadataRepo.findOne({
|
|
170
166
|
where: {
|
|
@@ -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 { 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"]}
|
|
@@ -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"]}
|
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.21",
|
|
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",
|
|
@@ -127,10 +127,10 @@ export class ModelMetadataService {
|
|
|
127
127
|
if (useCache) {
|
|
128
128
|
const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);
|
|
129
129
|
if (cached) {
|
|
130
|
-
this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);
|
|
130
|
+
// this.logger.debug(`Cache hit for findOneBySingularName: key=${cacheKey}`);
|
|
131
131
|
return cached;
|
|
132
132
|
}
|
|
133
|
-
this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);
|
|
133
|
+
// this.logger.debug(`Cache miss for findOneBySingularName: key=${cacheKey}`);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
const entity = await this.modelMetadataRepo.findOne({
|
|
@@ -157,10 +157,10 @@ export class ModelMetadataService {
|
|
|
157
157
|
if (useCache) {
|
|
158
158
|
const cached = await this.cacheManager.get<ModelMetadata>(cacheKey);
|
|
159
159
|
if (cached) {
|
|
160
|
-
this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);
|
|
160
|
+
// this.logger.debug(`Cache hit for findOneByUserKey: key=${cacheKey}`);
|
|
161
161
|
return cached;
|
|
162
162
|
}
|
|
163
|
-
this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);
|
|
163
|
+
// this.logger.debug(`Cache miss for findOneByUserKey: key=${cacheKey}`);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
const entity = await this.modelMetadataRepo.findOne({
|
|
@@ -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({
|