@solidstarters/solid-core 1.2.142 → 1.2.144

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.
Files changed (89) hide show
  1. package/dist/constants/error-messages.d.ts +83 -0
  2. package/dist/constants/error-messages.d.ts.map +1 -0
  3. package/dist/constants/error-messages.js +86 -0
  4. package/dist/constants/error-messages.js.map +1 -0
  5. package/dist/constants/success-messages.d.ts +11 -0
  6. package/dist/constants/success-messages.d.ts.map +1 -0
  7. package/dist/constants/success-messages.js +14 -0
  8. package/dist/constants/success-messages.js.map +1 -0
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  14. package/dist/services/ai-interaction.service.js +4 -3
  15. package/dist/services/ai-interaction.service.js.map +1 -1
  16. package/dist/services/authentication.service.d.ts.map +1 -1
  17. package/dist/services/authentication.service.js +66 -64
  18. package/dist/services/authentication.service.js.map +1 -1
  19. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.d.ts.map +1 -1
  20. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js +18 -2
  21. package/dist/services/computed-fields/entity/noops-entity-computed-field-provider.service.js.map +1 -1
  22. package/dist/services/crud-helper.service.d.ts.map +1 -1
  23. package/dist/services/crud-helper.service.js +3 -2
  24. package/dist/services/crud-helper.service.js.map +1 -1
  25. package/dist/services/crud.service.d.ts.map +1 -1
  26. package/dist/services/crud.service.js +23 -21
  27. package/dist/services/crud.service.js.map +1 -1
  28. package/dist/services/csv.service.d.ts.map +1 -1
  29. package/dist/services/csv.service.js +3 -2
  30. package/dist/services/csv.service.js.map +1 -1
  31. package/dist/services/excel.service.d.ts.map +1 -1
  32. package/dist/services/excel.service.js +3 -2
  33. package/dist/services/excel.service.js.map +1 -1
  34. package/dist/services/export-transaction.service.d.ts.map +1 -1
  35. package/dist/services/export-transaction.service.js +2 -1
  36. package/dist/services/export-transaction.service.js.map +1 -1
  37. package/dist/services/field-metadata.service.d.ts.map +1 -1
  38. package/dist/services/field-metadata.service.js +9 -8
  39. package/dist/services/field-metadata.service.js.map +1 -1
  40. package/dist/services/file.service.d.ts.map +1 -1
  41. package/dist/services/file.service.js +5 -4
  42. package/dist/services/file.service.js.map +1 -1
  43. package/dist/services/import-transaction.service.d.ts.map +1 -1
  44. package/dist/services/import-transaction.service.js +10 -9
  45. package/dist/services/import-transaction.service.js.map +1 -1
  46. package/dist/services/media-storage-provider-metadata.service.d.ts.map +1 -1
  47. package/dist/services/media-storage-provider-metadata.service.js +4 -3
  48. package/dist/services/media-storage-provider-metadata.service.js.map +1 -1
  49. package/dist/services/media.service.d.ts.map +1 -1
  50. package/dist/services/media.service.js +2 -1
  51. package/dist/services/media.service.js.map +1 -1
  52. package/dist/services/model-metadata.service.d.ts.map +1 -1
  53. package/dist/services/model-metadata.service.js +10 -9
  54. package/dist/services/model-metadata.service.js.map +1 -1
  55. package/dist/services/module-metadata.service.d.ts.map +1 -1
  56. package/dist/services/module-metadata.service.js +11 -10
  57. package/dist/services/module-metadata.service.js.map +1 -1
  58. package/dist/services/role-metadata.service.d.ts.map +1 -1
  59. package/dist/services/role-metadata.service.js +3 -2
  60. package/dist/services/role-metadata.service.js.map +1 -1
  61. package/dist/services/sql-expression-resolver.service.d.ts.map +1 -1
  62. package/dist/services/sql-expression-resolver.service.js +2 -1
  63. package/dist/services/sql-expression-resolver.service.js.map +1 -1
  64. package/dist/services/user.service.d.ts.map +1 -1
  65. package/dist/services/user.service.js +11 -10
  66. package/dist/services/user.service.js.map +1 -1
  67. package/dist/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
  69. package/src/constants/error-messages.ts +123 -0
  70. package/src/constants/success-messages.ts +13 -0
  71. package/src/index.ts +3 -1
  72. package/src/services/ai-interaction.service.ts +4 -3
  73. package/src/services/authentication.service.ts +66 -64
  74. package/src/services/computed-fields/entity/noops-entity-computed-field-provider.service.ts +4 -0
  75. package/src/services/crud-helper.service.ts +3 -2
  76. package/src/services/crud.service.ts +23 -23
  77. package/src/services/csv.service.ts +3 -2
  78. package/src/services/excel.service.ts +3 -2
  79. package/src/services/export-transaction.service.ts +2 -1
  80. package/src/services/field-metadata.service.ts +9 -8
  81. package/src/services/file.service.ts +5 -4
  82. package/src/services/import-transaction.service.ts +10 -9
  83. package/src/services/media-storage-provider-metadata.service.ts +4 -3
  84. package/src/services/media.service.ts +2 -1
  85. package/src/services/model-metadata.service.ts +10 -9
  86. package/src/services/module-metadata.service.ts +11 -10
  87. package/src/services/role-metadata.service.ts +3 -2
  88. package/src/services/sql-expression-resolver.service.ts +2 -1
  89. package/src/services/user.service.ts +11 -10
@@ -63,6 +63,7 @@ const crud_helper_service_1 = require("./crud-helper.service");
63
63
  const model_metadata_service_1 = require("./model-metadata.service");
64
64
  const module_metadata_helper_service_1 = require("../helpers/module-metadata-helper.service");
65
65
  const disallow_in_production_decorator_1 = require("../decorators/disallow-in-production.decorator");
66
+ const error_messages_1 = require("../constants/error-messages");
66
67
  let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataService {
67
68
  constructor(dataSource, moduleMetadataRepo, crudHelperService, schematicService, configService, fileService, permissionsSeederService, modelMetadataService, solidRegistry, moduleMetadataHelperService) {
68
69
  this.dataSource = dataSource;
@@ -102,7 +103,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
102
103
  }
103
104
  async findOneByUserKey(name, relations = {}) {
104
105
  if (!name) {
105
- throw new common_1.BadRequestException('name is required for finding entity');
106
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.ENTITY_NAME_REQUIRED);
106
107
  }
107
108
  const entity = await this.moduleMetadataRepo.findOne({
108
109
  where: {
@@ -114,7 +115,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
114
115
  }
115
116
  async findOne(id, relations = {}) {
116
117
  if (!id) {
117
- throw new common_1.BadRequestException('ID is required for finding entity');
118
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.ENTITY_ID_REQUIRED);
118
119
  }
119
120
  const entity = await this.moduleMetadataRepo.findOne({
120
121
  where: {
@@ -123,7 +124,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
123
124
  relations: relations,
124
125
  });
125
126
  if (!entity) {
126
- throw new common_1.NotFoundException(`entity #${id} not found`);
127
+ throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.ENTITY_NOT_FOUND());
127
128
  }
128
129
  return entity;
129
130
  }
@@ -204,7 +205,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
204
205
  }
205
206
  catch (error) {
206
207
  this.logger.error('File creation failed:', error);
207
- throw new Error('File creation failed, rolling back transaction');
208
+ throw new Error(error_messages_1.ERROR_MESSAGES.FILE_WRITE_FAILED);
208
209
  }
209
210
  }
210
211
  async update(id, updateModuleMetadataDto, files = []) {
@@ -226,7 +227,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
226
227
  ...updateModuleMetadataDto,
227
228
  });
228
229
  if (!module) {
229
- throw new common_1.NotFoundException(`Module ${id} not found`);
230
+ throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.MODULE_ID_NOT_FOUND(id));
230
231
  }
231
232
  if (files.length > 0) {
232
233
  const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));
@@ -277,7 +278,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
277
278
  }
278
279
  catch (error) {
279
280
  this.logger.error('File creation failed:', error);
280
- throw new Error('File creation failed, rolling back transaction');
281
+ throw new Error(error_messages_1.ERROR_MESSAGES.FILE_WRITE_FAILED);
281
282
  }
282
283
  }
283
284
  async upsert(updateModuleMetadataDto) {
@@ -309,7 +310,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
309
310
  }
310
311
  async deleteMany(ids) {
311
312
  if (!ids || ids.length === 0) {
312
- throw new Error('At least one ID is required for deletion');
313
+ throw new Error(error_messages_1.ERROR_MESSAGES.DELETE_IDS_REQUIRED);
313
314
  }
314
315
  const removedEntities = [];
315
316
  for (let i = 0; i < ids.length; i++) {
@@ -329,11 +330,11 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
329
330
  }
330
331
  async generateCode(options) {
331
332
  if (!options.moduleId && !options.moduleUserKey) {
332
- throw new common_1.BadRequestException('Module ID or Module Name is required for generating code');
333
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);
333
334
  }
334
335
  const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);
335
336
  if (!module) {
336
- throw new common_1.NotFoundException(`Module ${options.moduleId} not found`);
337
+ throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.MODULE_ID_NOT_FOUND(options.moduleId));
337
338
  }
338
339
  const moduleInstance = this.solidRegistry.getModule(`${(0, strings_1.classify)(module.name)}Module`);
339
340
  if (!moduleInstance) {
@@ -347,7 +348,7 @@ let ModuleMetadataService = ModuleMetadataService_1 = class ModuleMetadataServic
347
348
  }
348
349
  async generateAddModuleCode(options = { dryRun: false }) {
349
350
  if (!options.moduleId && !options.moduleUserKey) {
350
- throw new common_1.BadRequestException('Module ID or Module Name is required for generating code');
351
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);
351
352
  }
352
353
  const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);
353
354
  const output = await this.schematicService.executeSchematicCommand(schematic_service_1.ADD_MODULE_COMMAND, { module: module.name }, options.dryRun ?? false);
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata.service.js","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource, InjectRepository } from '@nestjs/typeorm';\nimport { DataSource, EntityManager, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path'; // To handle file paths\nimport { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';\nimport { FileService } from 'src/services/file.service';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModuleMetadataDto } from '../dtos/update-module-metadata.dto';\nimport {\n ADD_MODULE_COMMAND,\n SchematicService,\n} from '../helpers/schematic.service';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { ModelMetadataService } from './model-metadata.service';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\n\n@Injectable()\nexport class ModuleMetadataService {\n private readonly logger = new Logger(ModuleMetadataService.name);\n\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n @InjectRepository(ModuleMetadata)\n private readonly moduleMetadataRepo: Repository<ModuleMetadata>,\n private readonly crudHelperService: CrudHelperService,\n private readonly schematicService: SchematicService,\n private readonly configService: ConfigService,\n private readonly fileService: FileService,\n private readonly permissionsSeederService: PermissionMetadataSeederService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly solidRegistry: SolidRegistry,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n ) { }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'moduleMetadata';\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<ModuleMetadata> = this.moduleMetadataRepo.createQueryBuilder(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 findOneByUserKey(name: string, relations = {}) {\n if (!name) {\n throw new BadRequestException('name is required for finding entity');\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async findOne(id: number, relations = {}) {\n if (!id) {\n throw new BadRequestException('ID is required for finding entity');\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(`entity #${id} not found`);\n }\n return entity;\n }\n\n async create(createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.createInDB(manager, createDto, files);\n await this.createInFile(module);\n return module\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n if (files.length > 0) {\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));\n this.fileService.copyFile(files[0].path, fileStoragePath);\n this.fileService.deleteFile(files[0].path);\n createDto.menuIconUrl = fileStoragePath;\n }\n const moduleMetadata = this.moduleMetadataRepo.create(createDto);\n return manager.save(moduleMetadata); // Use the provided manager to perform DB operations\n }\n\n async createInFile(module: ModuleMetadata) {\n try {\n // Prepare the metadata JSON structure\n\n const moduleMetaDataJson: ModuleMetadataConfiguration = {\n moduleMetadata: {\n name: module?.name,\n displayName: module?.displayName,\n description: module?.description,\n defaultDataSource: module?.defaultDataSource,\n menuIconUrl: module?.menuIconUrl,\n menuSequenceNumber: module?.menuSequenceNumber,\n isSystem: module?.isSystem,\n models: [],\n },\n roles: [],\n users: [],\n actions: [\n {\n displayName: `${module?.name} Home`,\n name: `${module?.name}-home-action`,\n type: \"custom\",\n domain: \"\",\n context: \"\",\n customComponent: `/admin/core/${module?.name}/home`,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: \"\",\n moduleUserKey: module?.name,\n modelUserKey: \"\"\n }\n ],\n menus: [\n {\n displayName: \"Home\",\n name: `${module?.name}-home-menu`,\n sequenceNumber: 1,\n actionUserKey: `${module?.name}-home-action`,\n moduleUserKey: module?.name,\n parentMenuItemUserKey: \"\"\n }\n ],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n securityRules: [],\n };\n\n // Convert the object to JSON string\n const metadataJson = JSON.stringify(moduleMetaDataJson, null, 2);\n\n // Create the folder path inside 'module-metadata'\n const folderPath = path.resolve(process.cwd(), 'module-metadata', module.name);\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Ensure the folder exists\n await fs.mkdir(folderPath, { recursive: true });\n\n // Write the JSON to the file\n await fs.writeFile(filePath, metadataJson);\n\n } catch (error) {\n // console.error('File creation failed:', error);\n this.logger.error('File creation failed:', error);\n throw new Error('File creation failed, rolling back transaction'); // Trigger rollback\n }\n }\n\n async update(id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.updateInDB(manager, id, updateModuleMetadataDto, files);\n await this.updateInFile(module);\n return module\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 updateInDB(manager: EntityManager, id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n\n const module = await this.moduleMetadataRepo.preload({\n id,\n ...updateModuleMetadataDto,\n });\n\n if (!module) {\n throw new NotFoundException(`Module ${id} not found`);\n }\n if (files.length > 0) {\n\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));\n this.fileService.copyFile(files[0].path, fileStoragePath);\n this.fileService.deleteFile(files[0].path);\n module.menuIconUrl = fileStoragePath;\n }\n return manager.save(ModuleMetadata, module);\n }\n\n async updateInFile(module: ModuleMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Read the existing JSON file\n let metaData;\n try {\n metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n } catch (error) {\n metaData = {\n moduleMetadata: {\n name: null,\n displayName: null,\n description: null,\n defaultDataSource: null,\n menuIconUrl: null,\n menuSequenceNumber: null,\n isSystem: null,\n models: [],\n },\n roles: [],\n users: [],\n actions: [],\n menus: [],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n };\n }\n\n\n metaData.moduleMetadata.name = module?.name;\n metaData.moduleMetadata.displayName = module?.displayName;\n metaData.moduleMetadata.description = module?.description;\n metaData.moduleMetadata.defaultDataSource = module?.defaultDataSource;\n metaData.moduleMetadata.menuIconUrl = module?.menuIconUrl;\n metaData.moduleMetadata.menuSequenceNumber = module?.menuSequenceNumber;\n metaData.moduleMetadata.isSystem = module?.isSystem;\n\n // Write the JSON 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('File creation failed, rolling back transaction'); // Trigger rollback\n }\n }\n\n async upsert(updateModuleMetadataDto: UpdateModuleMetadataDto) {\n this.logger.log(`Module Upsert called for : ${updateModuleMetadataDto.name}`);\n // First check if module already exists using name\n const existingModuleMetadata = await this.moduleMetadataRepo.findOne({\n where: {\n name: updateModuleMetadataDto.name\n }\n })\n const { models, ...restUpdateModuleMetadataDto } = updateModuleMetadataDto;\n // if found\n if (existingModuleMetadata) {\n const updatedModuleMetadata = { ...existingModuleMetadata, ...restUpdateModuleMetadataDto };\n return this.moduleMetadataRepo.save(updatedModuleMetadata);\n }\n // if not found - create new \n else {\n const moduleMetadata = this.moduleMetadataRepo.create(restUpdateModuleMetadataDto);\n return this.moduleMetadataRepo.save(moduleMetadata);\n }\n }\n\n async removeByName(name: string) {\n const entity = await this.findOneByUserKey(name);\n if (entity) {\n await this.moduleMetadataRepo.remove(entity);\n }\n }\n\n async remove(id: number) {\n const entity = await this.findOne(id);\n return this.moduleMetadataRepo.remove(entity);\n }\n\n async deleteMany(ids: number[]): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error('At least one ID is required for deletion');\n }\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.moduleMetadataRepo.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 removedEntities.push(await this.moduleMetadataRepo.remove(entity));\n }\n\n return removedEntities\n }\n\n async refreshPermission() {\n await this.permissionsSeederService.seed();\n return true\n }\n\n @DisallowInProduction()\n async generateCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException('Module ID or Module Name is required for generating code');\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n // Check if the module exists\n if (!module) {\n throw new NotFoundException(`Module ${options.moduleId} not found`);\n }\n\n // Check if the module name already exists and is loaded\n const moduleInstance = this.solidRegistry.getModule(`${classify(module.name)}Module`);\n\n if (!moduleInstance) {\n const addModuleOutput = await this.generateAddModuleCode(options);\n const refreshModuleOutput = await this.generateRefreshModuleCode(options);\n return `${addModuleOutput}\\n${refreshModuleOutput}`;\n } else {\n return await this.generateRefreshModuleCode(options);\n }\n }\n\n private async generateAddModuleCode(options: CodeGenerationOptions = { dryRun: false }): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException('Module ID or Module Name is required for generating code');\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n //Generate the module\n const output = await this.schematicService.executeSchematicCommand(\n ADD_MODULE_COMMAND,\n { module: module.name },\n options.dryRun ?? false\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async generateRefreshModuleCode(options: CodeGenerationOptions): Promise<string> {\n const query = {\n relations: { models: { fields: true } },\n };\n const module = options.moduleId ? await this.findOne(options.moduleId, query.relations) : await this.findOneByUserKey(options.moduleUserKey, query.relations);\n const outputLines = []\n for (const model of module.models) {\n const codeGenerationOptions = {\n modelId: model.id,\n dryRun: options.dryRun,\n };\n const output = await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n this.logger.debug(`Schematic output : ${output}`);\n outputLines.push(output)\n }\n return outputLines.join('\\n');\n }\n\n private getFileSysytemFullFilePath(fileName: string): string {\n return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;\n }\n\n\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
1
+ {"version":3,"file":"module-metadata.service.js","sourceRoot":"","sources":["../../src/services/module-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectDataSource, InjectRepository } from '@nestjs/typeorm';\nimport { DataSource, EntityManager, Repository, SelectQueryBuilder } from 'typeorm';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { ConfigService } from '@nestjs/config';\nimport * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await\nimport * as path from 'path'; // To handle file paths\nimport { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';\nimport { FileService } from 'src/services/file.service';\nimport { BasicFilterDto } from '../dtos/basic-filters.dto';\nimport { UpdateModuleMetadataDto } from '../dtos/update-module-metadata.dto';\nimport {\n ADD_MODULE_COMMAND,\n SchematicService,\n} from '../helpers/schematic.service';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';\nimport { CrudHelperService } from './crud-helper.service';\nimport { ModelMetadataService } from './model-metadata.service';\nimport { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';\nimport { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n@Injectable()\nexport class ModuleMetadataService {\n private readonly logger = new Logger(ModuleMetadataService.name);\n\n constructor(\n @InjectDataSource()\n private readonly dataSource: DataSource,\n @InjectRepository(ModuleMetadata)\n private readonly moduleMetadataRepo: Repository<ModuleMetadata>,\n private readonly crudHelperService: CrudHelperService,\n private readonly schematicService: SchematicService,\n private readonly configService: ConfigService,\n private readonly fileService: FileService,\n private readonly permissionsSeederService: PermissionMetadataSeederService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly solidRegistry: SolidRegistry,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n ) { }\n\n async findMany(basicFilterDto: BasicFilterDto) {\n const alias = 'moduleMetadata';\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<ModuleMetadata> = this.moduleMetadataRepo.createQueryBuilder(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 findOneByUserKey(name: string, relations = {}) {\n if (!name) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_NAME_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n name: name,\n },\n relations: relations,\n });\n return entity;\n }\n\n async findOne(id: number, relations = {}) {\n if (!id) {\n throw new BadRequestException(ERROR_MESSAGES.ENTITY_ID_REQUIRED);\n }\n const entity = await this.moduleMetadataRepo.findOne({\n where: {\n id: id,\n },\n relations: relations,\n });\n if (!entity) {\n throw new NotFoundException(ERROR_MESSAGES.ENTITY_NOT_FOUND());\n }\n return entity;\n }\n\n async create(createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.createInDB(manager, createDto, files);\n await this.createInFile(module);\n return module\n });\n } catch (error) {\n // console.error('Transaction failed:', error);\n this.logger.error('Transaction failed:', error);\n throw error;\n }\n }\n async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {\n if (files.length > 0) {\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));\n this.fileService.copyFile(files[0].path, fileStoragePath);\n this.fileService.deleteFile(files[0].path);\n createDto.menuIconUrl = fileStoragePath;\n }\n const moduleMetadata = this.moduleMetadataRepo.create(createDto);\n return manager.save(moduleMetadata); // Use the provided manager to perform DB operations\n }\n\n async createInFile(module: ModuleMetadata) {\n try {\n // Prepare the metadata JSON structure\n\n const moduleMetaDataJson: ModuleMetadataConfiguration = {\n moduleMetadata: {\n name: module?.name,\n displayName: module?.displayName,\n description: module?.description,\n defaultDataSource: module?.defaultDataSource,\n menuIconUrl: module?.menuIconUrl,\n menuSequenceNumber: module?.menuSequenceNumber,\n isSystem: module?.isSystem,\n models: [],\n },\n roles: [],\n users: [],\n actions: [\n {\n displayName: `${module?.name} Home`,\n name: `${module?.name}-home-action`,\n type: \"custom\",\n domain: \"\",\n context: \"\",\n customComponent: `/admin/core/${module?.name}/home`,\n customIsModal: true,\n serverEndpoint: \"\",\n viewUserKey: \"\",\n moduleUserKey: module?.name,\n modelUserKey: \"\"\n }\n ],\n menus: [\n {\n displayName: \"Home\",\n name: `${module?.name}-home-menu`,\n sequenceNumber: 1,\n actionUserKey: `${module?.name}-home-action`,\n moduleUserKey: module?.name,\n parentMenuItemUserKey: \"\"\n }\n ],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n securityRules: [],\n };\n\n // Convert the object to JSON string\n const metadataJson = JSON.stringify(moduleMetaDataJson, null, 2);\n\n // Create the folder path inside 'module-metadata'\n const folderPath = path.resolve(process.cwd(), 'module-metadata', module.name);\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Ensure the folder exists\n await fs.mkdir(folderPath, { recursive: true });\n\n // Write the JSON to the file\n await fs.writeFile(filePath, metadataJson);\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 update(id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n try {\n return await this.dataSource.transaction(async (manager: EntityManager) => {\n // Step 1: Write initial data to the database\n const module = await this.updateInDB(manager, id, updateModuleMetadataDto, files);\n await this.updateInFile(module);\n return module\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 updateInDB(manager: EntityManager, id: number, updateModuleMetadataDto: UpdateModuleMetadataDto, files: Express.Multer.File[] = []) {\n\n const module = await this.moduleMetadataRepo.preload({\n id,\n ...updateModuleMetadataDto,\n });\n\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(id));\n }\n if (files.length > 0) {\n\n const fileStoragePath = this.getFileSysytemFullFilePath(this.getFileName(files[0]));\n this.fileService.copyFile(files[0].path, fileStoragePath);\n this.fileService.deleteFile(files[0].path);\n module.menuIconUrl = fileStoragePath;\n }\n return manager.save(ModuleMetadata, module);\n }\n\n async updateInFile(module: ModuleMetadata) {\n try {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(module.name);\n\n // Read the existing JSON file\n let metaData;\n try {\n metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);\n\n } catch (error) {\n metaData = {\n moduleMetadata: {\n name: null,\n displayName: null,\n description: null,\n defaultDataSource: null,\n menuIconUrl: null,\n menuSequenceNumber: null,\n isSystem: null,\n models: [],\n },\n roles: [],\n users: [],\n actions: [],\n menus: [],\n views: [],\n emailTemplates: [],\n smsTemplates: [],\n mediaStorageProviders: [],\n };\n }\n\n\n metaData.moduleMetadata.name = module?.name;\n metaData.moduleMetadata.displayName = module?.displayName;\n metaData.moduleMetadata.description = module?.description;\n metaData.moduleMetadata.defaultDataSource = module?.defaultDataSource;\n metaData.moduleMetadata.menuIconUrl = module?.menuIconUrl;\n metaData.moduleMetadata.menuSequenceNumber = module?.menuSequenceNumber;\n metaData.moduleMetadata.isSystem = module?.isSystem;\n\n // Write the JSON 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(updateModuleMetadataDto: UpdateModuleMetadataDto) {\n this.logger.log(`Module Upsert called for : ${updateModuleMetadataDto.name}`);\n // First check if module already exists using name\n const existingModuleMetadata = await this.moduleMetadataRepo.findOne({\n where: {\n name: updateModuleMetadataDto.name\n }\n })\n const { models, ...restUpdateModuleMetadataDto } = updateModuleMetadataDto;\n // if found\n if (existingModuleMetadata) {\n const updatedModuleMetadata = { ...existingModuleMetadata, ...restUpdateModuleMetadataDto };\n return this.moduleMetadataRepo.save(updatedModuleMetadata);\n }\n // if not found - create new \n else {\n const moduleMetadata = this.moduleMetadataRepo.create(restUpdateModuleMetadataDto);\n return this.moduleMetadataRepo.save(moduleMetadata);\n }\n }\n\n async removeByName(name: string) {\n const entity = await this.findOneByUserKey(name);\n if (entity) {\n await this.moduleMetadataRepo.remove(entity);\n }\n }\n\n async remove(id: number) {\n const entity = await this.findOne(id);\n return this.moduleMetadataRepo.remove(entity);\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.moduleMetadataRepo.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 removedEntities.push(await this.moduleMetadataRepo.remove(entity));\n }\n\n return removedEntities\n }\n\n async refreshPermission() {\n await this.permissionsSeederService.seed();\n return true\n }\n\n @DisallowInProduction()\n async generateCode(options: CodeGenerationOptions): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n // Check if the module exists\n if (!module) {\n throw new NotFoundException(ERROR_MESSAGES.MODULE_ID_NOT_FOUND(options.moduleId));\n }\n\n // Check if the module name already exists and is loaded\n const moduleInstance = this.solidRegistry.getModule(`${classify(module.name)}Module`);\n\n if (!moduleInstance) {\n const addModuleOutput = await this.generateAddModuleCode(options);\n const refreshModuleOutput = await this.generateRefreshModuleCode(options);\n return `${addModuleOutput}\\n${refreshModuleOutput}`;\n } else {\n return await this.generateRefreshModuleCode(options);\n }\n }\n\n private async generateAddModuleCode(options: CodeGenerationOptions = { dryRun: false }): Promise<string> {\n if (!options.moduleId && !options.moduleUserKey) {\n throw new BadRequestException(ERROR_MESSAGES.MODEL_REQUIRED_FOR_CODE_GENERATION);\n }\n const module = options.moduleId ? await this.findOne(options.moduleId) : await this.findOneByUserKey(options.moduleUserKey);\n\n //Generate the module\n const output = await this.schematicService.executeSchematicCommand(\n ADD_MODULE_COMMAND,\n { module: module.name },\n options.dryRun ?? false\n );\n this.logger.debug(`Schematic output : ${output}`);\n return output;\n }\n\n private async generateRefreshModuleCode(options: CodeGenerationOptions): Promise<string> {\n const query = {\n relations: { models: { fields: true } },\n };\n const module = options.moduleId ? await this.findOne(options.moduleId, query.relations) : await this.findOneByUserKey(options.moduleUserKey, query.relations);\n const outputLines = []\n for (const model of module.models) {\n const codeGenerationOptions = {\n modelId: model.id,\n dryRun: options.dryRun,\n };\n const output = await this.modelMetadataService.handleGenerateCode(codeGenerationOptions);\n this.logger.debug(`Schematic output : ${output}`);\n outputLines.push(output)\n }\n return outputLines.join('\\n');\n }\n\n private getFileSysytemFullFilePath(fileName: string): string {\n return `${this.configService.get('app-builder.fileStorageDir')}/${fileName}`;\n }\n\n\n\n private getFileName(file: Express.Multer.File): string {\n return `${file.filename}-${file.originalname}`;\n }\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"role-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAM,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAK9D,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;IAEvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAhB/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;gBAIpD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAEtB,oBAAoB,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAC5D,SAAS,EAAE,SAAS;IAMzB,cAAc,CAAC,QAAQ,EAAE,MAAM;IAe/B,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE;IAqCrD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;YAItD,qBAAqB;IAkE7B,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;YAsBrF,uBAAuB;CAWtC"}
1
+ {"version":3,"file":"role-metadata.service.d.ts","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAM,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,qBACa,mBAAoB,SAAQ,WAAW,CAAC,YAAY,CAAC;IAK9D,QAAQ,CAAC,oBAAoB,EAAE,oBAAoB;IACnD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,QAAQ,CAAC,aAAa,EAAE,aAAa;IACrC,QAAQ,CAAC,WAAW,EAAE,WAAW;IACjC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAE7C,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC;IAEvC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAhB/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;gBAIpD,oBAAoB,EAAE,oBAAoB,EAC1C,qBAAqB,EAAE,qBAAqB,EAC5C,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EAEpC,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,EAEtB,oBAAoB,EAAE,UAAU,CAAC,kBAAkB,CAAC,EAC5D,SAAS,EAAE,SAAS;IAMzB,cAAc,CAAC,QAAQ,EAAE,MAAM;IAe/B,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,EAAE;IAqCrD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IAIxF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;YAItD,qBAAqB;IAkE7B,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;YAsBrF,uBAAuB;CAWtC"}
@@ -26,6 +26,7 @@ const file_service_1 = require("./file.service");
26
26
  const crud_helper_service_1 = require("./crud-helper.service");
27
27
  const role_metadata_entity_1 = require("../entities/role-metadata.entity");
28
28
  const permission_metadata_entity_1 = require("../entities/permission-metadata.entity");
29
+ const error_messages_1 = require("../constants/error-messages");
29
30
  let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService extends crud_service_1.CRUDService {
30
31
  constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, permissionRepository, moduleRef) {
31
32
  super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);
@@ -151,7 +152,7 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
151
152
  }
152
153
  });
153
154
  if (!role) {
154
- throw new Error(`Role ${roleName} not found.`);
155
+ throw new Error(error_messages_1.ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));
155
156
  }
156
157
  role.permissions = role.permissions.filter(permission => !permissionNames.includes(permission.name));
157
158
  return await this.repo.save(role);
@@ -161,7 +162,7 @@ let RoleMetadataService = RoleMetadataService_1 = class RoleMetadataService exte
161
162
  where: { name },
162
163
  });
163
164
  if (!existingPermission) {
164
- throw new common_1.NotFoundException(`Permission ${name} does not exist`);
165
+ throw new common_1.NotFoundException(error_messages_1.ERROR_MESSAGES.PERMISSION_NOT_EXIST(name));
165
166
  }
166
167
  return existingPermission;
167
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"role-metadata.service.js","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, In, Repository } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from \"src/services/file.service\";\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\n\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { CreateRoleMetadataDto } from '../dtos/create-role-metadata.dto';\n\n@Injectable()\nexport class RoleMetadataService extends CRUDService<RoleMetadata> {\n private readonly logger = new Logger(RoleMetadataService.name);\n\n constructor(\n @Inject(forwardRef(() => ModelMetadataService))\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(RoleMetadata, 'default')\n readonly repo: Repository<RoleMetadata>,\n @InjectRepository(PermissionMetadata)\n private readonly permissionRepository: Repository<PermissionMetadata>,\n readonly moduleRef: ModuleRef\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);\n }\n\n async findRoleByName(roleName: string) {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n return entity;\n }\n\n async createRolesIfNotExists(roles: CreateRoleMetadataDto[]) {\n for (let id = 0; id < roles.length; id++) {\n try {\n const roleObj = roles[id];\n this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);\n\n const existingRole = await this.repo.findOne({\n where: {\n name: roleObj.name,\n },\n relations: {},\n });\n\n // Create only if not existing already.\n if (!existingRole) {\n this.logger.log(`Role ${roleObj.name} does not exist, hence creating`);\n\n let permissions = [];\n\n if (roleObj.permissions && roleObj.permissions.length > 0) {\n await Promise.all(\n roleObj.permissions.map(permission => this.preloadPermissionByName(permission.name)),\n );\n }\n\n // const role = this.repo.create({ ...roleObj, permissions });\n const role = this.repo.create({ ...roleObj });\n await this.repo.save(role);\n } else {\n this.logger.log(`Role ${roleObj.name} already exists`);\n }\n } catch (error) {\n this.logger.error(error);\n }\n }\n }\n\n async addAllPermissionsToRole(roleName: string): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, null);\n }\n\n async addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, permissionNames);\n }\n\n async addPermissionToRole(roleName: string, permissionName: string[]) {\n return await this._addPermissionsToRole(roleName, permissionName);\n }\n\n private async _addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n const role = await this.repo.findOne({\n where: { name: roleName },\n relations: {\n permissions: true\n }\n });\n if (!role) {\n throw new Error(`Role '${roleName}' not found.`);\n }\n\n this.logger.log(`Found role ${roleName}`);\n\n\n // The new set of permissions which are to be added to this role.\n let newPermissions: PermissionMetadata[];\n\n // Load all the specified permissions in the system. \n if (permissionNames && permissionNames.length != 0) {\n this.logger.log(`Loading specified permissions.`);\n\n newPermissions = await this.permissionRepository.find({ where: { name: In(permissionNames) } });\n if (newPermissions.length !== permissionNames.length) {\n throw new Error(`One or more permissions not found.`);\n }\n }\n else {\n this.logger.log(`Loading all permissions in system.`);\n\n // Load all permissions in the system. \n // TODO: Do we want to convert this to a paginated query to avoid having to load a very large permissions table into memory?\n newPermissions = await this.permissionRepository.find();\n if (newPermissions.length == 0) {\n throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);\n }\n }\n\n this.logger.log(`Adding ${newPermissions.length} permissions to role ${roleName}.`);\n\n // if there are already permissions assigned. \n if (role.permissions && role.permissions.length > 0) {\n for (let i = 0; i < newPermissions.length; i++) {\n const newPermission = newPermissions[i];\n let newPermissionFound = true;\n for (let j = 0; j < role.permissions.length; j++) {\n const existingPermission = role.permissions[j];\n if (existingPermission.name === newPermission.name) {\n newPermissionFound = false;\n break;\n }\n }\n\n if (newPermissionFound) {\n role.permissions.push(newPermission);\n }\n }\n\n }\n // else we create a new permissions set. \n else {\n role.permissions = newPermissions;\n }\n\n return await this.repo.save(role);\n }\n\n async removePermissionsFromRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n\n // load the role with the respective permissions.\n const role = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n\n if (!role) {\n throw new Error(`Role ${roleName} not found.`);\n }\n\n // modify the permissions array.\n role.permissions = role.permissions.filter(permission => !permissionNames.includes(permission.name));\n\n return await this.repo.save(role);\n }\n\n private async preloadPermissionByName(name: string): Promise<PermissionMetadata> {\n const existingPermission = await this.permissionRepository.findOne({\n where: { name },\n });\n if (!existingPermission) {\n throw new NotFoundException(`Permission ${name} does not exist`)\n }\n return existingPermission;\n }\n\n\n}\n"]}
1
+ {"version":3,"file":"role-metadata.service.js","sourceRoot":"","sources":["../../src/services/role-metadata.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { EntityManager, In, Repository } from 'typeorm';\nimport { CRUDService } from 'src/services/crud.service';\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { ConfigService } from '@nestjs/config';\nimport { FileService } from \"src/services/file.service\";\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\n\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { PermissionMetadata } from '../entities/permission-metadata.entity';\nimport { CreateRoleMetadataDto } from '../dtos/create-role-metadata.dto';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n@Injectable()\nexport class RoleMetadataService extends CRUDService<RoleMetadata> {\n private readonly logger = new Logger(RoleMetadataService.name);\n\n constructor(\n @Inject(forwardRef(() => ModelMetadataService))\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(RoleMetadata, 'default')\n readonly repo: Repository<RoleMetadata>,\n @InjectRepository(PermissionMetadata)\n private readonly permissionRepository: Repository<PermissionMetadata>,\n readonly moduleRef: ModuleRef\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'roleMetadata', 'solid-core', moduleRef);\n }\n\n async findRoleByName(roleName: string) {\n const entity = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n if (!entity) {\n throw new NotFoundException(`Entity #${roleName} not found`);\n }\n return entity;\n }\n\n async createRolesIfNotExists(roles: CreateRoleMetadataDto[]) {\n for (let id = 0; id < roles.length; id++) {\n try {\n const roleObj = roles[id];\n this.logger.log(`Resolving role: ${JSON.stringify(roleObj)}`);\n\n const existingRole = await this.repo.findOne({\n where: {\n name: roleObj.name,\n },\n relations: {},\n });\n\n // Create only if not existing already.\n if (!existingRole) {\n this.logger.log(`Role ${roleObj.name} does not exist, hence creating`);\n\n let permissions = [];\n\n if (roleObj.permissions && roleObj.permissions.length > 0) {\n await Promise.all(\n roleObj.permissions.map(permission => this.preloadPermissionByName(permission.name)),\n );\n }\n\n // const role = this.repo.create({ ...roleObj, permissions });\n const role = this.repo.create({ ...roleObj });\n await this.repo.save(role);\n } else {\n this.logger.log(`Role ${roleObj.name} already exists`);\n }\n } catch (error) {\n this.logger.error(error);\n }\n }\n }\n\n async addAllPermissionsToRole(roleName: string): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, null);\n }\n\n async addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n return await this._addPermissionsToRole(roleName, permissionNames);\n }\n\n async addPermissionToRole(roleName: string, permissionName: string[]) {\n return await this._addPermissionsToRole(roleName, permissionName);\n }\n\n private async _addPermissionsToRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n const role = await this.repo.findOne({\n where: { name: roleName },\n relations: {\n permissions: true\n }\n });\n if (!role) {\n throw new Error(`Role '${roleName}' not found.`);\n }\n\n this.logger.log(`Found role ${roleName}`);\n\n\n // The new set of permissions which are to be added to this role.\n let newPermissions: PermissionMetadata[];\n\n // Load all the specified permissions in the system. \n if (permissionNames && permissionNames.length != 0) {\n this.logger.log(`Loading specified permissions.`);\n\n newPermissions = await this.permissionRepository.find({ where: { name: In(permissionNames) } });\n if (newPermissions.length !== permissionNames.length) {\n throw new Error(`One or more permissions not found.`);\n }\n }\n else {\n this.logger.log(`Loading all permissions in system.`);\n\n // Load all permissions in the system. \n // TODO: Do we want to convert this to a paginated query to avoid having to load a very large permissions table into memory?\n newPermissions = await this.permissionRepository.find();\n if (newPermissions.length == 0) {\n throw new Error(`No permissions configured in the system. Did you forget to run the PermissionSeederService?`);\n }\n }\n\n this.logger.log(`Adding ${newPermissions.length} permissions to role ${roleName}.`);\n\n // if there are already permissions assigned. \n if (role.permissions && role.permissions.length > 0) {\n for (let i = 0; i < newPermissions.length; i++) {\n const newPermission = newPermissions[i];\n let newPermissionFound = true;\n for (let j = 0; j < role.permissions.length; j++) {\n const existingPermission = role.permissions[j];\n if (existingPermission.name === newPermission.name) {\n newPermissionFound = false;\n break;\n }\n }\n\n if (newPermissionFound) {\n role.permissions.push(newPermission);\n }\n }\n\n }\n // else we create a new permissions set. \n else {\n role.permissions = newPermissions;\n }\n\n return await this.repo.save(role);\n }\n\n async removePermissionsFromRole(roleName: string, permissionNames: string[]): Promise<RoleMetadata> {\n\n // load the role with the respective permissions.\n const role = await this.repo.findOne({\n where: {\n name: roleName\n },\n relations: {\n permissions: true\n }\n });\n\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n // modify the permissions array.\n role.permissions = role.permissions.filter(permission => !permissionNames.includes(permission.name));\n\n return await this.repo.save(role);\n }\n\n private async preloadPermissionByName(name: string): Promise<PermissionMetadata> {\n const existingPermission = await this.permissionRepository.findOne({\n where: { name },\n });\n if (!existingPermission) {\n throw new NotFoundException(ERROR_MESSAGES.PERMISSION_NOT_EXIST(name));\n }\n return existingPermission;\n }\n\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sql-expression-resolver.service.d.ts","sourceRoot":"","sources":["../../src/services/sql-expression-resolver.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAyB,MAAM,6DAA6D,CAAC;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,EAAE,CAAC;CACnB;AAED,qBACa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IACzE,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,oBAAoB;CA8H3F"}
1
+ {"version":3,"file":"sql-expression-resolver.service.d.ts","sourceRoot":"","sources":["../../src/services/sql-expression-resolver.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAyB,MAAM,6DAA6D,CAAC;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,GAAG,EAAE,CAAC;CACnB;AAED,qBACa,4BAA4B;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAArB,qBAAqB,EAAE,qBAAqB;IACzE,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,oBAAoB;CA8H3F"}
@@ -13,6 +13,7 @@ exports.SqlExpressionResolverService = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const chartjs_sql_data_provider_service_1 = require("./question-data-providers/chartjs-sql-data-provider.service");
15
15
  const request_context_service_1 = require("./request-context.service");
16
+ const error_messages_1 = require("../constants/error-messages");
16
17
  let SqlExpressionResolverService = class SqlExpressionResolverService {
17
18
  constructor(requestContextService) {
18
19
  this.requestContextService = requestContextService;
@@ -100,7 +101,7 @@ let SqlExpressionResolverService = class SqlExpressionResolverService {
100
101
  parameters.push(expr.value[0]);
101
102
  break;
102
103
  default:
103
- throw new Error(`Unsupported SQL operator: ${expr.operator}`);
104
+ throw new Error(error_messages_1.ERROR_MESSAGES.UNSUPPORTED_SQL_OPERATOR(expr.operator));
104
105
  }
105
106
  simplifiedSql = simplifiedSql.replace(placeholder, sqlFragment);
106
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sql-expression-resolver.service.js","sourceRoot":"","sources":["../../src/services/sql-expression-resolver.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SqlExpression, SqlExpressionOperator } from \"./question-data-providers/chartjs-sql-data-provider.service\";\nimport { RequestContextService } from \"./request-context.service\";\n\nexport interface SqlReplacementResult {\n rawSql: string;\n parameters: any[]; // Positional parameters\n}\n\n@Injectable()\nexport class SqlExpressionResolverService {\n constructor(private readonly requestContextService: RequestContextService) { }\n resolveSqlWithExpressions(sql: string, expressions: SqlExpression[]): SqlReplacementResult {\n const variableToColumnMap: Record<string, string> = {};\n const variablePattern = /{{\\s*(\\w+)\\s*\\[\\s*([\\w.]+)\\s*\\]\\s*}}/g;\n\n let paramIndex = 1;\n const parameters: any[] = [];\n\n // Handle sql expression tokens like {{$activeUserId}} in the SQL string\n if (sql.includes('{{$activeUserId}}')) {\n const activeUser = this.requestContextService.getActiveUser();\n if (activeUser && activeUser.sub) {\n // Replace custom placeholder with parameter placeholder ($1)\n sql = sql.replace(/\\{\\{\\$activeUserId\\}\\}/g, `$${paramIndex++}`);\n // Add the active user ID to parameters\n parameters.push(activeUser.sub);\n }\n }\n\n // --- Pass 1: extract variable -> column mappings ---\n let simplifiedSql = sql.replace(variablePattern, (_, variableName, columnName) => {\n variableToColumnMap[variableName] = columnName;\n return `{{${variableName}}}`;\n });\n\n // --- Pass 2: Replace each variable with positional fragment ---\n\n for (const expr of expressions) {\n const column = variableToColumnMap[expr.variableName];\n if (!column) continue;\n\n let sqlFragment = '';\n const placeholder = `{{${expr.variableName}}}`;\n\n switch (expr.operator) {\n case SqlExpressionOperator.EQUALS:\n sqlFragment = `${column} = $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.NOT_EQUALS:\n sqlFragment = `${column} != $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.CONTAINS:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.NOT_CONTAINS:\n sqlFragment = `${column} NOT LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.STARTS_WITH:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.ENDS_WITH:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}`);\n break;\n\n case SqlExpressionOperator.IN:\n const inParams = expr.value.map(val => {\n parameters.push(val);\n return `$${paramIndex++}`;\n });\n sqlFragment = `${column} IN (${inParams.join(\", \")})`;\n break;\n\n case SqlExpressionOperator.NOT_IN:\n const notInParams = expr.value.map(val => {\n parameters.push(val);\n return `$${paramIndex++}`;\n });\n sqlFragment = `${column} NOT IN (${notInParams.join(\", \")})`;\n break;\n\n case SqlExpressionOperator.BETWEEN:\n sqlFragment = `${column} BETWEEN $${paramIndex} AND $${paramIndex + 1}`;\n parameters.push(expr.value[0], expr.value[1]);\n paramIndex += 2;\n break;\n\n case SqlExpressionOperator.LT:\n sqlFragment = `${column} < $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.LTE:\n sqlFragment = `${column} <= $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.GT:\n sqlFragment = `${column} > $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.GTE:\n sqlFragment = `${column} >= $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n default:\n throw new Error(`Unsupported SQL operator: ${expr.operator}`);\n }\n simplifiedSql = simplifiedSql.replace(placeholder, sqlFragment);\n }\n\n // --- Final cleanup: remove any remaining placeholders ---\n simplifiedSql = simplifiedSql.replace(/{{\\s*\\w+\\s*}}/g, '');\n\n // Remove dangling where clause if no expressions were applied\n simplifiedSql = simplifiedSql.replace(/\\bwhere\\b\\s*$/i, '').trim();\n\n // Need to handle scenarios of complex expression i.e with and / or clauses. probably need to have this logic in the sql expression object itself\n\n\n return {\n rawSql: simplifiedSql,\n parameters\n };\n }\n}"]}
1
+ {"version":3,"file":"sql-expression-resolver.service.js","sourceRoot":"","sources":["../../src/services/sql-expression-resolver.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { SqlExpression, SqlExpressionOperator } from \"./question-data-providers/chartjs-sql-data-provider.service\";\nimport { RequestContextService } from \"./request-context.service\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\n\nexport interface SqlReplacementResult {\n rawSql: string;\n parameters: any[]; // Positional parameters\n}\n\n@Injectable()\nexport class SqlExpressionResolverService {\n constructor(private readonly requestContextService: RequestContextService) { }\n resolveSqlWithExpressions(sql: string, expressions: SqlExpression[]): SqlReplacementResult {\n const variableToColumnMap: Record<string, string> = {};\n const variablePattern = /{{\\s*(\\w+)\\s*\\[\\s*([\\w.]+)\\s*\\]\\s*}}/g;\n\n let paramIndex = 1;\n const parameters: any[] = [];\n\n // Handle sql expression tokens like {{$activeUserId}} in the SQL string\n if (sql.includes('{{$activeUserId}}')) {\n const activeUser = this.requestContextService.getActiveUser();\n if (activeUser && activeUser.sub) {\n // Replace custom placeholder with parameter placeholder ($1)\n sql = sql.replace(/\\{\\{\\$activeUserId\\}\\}/g, `$${paramIndex++}`);\n // Add the active user ID to parameters\n parameters.push(activeUser.sub);\n }\n }\n\n // --- Pass 1: extract variable -> column mappings ---\n let simplifiedSql = sql.replace(variablePattern, (_, variableName, columnName) => {\n variableToColumnMap[variableName] = columnName;\n return `{{${variableName}}}`;\n });\n\n // --- Pass 2: Replace each variable with positional fragment ---\n\n for (const expr of expressions) {\n const column = variableToColumnMap[expr.variableName];\n if (!column) continue;\n\n let sqlFragment = '';\n const placeholder = `{{${expr.variableName}}}`;\n\n switch (expr.operator) {\n case SqlExpressionOperator.EQUALS:\n sqlFragment = `${column} = $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.NOT_EQUALS:\n sqlFragment = `${column} != $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.CONTAINS:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.NOT_CONTAINS:\n sqlFragment = `${column} NOT LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.STARTS_WITH:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`${expr.value[0]}%`);\n break;\n\n case SqlExpressionOperator.ENDS_WITH:\n sqlFragment = `${column} LIKE $${paramIndex++}`;\n parameters.push(`%${expr.value[0]}`);\n break;\n\n case SqlExpressionOperator.IN:\n const inParams = expr.value.map(val => {\n parameters.push(val);\n return `$${paramIndex++}`;\n });\n sqlFragment = `${column} IN (${inParams.join(\", \")})`;\n break;\n\n case SqlExpressionOperator.NOT_IN:\n const notInParams = expr.value.map(val => {\n parameters.push(val);\n return `$${paramIndex++}`;\n });\n sqlFragment = `${column} NOT IN (${notInParams.join(\", \")})`;\n break;\n\n case SqlExpressionOperator.BETWEEN:\n sqlFragment = `${column} BETWEEN $${paramIndex} AND $${paramIndex + 1}`;\n parameters.push(expr.value[0], expr.value[1]);\n paramIndex += 2;\n break;\n\n case SqlExpressionOperator.LT:\n sqlFragment = `${column} < $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.LTE:\n sqlFragment = `${column} <= $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.GT:\n sqlFragment = `${column} > $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n case SqlExpressionOperator.GTE:\n sqlFragment = `${column} >= $${paramIndex++}`;\n parameters.push(expr.value[0]);\n break;\n\n default:\n throw new Error(ERROR_MESSAGES.UNSUPPORTED_SQL_OPERATOR(expr.operator));\n }\n simplifiedSql = simplifiedSql.replace(placeholder, sqlFragment);\n }\n\n // --- Final cleanup: remove any remaining placeholders ---\n simplifiedSql = simplifiedSql.replace(/{{\\s*\\w+\\s*}}/g, '');\n\n // Remove dangling where clause if no expressions were applied\n simplifiedSql = simplifiedSql.replace(/\\bwhere\\b\\s*$/i, '').trim();\n\n // Need to handle scenarios of complex expression i.e with and / or clauses. probably need to have this logic in the sql expression object itself\n\n\n return {\n rawSql: simplifiedSql,\n parameters\n };\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user.service.d.ts","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ const typeorm_2 = require("typeorm");
26
26
  const role_metadata_entity_1 = require("../entities/role-metadata.entity");
27
27
  const user_entity_1 = require("../entities/user.entity");
28
28
  const iam_config_1 = require("../config/iam.config");
29
+ const error_messages_1 = require("../constants/error-messages");
29
30
  let UserService = class UserService extends crud_service_1.CRUDService {
30
31
  constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, roleRepository, moduleRef, iamConfiguration) {
31
32
  super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'user', 'solid-core', moduleRef);
@@ -43,16 +44,16 @@ let UserService = class UserService extends crud_service_1.CRUDService {
43
44
  }
44
45
  async delete(id, solidRequestContext = {}) {
45
46
  if (solidRequestContext?.activeUser?.sub === id) {
46
- throw new common_1.BadRequestException('Deleting logged-in user is not allowed');
47
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);
47
48
  }
48
49
  return super.delete(id, solidRequestContext);
49
50
  }
50
51
  async deleteMany(ids, solidRequestContext = {}) {
51
52
  if (!ids || ids.length === 0) {
52
- throw new Error('At least one ID is required for deletion');
53
+ throw new Error(error_messages_1.ERROR_MESSAGES.DELETE_IDS_REQUIRED);
53
54
  }
54
55
  if (solidRequestContext?.activeUser?.sub && ids.includes(solidRequestContext.activeUser.id)) {
55
- throw new common_1.BadRequestException('Deleting logged-in user is not allowed');
56
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);
56
57
  }
57
58
  return super.deleteMany(ids, solidRequestContext);
58
59
  }
@@ -88,7 +89,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
88
89
  }
89
90
  });
90
91
  if (!user) {
91
- throw new Error(`User not found.`);
92
+ throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND);
92
93
  }
93
94
  const roles = updateDto.roles ? updateDto.roles : [];
94
95
  await this.addRolesToUser(user.username, roles);
@@ -102,11 +103,11 @@ let UserService = class UserService extends crud_service_1.CRUDService {
102
103
  }
103
104
  });
104
105
  if (!user) {
105
- throw new Error(`User with username '${username}' not found.`);
106
+ throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
106
107
  }
107
108
  const role = await this.roleRepository.findOne({ where: { name: roleName } });
108
109
  if (!role) {
109
- throw new Error(`Role '${roleName}' not found.`);
110
+ throw new Error(error_messages_1.ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));
110
111
  }
111
112
  if (user.roles && user.roles.length > 0) {
112
113
  user.roles.push(role);
@@ -122,7 +123,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
122
123
  relations: { roles: true }
123
124
  });
124
125
  if (!user) {
125
- throw new Error(`User with username '${username}' not found.`);
126
+ throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
126
127
  }
127
128
  const roles = await this.roleRepository.find({
128
129
  where: roleNames.map(roleName => ({ name: roleName }))
@@ -130,7 +131,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
130
131
  if (roles.length !== roleNames.length) {
131
132
  const foundRoleNames = roles.map(role => role.name);
132
133
  const missingRoles = roleNames.filter(roleName => !foundRoleNames.includes(roleName));
133
- throw new Error(`The following roles were not found: ${missingRoles.join(', ')}`);
134
+ throw new Error(error_messages_1.ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));
134
135
  }
135
136
  const currentRoles = user.roles.map(role => role.name);
136
137
  const rolesToAdd = roles.filter(role => !currentRoles.includes(role.name));
@@ -153,7 +154,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
153
154
  }
154
155
  });
155
156
  if (!user) {
156
- throw new Error(`User with username '${username}' not found.`);
157
+ throw new Error(error_messages_1.ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));
157
158
  }
158
159
  user.roles = user.roles.filter(role => role.name !== roleName);
159
160
  return await this.repo.save(user);
@@ -208,7 +209,7 @@ let UserService = class UserService extends crud_service_1.CRUDService {
208
209
  }
209
210
  async initializeRolesForNewUser(roles, user) {
210
211
  if (!user.id) {
211
- throw new common_1.BadRequestException('User must exist before initializing roles');
212
+ throw new common_1.BadRequestException(error_messages_1.ERROR_MESSAGES.USER_MISSING_ID);
212
213
  }
213
214
  let userRoles = [];
214
215
  userRoles.push("Internal User");
@@ -1 +1 @@
1
- {"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Inject, Injectable } from '@nestjs/common';\nimport { ConfigService, ConfigType } from '@nestjs/config';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from \"src/services/file.service\";\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { EntityManager, Repository } from 'typeorm';\n\n\nimport { OauthUserDto } from '../dtos/oauth-user-dto';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { User } from '../entities/user.entity';\nimport { ActiveUserData } from '../interfaces/active-user-data.interface';\nimport { iamConfig } from 'src/config/iam.config';\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(User, 'default')\n readonly repo: Repository<User>,\n @InjectRepository(RoleMetadata)\n private readonly roleRepository: Repository<RoleMetadata>,\n readonly moduleRef: ModuleRef,\n @Inject(iamConfig.KEY)\n private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'user', 'solid-core', moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException('Deleting logged-in user is not allowed');\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error('At least one ID is required for deletion');\n }\n\n // ❌ If the active user is trying to delete themselves\n if (solidRequestContext?.activeUser?.sub && ids.includes(solidRequestContext.activeUser.id)) {\n throw new BadRequestException('Deleting logged-in user is not allowed');\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode\n },\n relations: {}\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(`User not found.`);\n }\n const roles = updateDto.roles ? updateDto.roles : [];\n await this.addRolesToUser(user.username, roles);\n await this.update(id, updateDto, files, true);\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(`User with username '${username}' not found.`);\n }\n const role = await this.roleRepository.findOne({ where: { name: roleName } });\n if (!role) {\n throw new Error(`Role '${roleName}' not found.`);\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n }\n else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.repo.findOne({\n where: { username: username },\n relations: { roles: true }\n });\n\n if (!user) {\n throw new Error(`User with username '${username}' not found.`);\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map(roleName => ({ name: roleName }))\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map(role => role.name);\n const missingRoles = roleNames.filter(roleName => !foundRoleNames.includes(roleName));\n throw new Error(`The following roles were not found: ${missingRoles.join(', ')}`);\n }\n\n const currentRoles = user.roles.map(role => role.name);\n\n const rolesToAdd = roles.filter(role => !currentRoles.includes(role.name));\n\n const rolesToRemove = user.roles.filter(role => !roleNames.includes(role.name));\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter(role => !rolesToRemove.includes(role));\n }\n\n return await this.repo.save(user);\n }\n\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username\n },\n relations: {\n roles: true\n }\n });\n\n if (!user) {\n throw new Error(`User with username '${username}' not found.`);\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter(role => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true\n }\n });\n\n // if we are unable to find a user then we need to create one. \n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n this.initializeRolesForNewUser([this.iamConfiguration.defaultRole], savedUser);\n }\n // else we update the user and store the generated code & access token. \n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async findUsersByRole(roleName: string, relations: any = {}): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName\n }\n },\n relations: relations\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n\n const matchingPermssions = activeUser.permissions.filter((p) => query.permissionNames.includes(p));\n return matchingPermssions\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException('User must exist before initializing roles');\n }\n let userRoles = [];\n // Default Internal user role assigned \n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n}\n"]}
1
+ {"version":3,"file":"user.service.js","sourceRoot":"","sources":["../../src/services/user.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Inject, Injectable } from '@nestjs/common';\nimport { ConfigService, ConfigType } from '@nestjs/config';\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';\nimport { CrudHelperService } from \"src/services/crud-helper.service\";\nimport { CRUDService } from 'src/services/crud.service';\nimport { FileService } from \"src/services/file.service\";\nimport { ModelMetadataService } from 'src/services/model-metadata.service';\nimport { ModuleMetadataService } from 'src/services/module-metadata.service';\nimport { EntityManager, Repository } from 'typeorm';\n\n\nimport { OauthUserDto } from '../dtos/oauth-user-dto';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { User } from '../entities/user.entity';\nimport { ActiveUserData } from '../interfaces/active-user-data.interface';\nimport { iamConfig } from 'src/config/iam.config';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\n\n@Injectable()\nexport class UserService extends CRUDService<User> {\n constructor(\n readonly modelMetadataService: ModelMetadataService,\n readonly moduleMetadataService: ModuleMetadataService,\n readonly configService: ConfigService,\n readonly fileService: FileService,\n readonly discoveryService: DiscoveryService,\n readonly crudHelperService: CrudHelperService,\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n @InjectRepository(User, 'default')\n readonly repo: Repository<User>,\n @InjectRepository(RoleMetadata)\n private readonly roleRepository: Repository<RoleMetadata>,\n readonly moduleRef: ModuleRef,\n @Inject(iamConfig.KEY)\n private readonly iamConfiguration: ConfigType<typeof iamConfig>,\n\n ) {\n super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'user', 'solid-core', moduleRef);\n }\n\n override async delete(id: number, solidRequestContext: any = {}) {\n // Prevent user from deleting themselves\n if (solidRequestContext?.activeUser?.sub === id) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n // ✅ Proceed with the default deletion logic\n return super.delete(id, solidRequestContext);\n }\n\n override async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // ❌ If the active user is trying to delete themselves\n if (solidRequestContext?.activeUser?.sub && ids.includes(solidRequestContext.activeUser.id)) {\n throw new BadRequestException(ERROR_MESSAGES.DELETE_SELF_NOT_ALLOWED);\n }\n\n return super.deleteMany(ids, solidRequestContext);\n }\n\n async findOneByEmail(email: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n email: email\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with email #${email} not found`);\n // }\n // return entity;\n }\n\n async findOneByAccessCode(accessCode: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n accessCode: accessCode\n },\n relations: {}\n });\n }\n\n async findOneByUsername(username: string): Promise<User> {\n return await this.repo.findOne({\n where: {\n username: username\n },\n relations: {}\n });\n // if (!entity) {\n // throw new NotFoundException(`user with username ${username} not found`);\n // }\n // return entity;\n }\n\n async updateUser(id: any, updateDto, files, solidRequestContext: any = {}) {\n const user = await this.repo.findOne({\n where: { id: id },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);\n }\n const roles = updateDto.roles ? updateDto.roles : [];\n await this.addRolesToUser(user.username, roles);\n await this.update(id, updateDto, files, true);\n }\n\n async addRoleToUser(username: string, roleName: string): Promise<User> {\n // Find the role, find the user and populate the many 2 many table.\n const user = await this.repo.findOne({\n where: { username: username },\n relations: {\n roles: true\n }\n });\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n const role = await this.roleRepository.findOne({ where: { name: roleName } });\n if (!role) {\n throw new Error(ERROR_MESSAGES.ROLE_NOT_FOUND(roleName));\n }\n\n if (user.roles && user.roles.length > 0) {\n user.roles.push(role);\n }\n else {\n user.roles = [role];\n }\n\n return await this.repo.save(user);\n }\n\n async addRolesToUser(username: string, roleNames: string[]): Promise<User> {\n const user = await this.repo.findOne({\n where: { username: username },\n relations: { roles: true }\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n const roles = await this.roleRepository.find({\n where: roleNames.map(roleName => ({ name: roleName }))\n });\n\n if (roles.length !== roleNames.length) {\n const foundRoleNames = roles.map(role => role.name);\n const missingRoles = roleNames.filter(roleName => !foundRoleNames.includes(roleName));\n throw new Error(ERROR_MESSAGES.ROLES_NOT_FOUND(missingRoles));\n }\n\n const currentRoles = user.roles.map(role => role.name);\n\n const rolesToAdd = roles.filter(role => !currentRoles.includes(role.name));\n\n const rolesToRemove = user.roles.filter(role => !roleNames.includes(role.name));\n\n if (rolesToAdd.length > 0) {\n user.roles.push(...rolesToAdd);\n }\n\n if (rolesToRemove.length > 0) {\n user.roles = user.roles.filter(role => !rolesToRemove.includes(role));\n }\n\n return await this.repo.save(user);\n }\n\n\n async removeRoleFromUser(username: string, roleName: string): Promise<User> {\n\n // load the role with the respective permissions.\n const user = await this.repo.findOne({\n where: {\n username: username\n },\n relations: {\n roles: true\n }\n });\n\n if (!user) {\n throw new Error(ERROR_MESSAGES.USER_NOT_FOUND_BY_USERNAME(username));\n }\n\n // modify the permissions array.\n user.roles = user.roles.filter(role => role.name !== roleName);\n\n return await this.repo.save(user);\n }\n\n // PROVIDER SPECIFIC CODE\n async resolveUserOnOauthGoogle(oauthUserDto: OauthUserDto): Promise<User> {\n const user = await this.repo.findOne({\n where: {\n email: oauthUserDto.email,\n },\n relations: {\n roles: true\n }\n });\n\n // if we are unable to find a user then we need to create one. \n if (!user) {\n const user = new User();\n user.username = oauthUserDto.email;\n user.email = oauthUserDto.email;\n user.lastLoginProvider = oauthUserDto.provider;\n user.accessCode = oauthUserDto.accessCode;\n user.googleAccessToken = oauthUserDto.accessToken;\n user.googleId = oauthUserDto.providerId;\n user.googleProfilePicture = oauthUserDto.picture;\n\n const savedUser = await this.repo.save(user);\n\n // Initialize the user roles\n this.initializeRolesForNewUser([this.iamConfiguration.defaultRole], savedUser);\n }\n // else we update the user and store the generated code & access token. \n else {\n const entity = await this.repo.preload({\n id: user.id,\n lastLoginProvider: oauthUserDto.provider,\n accessCode: oauthUserDto.accessCode,\n googleAccessToken: oauthUserDto.accessToken,\n googleId: oauthUserDto.providerId,\n googleProfilePicture: oauthUserDto.picture,\n });\n\n await this.repo.save(entity);\n }\n\n return user;\n }\n\n async findUsersByRole(roleName: string, relations: any = {}): Promise<User[]> {\n return await this.repo.find({\n where: {\n roles: {\n name: roleName\n }\n },\n relations: relations\n });\n }\n\n async checkIfPermissionExists(query: any, activeUser: ActiveUserData) {\n\n const matchingPermssions = activeUser.permissions.filter((p) => query.permissionNames.includes(p));\n return matchingPermssions\n }\n\n async initializeRolesForNewUser(roles: string[], user: User) {\n if (!user.id) {\n throw new BadRequestException(ERROR_MESSAGES.USER_MISSING_ID);\n }\n let userRoles = [];\n // Default Internal user role assigned \n userRoles.push(\"Internal User\");\n if (roles) {\n userRoles = [...userRoles, ...roles];\n }\n userRoles = Array.from(new Set([...userRoles]));\n if (userRoles.length > 0) {\n await this.addRolesToUser(user.username, userRoles);\n }\n }\n\n}\n"]}