@solidxai/core 0.1.11-beta.1 → 0.1.11-beta.4

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 (136) hide show
  1. package/.claude/settings.local.json +16 -0
  2. package/CLAUDE.md +26 -0
  3. package/dist/controllers/datasource-introspection.controller.d.ts +38 -1
  4. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  5. package/dist/controllers/datasource-introspection.controller.js +38 -0
  6. package/dist/controllers/datasource-introspection.controller.js.map +1 -1
  7. package/dist/controllers/service.controller.d.ts +1 -0
  8. package/dist/controllers/service.controller.d.ts.map +1 -1
  9. package/dist/controllers/service.controller.js +2 -2
  10. package/dist/controllers/service.controller.js.map +1 -1
  11. package/dist/dtos/datasource-introspection-mapping.dto.d.ts +4 -0
  12. package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -1
  13. package/dist/dtos/datasource-introspection-mapping.dto.js +18 -2
  14. package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -1
  15. package/dist/entities/{legacy-common-with-id.entity.d.ts → legacy-common-with-generated-id.entity.d.ts} +2 -2
  16. package/dist/entities/legacy-common-with-generated-id.entity.d.ts.map +1 -0
  17. package/dist/entities/{legacy-common-with-id.entity.js → legacy-common-with-generated-id.entity.js} +4 -4
  18. package/dist/entities/legacy-common-with-generated-id.entity.js.map +1 -0
  19. package/dist/entities/{legacy-common.entity.d.ts → legacy-common.entity-with-existing-id.entity.d.ts} +1 -1
  20. package/dist/entities/legacy-common.entity-with-existing-id.entity.d.ts.map +1 -0
  21. package/dist/entities/{legacy-common.entity.js → legacy-common.entity-with-existing-id.entity.js} +1 -1
  22. package/dist/entities/legacy-common.entity-with-existing-id.entity.js.map +1 -0
  23. package/dist/helpers/field-crud-managers/IntFieldCrudManager.d.ts.map +1 -1
  24. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js +4 -1
  25. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js.map +1 -1
  26. package/dist/helpers/model-metadata-helper.service.js +3 -3
  27. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  28. package/dist/helpers/solid-registry.d.ts +2 -1
  29. package/dist/helpers/solid-registry.d.ts.map +1 -1
  30. package/dist/helpers/solid-registry.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/interfaces/datasource-introspection-provider.interface.d.ts +1 -0
  36. package/dist/interfaces/datasource-introspection-provider.interface.d.ts.map +1 -1
  37. package/dist/interfaces/datasource-introspection-provider.interface.js.map +1 -1
  38. package/dist/seeders/module-metadata-seeder.service.d.ts +5 -1
  39. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  40. package/dist/seeders/module-metadata-seeder.service.js +61 -3
  41. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  42. package/dist/seeders/seed-data/solid-core-metadata.json +19 -3
  43. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  44. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +6 -5
  45. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  46. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -1
  47. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +12 -0
  48. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -1
  49. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -1
  50. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +2 -0
  51. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -1
  52. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -1
  53. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +28 -15
  54. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -1
  55. package/dist/services/datasource-introspection.service.d.ts +52 -2
  56. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  57. package/dist/services/datasource-introspection.service.js +534 -160
  58. package/dist/services/datasource-introspection.service.js.map +1 -1
  59. package/dist/services/locale.service.d.ts +14 -0
  60. package/dist/services/locale.service.d.ts.map +1 -1
  61. package/dist/services/locale.service.js +83 -0
  62. package/dist/services/locale.service.js.map +1 -1
  63. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +10 -10
  64. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  65. package/dist/services/role-metadata.service.d.ts +1 -0
  66. package/dist/services/role-metadata.service.d.ts.map +1 -1
  67. package/dist/services/role-metadata.service.js +23 -2
  68. package/dist/services/role-metadata.service.js.map +1 -1
  69. package/dist/services/view-metadata.service.d.ts.map +1 -1
  70. package/dist/services/view-metadata.service.js +4 -7
  71. package/dist/services/view-metadata.service.js.map +1 -1
  72. package/dist/subscribers/audit.subscriber.d.ts +2 -0
  73. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  74. package/dist/subscribers/audit.subscriber.js +25 -6
  75. package/dist/subscribers/audit.subscriber.js.map +1 -1
  76. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  77. package/dist/subscribers/computed-entity-field.subscriber.js +1 -0
  78. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  79. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  80. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  81. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  82. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  83. package/package.json +1 -1
  84. package/src/controllers/datasource-introspection.controller.ts +27 -1
  85. package/src/controllers/service.controller.ts +3 -2
  86. package/src/dtos/datasource-introspection-mapping.dto.ts +10 -0
  87. package/src/entities/{legacy-common-with-id.entity.ts → legacy-common-with-generated-id.entity.ts} +1 -1
  88. package/src/helpers/field-crud-managers/IntFieldCrudManager.ts +4 -1
  89. package/src/helpers/model-metadata-helper.service.ts +1 -1
  90. package/src/helpers/solid-registry.ts +7 -1
  91. package/src/index.ts +2 -2
  92. package/src/interfaces/datasource-introspection-provider.interface.ts +1 -0
  93. package/src/seeders/module-metadata-seeder.service.ts +72 -2
  94. package/src/seeders/seed-data/solid-core-metadata.json +19 -3
  95. package/src/services/1.js +6 -0
  96. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +10 -5
  97. package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +12 -0
  98. package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +2 -0
  99. package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +28 -15
  100. package/src/services/datasource-introspection.service.ts +626 -136
  101. package/src/services/locale.service.ts +111 -3
  102. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
  103. package/src/services/role-metadata.service.ts +26 -2
  104. package/src/services/view-metadata.service.ts +4 -8
  105. package/src/subscribers/audit.subscriber.ts +34 -14
  106. package/src/subscribers/computed-entity-field.subscriber.ts +1 -0
  107. package/src/subscribers/created-by-updated-by.subscriber.ts +3 -0
  108. package/src/subscribers/field-metadata.subscriber.ts +3 -0
  109. package/dist/entities/legacy-common-with-id.entity.d.ts.map +0 -1
  110. package/dist/entities/legacy-common-with-id.entity.js.map +0 -1
  111. package/dist/entities/legacy-common.entity.d.ts.map +0 -1
  112. package/dist/entities/legacy-common.entity.js.map +0 -1
  113. package/dist-tests/api/authenticate.spec.js +0 -119
  114. package/dist-tests/api/authenticate.spec.js.map +0 -1
  115. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  116. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  117. package/dist-tests/api/ping.spec.js +0 -21
  118. package/dist-tests/api/ping.spec.js.map +0 -1
  119. package/dist-tests/helpers/auth.js +0 -41
  120. package/dist-tests/helpers/auth.js.map +0 -1
  121. package/dist-tests/helpers/env.js +0 -11
  122. package/dist-tests/helpers/env.js.map +0 -1
  123. package/docs/agent-hub-grooming.md +0 -301
  124. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  125. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  126. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  127. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  128. package/docs/datasource-introspection-implementation-plan.md +0 -306
  129. package/docs/grouping-enhancements.md +0 -89
  130. package/docs/java-spring/README.md +0 -3
  131. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  132. package/docs/module-package-import-handoff.md +0 -691
  133. package/docs/seed-changes.md +0 -65
  134. package/docs/test-data-workflow.md +0 -200
  135. package/docs/type-declaration-import-issue.md +0 -24
  136. /package/src/entities/{legacy-common.entity.ts → legacy-common.entity-with-existing-id.entity.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata-seeder.service.js","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';\nimport { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';\nimport { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';\nimport { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';\nimport { SecurityRuleRepository } from 'src/repository/security-rule.repository';\nimport { AuthenticationService } from 'src/services/authentication.service';\nimport { EmailTemplateService } from 'src/services/email-template.service';\nimport { ListOfValuesService } from 'src/services/list-of-values.service';\nimport { SettingService } from 'src/services/setting.service';\nimport { SmsTemplateService } from 'src/services/sms-template.service';\nimport { UserService } from 'src/services/user.service';\nimport { DataSource, In, Repository } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { getDynamicModuleNamesBasedOnMetadata } from '../helpers/module.helper';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { ActionMetadataService } from '../services/action-metadata.service';\nimport { FieldMetadataService } from '../services/field-metadata.service';\nimport { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';\nimport { ModelMetadataService } from '../services/model-metadata.service';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { RoleMetadataService } from '../services/role-metadata.service';\nimport { ViewMetadataService } from '../services/view-metadata.service';\nimport solidCoreMetadata from './seed-data/solid-core-metadata.json';\nimport { SystemFieldsSeederService } from './system-fields-seeder.service';\n// import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { MENU_ROLE_JOIN_TABLE_NAME, MENU_ROLE_JOIN_TABLE_NAME_MENU_COL, MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL } from '../dtos/create-menu-item-metadata.dto';\nimport { DEFAULT_SA_PASSWORD } from '../dtos/create-user.dto';\nimport { SignUpDto } from '../dtos/sign-up.dto';\nimport { ADMIN_ROLE_NAME, CreateRoleMetadataDto } from 'src/dtos/create-role-metadata.dto';\nimport { CreateSavedFiltersDto } from 'src/dtos/create-saved-filters.dto';\nimport { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';\nimport { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\nimport { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';\nimport { SettingRepository } from 'src/repository/setting.repository';\nimport { CreateModelSequenceDto } from 'src/dtos/create-model-sequence.dto';\nimport { ModelSequenceRepository } from 'src/repository/model-sequence.repository';\nimport { ModelSequence } from 'src/entities/model-sequence.entity';\nimport { SavedFilters } from 'src/entities/saved-filters.entity';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { SecurityRule } from 'src/entities/security-rule.entity';\nimport { ListOfValues } from 'src/entities/list-of-values.entity';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { ViewMetadata } from 'src/entities/view-metadata.entity';\n\n/**\n * Central metadata seeder for both solid-core and consuming modules.\n *\n * Performance notes:\n * - This file now contains the main seed-time optimizations that were added after profiling real FRMS seed runs.\n * - The goal of those changes was to preserve existing behavior while removing avoidable serial database work.\n * - Verbose timing logs are intentionally emitted through Nest logger `debug()` only, so normal CLI runs stay clean.\n * - Every timing line is tagged with `[SEED_TIMING]` and a stable `[ITEM:...]` identifier for grep-friendly analysis.\n *\n * High-impact optimizations currently implemented here:\n * - Batched permission preload/insert, with case-insensitive dedupe to match MSSQL collation behavior.\n * - Process-local lookup caches for module/model/view/provider reads during a single seed run.\n * - Model-level field preload/diff to avoid field-level serial existence checks.\n * - View/action preload + in-memory no-op detection so unchanged rows skip save() entirely.\n * - Menu entity no-op detection, though menu relation lookups are still mostly serial and remain a future candidate.\n */\n@Injectable()\nexport class ModuleMetadataSeederService {\n private readonly logger = new Logger(ModuleMetadataSeederService.name);\n // Stable tag used on all verbose seed timing logs so runs can be grepped quickly.\n private readonly seedTimingTag = 'SEED_TIMING';\n // Keep permission batching bounded while still collapsing thousands of serial checks into a few queries.\n private readonly permissionSeedBatchSize = 500;\n // Restrict no-op detection to the fields that actually matter for persistence.\n private readonly viewComparableFields = ['name', 'displayName', 'type', 'context', 'layout', 'module', 'model'] as const;\n private readonly actionComparableFields = ['name', 'displayName', 'type', 'domain', 'context', 'customComponent', 'customIsModal', 'serverEndpoint', 'module', 'model', 'view'] as const;\n // These caches are intentionally process-local and are reset at the beginning of every seed run.\n private readonly moduleLookupCache = new Map<string, ModuleMetadata | null>();\n private readonly modelLookupCache = new Map<string, ModelMetadata | null>();\n private readonly viewLookupCache = new Map<string, ViewMetadata | null>();\n private readonly mediaStorageProviderLookupCache = new Map<string, any | null>();\n private enablePruning: boolean = false;\n\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly userService: UserService,\n private readonly authenticationService: AuthenticationService,\n private readonly solidActionService: ActionMetadataService,\n private readonly solidViewService: ViewMetadataService,\n private readonly emailTemplateService: EmailTemplateService,\n private readonly smsTemplateService: SmsTemplateService,\n private readonly listOfValuesService: ListOfValuesService,\n // @InjectRepository(PermissionMetadata)\n // private readonly permissionRepo: Repository<PermissionMetadata>,\n private readonly permissionRepo: PermissionMetadataRepository,\n private readonly solidRegistry: SolidRegistry,\n private readonly settingService: SettingService,\n // @InjectRepository(Setting, 'default')\n // readonly settingsRepo: Repository<Setting>,\n private readonly settingsRepo: SettingRepository,\n readonly securityRuleRepo: SecurityRuleRepository,\n readonly systemFieldsSeederService: SystemFieldsSeederService,\n readonly scheduledJobRepository: ScheduledJobRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly dataSource: DataSource,\n readonly modelSequenceRepo: ModelSequenceRepository,\n ) { }\n\n async seed(conf?: any) {\n let currentModule = 'global';\n let currentStep = 'bootstrap';\n let modulesToSeed: string[] | null = null;\n const shouldSeedGlobalMetadata = conf?.seedGlobalMetadata !== false;\n\n try {\n this.enablePruning = Boolean(conf?.pruneMetadata);\n // Never reuse cached entity snapshots across seed invocations in the same process.\n this.resetLookupCaches();\n console.log(this.enablePruning ? '▶ Pruning enabled: metadata not present in JSON will be removed.' : '▶ Pruning disabled: existing metadata will be kept.');\n\n await this.timeOperation('seed-run', async () => {\n // Global seeding steps i.e across all modules\n if (shouldSeedGlobalMetadata) {\n currentStep = 'seedGlobalMetadata';\n await this.timeOperation('global-seed', () => this.seedGlobalMetadata(), { moduleName: 'global', component: 'global-metadata' });\n } else {\n this.logger.log(`Skipping global metadata seeding.`);\n }\n\n // Module specific seeding steps.\n // Get all the module metadata files which needs to be seeded.\n const seedDataFiles = this.seedDataFiles;\n this.logger.debug(`Found seed data for modules: ${seedDataFiles.map(s => s.moduleMetadata?.name)}`);\n\n /**\n * -------------------------------------------------------------\n * Selective module seeding via: solid seed --modules-to-seed onboarding,reports\n * -------------------------------------------------------------\n */\n currentStep = 'resolveModulesToSeed';\n if (conf && Array.isArray(conf.modulesToSeed)) {\n modulesToSeed = conf.modulesToSeed;\n console.log(`▶ Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);\n this.logger.log(`Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);\n } else {\n console.log(`▶ No modulesToSeed provided. Seeding ALL modules.`);\n this.logger.log(`No modulesToSeed provided. Seeding ALL modules.`);\n }\n\n // Filter modules if needed\n const filteredSeedDataFiles = modulesToSeed ? seedDataFiles.filter((file) => modulesToSeed.includes(file.moduleMetadata?.name)) : seedDataFiles;\n\n if (filteredSeedDataFiles.length === 0) {\n this.logger.warn(`No modules matched the provided modulesToSeed list.`);\n return;\n }\n\n // let usersDetail;\n // For each module metadata file, we will process the seeding steps one by one.\n for (let i = 0; i < filteredSeedDataFiles.length; i++) {\n const overallMetadata = filteredSeedDataFiles[i];\n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n currentModule = moduleMetadata?.name ?? 'unknown';\n\n if (!moduleMetadata?.name) {\n this.logger.warn(`Skipping seed metadata file because moduleMetadata.name is missing.`);\n continue;\n }\n\n console.log(`▶ Seeding Metadata for Module: ${moduleMetadata.name}`);\n this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);\n\n await this.timeOperation('module-total', async () => {\n currentStep = 'seedMediaStorageProviders';\n this.logger.log(`Seeding Media Storage Providers`);\n const mediaStorageCounts = await this.timeOperation('seed-media-storage-providers', () => this.seedMediaStorageProviders(overallMetadata.mediaStorageProviders), { moduleName: moduleMetadata.name, component: 'media-storage-providers' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Media Storage Providers', mediaStorageCounts)}`);\n\n // Process module metadata first.\n currentStep = 'seedModuleModelFields';\n this.logger.log(`Seeding Module / Model / Fields`);\n const moduleModelFieldCounts = await this.timeOperation('seed-module-model-fields', () => this.seedModuleModelFields(moduleMetadata), { moduleName: moduleMetadata.name, component: 'module-model-fields' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Module/Model/Fields', moduleModelFieldCounts)}`);\n\n currentStep = 'seedPermissions';\n this.logger.log(`Seeding Permissions`);\n const permissionCounts = await this.timeOperation('seed-permissions', () => this.seedPermissions(overallMetadata), { moduleName: moduleMetadata.name, component: 'permissions' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Permissions', permissionCounts)}`);\n\n currentStep = 'seedRoles';\n this.logger.log(`Seeding Roles`);\n const roleCounts = await this.timeOperation('seed-roles', () => this.seedRoles(overallMetadata), { moduleName: moduleMetadata.name, component: 'roles' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Roles', roleCounts)}`);\n\n currentStep = 'seedUsers';\n this.logger.log(`Seeding Users`);\n const userCounts = await this.timeOperation('seed-users', () => this.seedUsers(overallMetadata), { moduleName: moduleMetadata.name, component: 'users' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Users', userCounts)}`);\n\n currentStep = 'seedViews';\n this.logger.log(`Seeding Views`);\n const viewCounts = await this.timeOperation('seed-views', () => this.seedViews(overallMetadata), { moduleName: moduleMetadata.name, component: 'views' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Views', viewCounts)}`);\n\n currentStep = 'seedActions';\n this.logger.log(`Seeding Actions`);\n const actionCounts = await this.timeOperation('seed-actions', () => this.seedActions(overallMetadata), { moduleName: moduleMetadata.name, component: 'actions' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Actions', actionCounts)}`);\n\n currentStep = 'seedMenus';\n this.logger.log(`Seeding Menus`);\n const menuCounts = await this.timeOperation('seed-menus', () => this.seedMenus(overallMetadata), { moduleName: moduleMetadata.name, component: 'menus' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Menus', menuCounts)}`);\n\n currentStep = 'seedEmailTemplates';\n this.logger.log(`Seeding Email Templates`);\n const emailTemplateCounts = await this.timeOperation('seed-email-templates', () => this.seedEmailTemplates(overallMetadata, moduleMetadata.name), { moduleName: moduleMetadata.name, component: 'email-templates' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Email Templates', emailTemplateCounts)}`);\n\n currentStep = 'seedSmsTemplates';\n this.logger.log(`Seeding Sms Templates`);\n const smsTemplateCounts = await this.timeOperation('seed-sms-templates', () => this.seedSmsTemplates(overallMetadata, moduleMetadata.name), { moduleName: moduleMetadata.name, component: 'sms-templates' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Sms Templates', smsTemplateCounts)}`);\n\n currentStep = 'seedSecurityRules';\n this.logger.log(`Seeding Security Rules`);\n const securityRuleCounts = await this.timeOperation('seed-security-rules', () => this.seedSecurityRules(overallMetadata), { moduleName: moduleMetadata.name, component: 'security-rules' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Security Rules', securityRuleCounts)}`);\n\n currentStep = 'seedListOfValues';\n this.logger.log(`Seeding List Of Values`);\n const lovCounts = await this.timeOperation('seed-list-of-values', () => this.seedListOfValues(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'list-of-values' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'List Of Values', lovCounts)}`);\n\n currentStep = 'seedScheduledJobs';\n this.logger.log(`Seeding Scheduled Jobs`);\n const scheduledJobCounts = await this.timeOperation('seed-scheduled-jobs', () => this.seedScheduledJobs(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'scheduled-jobs' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Scheduled Jobs', scheduledJobCounts)}`);\n\n currentStep = 'seedSavedFilters';\n this.logger.log(`Seeding Saved Filters`);\n const savedFilterCounts = await this.timeOperation('seed-saved-filters', () => this.seedSavedFilters(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'saved-filters' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Saved Filters', savedFilterCounts)}`);\n\n currentStep = 'seedModelSequences';\n this.logger.log(`Seeding Model Sequences`);\n const modelSequenceCounts = await this.timeOperation('seed-model-sequences', () => this.seedModelSequences(overallMetadata), { moduleName: moduleMetadata.name, component: 'model-sequences' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Model Sequences', modelSequenceCounts)}`);\n }, { moduleName: moduleMetadata.name, component: 'module-seed' });\n }\n\n currentModule = 'global';\n currentStep = 'setupDefaultRolesWithPermissions';\n await this.timeOperation('setup-default-roles-with-permissions', () => this.setupDefaultRolesWithPermissions(), { moduleName: 'global', component: 'default-roles' });\n }, { moduleName: 'global', component: 'seed-run' });\n\n // Add a console log indicating seeding is finished. This needs to be console.log so that it looks proper when this code is run via CLI.\n console.log(`✔ Seeding completed.`);\n //this.logger.log(`All Seeders finished`);\n\n //FIXME: Handle displaying the created users credentials in a better way.\n // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);\n } catch (error: any) {\n this.logSeedFailureForCli(error, {\n moduleName: currentModule,\n step: currentStep,\n pruneEnabled: this.enablePruning,\n modulesToSeed,\n });\n throw error;\n }\n }\n\n private buildTimingPrefix(itemTag: string, options?: { moduleName?: string; component?: string; serviceCall?: string }): string {\n const parts = [`[${this.seedTimingTag}]`, `[ITEM:${itemTag}]`];\n if (options?.moduleName) {\n parts.push(`[MODULE:${options.moduleName}]`);\n }\n if (options?.component) {\n parts.push(`[COMPONENT:${options.component}]`);\n }\n if (options?.serviceCall) {\n parts.push(`[CALL:${options.serviceCall}]`);\n }\n return parts.join(' ');\n }\n\n private formatDuration(durationMs: number): string {\n return durationMs >= 1000\n ? `${(durationMs / 1000).toFixed(2)} s (${durationMs.toFixed(2)} ms)`\n : `${durationMs.toFixed(2)} ms`;\n }\n\n private resetLookupCaches(): void {\n this.moduleLookupCache.clear();\n this.modelLookupCache.clear();\n this.viewLookupCache.clear();\n this.mediaStorageProviderLookupCache.clear();\n }\n\n // These cache-backed helpers now log only cache misses. Earlier versions also logged cache hits and operation\n // starts, but that produced too much verbose noise relative to the debugging value.\n private async getModuleByUserKeyCached(\n moduleUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ModuleMetadata | null> {\n if (!moduleUserKey) {\n return null;\n }\n if (this.moduleLookupCache.has(moduleUserKey)) {\n return this.moduleLookupCache.get(moduleUserKey) ?? null;\n }\n\n const module = await this.timeOperation('module-find-by-user-key-cache-miss', () => this.moduleMetadataService.findOneByUserKey(moduleUserKey), {\n moduleName: options?.moduleName ?? moduleUserKey,\n component: options?.component,\n serviceCall: 'moduleMetadataService.findOneByUserKey',\n details: options?.details ?? `module=${moduleUserKey}`,\n });\n this.moduleLookupCache.set(moduleUserKey, module ?? null);\n return module ?? null;\n }\n\n private async getModelByUserKeyCached(\n modelUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ModelMetadata | null> {\n if (!modelUserKey) {\n return null;\n }\n if (this.modelLookupCache.has(modelUserKey)) {\n return this.modelLookupCache.get(modelUserKey) ?? null;\n }\n\n const model = await this.timeOperation('model-find-by-user-key-cache-miss', () => this.modelMetadataService.findOneByUserKey(modelUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'modelMetadataService.findOneByUserKey',\n details: options?.details ?? `model=${modelUserKey}`,\n });\n this.modelLookupCache.set(modelUserKey, model ?? null);\n return model ?? null;\n }\n\n private async getViewByUserKeyCached(\n viewUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ViewMetadata | null> {\n if (!viewUserKey) {\n return null;\n }\n if (this.viewLookupCache.has(viewUserKey)) {\n return this.viewLookupCache.get(viewUserKey) ?? null;\n }\n\n const view = await this.timeOperation('view-find-by-user-key-cache-miss', () => this.solidViewService.findOneByUserKey(viewUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'solidViewService.findOneByUserKey',\n details: options?.details ?? `view=${viewUserKey}`,\n });\n this.viewLookupCache.set(viewUserKey, view ?? null);\n return view ?? null;\n }\n\n private async getMediaStorageProviderByUserKeyCached(\n mediaStorageProviderUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<any | null> {\n if (!mediaStorageProviderUserKey) {\n return null;\n }\n if (this.mediaStorageProviderLookupCache.has(mediaStorageProviderUserKey)) {\n return this.mediaStorageProviderLookupCache.get(mediaStorageProviderUserKey) ?? null;\n }\n\n const mediaStorageProvider = await this.timeOperation('media-storage-provider-find-by-user-key-cache-miss', () => this.mediaStorageProviderMetadataService.findOneByUserKey(mediaStorageProviderUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'mediaStorageProviderMetadataService.findOneByUserKey',\n details: options?.details ?? `provider=${mediaStorageProviderUserKey}`,\n });\n this.mediaStorageProviderLookupCache.set(mediaStorageProviderUserKey, mediaStorageProvider ?? null);\n return mediaStorageProvider ?? null;\n }\n\n private async timeOperation<T>(\n itemTag: string,\n operation: () => Promise<T>,\n options?: { moduleName?: string; component?: string; serviceCall?: string; details?: string },\n ): Promise<T> {\n const prefix = this.buildTimingPrefix(itemTag, options);\n const detailSuffix = options?.details ? ` ${options.details}` : '';\n const start = process.hrtime.bigint();\n\n try {\n const result = await operation();\n const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;\n this.logger.debug(`${prefix} done in ${this.formatDuration(durationMs)}${detailSuffix}`);\n return result;\n } catch (error) {\n const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;\n this.logger.debug(`${prefix} failed after ${this.formatDuration(durationMs)}${detailSuffix}`);\n throw error;\n }\n }\n\n private async seedScheduledJobs(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const scheduledJobs = this.getSeedArray<CreateScheduledJobDto>(overallMetadata?.scheduledJobs);\n const pruned = this.enablePruning ? await this.timeOperation('prune-scheduled-jobs', () => this.pruneScheduledJobs(scheduledJobs, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'scheduled-jobs',\n serviceCall: 'pruneScheduledJobs',\n }) : 0;\n if (scheduledJobs.length > 0) {\n await this.timeOperation('handle-scheduled-jobs', () => this.handleSeedScheduledJobs(scheduledJobs), {\n moduleName: moduleMetadata.name,\n component: 'scheduled-jobs',\n serviceCall: 'handleSeedScheduledJobs',\n });\n }\n return { pruned, upserted: scheduledJobs.length };\n }\n\n private async seedSavedFilters(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const savedFilters = this.getSeedArray<CreateSavedFiltersDto>(overallMetadata?.savedFilters);\n const pruned = this.enablePruning ? await this.timeOperation('prune-saved-filters', () => this.pruneSavedFilters(savedFilters, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'saved-filters',\n serviceCall: 'pruneSavedFilters',\n }) : 0;\n if (savedFilters.length > 0) {\n await this.timeOperation('handle-saved-filters', () => this.handleSeedSavedFilters(savedFilters), {\n moduleName: moduleMetadata.name,\n component: 'saved-filters',\n serviceCall: 'handleSeedSavedFilters',\n });\n }\n return { pruned, upserted: savedFilters.length };\n }\n\n private async seedListOfValues(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const listOfValues = this.getSeedArray<CreateListOfValuesDto>(overallMetadata?.listOfValues);\n const pruned = this.enablePruning ? await this.timeOperation('prune-list-of-values', () => this.pruneListOfValues(listOfValues, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'list-of-values',\n serviceCall: 'pruneListOfValues',\n }) : 0;\n await this.timeOperation('handle-list-of-values', () => this.handleSeedListOfValues(listOfValues), {\n moduleName: moduleMetadata.name,\n component: 'list-of-values',\n serviceCall: 'handleSeedListOfValues',\n });\n return { pruned, upserted: listOfValues.length };\n }\n\n private async setupDefaultRolesWithPermissions() {\n this.logger.debug(`About to add all permissions to the Admin role`);\n await this.timeOperation('role-add-all-permissions', () => this.roleService.addAllPermissionsToRole(ADMIN_ROLE_NAME), {\n moduleName: 'global',\n component: 'default-roles',\n serviceCall: 'roleService.addAllPermissionsToRole',\n details: `role=${ADMIN_ROLE_NAME}`,\n });\n\n // The below code is commented out for now as we are including permissions for these roles from the seeder json for the Internal and Public role. \n // 2. Give permissions to the Internal / Public role.\n // this.logger.debug(`About to add all permissions to the Internal role`);\n // await this.roleService.addPermissionToRole(INTERNAL_ROLE_NAME, INTERNAL_ROLE_PERMISSIONS);\n\n // this.logger.debug(`About to add all permissions to the Public role`);\n // await this.roleService.addPermissionToRole(PUBLIC_ROLE_NAME, ['SettingController.wrapSettings', 'AuthenticationController.logout']);\n }\n\n private async seedSecurityRules(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const securityRules = this.getSeedArray<CreateSecurityRuleDto>(overallMetadata?.securityRules);\n const pruned = this.enablePruning ? await this.timeOperation('prune-security-rules', () => this.pruneSecurityRules(securityRules, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'security-rules',\n serviceCall: 'pruneSecurityRules',\n }) : 0;\n await this.timeOperation('handle-security-rules', () => this.handleSeedSecurityRules(securityRules), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'security-rules',\n serviceCall: 'handleSeedSecurityRules',\n });\n return { pruned, upserted: securityRules.length };\n }\n\n // Ok\n private async seedDefaultSettings() {\n await this.timeOperation('seed-default-settings-call', () => this.settingService.seedSystemAdminEditableAndAboveSettings(), {\n moduleName: 'global',\n component: 'settings',\n serviceCall: 'settingService.seedSystemAdminEditableAndAboveSettings',\n });\n }\n\n private async seedSmsTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {\n const smsTemplates = this.getSeedArray<CreateSmsTemplateDto>(overallMetadata?.smsTemplates);\n await this.timeOperation('handle-sms-templates', () => this.handleSeedSmsTemplates(smsTemplates, moduleName), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'handleSeedSmsTemplates',\n });\n return { pruned: 0, upserted: smsTemplates.length };\n }\n\n // OK\n private async seedEmailTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {\n const emailTemplates = this.getSeedArray<CreateEmailTemplateDto>(overallMetadata?.emailTemplates);\n await this.timeOperation('handle-email-templates', () => this.handleSeedEmailTemplates(emailTemplates, moduleName), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'handleSeedEmailTemplates',\n });\n return { pruned: 0, upserted: emailTemplates.length };\n }\n\n // Ok\n private async seedMenus(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const menus = this.getSeedArray<any>(overallMetadata?.menus);\n const pruned = this.enablePruning ? await this.timeOperation('prune-menus', () => this.pruneMenus(menus, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'menus',\n serviceCall: 'pruneMenus',\n }) : 0;\n await this.timeOperation('handle-menus', () => this.handleSeedMenus(menus), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'menus',\n serviceCall: 'handleSeedMenus',\n });\n return { pruned, upserted: menus.length };\n }\n\n // Ok\n private async seedActions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const actions = this.getSeedArray<any>(overallMetadata?.actions);\n const pruned = this.enablePruning ? await this.timeOperation('prune-actions', () => this.pruneActions(actions, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'actions',\n serviceCall: 'pruneActions',\n }) : 0;\n await this.timeOperation('handle-actions', () => this.handleSeedActions(actions), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'actions',\n serviceCall: 'handleSeedActions',\n });\n return { pruned, upserted: actions.length };\n }\n\n // Ok\n private async seedViews(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const views = this.getSeedArray<any>(overallMetadata?.views);\n const pruned = this.enablePruning ? await this.timeOperation('prune-views', () => this.pruneViews(views, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'views',\n serviceCall: 'pruneViews',\n }) : 0;\n await this.timeOperation('handle-views', () => this.handleSeedViews(views), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'views',\n serviceCall: 'handleSeedViews',\n });\n return { pruned, upserted: views.length };\n }\n\n // Ok\n private async seedUsers(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const users = this.getSeedArray<SignUpDto>(overallMetadata?.users);\n // usersDetail = users;\n await this.timeOperation('handle-users', () => this.handleSeedUsers(users), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'users',\n serviceCall: 'handleSeedUsers',\n });\n return { pruned: 0, upserted: users.length };\n }\n\n // OK\n private async seedRoles(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const roles = this.getSeedArray<CreateRoleMetadataDto>(overallMetadata?.roles);\n // While creating roles we are only passing the role name to be used. \n await this.timeOperation('roles-create-if-not-exists', () => this.roleService.createRolesIfNotExists(\n roles\n .filter((role) => role?.name)\n .map((role) => ({ name: role.name } as any)),\n ), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'roles',\n serviceCall: 'roleService.createRolesIfNotExists',\n details: `roleCount=${roles.length}`,\n });\n // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.\n // Every role configuration in the seeder json can optionally have a permissions attribute. \n for (const role of roles) {\n if (role.permissions) {\n await this.timeOperation('role-add-permissions', () => this.roleService.addPermissionsToRole(\n role.name,\n role.permissions\n .map((permission: any) => typeof permission === 'string' ? permission : permission?.name)\n .filter(Boolean),\n ), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'roles',\n serviceCall: 'roleService.addPermissionsToRole',\n details: `role=${role.name} permissionCount=${role.permissions.length}`,\n });\n }\n }\n return { pruned: 0, upserted: roles.length };\n }\n\n private async seedPermissions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const permissions = overallMetadata.permissions ?? [];\n await this.timeOperation('handle-permissions', () => this.handleSeedPermissions(permissions), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'permissions',\n serviceCall: 'handleSeedPermissions',\n });\n return { pruned: 0, upserted: permissions?.length ?? 0 };\n }\n\n // OK\n private get seedDataFiles(): any[] {\n const typedSolidCoreMetadata = structuredClone(solidCoreMetadata);\n const seedDataFiles = [typedSolidCoreMetadata];\n // const enabledModules = getDynamicModuleNames();\n const enabledModules = getDynamicModuleNamesBasedOnMetadata();\n for (const enabledModule of enabledModules) {\n const enabledModuleSeedFile = `src/${enabledModule}/metadata/${enabledModule}-metadata.json`;\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n\n if (fs.existsSync(fullPath)) {\n const overallMetadata = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n seedDataFiles.push(overallMetadata);\n }\n }\n\n return seedDataFiles;\n }\n\n // OK\n private async seedGlobalMetadata() {\n this.logger.log(`Seeding Permissions`);\n await this.timeOperation('seed-controller-permissions', () => this.seedControllerPermissions(), {\n moduleName: 'global',\n component: 'controller-permissions',\n });\n\n // this.logger.log(`Seeding Default Media Storage Providers`);\n // await this.seedDefaultMediaStorageProviders();\n\n this.logger.log(`Seeding System Fields Metadata`);\n await this.timeOperation('seed-default-system-fields', () => this.seedDefaultSystemFields(), {\n moduleName: 'global',\n component: 'system-fields',\n });\n\n // Settings\n this.logger.log(`Seeding Default Settings`);\n await this.timeOperation('seed-default-settings', () => this.seedDefaultSettings(), {\n moduleName: 'global',\n component: 'settings',\n });\n\n\n this.logger.debug(`Global metadata seeding completed`);\n }\n\n private async seedDefaultSystemFields() {\n await this.timeOperation('system-fields-seed', () => this.systemFieldsSeederService.seed(), {\n moduleName: 'global',\n component: 'system-fields',\n serviceCall: 'systemFieldsSeederService.seed',\n });\n }\n\n // OK\n private async seedControllerPermissions() {\n\n const controllers = this.solidRegistry.getControllers();\n const permissionNames: string[] = [];\n\n // Loop over the countries and create them.\n for (let id = 0; id < controllers.length; id++) {\n try {\n const controller = controllers[id];\n // this.logger.log(`Resolving controller: ${controller.name}`);\n\n const methods = controller.methods;\n for (let mId = 0; mId < methods.length; mId++) {\n\n const methodName = methods[mId];\n const permissionName = `${controller.name}.${methodName}`;\n permissionNames.push(permissionName);\n }\n\n } catch (error: any) {\n this.logger.error(error);\n }\n }\n\n await this.timeOperation('seed-controller-permissions-bulk', () => this.seedPermissionsInBatches(permissionNames, {\n moduleName: 'global',\n component: 'controller-permissions',\n }), {\n moduleName: 'global',\n component: 'controller-permissions',\n serviceCall: 'seedPermissionsInBatches',\n details: `permissionCount=${permissionNames.length} batchSize=${this.permissionSeedBatchSize}`,\n });\n\n if (this.enablePruning) {\n await this.timeOperation('prune-controller-permissions', () => this.prunePermissions(permissionNames), {\n moduleName: 'global',\n component: 'controller-permissions',\n serviceCall: 'prunePermissions',\n });\n }\n }\n\n private async handleSeedPermissions(permissions: any[]): Promise<void> {\n const permissionNames = permissions\n .map((permission) => typeof permission === 'string' ? permission : permission?.name)\n .filter(Boolean);\n\n // This path replaced the old \"check one permission at a time\" approach that was responsible for one of the\n // biggest seed-time regressions. We now normalize upfront and let the batch helper do set-based existence work.\n await this.seedPermissionsInBatches(permissionNames, {\n component: 'permissions',\n });\n }\n\n private async seedPermissionsInBatches(\n permissionNames: string[],\n options?: { moduleName?: string; component?: string },\n ): Promise<void> {\n const uniquePermissionNames = this.getUniquePermissionNames(permissionNames);\n if (uniquePermissionNames.length === 0) {\n return;\n }\n\n // We intentionally process in bounded chunks so we get the performance benefit of set-based reads/writes\n // without loading an unbounded permission list into a single query or save payload.\n for (let index = 0; index < uniquePermissionNames.length; index += this.permissionSeedBatchSize) {\n const batch = uniquePermissionNames.slice(index, index + this.permissionSeedBatchSize);\n const batchNumber = Math.floor(index / this.permissionSeedBatchSize) + 1;\n\n const existingPermissions = await this.timeOperation('permission-batch-find', () => this.permissionRepo.find({\n where: {\n name: In(batch),\n }\n }), {\n moduleName: options?.moduleName,\n component: options?.component ?? 'permissions',\n serviceCall: 'permissionRepo.find',\n details: `batch=${batchNumber} batchSize=${batch.length}`,\n });\n\n const existingPermissionNames = new Set(\n existingPermissions.map((permission) => this.normalizePermissionName(permission.name)),\n );\n const missingPermissionNames = batch.filter(\n (name) => !existingPermissionNames.has(this.normalizePermissionName(name)),\n );\n\n if (missingPermissionNames.length === 0) {\n continue;\n }\n\n this.logger.log(`Creating ${missingPermissionNames.length} missing permissions in batch ${batchNumber}.`);\n await this.timeOperation('permission-batch-save', () => this.permissionRepo.save(\n missingPermissionNames.map((name) => this.permissionRepo.create({ name })),\n ), {\n moduleName: options?.moduleName,\n component: options?.component ?? 'permissions',\n serviceCall: 'permissionRepo.save',\n details: `batch=${batchNumber} createCount=${missingPermissionNames.length}`,\n });\n }\n }\n\n private getUniquePermissionNames(permissionNames: string[]): string[] {\n const normalizedPermissionNames = new Set<string>();\n const uniquePermissionNames: string[] = [];\n\n for (const permissionName of permissionNames) {\n if (!permissionName) {\n continue;\n }\n\n // Deduping is intentionally case-insensitive because MSSQL commonly compares these names using a\n // case-insensitive collation. Without that, a batch can think `Foo.Bar` is missing even when\n // `foo.bar` already exists in the database.\n const normalizedPermissionName = this.normalizePermissionName(permissionName);\n if (normalizedPermissionNames.has(normalizedPermissionName)) {\n continue;\n }\n\n normalizedPermissionNames.add(normalizedPermissionName);\n uniquePermissionNames.push(permissionName.trim());\n }\n\n return uniquePermissionNames;\n }\n\n private normalizePermissionName(permissionName: string): string {\n return permissionName.trim().toLowerCase();\n }\n\n // OK\n // private async seedDefaultMediaStorageProviders() {\n // await this.mediaStorageProviderSeederService.seed();\n // }\n\n // OK\n private async seedMediaStorageProviders(mediaStorageProviders: any[]): Promise<{ pruned: number; upserted: number }> {\n const providers = this.getSeedArray<any>(mediaStorageProviders);\n\n for (let i = 0; i < providers.length; i++) {\n const mediaStorageProvider = providers[i];\n await this.timeOperation('media-storage-provider-upsert', () => this.mediaStorageProviderMetadataService.upsert(mediaStorageProvider), {\n component: 'media-storage-providers',\n serviceCall: 'mediaStorageProviderMetadataService.upsert',\n details: `provider=${mediaStorageProvider?.name ?? mediaStorageProvider?.userKey ?? i}`,\n });\n }\n return { pruned: 0, upserted: providers.length };\n }\n\n private async seedModelSequences(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const modelSequences = this.getSeedArray<CreateModelSequenceDto>(overallMetadata?.modelSequences);\n const pruned = this.enablePruning ? await this.timeOperation('prune-model-sequences', () => this.pruneModelSequences(modelSequences, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'model-sequences',\n serviceCall: 'pruneModelSequences',\n }) : 0;\n await this.timeOperation('handle-model-sequences', () => this.handleSeedModelSequences(modelSequences), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'model-sequences',\n serviceCall: 'handleSeedModelSequences',\n });\n return { pruned, upserted: modelSequences.length };\n }\n\n // OK\n private async handleSeedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleName: string) {\n if (!emailTemplates) {\n return;\n }\n\n for (let i = 0; i < emailTemplates.length; i++) {\n const emailTemplate = emailTemplates[i];\n // this.logger.log(`Found ${emailTemplate.name} email template`);\n\n // We need to load the actual template contents. \n if (moduleName === 'solid-core') {\n let moduleRoot: string | null = null;\n\n try {\n // Always resolve package.json, never the module entry\n moduleRoot = path.dirname(\n require.resolve('@solidxai/core/package.json'),\n );\n } catch (err: any) {\n this.logger.debug(\n 'Could not resolve @solidxai/core from node_modules, assuming local execution',\n );\n }\n\n const filePathInternal = 'src/seeders/seed-data/email-templates/';\n let filePath: string;\n // Case 1: solid-core installed as dependency\n if (moduleRoot) {\n filePath = path.join(\n moduleRoot,\n filePathInternal,\n emailTemplate.body,\n );\n }\n else {\n // Case 2: running INSIDE solid-core repo\n const localCoreRoot = process.cwd(); // or configurable root\n filePath = path.join(\n localCoreRoot,\n filePathInternal,\n emailTemplate.body,\n );\n }\n\n if (fs.existsSync(filePath)) {\n emailTemplate.body = fs.readFileSync(filePath, 'utf-8');\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `src/${moduleName}/metadata/email-templates/${emailTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n // this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n emailTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n // Save to DB.\n await this.timeOperation('email-template-remove', () => this.emailTemplateService.removeByName(emailTemplate.name), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'emailTemplateService.removeByName',\n details: `template=${emailTemplate.name}`,\n });\n await this.timeOperation('email-template-create', () => this.emailTemplateService.create(emailTemplate), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'emailTemplateService.create',\n details: `template=${emailTemplate.name}`,\n });\n }\n\n }\n\n // Ok\n private async handleSeedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleName: string) {\n if (!smsTemplates) {\n return;\n }\n\n for (let i = 0; i < smsTemplates.length; i++) {\n const smsTemplate = smsTemplates[i];\n // this.logger.log(`Found ${smsTemplate.name} sms template`);\n\n // We need to load the actual template contents. \n if (moduleName === 'solid-core') {\n let moduleRoot: string | null = null;\n\n try {\n // Always resolve package.json, never the module entry\n moduleRoot = path.dirname(\n require.resolve('@solidxai/core/package.json'),\n );\n } catch (err: any) {\n this.logger.debug(\n 'Could not resolve @solidxai/core from node_modules, assuming local execution',\n );\n }\n\n const filePathInternal = 'src/seeders/seed-data/sms-templates/';\n let filePath: string;\n // Case 1: solid-core installed as dependency\n if (moduleRoot) {\n filePath = path.join(\n moduleRoot,\n filePathInternal,\n smsTemplate.body,\n );\n }\n else {\n // Case 2: running INSIDE solid-core repo\n const localCoreRoot = process.cwd(); // or configurable root\n filePath = path.join(\n localCoreRoot,\n filePathInternal,\n smsTemplate.body,\n );\n }\n\n if (fs.existsSync(filePath)) {\n smsTemplate.body = fs.readFileSync(filePath, 'utf-8');\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `src/${moduleName}/metadata/sms-templates/${smsTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n // this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n smsTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n\n // Save to DB.\n await this.timeOperation('sms-template-remove', () => this.smsTemplateService.removeByName(smsTemplate.name), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'smsTemplateService.removeByName',\n details: `template=${smsTemplate.name}`,\n });\n await this.timeOperation('sms-template-create', () => this.smsTemplateService.create(smsTemplate), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'smsTemplateService.create',\n details: `template=${smsTemplate.name}`,\n });\n }\n }\n\n // Ok\n private async handleSeedMenus(menus: any) {\n if (!menus) {\n return;\n }\n\n // Menu writes are now no-op aware, but this block still performs several serial relation lookups per menu.\n // That tradeoff is acceptable for now because the highest-value wins were elsewhere, but if menu seeding\n // becomes the next hotspot the natural next step is bulk-preloading actions/modules/existing menus here too.\n await this.timeOperation('menus-transaction', () => this.dataSource.transaction(async (trx) => {\n const menuRepo = trx.getRepository(MenuItemMetadata);\n const roleRepo = trx.getRepository(RoleMetadata);\n const actionRepo = trx.getRepository(ActionMetadata);\n const moduleRepo = trx.getRepository(ModuleMetadata);\n\n // 1) Upsert menus WITHOUT roles (manual upsert)\n for (const m of menus) {\n const action = m.actionUserKey\n ? await this.timeOperation('menu-action-find-one', () => actionRepo.findOne({ where: { name: m.actionUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'actionRepo.findOne',\n details: `action=${m.actionUserKey}`,\n })\n : null;\n\n const module = m.moduleUserKey\n ? await this.timeOperation('menu-module-find-one', () => moduleRepo.findOne({ where: { name: m.moduleUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'moduleRepo.findOne',\n details: `module=${m.moduleUserKey}`,\n })\n : null;\n\n const parentMenuItem = m.parentMenuItemUserKey\n ? await this.timeOperation('menu-parent-find-one', () => menuRepo.findOne({ where: { name: m.parentMenuItemUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'menuRepo.findOne',\n details: `parent=${m.parentMenuItemUserKey}`,\n })\n : null;\n\n // Check if a menu with this name already exists\n const existing = await this.timeOperation('menu-existing-find-one', () => menuRepo.findOne({\n where: { name: m.name },\n relations: {\n action: true,\n module: true,\n parentMenuItem: true,\n },\n }), {\n component: 'menus',\n serviceCall: 'menuRepo.findOne',\n details: `menu=${m.name}`,\n });\n\n // Build the entity data (without id)\n const base = {\n name: m.name,\n displayName: m.displayName,\n action,\n module,\n parentMenuItem,\n sequenceNumber: m.sequenceNumber,\n iconName: m.iconName,\n };\n\n const hasChanges = existing\n ? existing.displayName !== base.displayName\n || existing.sequenceNumber !== base.sequenceNumber\n || existing.iconName !== base.iconName\n || existing.action?.id !== base.action?.id\n || existing.module?.id !== base.module?.id\n || existing.parentMenuItem?.id !== base.parentMenuItem?.id\n : true;\n\n if (existing && !hasChanges) {\n this.logger.debug(`Skipping menu upsert for ${m.name}; no changes detected.`);\n continue;\n }\n\n // If existing, set its id so save() will perform an update, otherwise insert\n const entity = menuRepo.create(\n existing ? { id: existing.id, ...base } : base,\n );\n\n await this.timeOperation('menu-save', () => menuRepo.save(entity), {\n component: 'menus',\n serviceCall: 'menuRepo.save',\n details: `menu=${m.name}`,\n });\n }\n\n // 2) Fetch ids for batching\n const seeded = await this.timeOperation('menu-seeded-find', () => menuRepo.find({\n where: { name: In(menus.map((m: any) => m.name)) },\n select: [\"id\", \"name\"],\n }), {\n component: 'menus',\n serviceCall: 'menuRepo.find',\n details: `count=${menus.length}`,\n });\n const idByName = new Map(seeded.map(s => [s.name, s.id]));\n\n // 3) Build desired join rows once\n const admin = await this.timeOperation('menu-admin-role-find-one', () => roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: [\"id\", \"name\"] }), {\n component: 'menus',\n serviceCall: 'roleRepo.findOne',\n details: `role=${ADMIN_ROLE_NAME}`,\n });\n const allRoleNames = new Set<string>();\n for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));\n if (admin) allRoleNames.add(admin.name);\n\n const roles = await this.timeOperation('menu-roles-find', () => roleRepo.find({\n where: { name: In([...allRoleNames]) },\n select: [\"id\", \"name\"],\n }), {\n component: 'menus',\n serviceCall: 'roleRepo.find',\n details: `roleCount=${allRoleNames.size}`,\n });\n const roleByName = new Map(roles.map(r => [r.name, r]));\n\n const joinRows: Array<{ menuId: number; roleId: number }> = [];\n for (const m of menus) {\n const menuId = idByName.get(m.name)!;\n const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);\n for (const rn of roleNames) {\n const role = roleByName.get(rn);\n if (role) joinRows.push({ menuId, roleId: role.id });\n }\n }\n\n // 4) Replace in bulk — no orIgnore, safe for MSSQL\n // 4a) delete existing for affected menus\n const menuIds = [...new Set(joinRows.map(r => r.menuId))];\n if (menuIds.length) {\n await this.timeOperation('menu-role-joins-delete', () => trx\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME) // string table name is fine\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids: menuIds })\n .execute(), {\n component: 'menus',\n serviceCall: 'trx.delete.menuRoleJoins',\n details: `menuCount=${menuIds.length}`,\n });\n }\n\n // 4b) bulk insert all pairs\n if (joinRows.length) {\n const values = joinRows.map(r => ({\n [MENU_ROLE_JOIN_TABLE_NAME_MENU_COL]: r.menuId,\n [MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL]: r.roleId,\n }));\n\n await this.timeOperation('menu-role-joins-insert', () => trx\n .createQueryBuilder()\n .insert()\n .into(MENU_ROLE_JOIN_TABLE_NAME)\n .values(values)\n // .orIgnore() // ❌ remove this – it triggers unsupported onUpdate path\n .execute(), {\n component: 'menus',\n serviceCall: 'trx.insert.menuRoleJoins',\n details: `rowCount=${values.length}`,\n });\n }\n }), { component: 'menus', serviceCall: 'dataSource.transaction' });\n }\n\n // Ok\n private async handleSeedActions(actions: any) {\n if (!actions) {\n return;\n }\n\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // Prime related-entity caches once before iterating so we do not pay repeated user-key lookups per row.\n await this.timeOperation('action-prime-module-cache', () => this.primeModuleLookupCache(\n actions.map((action: any) => action?.moduleUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeModuleLookupCache',\n details: `count=${actions.length}`,\n });\n await this.timeOperation('action-prime-model-cache', () => this.primeModelLookupCache(\n actions.map((action: any) => action?.modelUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeModelLookupCache',\n details: `count=${actions.length}`,\n });\n await this.timeOperation('action-prime-view-cache', () => this.primeViewLookupCache(\n actions.map((action: any) => action?.viewUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeViewLookupCache',\n details: `count=${actions.length}`,\n });\n const existingActionsByName = await this.timeOperation('action-preload-existing', () => this.loadExistingActionsByName(\n actionRepo,\n actions.map((action: any) => action?.name).filter(Boolean),\n ), {\n component: 'actions',\n serviceCall: 'loadExistingActionsByName',\n details: `count=${actions.length}`,\n });\n // Keep the verbose output summarized rather than emitting forty separate \"skip\" lines.\n let created = 0;\n let updated = 0;\n let skipped = 0;\n\n for (let j = 0; j < actions.length; j++) {\n const actionData = actions[j];\n actionData['module'] = await this.getModuleByUserKeyCached(actionData.moduleUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `module=${actionData.moduleUserKey}`,\n });\n if (actionData.type === 'solid') {\n actionData['model'] = await this.getModelByUserKeyCached(actionData.modelUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `model=${actionData.modelUserKey}`,\n });\n actionData['view'] = await this.getViewByUserKeyCached(actionData.viewUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `view=${actionData.viewUserKey}`,\n });\n }\n else {\n if (actionData.modelUserKey) {\n actionData['model'] = await this.getModelByUserKeyCached(actionData.modelUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `model=${actionData.modelUserKey}`,\n });\n }\n }\n const result = await this.upsertActionMetadataWithPreloadedExisting(actionRepo, existingActionsByName, actionData);\n if (result.outcome === 'created') {\n created += 1;\n } else if (result.outcome === 'updated') {\n updated += 1;\n } else {\n skipped += 1;\n }\n }\n\n this.logger.debug(`Action seed summary: created=${created}, updated=${updated}, skipped=${skipped}.`);\n }\n\n // Ok\n private async handleSeedViews(views: any) {\n if (!views) {\n return;\n }\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // Same preload/diff strategy as actions: resolve relation references in bulk, load existing rows once,\n // then do the rest of the work in memory so unchanged views never fall through to save().\n await this.timeOperation('view-prime-module-cache', () => this.primeModuleLookupCache(\n views.map((view: any) => view?.moduleUserKey),\n ), {\n component: 'views',\n serviceCall: 'primeModuleLookupCache',\n details: `count=${views.length}`,\n });\n await this.timeOperation('view-prime-model-cache', () => this.primeModelLookupCache(\n views.map((view: any) => view?.modelUserKey),\n ), {\n component: 'views',\n serviceCall: 'primeModelLookupCache',\n details: `count=${views.length}`,\n });\n const existingViewsByName = await this.timeOperation('view-preload-existing', () => this.loadExistingViewsByName(\n viewRepo,\n views.map((view: any) => view?.name).filter(Boolean),\n ), {\n component: 'views',\n serviceCall: 'loadExistingViewsByName',\n details: `count=${views.length}`,\n });\n let created = 0;\n let updated = 0;\n let skipped = 0;\n\n for (let j = 0; j < views.length; j++) {\n const viewData = views[j];\n\n // preety format the layout & context. \n viewData['layout'] = JSON.stringify(viewData['layout'], null, 2);\n\n viewData['module'] = await this.getModuleByUserKeyCached(viewData.moduleUserKey, {\n moduleName: viewData.moduleUserKey,\n component: 'views',\n details: `module=${viewData.moduleUserKey}`,\n });\n viewData['model'] = await this.getModelByUserKeyCached(viewData.modelUserKey, {\n moduleName: viewData.moduleUserKey,\n component: 'views',\n details: `model=${viewData.modelUserKey}`,\n });\n\n const result = await this.upsertViewMetadataWithPreloadedExisting(viewRepo, existingViewsByName, viewData);\n this.viewLookupCache.set(viewData.name, result.entity ?? null);\n if (result.outcome === 'created') {\n created += 1;\n } else if (result.outcome === 'updated') {\n updated += 1;\n } else {\n skipped += 1;\n }\n }\n\n this.logger.debug(`View seed summary: created=${created}, updated=${updated}, skipped=${skipped}.`);\n }\n\n // OK\n private async handleSeedUsers(users: SignUpDto[]) {\n if (!users) {\n return;\n }\n\n for (let l = 0; l < users.length; l++) {\n const user: SignUpDto = users[l];\n let exisitingUser = await this.timeOperation('user-find-by-username', () => this.userService.findOneByUsername(user.username), {\n component: 'users',\n serviceCall: 'userService.findOneByUsername',\n details: `username=${user.username}`,\n });\n if (!exisitingUser) {\n if (user.username === 'sa') {\n user.password = DEFAULT_SA_PASSWORD;\n }\n\n exisitingUser = await this.timeOperation('user-sign-up', () => this.authenticationService.signUp(user), {\n component: 'users',\n serviceCall: 'authenticationService.signUp',\n details: `username=${user.username}`,\n });\n this.logger.log(`Newly created user ${user.username}`);\n }\n //FIXME: Create the user roles assignment logic here.\n // now add Roles to user.\n // for (let m = 0; m < roles.length; m++) {\n // const role = roles[m];\n // await this.userService.addRoleToUser(user.email, role.name);\n // }\n }\n }\n\n // OK\n private async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto): Promise<{ pruned: number; upserted: number }> {\n const fieldMetadataRepo = this.dataSource.getRepository(FieldMetadata);\n\n // First we create the module. \n const module = await this.timeOperation('module-upsert', () => this.moduleMetadataService.upsert(moduleMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'moduleMetadataService.upsert',\n details: `module=${moduleMetadata.name}`,\n });\n this.moduleLookupCache.set(moduleMetadata.name, module ?? null);\n let pruned = 0;\n let upserted = 1;\n\n // Next create all the models. \n const modelsMetadata = this.getSeedArray<CreateModelMetadataDto>(moduleMetadata?.models);\n upserted += modelsMetadata.length;\n for (let j = 0; j < modelsMetadata.length; j++) {\n const modelMetadata = modelsMetadata[j];\n\n // Before creating the model, we need to make sure we are linking it to the newly created module.\n modelMetadata['module'] = module;\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = modelMetadata;\n\n // Load and set the parent model if it exists.\n if (modelMetadata.isChild && modelMetadata.parentModelUserKey) {\n const parentModel = await this.getModelByUserKeyCached(modelMetadata.parentModelUserKey, {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n details: `parentModel=${modelMetadata.parentModelUserKey}`,\n });\n modelMetaDataWithoutFields['parentModel'] = parentModel;\n }\n\n const upsertedModel = await this.timeOperation('model-upsert', () => this.modelMetadataService.upsert(modelMetaDataWithoutFields), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.upsert',\n details: `model=${modelMetadata.singularName}`,\n });\n this.modelLookupCache.set(modelMetadata.singularName, upsertedModel ?? null);\n const model = await this.timeOperation('model-find-by-singular-name', () => this.modelMetadataService.findOneBySingularName(modelMetadata.singularName), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.findOneBySingularName',\n details: `model=${modelMetadata.singularName}`,\n });\n\n // iterate over all fields and upsert. \n if (this.enablePruning) {\n pruned += await this.timeOperation('prune-fields-for-model', () => this.pruneFieldsForModel(model, fieldsMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'pruneFieldsForModel',\n details: `model=${modelMetadata.singularName}`,\n });\n }\n let userKeyField = null;\n const userKeyFieldName = modelMetadata.userKeyFieldUserKey;\n // Preload all existing fields for the model once. This is why field upserts are now effectively cheap:\n // we no longer do row-by-row existence checks for every field in steady-state runs.\n const existingFieldsByName = await this.timeOperation('field-preload-for-model', () => this.loadExistingFieldsByName(fieldMetadataRepo, model.id), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'loadExistingFieldsByName',\n details: `model=${modelMetadata.singularName}`,\n });\n upserted += fieldsMetadata?.length ?? 0;\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // Link model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderUserKey) {\n fieldMetadata['mediaStorageProvider'] = await this.getMediaStorageProviderByUserKeyCached(fieldMetadata.mediaStorageProviderUserKey, {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n details: `provider=${fieldMetadata.mediaStorageProviderUserKey}`,\n });\n }\n // console.log(fieldMetadata.displayName);\n\n const affectedField = await this.timeOperation('field-upsert', () => this.upsertFieldMetadataWithPreloadedExisting(fieldMetadataRepo, existingFieldsByName, fieldMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'upsertFieldMetadataWithPreloadedExisting',\n details: `field=${fieldMetadata.name} model=${modelMetadata.singularName}`,\n });\n if (fieldMetadata.name === userKeyFieldName || fieldMetadata.isUserKey) {\n const { model, ...fieldData } = affectedField;\n userKeyField = fieldData;\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 await this.timeOperation('model-user-key-field-upsert', () => this.modelMetadataService.upsert(modelMetaDataWithoutFields), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.upsert',\n details: `model=${modelMetadata.singularName} userKeyField=${userKeyField?.name ?? 'unknown'}`,\n });\n }\n }\n if (this.enablePruning) {\n pruned += await this.timeOperation('prune-models', () => this.pruneModels(modelsMetadata, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'pruneModels',\n });\n }\n return { pruned, upserted };\n }\n\n private getSeedArray<T>(value: T[] | null | undefined): T[] {\n return Array.isArray(value) ? value : [];\n }\n\n private async loadExistingFieldsByName(fieldMetadataRepo: Repository<FieldMetadata>, modelId: number): Promise<Map<string, FieldMetadata>> {\n const existingFields = await fieldMetadataRepo.find({\n where: {\n model: { id: modelId },\n },\n relations: {\n model: true,\n mediaStorageProvider: true,\n },\n });\n\n return new Map(existingFields.map((field) => [field.name, field]));\n }\n\n private async primeModuleLookupCache(moduleUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingModuleUserKeys = [...new Set(moduleUserKeys.filter((moduleUserKey): moduleUserKey is string =>\n Boolean(moduleUserKey) && !this.moduleLookupCache.has(moduleUserKey),\n ))];\n\n if (missingModuleUserKeys.length === 0) {\n return;\n }\n\n // Only bulk-load keys that are still missing from the process-local cache.\n const moduleRepo = this.dataSource.getRepository(ModuleMetadata);\n const existingModules = await moduleRepo.find({\n where: {\n name: In(missingModuleUserKeys),\n },\n });\n\n const moduleByName = new Map(existingModules.map((module) => [module.name, module]));\n for (const moduleUserKey of missingModuleUserKeys) {\n this.moduleLookupCache.set(moduleUserKey, moduleByName.get(moduleUserKey) ?? null);\n }\n }\n\n private async primeModelLookupCache(modelUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingModelUserKeys = [...new Set(modelUserKeys.filter((modelUserKey): modelUserKey is string =>\n Boolean(modelUserKey) && !this.modelLookupCache.has(modelUserKey),\n ))];\n\n if (missingModelUserKeys.length === 0) {\n return;\n }\n\n const modelRepo = this.dataSource.getRepository(ModelMetadata);\n const existingModels = await modelRepo.find({\n where: {\n singularName: In(missingModelUserKeys),\n },\n relations: {\n module: true,\n userKeyField: true,\n },\n });\n\n const modelBySingularName = new Map(existingModels.map((model) => [model.singularName, model]));\n for (const modelUserKey of missingModelUserKeys) {\n this.modelLookupCache.set(modelUserKey, modelBySingularName.get(modelUserKey) ?? null);\n }\n }\n\n private async primeViewLookupCache(viewUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingViewUserKeys = [...new Set(viewUserKeys.filter((viewUserKey): viewUserKey is string =>\n Boolean(viewUserKey) && !this.viewLookupCache.has(viewUserKey),\n ))];\n\n if (missingViewUserKeys.length === 0) {\n return;\n }\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const existingViews = await viewRepo.find({\n where: {\n name: In(missingViewUserKeys),\n },\n relations: {\n module: true,\n model: true,\n },\n });\n\n const viewByName = new Map(existingViews.map((view) => [view.name, view]));\n for (const viewUserKey of missingViewUserKeys) {\n this.viewLookupCache.set(viewUserKey, viewByName.get(viewUserKey) ?? null);\n }\n }\n\n private async loadExistingViewsByName(viewRepo: Repository<ViewMetadata>, viewNames: string[]): Promise<Map<string, ViewMetadata>> {\n const uniqueViewNames = [...new Set(viewNames.filter(Boolean))];\n if (uniqueViewNames.length === 0) {\n return new Map();\n }\n\n // Load relation ids needed for no-op detection. If module/model are not present here, unchanged rows look\n // dirty and every view falls through to save().\n const existingViews = await viewRepo.find({\n where: {\n name: In(uniqueViewNames),\n },\n relations: {\n module: true,\n model: true,\n },\n });\n\n return new Map(existingViews.map((view) => [view.name, view]));\n }\n\n private async loadExistingActionsByName(actionRepo: Repository<ActionMetadata>, actionNames: string[]): Promise<Map<string, ActionMetadata>> {\n const uniqueActionNames = [...new Set(actionNames.filter(Boolean))];\n if (uniqueActionNames.length === 0) {\n return new Map();\n }\n\n // Same reason as views: the diff logic compares relation ids, so those relations must be loaded here.\n const existingActions = await actionRepo.find({\n where: {\n name: In(uniqueActionNames),\n },\n relations: {\n module: true,\n model: true,\n view: true,\n },\n });\n\n return new Map(existingActions.map((action) => [action.name, action]));\n }\n\n private normalizeJsonFieldValue(value: any): any {\n // Normalize persisted JSON strings and in-memory objects/arrays into the same canonical shape before compare.\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}'))\n || (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasViewMetadataChanges(existingView: ViewMetadata, updateDto: any): boolean {\n const relationFields = new Set(['module', 'model']);\n const jsonFields = new Set(['layout', 'context']);\n\n // Compare only the persisted fields we explicitly care about. Generic object-wide diffing became fragile once\n // seeding DTOs started carrying transient helper properties that should not trigger writes.\n return this.viewComparableFields.some((key) => {\n const value = updateDto[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (relationFields.has(key)) {\n const relationValue = value as any;\n return (existingView as any)[key]?.id !== relationValue?.id;\n }\n\n if (jsonFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingView as any)[key] !== value;\n });\n }\n\n private hasActionMetadataChanges(existingAction: ActionMetadata, updateDto: any): boolean {\n const relationFields = new Set(['module', 'model', 'view']);\n const jsonFields = new Set(['domain', 'context']);\n\n return this.actionComparableFields.some((key) => {\n const value = updateDto[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (relationFields.has(key)) {\n const relationValue = value as any;\n return (existingAction as any)[key]?.id !== relationValue?.id;\n }\n\n if (jsonFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingAction as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingAction as any)[key] !== value;\n });\n }\n\n private async upsertViewMetadataWithPreloadedExisting(\n viewRepo: Repository<ViewMetadata>,\n existingViewsByName: Map<string, ViewMetadata>,\n updateDto: any,\n ): Promise<{ entity: ViewMetadata; outcome: 'created' | 'updated' | 'skipped' }> {\n const existingView = existingViewsByName.get(updateDto.name);\n\n if (existingView) {\n // In the steady-state case we want to return fast here and avoid save() entirely.\n if (!this.hasViewMetadataChanges(existingView, updateDto)) {\n return { entity: existingView, outcome: 'skipped' };\n }\n\n const updatedView = { ...existingView, ...updateDto };\n const savedView = await this.timeOperation('view-save', () => viewRepo.save(updatedView as ViewMetadata), {\n component: 'views',\n serviceCall: 'viewRepo.save',\n details: `view=${updateDto.name}`,\n }) as ViewMetadata;\n existingViewsByName.set(updateDto.name, savedView);\n return { entity: savedView, outcome: 'updated' };\n }\n\n const view = viewRepo.create(updateDto as Partial<ViewMetadata>);\n const savedView = await this.timeOperation('view-save', () => viewRepo.save(view as ViewMetadata), {\n component: 'views',\n serviceCall: 'viewRepo.save',\n details: `view=${updateDto.name}`,\n }) as ViewMetadata;\n existingViewsByName.set(updateDto.name, savedView);\n return { entity: savedView, outcome: 'created' };\n }\n\n private async upsertActionMetadataWithPreloadedExisting(\n actionRepo: Repository<ActionMetadata>,\n existingActionsByName: Map<string, ActionMetadata>,\n updateDto: any,\n ): Promise<{ entity: ActionMetadata; outcome: 'created' | 'updated' | 'skipped' }> {\n const existingAction = existingActionsByName.get(updateDto.name);\n\n if (existingAction) {\n if (!this.hasActionMetadataChanges(existingAction, updateDto)) {\n return { entity: existingAction, outcome: 'skipped' };\n }\n\n const updatedAction = { ...existingAction, ...updateDto };\n const savedAction = await this.timeOperation('action-save', () => actionRepo.save(updatedAction as ActionMetadata), {\n component: 'actions',\n serviceCall: 'actionRepo.save',\n details: `action=${updateDto.name}`,\n }) as ActionMetadata;\n existingActionsByName.set(updateDto.name, savedAction);\n return { entity: savedAction, outcome: 'updated' };\n }\n\n const action = actionRepo.create(updateDto as Partial<ActionMetadata>);\n const savedAction = await this.timeOperation('action-save', () => actionRepo.save(action as ActionMetadata), {\n component: 'actions',\n serviceCall: 'actionRepo.save',\n details: `action=${updateDto.name}`,\n }) as ActionMetadata;\n existingActionsByName.set(updateDto.name, savedAction);\n return { entity: savedAction, outcome: 'created' };\n }\n\n private async upsertFieldMetadataWithPreloadedExisting(\n fieldMetadataRepo: Repository<FieldMetadata>,\n existingFieldsByName: Map<string, FieldMetadata>,\n updateDto: any,\n ): Promise<FieldMetadata> {\n const existingFieldMetadata = existingFieldsByName.get(updateDto.name);\n\n if (existingFieldMetadata) {\n // Field metadata still uses a broad DTO diff because the major performance problem here was query volume,\n // not the in-memory comparison itself.\n const hasChanges = Object.entries(updateDto).some(([key, value]) => {\n const relationValue = value as any;\n if (key === 'model') {\n return existingFieldMetadata.model?.id !== relationValue?.id;\n }\n if (key === 'mediaStorageProvider') {\n return existingFieldMetadata.mediaStorageProvider?.id !== relationValue?.id;\n }\n const currentValue = (existingFieldMetadata as any)[key];\n if (Array.isArray(currentValue) || Array.isArray(value)) {\n return JSON.stringify(currentValue ?? null) !== JSON.stringify(value ?? null);\n }\n if (value && typeof value === 'object') {\n return JSON.stringify(currentValue ?? null) !== JSON.stringify(value ?? null);\n }\n return currentValue !== value;\n });\n\n if (!hasChanges) {\n return existingFieldMetadata;\n }\n\n const updatedFieldMetadata = { ...existingFieldMetadata, ...updateDto };\n const savedFieldMetadata = await fieldMetadataRepo.save(updatedFieldMetadata as FieldMetadata) as FieldMetadata;\n existingFieldsByName.set(updateDto.name, savedFieldMetadata);\n return savedFieldMetadata;\n }\n\n const fieldMetadata = fieldMetadataRepo.create(updateDto as Partial<FieldMetadata>);\n const savedFieldMetadata = await fieldMetadataRepo.save(fieldMetadata as FieldMetadata) as FieldMetadata;\n existingFieldsByName.set(updateDto.name, savedFieldMetadata);\n return savedFieldMetadata;\n }\n\n private async handleSeedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {\n if (!rulesDto || rulesDto.length === 0) {\n this.logger.debug(`No security rules found to seed`);\n return;\n }\n for (const dto of rulesDto) {\n await this.timeOperation('security-rule-upsert', () => this.securityRuleRepo.upsertWithDto({ ...dto, securityRuleConfig: JSON.stringify(dto.securityRuleConfig) }), {\n component: 'security-rules',\n serviceCall: 'securityRuleRepo.upsertWithDto',\n details: `rule=${dto.name}`,\n });\n }\n }\n\n // Not Ok\n private async handleSeedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {\n if (!listOfValuesDto || listOfValuesDto.length === 0) {\n this.logger.debug(`No List Of Values found to seed`);\n return;\n }\n for (let j = 0; j < listOfValuesDto.length; j++) {\n const listOfValueDto = listOfValuesDto[j];\n listOfValueDto['module'] = await this.getModuleByUserKeyCached(listOfValueDto.moduleUserKey, {\n moduleName: listOfValueDto.moduleUserKey,\n component: 'list-of-values',\n details: `module=${listOfValueDto.moduleUserKey}`,\n });\n await this.timeOperation('lov-upsert', () => this.listOfValuesService.upsert(listOfValuesDto[j]), {\n component: 'list-of-values',\n serviceCall: 'listOfValuesService.upsert',\n details: `type=${listOfValueDto.type} value=${listOfValueDto.value}`,\n });\n }\n }\n\n private async handleSeedScheduledJobs(createScheduledJobDto: CreateScheduledJobDto[]) {\n if (!createScheduledJobDto || createScheduledJobDto.length === 0) {\n this.logger.debug(`No scheduled jobs found to seed`);\n return;\n }\n for (const dto of createScheduledJobDto) {\n await this.timeOperation('scheduled-job-upsert', () => this.scheduledJobRepository.upsertWithDto(dto), {\n component: 'scheduled-jobs',\n serviceCall: 'scheduledJobRepository.upsertWithDto',\n details: `schedule=${dto.scheduleName}`,\n });\n }\n }\n\n private async handleSeedSavedFilters(createSavedFilterDto: CreateSavedFiltersDto[]) {\n if (!createSavedFilterDto || createSavedFilterDto.length === 0) {\n this.logger.debug(`No saved filters found to seed`);\n return;\n }\n for (const dto of createSavedFilterDto) {\n this.validateSavedFilterQueryJsonWrapper(dto);\n await this.timeOperation('saved-filter-upsert', () => this.savedFiltersRepo.upsertWithDto({ ...dto, filterQueryJson: JSON.stringify(dto.filterQueryJson), isSeeded: true }), {\n component: 'saved-filters',\n serviceCall: 'savedFiltersRepo.upsertWithDto',\n details: `filter=${dto.name}`,\n });\n }\n }\n\n private validateSavedFilterQueryJsonWrapper(dto: CreateSavedFiltersDto): void {\n const filterName = dto?.name ?? '<unnamed>';\n const filterQueryJson = dto?.filterQueryJson;\n const baseErrorMessage =\n `Invalid saved filter \"${filterName}\": filterQueryJson must be wrapped with a top-level \"$or\" or \"$and\". ` +\n `Example: {\"$or\":[{\"employeeStatus\":{\"$eq\":\"Active\"}}]}`;\n\n if (!filterQueryJson || typeof filterQueryJson !== 'object' || Array.isArray(filterQueryJson)) {\n throw new Error(baseErrorMessage);\n }\n\n const topLevelKeys = Object.keys(filterQueryJson);\n const hasLogicalWrapper = topLevelKeys.includes('$or') || topLevelKeys.includes('$and');\n if (!hasLogicalWrapper) {\n const receivedKeys = topLevelKeys.length > 0 ? topLevelKeys.join(', ') : '(none)';\n throw new Error(`${baseErrorMessage}. Received top-level keys: ${receivedKeys}`);\n }\n }\n\n private async handleSeedModelSequences(modelSequencesDto: CreateModelSequenceDto[]) {\n if (!modelSequencesDto || modelSequencesDto.length === 0) {\n this.logger.debug(`No Model Sequences found to seed`);\n return;\n }\n for (const dto of modelSequencesDto) {\n await this.timeOperation('model-sequence-upsert', () => this.modelSequenceRepo.upsertWithDto(dto), {\n component: 'model-sequences',\n serviceCall: 'modelSequenceRepo.upsertWithDto',\n details: `sequence=${dto.sequenceName}`,\n });\n }\n }\n\n private async pruneModelSequences(modelSequencesDto: CreateModelSequenceDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping model sequence prune: missing module name in metadata.`);\n return 0;\n }\n const sequences = modelSequencesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'model-sequences',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping model sequence prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const sequenceNames = [...new Set(sequences.map(dto => dto.sequenceName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ModelSequence);\n const idsToDeleteQuery = repo\n .createQueryBuilder('ms')\n .select('ms.id', 'id')\n .innerJoin('ms.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (sequenceNames.length > 0) {\n idsToDeleteQuery.andWhere('ms.sequenceName NOT IN (:...sequenceNames)', { sequenceNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ModelSequence)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneSavedFilters(savedFiltersDto: CreateSavedFiltersDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping saved filters prune: missing module name in metadata.`);\n return 0;\n }\n const savedFilters = savedFiltersDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'saved-filters',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping saved filters prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const filterNames = [...new Set(savedFilters.map(dto => dto.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(SavedFilters);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sf')\n .select('sf.id', 'id')\n .innerJoin('sf.view', 'view')\n .innerJoin('view.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (filterNames.length > 0) {\n idsToDeleteQuery.andWhere('sf.name NOT IN (:...filterNames)', { filterNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(SavedFilters)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneScheduledJobs(scheduledJobsDto: CreateScheduledJobDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping scheduled jobs prune: missing module name in metadata.`);\n return 0;\n }\n const scheduledJobs = scheduledJobsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'scheduled-jobs',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping scheduled jobs prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const scheduleNames = [...new Set(scheduledJobs.map(dto => dto.scheduleName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ScheduledJob);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sj')\n .select('sj.id', 'id')\n .innerJoin('sj.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (scheduleNames.length > 0) {\n idsToDeleteQuery.andWhere('sj.scheduleName NOT IN (:...scheduleNames)', { scheduleNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ScheduledJob)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneSecurityRules(securityRulesDto: CreateSecurityRuleDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping security rules prune: missing module name in metadata.`);\n return 0;\n }\n const securityRules = securityRulesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'security-rules',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping security rules prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const ruleNames = [...new Set(securityRules.map(dto => dto.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(SecurityRule);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sr')\n .select('sr.id', 'id')\n .innerJoin('sr.modelMetadata', 'model')\n .innerJoin('model.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (ruleNames.length > 0) {\n idsToDeleteQuery.andWhere('sr.name NOT IN (:...ruleNames)', { ruleNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(SecurityRule)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneListOfValues(listOfValuesDto: CreateListOfValuesDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping list of values prune: missing module name in metadata.`);\n return 0;\n }\n const listOfValues = listOfValuesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'list-of-values',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping list of values prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const pairs = listOfValues\n .filter(dto => dto.type && dto.value)\n .map(dto => ({ type: dto.type, value: dto.value }));\n const repo = this.dataSource.getRepository(ListOfValues);\n const idsToDeleteQuery = repo\n .createQueryBuilder('lov')\n .select('lov.id', 'id')\n .innerJoin('lov.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (pairs.length > 0) {\n const conditions = pairs.map((_, i) => `(lov.type = :t${i} AND lov.value = :v${i})`).join(' OR ');\n const params = pairs.reduce((acc, pair, i) => {\n acc[`t${i}`] = pair.type;\n acc[`v${i}`] = pair.value;\n return acc;\n }, {} as Record<string, string>);\n\n idsToDeleteQuery.andWhere(`NOT (${conditions})`, params);\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ListOfValues)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneMenus(menusDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping menus prune: missing module name in metadata.`);\n return 0;\n }\n const menus = menusDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'menus',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping menus prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const menuNames = [...new Set(menus.map(m => m.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(MenuItemMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('menu')\n .select('menu.id', 'id')\n .innerJoin('menu.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (menuNames.length > 0) {\n idsToDeleteQuery.andWhere('menu.name NOT IN (:...menuNames)', { menuNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME)\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids })\n .execute();\n }\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(MenuItemMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneViews(viewsDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping views prune: missing module name in metadata.`);\n return 0;\n }\n const views = viewsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'views',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping views prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const viewNames = [...new Set(views.map((v: any) => v.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(ViewMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('view')\n .select('view.id', 'id')\n .innerJoin('view.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (viewNames.length > 0) {\n idsToDeleteQuery.andWhere('view.name NOT IN (:...viewNames)', { viewNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n // Delete actions tied to these views before deleting the views themselves.\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const actionRows = await actionRepo\n .createQueryBuilder('action')\n .select('action.id', 'id')\n .innerJoin('action.view', 'view')\n .where('view.id IN (:...viewIds)', { viewIds: ids })\n .getRawMany();\n const actionIds = actionRows.map((row) => row.id);\n if (actionIds.length > 0) {\n const result = await actionRepo\n .createQueryBuilder()\n .delete()\n .from(ActionMetadata)\n .whereInIds(actionIds)\n .execute();\n if ((result.affected ?? 0) === 0) {\n this.logger.warn(`No actions deleted for pruned views in module ${moduleName}.`);\n }\n }\n\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ViewMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneActions(actionsDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping actions prune: missing module name in metadata.`);\n return 0;\n }\n const actions = actionsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'actions',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping actions prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const actionNames = [...new Set(actions.map((a: any) => a.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(ActionMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('action')\n .select('action.id', 'id')\n .innerJoin('action.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (actionNames.length > 0) {\n idsToDeleteQuery.andWhere('action.name NOT IN (:...actionNames)', { actionNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n const menuRows = await menuRepo\n .createQueryBuilder('menu')\n .select('menu.id', 'id')\n .innerJoin('menu.action', 'action')\n .where('action.id IN (:...actionIds)', { actionIds: ids })\n .getRawMany();\n const menuIds = menuRows.map((row) => row.id);\n\n if (menuIds.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME)\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids: menuIds })\n .execute();\n\n await menuRepo\n .createQueryBuilder()\n .delete()\n .from(MenuItemMetadata)\n .whereInIds(menuIds)\n .execute();\n }\n\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ActionMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneFieldsForModel(model: any, fieldsMetadata: any[] | undefined): Promise<number> {\n if (!model) {\n this.logger.warn(`Skipping fields prune: model not found.`);\n return 0;\n }\n const fields = fieldsMetadata ?? [];\n\n const fieldNames = [...new Set(fields.map(f => f.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(FieldMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('field')\n .select('field.id', 'id')\n .innerJoin('field.model', 'model')\n .where('model.id = :modelId', { modelId: model.id })\n .andWhere('field.isSystem = :isSystem', { isSystem: false });\n\n if (fieldNames.length > 0) {\n idsToDeleteQuery.andWhere('field.name NOT IN (:...fieldNames)', { fieldNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(FieldMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneModels(modelsMetadata: CreateModelMetadataDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping models prune: missing module name in metadata.`);\n return 0;\n }\n const models = modelsMetadata ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'module-model-fields',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping models prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const modelNames = [...new Set(models.map(m => m.singularName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ModelMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('model')\n .select('model.id', 'id')\n .innerJoin('model.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id })\n .andWhere('model.isSystem = :isSystem', { isSystem: false });\n\n if (modelNames.length > 0) {\n idsToDeleteQuery.andWhere('model.singularName NOT IN (:...modelNames)', { modelNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ModelMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private getRolePermissionJoinInfo(): { tableName: string; permissionIdColumn: string } | null {\n const roleMetadata = this.dataSource.getMetadata(RoleMetadata);\n const relation = roleMetadata.relations.find((r) => r.propertyName === 'permissions');\n if (!relation || !relation.junctionEntityMetadata) {\n this.logger.warn(`Role-permission join table metadata not found; skipping join cleanup.`);\n return null;\n }\n\n const permissionIdColumn = relation.inverseJoinColumns[0]?.databaseName;\n if (!permissionIdColumn) {\n this.logger.warn(`Role-permission join column not found; skipping join cleanup.`);\n return null;\n }\n\n return {\n tableName: relation.junctionEntityMetadata.tableName,\n permissionIdColumn,\n };\n }\n\n private async prunePermissions(permissionNames: string[]): Promise<number> {\n const uniqueNames = [...new Set(permissionNames.filter(Boolean))];\n const repo = this.dataSource.getRepository(PermissionMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('perm')\n .select('perm.id', 'id');\n\n if (uniqueNames.length > 0) {\n idsToDeleteQuery.andWhere('perm.name NOT IN (:...names)', { names: uniqueNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n // Commented out to allow pruning when metadata is empty/missing.\n // if (ids.length === 0) {\n // return;\n // }\n\n const joinInfo = this.getRolePermissionJoinInfo();\n if (joinInfo && ids.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(joinInfo.tableName)\n .where(`${joinInfo.permissionIdColumn} IN (:...ids)`, { ids })\n .execute();\n }\n\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(PermissionMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n // private async resolvePruningChoice(conf?: any): Promise<boolean> {\n // if (typeof conf?.pruneMetadata === 'boolean') {\n // return conf.pruneMetadata;\n // }\n // if (!process.stdin.isTTY) {\n // return false;\n // }\n\n // const rl = readline.createInterface({\n // input: process.stdin,\n // output: process.stdout,\n // });\n\n // const question = `Prune metadata entries not in JSON? (y/N) `;\n // const answer: string = await new Promise((resolve) => {\n // rl.question(question, (input) => resolve(input));\n // });\n // rl.close();\n\n // return answer.trim().toLowerCase().startsWith('y');\n // }\n\n private logSeedFailureForCli(\n error: unknown,\n context: { moduleName: string; step: string; pruneEnabled: boolean; modulesToSeed: string[] | null }\n ): void {\n const err = error instanceof Error ? error : new Error(String(error));\n const stackLines = (err.stack ?? '')\n .split('\\n')\n .slice(0, 8)\n .map((line) => line.trim())\n .filter(Boolean);\n const logPayload = {\n module: context.moduleName,\n step: context.step,\n pruneEnabled: context.pruneEnabled,\n modulesToSeed: context.modulesToSeed?.length ? context.modulesToSeed : 'ALL',\n error: {\n name: err.name,\n message: err.message,\n stackPreview: stackLines.length > 0 ? stackLines : undefined,\n },\n };\n\n console.log('✖ Seeding failed');\n console.log(JSON.stringify(logPayload, null, 2));\n }\n\n private formatSeedResult(moduleName: string, label: string, counts: { pruned: number; upserted: number }): string {\n if (this.enablePruning) {\n return `✔ [${moduleName}] ${label} seeded (pruned ${counts.pruned}, upserted ${counts.upserted})`;\n }\n return `✔ [${moduleName}] ${label} seeded (upserted ${counts.upserted})`;\n }\n\n}\n"]}
1
+ {"version":3,"file":"module-metadata-seeder.service.js","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { CreateEmailTemplateDto } from 'src/dtos/create-email-template.dto';\nimport { CreateListOfValuesDto } from 'src/dtos/create-list-of-values.dto';\nimport { CreateSecurityRuleDto } from 'src/dtos/create-security-rule.dto';\nimport { CreateSmsTemplateDto } from 'src/dtos/create-sms-template.dto';\nimport { SecurityRuleRepository } from 'src/repository/security-rule.repository';\nimport { AuthenticationService } from 'src/services/authentication.service';\nimport { EmailTemplateService } from 'src/services/email-template.service';\nimport { ListOfValuesService } from 'src/services/list-of-values.service';\nimport { SettingService } from 'src/services/setting.service';\nimport { SmsTemplateService } from 'src/services/sms-template.service';\nimport { UserService } from 'src/services/user.service';\nimport { DataSource, In, Repository } from 'typeorm';\nimport { CreateModelMetadataDto } from '../dtos/create-model-metadata.dto';\nimport { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';\nimport { getDynamicModuleNamesBasedOnMetadata } from '../helpers/module.helper';\nimport { SolidRegistry } from '../helpers/solid-registry';\nimport { ActionMetadataService } from '../services/action-metadata.service';\nimport { FieldMetadataService } from '../services/field-metadata.service';\nimport { MediaStorageProviderMetadataService } from '../services/media-storage-provider-metadata.service';\nimport { ModelMetadataService } from '../services/model-metadata.service';\nimport { ModuleMetadataService } from '../services/module-metadata.service';\nimport { RoleMetadataService } from '../services/role-metadata.service';\nimport { ViewMetadataService } from '../services/view-metadata.service';\nimport solidCoreMetadata from './seed-data/solid-core-metadata.json';\nimport { SystemFieldsSeederService } from './system-fields-seeder.service';\n// import { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';\nimport { ActionMetadata } from '../entities/action-metadata.entity';\nimport { MenuItemMetadata } from '../entities/menu-item-metadata.entity';\nimport { ModuleMetadata } from '../entities/module-metadata.entity';\nimport { RoleMetadata } from '../entities/role-metadata.entity';\nimport { MENU_ROLE_JOIN_TABLE_NAME, MENU_ROLE_JOIN_TABLE_NAME_MENU_COL, MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL } from '../dtos/create-menu-item-metadata.dto';\nimport { DEFAULT_SA_PASSWORD } from '../dtos/create-user.dto';\nimport { SignUpDto } from '../dtos/sign-up.dto';\nimport { ADMIN_ROLE_NAME, CreateRoleMetadataDto } from 'src/dtos/create-role-metadata.dto';\nimport { CreateSavedFiltersDto } from 'src/dtos/create-saved-filters.dto';\nimport { CreateScheduledJobDto } from 'src/dtos/create-scheduled-job.dto';\nimport { CreateLocaleDto } from 'src/dtos/create-locale.dto';\nimport { PermissionMetadataRepository } from 'src/repository/permission-metadata.repository';\nimport { SavedFiltersRepository } from 'src/repository/saved-filters.repository';\nimport { ScheduledJobRepository } from 'src/repository/scheduled-job.repository';\nimport { SettingRepository } from 'src/repository/setting.repository';\nimport { CreateModelSequenceDto } from 'src/dtos/create-model-sequence.dto';\nimport { ModelSequenceRepository } from 'src/repository/model-sequence.repository';\nimport { LocaleRepository } from 'src/repository/locale.repository';\nimport { ModelSequence } from 'src/entities/model-sequence.entity';\nimport { SavedFilters } from 'src/entities/saved-filters.entity';\nimport { ScheduledJob } from 'src/entities/scheduled-job.entity';\nimport { SecurityRule } from 'src/entities/security-rule.entity';\nimport { ListOfValues } from 'src/entities/list-of-values.entity';\nimport { FieldMetadata } from 'src/entities/field-metadata.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { PermissionMetadata } from 'src/entities/permission-metadata.entity';\nimport { ViewMetadata } from 'src/entities/view-metadata.entity';\n\n/**\n * Central metadata seeder for both solid-core and consuming modules.\n *\n * Performance notes:\n * - This file now contains the main seed-time optimizations that were added after profiling real FRMS seed runs.\n * - The goal of those changes was to preserve existing behavior while removing avoidable serial database work.\n * - Verbose timing logs are intentionally emitted through Nest logger `debug()` only, so normal CLI runs stay clean.\n * - Every timing line is tagged with `[SEED_TIMING]` and a stable `[ITEM:...]` identifier for grep-friendly analysis.\n *\n * High-impact optimizations currently implemented here:\n * - Batched permission preload/insert, with case-insensitive dedupe to match MSSQL collation behavior.\n * - Process-local lookup caches for module/model/view/provider reads during a single seed run.\n * - Model-level field preload/diff to avoid field-level serial existence checks.\n * - View/action preload + in-memory no-op detection so unchanged rows skip save() entirely.\n * - Menu entity no-op detection, though menu relation lookups are still mostly serial and remain a future candidate.\n */\n@Injectable()\nexport class ModuleMetadataSeederService {\n private readonly logger = new Logger(ModuleMetadataSeederService.name);\n // Stable tag used on all verbose seed timing logs so runs can be grepped quickly.\n private readonly seedTimingTag = 'SEED_TIMING';\n // Keep permission batching bounded while still collapsing thousands of serial checks into a few queries.\n private readonly permissionSeedBatchSize = 500;\n // Restrict no-op detection to the fields that actually matter for persistence.\n private readonly viewComparableFields = ['name', 'displayName', 'type', 'context', 'layout', 'module', 'model'] as const;\n private readonly actionComparableFields = ['name', 'displayName', 'type', 'domain', 'context', 'customComponent', 'customIsModal', 'serverEndpoint', 'module', 'model', 'view'] as const;\n // These caches are intentionally process-local and are reset at the beginning of every seed run.\n private readonly moduleLookupCache = new Map<string, ModuleMetadata | null>();\n private readonly modelLookupCache = new Map<string, ModelMetadata | null>();\n private readonly viewLookupCache = new Map<string, ViewMetadata | null>();\n private readonly mediaStorageProviderLookupCache = new Map<string, any | null>();\n private enablePruning: boolean = false;\n\n constructor(\n private readonly moduleMetadataService: ModuleMetadataService,\n @Inject(forwardRef(() => ModelMetadataService))\n private readonly modelMetadataService: ModelMetadataService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly mediaStorageProviderMetadataService: MediaStorageProviderMetadataService,\n private readonly roleService: RoleMetadataService,\n private readonly userService: UserService,\n private readonly authenticationService: AuthenticationService,\n private readonly solidActionService: ActionMetadataService,\n private readonly solidViewService: ViewMetadataService,\n private readonly emailTemplateService: EmailTemplateService,\n private readonly smsTemplateService: SmsTemplateService,\n private readonly listOfValuesService: ListOfValuesService,\n // @InjectRepository(PermissionMetadata)\n // private readonly permissionRepo: Repository<PermissionMetadata>,\n private readonly permissionRepo: PermissionMetadataRepository,\n private readonly solidRegistry: SolidRegistry,\n private readonly settingService: SettingService,\n // @InjectRepository(Setting, 'default')\n // readonly settingsRepo: Repository<Setting>,\n private readonly settingsRepo: SettingRepository,\n readonly securityRuleRepo: SecurityRuleRepository,\n readonly systemFieldsSeederService: SystemFieldsSeederService,\n readonly scheduledJobRepository: ScheduledJobRepository,\n readonly savedFiltersRepo: SavedFiltersRepository,\n readonly dataSource: DataSource,\n readonly modelSequenceRepo: ModelSequenceRepository,\n readonly localeRepo: LocaleRepository,\n ) { }\n\n async seed(conf?: any) {\n let currentModule = 'global';\n let currentStep = 'bootstrap';\n let modulesToSeed: string[] | null = null;\n const shouldSeedGlobalMetadata = conf?.seedGlobalMetadata !== false;\n\n try {\n this.enablePruning = Boolean(conf?.pruneMetadata);\n // Never reuse cached entity snapshots across seed invocations in the same process.\n this.resetLookupCaches();\n console.log(this.enablePruning ? '▶ Pruning enabled: metadata not present in JSON will be removed.' : '▶ Pruning disabled: existing metadata will be kept.');\n\n await this.timeOperation('seed-run', async () => {\n // Global seeding steps i.e across all modules\n if (shouldSeedGlobalMetadata) {\n currentStep = 'seedGlobalMetadata';\n await this.timeOperation('global-seed', () => this.seedGlobalMetadata(), { moduleName: 'global', component: 'global-metadata' });\n } else {\n this.logger.log(`Skipping global metadata seeding.`);\n }\n\n // Module specific seeding steps.\n // Get all the module metadata files which needs to be seeded.\n const seedDataFiles = this.seedDataFiles;\n this.logger.debug(`Found seed data for modules: ${seedDataFiles.map(s => s.moduleMetadata?.name)}`);\n\n /**\n * -------------------------------------------------------------\n * Selective module seeding via: solid seed --modules-to-seed onboarding,reports\n * -------------------------------------------------------------\n */\n currentStep = 'resolveModulesToSeed';\n if (conf && Array.isArray(conf.modulesToSeed)) {\n modulesToSeed = conf.modulesToSeed;\n console.log(`▶ Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);\n this.logger.log(`Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);\n } else {\n console.log(`▶ No modulesToSeed provided. Seeding ALL modules.`);\n this.logger.log(`No modulesToSeed provided. Seeding ALL modules.`);\n }\n\n // Filter modules if needed\n const filteredSeedDataFiles = modulesToSeed ? seedDataFiles.filter((file) => modulesToSeed.includes(file.moduleMetadata?.name)) : seedDataFiles;\n\n if (filteredSeedDataFiles.length === 0) {\n this.logger.warn(`No modules matched the provided modulesToSeed list.`);\n return;\n }\n\n // let usersDetail;\n // For each module metadata file, we will process the seeding steps one by one.\n for (let i = 0; i < filteredSeedDataFiles.length; i++) {\n const overallMetadata = filteredSeedDataFiles[i];\n const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;\n currentModule = moduleMetadata?.name ?? 'unknown';\n\n if (!moduleMetadata?.name) {\n this.logger.warn(`Skipping seed metadata file because moduleMetadata.name is missing.`);\n continue;\n }\n\n console.log(`▶ Seeding Metadata for Module: ${moduleMetadata.name}`);\n this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);\n\n await this.timeOperation('module-total', async () => {\n currentStep = 'seedMediaStorageProviders';\n this.logger.log(`Seeding Media Storage Providers`);\n const mediaStorageCounts = await this.timeOperation('seed-media-storage-providers', () => this.seedMediaStorageProviders(overallMetadata.mediaStorageProviders), { moduleName: moduleMetadata.name, component: 'media-storage-providers' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Media Storage Providers', mediaStorageCounts)}`);\n\n // Process module metadata first.\n currentStep = 'seedModuleModelFields';\n this.logger.log(`Seeding Module / Model / Fields`);\n const moduleModelFieldCounts = await this.timeOperation('seed-module-model-fields', () => this.seedModuleModelFields(moduleMetadata), { moduleName: moduleMetadata.name, component: 'module-model-fields' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Module/Model/Fields', moduleModelFieldCounts)}`);\n\n currentStep = 'seedLocales';\n this.logger.log(`Seeding Locales`);\n const localeCounts = await this.seedLocales(overallMetadata);\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Locales', localeCounts)}`);\n\n currentStep = 'seedPermissions';\n this.logger.log(`Seeding Permissions`);\n const permissionCounts = await this.timeOperation('seed-permissions', () => this.seedPermissions(overallMetadata), { moduleName: moduleMetadata.name, component: 'permissions' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Permissions', permissionCounts)}`);\n\n currentStep = 'seedRoles';\n this.logger.log(`Seeding Roles`);\n const roleCounts = await this.timeOperation('seed-roles', () => this.seedRoles(overallMetadata), { moduleName: moduleMetadata.name, component: 'roles' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Roles', roleCounts)}`);\n\n currentStep = 'seedUsers';\n this.logger.log(`Seeding Users`);\n const userCounts = await this.timeOperation('seed-users', () => this.seedUsers(overallMetadata), { moduleName: moduleMetadata.name, component: 'users' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Users', userCounts)}`);\n\n currentStep = 'seedViews';\n this.logger.log(`Seeding Views`);\n const viewCounts = await this.timeOperation('seed-views', () => this.seedViews(overallMetadata), { moduleName: moduleMetadata.name, component: 'views' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Views', viewCounts)}`);\n\n currentStep = 'seedActions';\n this.logger.log(`Seeding Actions`);\n const actionCounts = await this.timeOperation('seed-actions', () => this.seedActions(overallMetadata), { moduleName: moduleMetadata.name, component: 'actions' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Actions', actionCounts)}`);\n\n currentStep = 'seedMenus';\n this.logger.log(`Seeding Menus`);\n const menuCounts = await this.timeOperation('seed-menus', () => this.seedMenus(overallMetadata), { moduleName: moduleMetadata.name, component: 'menus' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Menus', menuCounts)}`);\n\n currentStep = 'seedEmailTemplates';\n this.logger.log(`Seeding Email Templates`);\n const emailTemplateCounts = await this.timeOperation('seed-email-templates', () => this.seedEmailTemplates(overallMetadata, moduleMetadata.name), { moduleName: moduleMetadata.name, component: 'email-templates' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Email Templates', emailTemplateCounts)}`);\n\n currentStep = 'seedSmsTemplates';\n this.logger.log(`Seeding Sms Templates`);\n const smsTemplateCounts = await this.timeOperation('seed-sms-templates', () => this.seedSmsTemplates(overallMetadata, moduleMetadata.name), { moduleName: moduleMetadata.name, component: 'sms-templates' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Sms Templates', smsTemplateCounts)}`);\n\n currentStep = 'seedSecurityRules';\n this.logger.log(`Seeding Security Rules`);\n const securityRuleCounts = await this.timeOperation('seed-security-rules', () => this.seedSecurityRules(overallMetadata), { moduleName: moduleMetadata.name, component: 'security-rules' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Security Rules', securityRuleCounts)}`);\n\n currentStep = 'seedListOfValues';\n this.logger.log(`Seeding List Of Values`);\n const lovCounts = await this.timeOperation('seed-list-of-values', () => this.seedListOfValues(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'list-of-values' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'List Of Values', lovCounts)}`);\n\n currentStep = 'seedScheduledJobs';\n this.logger.log(`Seeding Scheduled Jobs`);\n const scheduledJobCounts = await this.timeOperation('seed-scheduled-jobs', () => this.seedScheduledJobs(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'scheduled-jobs' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Scheduled Jobs', scheduledJobCounts)}`);\n\n currentStep = 'seedSavedFilters';\n this.logger.log(`Seeding Saved Filters`);\n const savedFilterCounts = await this.timeOperation('seed-saved-filters', () => this.seedSavedFilters(moduleMetadata, overallMetadata), { moduleName: moduleMetadata.name, component: 'saved-filters' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Saved Filters', savedFilterCounts)}`);\n\n currentStep = 'seedModelSequences';\n this.logger.log(`Seeding Model Sequences`);\n const modelSequenceCounts = await this.timeOperation('seed-model-sequences', () => this.seedModelSequences(overallMetadata), { moduleName: moduleMetadata.name, component: 'model-sequences' });\n console.log(`${this.formatSeedResult(moduleMetadata.name, 'Model Sequences', modelSequenceCounts)}`);\n }, { moduleName: moduleMetadata.name, component: 'module-seed' });\n }\n\n currentModule = 'global';\n currentStep = 'setupDefaultRolesWithPermissions';\n await this.timeOperation('setup-default-roles-with-permissions', () => this.setupDefaultRolesWithPermissions(), { moduleName: 'global', component: 'default-roles' });\n }, { moduleName: 'global', component: 'seed-run' });\n\n // Add a console log indicating seeding is finished. This needs to be console.log so that it looks proper when this code is run via CLI.\n console.log(`✔ Seeding completed.`);\n //this.logger.log(`All Seeders finished`);\n\n //FIXME: Handle displaying the created users credentials in a better way.\n // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);\n } catch (error: any) {\n this.logSeedFailureForCli(error, {\n moduleName: currentModule,\n step: currentStep,\n pruneEnabled: this.enablePruning,\n modulesToSeed,\n });\n throw error;\n }\n }\n\n private buildTimingPrefix(itemTag: string, options?: { moduleName?: string; component?: string; serviceCall?: string }): string {\n const parts = [`[${this.seedTimingTag}]`, `[ITEM:${itemTag}]`];\n if (options?.moduleName) {\n parts.push(`[MODULE:${options.moduleName}]`);\n }\n if (options?.component) {\n parts.push(`[COMPONENT:${options.component}]`);\n }\n if (options?.serviceCall) {\n parts.push(`[CALL:${options.serviceCall}]`);\n }\n return parts.join(' ');\n }\n\n private formatDuration(durationMs: number): string {\n return durationMs >= 1000\n ? `${(durationMs / 1000).toFixed(2)} s (${durationMs.toFixed(2)} ms)`\n : `${durationMs.toFixed(2)} ms`;\n }\n\n private resetLookupCaches(): void {\n this.moduleLookupCache.clear();\n this.modelLookupCache.clear();\n this.viewLookupCache.clear();\n this.mediaStorageProviderLookupCache.clear();\n }\n\n // These cache-backed helpers now log only cache misses. Earlier versions also logged cache hits and operation\n // starts, but that produced too much verbose noise relative to the debugging value.\n private async getModuleByUserKeyCached(\n moduleUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ModuleMetadata | null> {\n if (!moduleUserKey) {\n return null;\n }\n if (this.moduleLookupCache.has(moduleUserKey)) {\n return this.moduleLookupCache.get(moduleUserKey) ?? null;\n }\n\n const module = await this.timeOperation('module-find-by-user-key-cache-miss', () => this.moduleMetadataService.findOneByUserKey(moduleUserKey), {\n moduleName: options?.moduleName ?? moduleUserKey,\n component: options?.component,\n serviceCall: 'moduleMetadataService.findOneByUserKey',\n details: options?.details ?? `module=${moduleUserKey}`,\n });\n this.moduleLookupCache.set(moduleUserKey, module ?? null);\n return module ?? null;\n }\n\n private async getModelByUserKeyCached(\n modelUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ModelMetadata | null> {\n if (!modelUserKey) {\n return null;\n }\n if (this.modelLookupCache.has(modelUserKey)) {\n return this.modelLookupCache.get(modelUserKey) ?? null;\n }\n\n const model = await this.timeOperation('model-find-by-user-key-cache-miss', () => this.modelMetadataService.findOneByUserKey(modelUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'modelMetadataService.findOneByUserKey',\n details: options?.details ?? `model=${modelUserKey}`,\n });\n this.modelLookupCache.set(modelUserKey, model ?? null);\n return model ?? null;\n }\n\n private async getViewByUserKeyCached(\n viewUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<ViewMetadata | null> {\n if (!viewUserKey) {\n return null;\n }\n if (this.viewLookupCache.has(viewUserKey)) {\n return this.viewLookupCache.get(viewUserKey) ?? null;\n }\n\n const view = await this.timeOperation('view-find-by-user-key-cache-miss', () => this.solidViewService.findOneByUserKey(viewUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'solidViewService.findOneByUserKey',\n details: options?.details ?? `view=${viewUserKey}`,\n });\n this.viewLookupCache.set(viewUserKey, view ?? null);\n return view ?? null;\n }\n\n private async getMediaStorageProviderByUserKeyCached(\n mediaStorageProviderUserKey: string,\n options?: { moduleName?: string; component?: string; details?: string },\n ): Promise<any | null> {\n if (!mediaStorageProviderUserKey) {\n return null;\n }\n if (this.mediaStorageProviderLookupCache.has(mediaStorageProviderUserKey)) {\n return this.mediaStorageProviderLookupCache.get(mediaStorageProviderUserKey) ?? null;\n }\n\n const mediaStorageProvider = await this.timeOperation('media-storage-provider-find-by-user-key-cache-miss', () => this.mediaStorageProviderMetadataService.findOneByUserKey(mediaStorageProviderUserKey), {\n moduleName: options?.moduleName,\n component: options?.component,\n serviceCall: 'mediaStorageProviderMetadataService.findOneByUserKey',\n details: options?.details ?? `provider=${mediaStorageProviderUserKey}`,\n });\n this.mediaStorageProviderLookupCache.set(mediaStorageProviderUserKey, mediaStorageProvider ?? null);\n return mediaStorageProvider ?? null;\n }\n\n private async timeOperation<T>(\n itemTag: string,\n operation: () => Promise<T>,\n options?: { moduleName?: string; component?: string; serviceCall?: string; details?: string },\n ): Promise<T> {\n const prefix = this.buildTimingPrefix(itemTag, options);\n const detailSuffix = options?.details ? ` ${options.details}` : '';\n const start = process.hrtime.bigint();\n\n try {\n const result = await operation();\n const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;\n this.logger.debug(`${prefix} done in ${this.formatDuration(durationMs)}${detailSuffix}`);\n return result;\n } catch (error) {\n const durationMs = Number(process.hrtime.bigint() - start) / 1_000_000;\n this.logger.debug(`${prefix} failed after ${this.formatDuration(durationMs)}${detailSuffix}`);\n throw error;\n }\n }\n\n private async seedScheduledJobs(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const scheduledJobs = this.getSeedArray<CreateScheduledJobDto>(overallMetadata?.scheduledJobs);\n const pruned = this.enablePruning ? await this.timeOperation('prune-scheduled-jobs', () => this.pruneScheduledJobs(scheduledJobs, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'scheduled-jobs',\n serviceCall: 'pruneScheduledJobs',\n }) : 0;\n if (scheduledJobs.length > 0) {\n await this.timeOperation('handle-scheduled-jobs', () => this.handleSeedScheduledJobs(scheduledJobs), {\n moduleName: moduleMetadata.name,\n component: 'scheduled-jobs',\n serviceCall: 'handleSeedScheduledJobs',\n });\n }\n return { pruned, upserted: scheduledJobs.length };\n }\n\n private async seedSavedFilters(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const savedFilters = this.getSeedArray<CreateSavedFiltersDto>(overallMetadata?.savedFilters);\n const pruned = this.enablePruning ? await this.timeOperation('prune-saved-filters', () => this.pruneSavedFilters(savedFilters, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'saved-filters',\n serviceCall: 'pruneSavedFilters',\n }) : 0;\n if (savedFilters.length > 0) {\n await this.timeOperation('handle-saved-filters', () => this.handleSeedSavedFilters(savedFilters), {\n moduleName: moduleMetadata.name,\n component: 'saved-filters',\n serviceCall: 'handleSeedSavedFilters',\n });\n }\n return { pruned, upserted: savedFilters.length };\n }\n\n private async seedListOfValues(moduleMetadata: CreateModuleMetadataDto, overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const listOfValues = this.getSeedArray<CreateListOfValuesDto>(overallMetadata?.listOfValues);\n const pruned = this.enablePruning ? await this.timeOperation('prune-list-of-values', () => this.pruneListOfValues(listOfValues, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'list-of-values',\n serviceCall: 'pruneListOfValues',\n }) : 0;\n await this.timeOperation('handle-list-of-values', () => this.handleSeedListOfValues(listOfValues), {\n moduleName: moduleMetadata.name,\n component: 'list-of-values',\n serviceCall: 'handleSeedListOfValues',\n });\n return { pruned, upserted: listOfValues.length };\n }\n\n private async seedLocales(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n this.logger.debug(`[Start] Processing locales`);\n const locales = this.getSeedArray<CreateLocaleDto>(overallMetadata?.locales);\n const existingLocales = await this.localeRepo.find();\n\n if (existingLocales.length > 0) {\n this.solidRegistry.registerlocales(existingLocales);\n this.logger.debug(`[End] Skipping locale seed because locales already exist`);\n return { pruned: 0, upserted: 0 };\n }\n\n await this.handleSeedLocales(locales);\n this.logger.debug(`[End] Processing locales`);\n return { pruned: 0, upserted: locales.length };\n }\n\n private async setupDefaultRolesWithPermissions() {\n this.logger.debug(`About to add all permissions to the Admin role`);\n await this.timeOperation('role-add-all-permissions', () => this.roleService.addAllPermissionsToRole(ADMIN_ROLE_NAME), {\n moduleName: 'global',\n component: 'default-roles',\n serviceCall: 'roleService.addAllPermissionsToRole',\n details: `role=${ADMIN_ROLE_NAME}`,\n });\n\n // The below code is commented out for now as we are including permissions for these roles from the seeder json for the Internal and Public role. \n // 2. Give permissions to the Internal / Public role.\n // this.logger.debug(`About to add all permissions to the Internal role`);\n // await this.roleService.addPermissionToRole(INTERNAL_ROLE_NAME, INTERNAL_ROLE_PERMISSIONS);\n\n // this.logger.debug(`About to add all permissions to the Public role`);\n // await this.roleService.addPermissionToRole(PUBLIC_ROLE_NAME, ['SettingController.wrapSettings', 'AuthenticationController.logout']);\n }\n\n private async seedSecurityRules(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const securityRules = this.getSeedArray<CreateSecurityRuleDto>(overallMetadata?.securityRules);\n const pruned = this.enablePruning ? await this.timeOperation('prune-security-rules', () => this.pruneSecurityRules(securityRules, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'security-rules',\n serviceCall: 'pruneSecurityRules',\n }) : 0;\n await this.timeOperation('handle-security-rules', () => this.handleSeedSecurityRules(securityRules), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'security-rules',\n serviceCall: 'handleSeedSecurityRules',\n });\n return { pruned, upserted: securityRules.length };\n }\n\n // Ok\n private async seedDefaultSettings() {\n await this.timeOperation('seed-default-settings-call', () => this.settingService.seedSystemAdminEditableAndAboveSettings(), {\n moduleName: 'global',\n component: 'settings',\n serviceCall: 'settingService.seedSystemAdminEditableAndAboveSettings',\n });\n }\n\n private async seedSmsTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {\n const smsTemplates = this.getSeedArray<CreateSmsTemplateDto>(overallMetadata?.smsTemplates);\n await this.timeOperation('handle-sms-templates', () => this.handleSeedSmsTemplates(smsTemplates, moduleName), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'handleSeedSmsTemplates',\n });\n return { pruned: 0, upserted: smsTemplates.length };\n }\n\n // OK\n private async seedEmailTemplates(overallMetadata: any, moduleName: string): Promise<{ pruned: number; upserted: number }> {\n const emailTemplates = this.getSeedArray<CreateEmailTemplateDto>(overallMetadata?.emailTemplates);\n await this.timeOperation('handle-email-templates', () => this.handleSeedEmailTemplates(emailTemplates, moduleName), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'handleSeedEmailTemplates',\n });\n return { pruned: 0, upserted: emailTemplates.length };\n }\n\n // Ok\n private async seedMenus(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const menus = this.getSeedArray<any>(overallMetadata?.menus);\n const pruned = this.enablePruning ? await this.timeOperation('prune-menus', () => this.pruneMenus(menus, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'menus',\n serviceCall: 'pruneMenus',\n }) : 0;\n await this.timeOperation('handle-menus', () => this.handleSeedMenus(menus), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'menus',\n serviceCall: 'handleSeedMenus',\n });\n return { pruned, upserted: menus.length };\n }\n\n // Ok\n private async seedActions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const actions = this.getSeedArray<any>(overallMetadata?.actions);\n const pruned = this.enablePruning ? await this.timeOperation('prune-actions', () => this.pruneActions(actions, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'actions',\n serviceCall: 'pruneActions',\n }) : 0;\n await this.timeOperation('handle-actions', () => this.handleSeedActions(actions), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'actions',\n serviceCall: 'handleSeedActions',\n });\n return { pruned, upserted: actions.length };\n }\n\n // Ok\n private async seedViews(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const views = this.getSeedArray<any>(overallMetadata?.views);\n const pruned = this.enablePruning ? await this.timeOperation('prune-views', () => this.pruneViews(views, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'views',\n serviceCall: 'pruneViews',\n }) : 0;\n await this.timeOperation('handle-views', () => this.handleSeedViews(views), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'views',\n serviceCall: 'handleSeedViews',\n });\n return { pruned, upserted: views.length };\n }\n\n // Ok\n private async seedUsers(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const users = this.getSeedArray<SignUpDto>(overallMetadata?.users);\n // usersDetail = users;\n await this.timeOperation('handle-users', () => this.handleSeedUsers(users), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'users',\n serviceCall: 'handleSeedUsers',\n });\n return { pruned: 0, upserted: users.length };\n }\n\n // OK\n private async seedRoles(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const roles = this.getSeedArray<CreateRoleMetadataDto>(overallMetadata?.roles);\n // Preserve module linkage metadata so RoleMetadata.module is populated from the defining module.\n await this.timeOperation('roles-create-if-not-exists', () => this.roleService.createRolesIfNotExists(\n roles\n .filter((role) => role?.name)\n .map((role) => ({\n name: role.name,\n moduleId: role.moduleId,\n moduleUserKey: role.moduleUserKey ?? overallMetadata?.moduleMetadata?.name,\n } as CreateRoleMetadataDto)),\n ), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'roles',\n serviceCall: 'roleService.createRolesIfNotExists',\n details: `roleCount=${roles.length}`,\n });\n // After roles are created, we iterate over all roles and attach permissions (if specified in the seeder json) to the respective role.\n // Every role configuration in the seeder json can optionally have a permissions attribute. \n for (const role of roles) {\n if (role.permissions) {\n await this.timeOperation('role-add-permissions', () => this.roleService.addPermissionsToRole(\n role.name,\n role.permissions\n .map((permission: any) => typeof permission === 'string' ? permission : permission?.name)\n .filter(Boolean),\n ), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'roles',\n serviceCall: 'roleService.addPermissionsToRole',\n details: `role=${role.name} permissionCount=${role.permissions.length}`,\n });\n }\n }\n return { pruned: 0, upserted: roles.length };\n }\n\n private async seedPermissions(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const permissions = overallMetadata.permissions ?? [];\n await this.timeOperation('handle-permissions', () => this.handleSeedPermissions(permissions), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'permissions',\n serviceCall: 'handleSeedPermissions',\n });\n return { pruned: 0, upserted: permissions?.length ?? 0 };\n }\n\n // OK\n private get seedDataFiles(): any[] {\n const typedSolidCoreMetadata = structuredClone(solidCoreMetadata);\n const seedDataFiles = [typedSolidCoreMetadata];\n // const enabledModules = getDynamicModuleNames();\n const enabledModules = getDynamicModuleNamesBasedOnMetadata();\n for (const enabledModule of enabledModules) {\n const enabledModuleSeedFile = `src/${enabledModule}/metadata/${enabledModule}-metadata.json`;\n const fullPath = path.join(process.cwd(), enabledModuleSeedFile);\n\n if (fs.existsSync(fullPath)) {\n const overallMetadata = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));\n seedDataFiles.push(overallMetadata);\n }\n }\n\n return seedDataFiles;\n }\n\n // OK\n private async seedGlobalMetadata() {\n this.logger.log(`Seeding Permissions`);\n await this.timeOperation('seed-controller-permissions', () => this.seedControllerPermissions(), {\n moduleName: 'global',\n component: 'controller-permissions',\n });\n\n // this.logger.log(`Seeding Default Media Storage Providers`);\n // await this.seedDefaultMediaStorageProviders();\n\n this.logger.log(`Seeding System Fields Metadata`);\n await this.timeOperation('seed-default-system-fields', () => this.seedDefaultSystemFields(), {\n moduleName: 'global',\n component: 'system-fields',\n });\n\n // Settings\n this.logger.log(`Seeding Default Settings`);\n await this.timeOperation('seed-default-settings', () => this.seedDefaultSettings(), {\n moduleName: 'global',\n component: 'settings',\n });\n\n\n this.logger.debug(`Global metadata seeding completed`);\n }\n\n private async seedDefaultSystemFields() {\n await this.timeOperation('system-fields-seed', () => this.systemFieldsSeederService.seed(), {\n moduleName: 'global',\n component: 'system-fields',\n serviceCall: 'systemFieldsSeederService.seed',\n });\n }\n\n // OK\n private async seedControllerPermissions() {\n\n const controllers = this.solidRegistry.getControllers();\n const permissionNames: string[] = [];\n\n // Loop over the countries and create them.\n for (let id = 0; id < controllers.length; id++) {\n try {\n const controller = controllers[id];\n // this.logger.log(`Resolving controller: ${controller.name}`);\n\n const methods = controller.methods;\n for (let mId = 0; mId < methods.length; mId++) {\n\n const methodName = methods[mId];\n const permissionName = `${controller.name}.${methodName}`;\n permissionNames.push(permissionName);\n }\n\n } catch (error: any) {\n this.logger.error(error);\n }\n }\n\n await this.timeOperation('seed-controller-permissions-bulk', () => this.seedPermissionsInBatches(permissionNames, {\n moduleName: 'global',\n component: 'controller-permissions',\n }), {\n moduleName: 'global',\n component: 'controller-permissions',\n serviceCall: 'seedPermissionsInBatches',\n details: `permissionCount=${permissionNames.length} batchSize=${this.permissionSeedBatchSize}`,\n });\n\n if (this.enablePruning) {\n await this.timeOperation('prune-controller-permissions', () => this.prunePermissions(permissionNames), {\n moduleName: 'global',\n component: 'controller-permissions',\n serviceCall: 'prunePermissions',\n });\n }\n }\n\n private async handleSeedPermissions(permissions: any[]): Promise<void> {\n const permissionNames = permissions\n .map((permission) => typeof permission === 'string' ? permission : permission?.name)\n .filter(Boolean);\n\n // This path replaced the old \"check one permission at a time\" approach that was responsible for one of the\n // biggest seed-time regressions. We now normalize upfront and let the batch helper do set-based existence work.\n await this.seedPermissionsInBatches(permissionNames, {\n component: 'permissions',\n });\n }\n\n private async seedPermissionsInBatches(\n permissionNames: string[],\n options?: { moduleName?: string; component?: string },\n ): Promise<void> {\n const uniquePermissionNames = this.getUniquePermissionNames(permissionNames);\n if (uniquePermissionNames.length === 0) {\n return;\n }\n\n // We intentionally process in bounded chunks so we get the performance benefit of set-based reads/writes\n // without loading an unbounded permission list into a single query or save payload.\n for (let index = 0; index < uniquePermissionNames.length; index += this.permissionSeedBatchSize) {\n const batch = uniquePermissionNames.slice(index, index + this.permissionSeedBatchSize);\n const batchNumber = Math.floor(index / this.permissionSeedBatchSize) + 1;\n\n const existingPermissions = await this.timeOperation('permission-batch-find', () => this.permissionRepo.find({\n where: {\n name: In(batch),\n }\n }), {\n moduleName: options?.moduleName,\n component: options?.component ?? 'permissions',\n serviceCall: 'permissionRepo.find',\n details: `batch=${batchNumber} batchSize=${batch.length}`,\n });\n\n const existingPermissionNames = new Set(\n existingPermissions.map((permission) => this.normalizePermissionName(permission.name)),\n );\n const missingPermissionNames = batch.filter(\n (name) => !existingPermissionNames.has(this.normalizePermissionName(name)),\n );\n\n if (missingPermissionNames.length === 0) {\n continue;\n }\n\n this.logger.log(`Creating ${missingPermissionNames.length} missing permissions in batch ${batchNumber}.`);\n await this.timeOperation('permission-batch-save', () => this.permissionRepo.save(\n missingPermissionNames.map((name) => this.permissionRepo.create({ name })),\n ), {\n moduleName: options?.moduleName,\n component: options?.component ?? 'permissions',\n serviceCall: 'permissionRepo.save',\n details: `batch=${batchNumber} createCount=${missingPermissionNames.length}`,\n });\n }\n }\n\n private getUniquePermissionNames(permissionNames: string[]): string[] {\n const normalizedPermissionNames = new Set<string>();\n const uniquePermissionNames: string[] = [];\n\n for (const permissionName of permissionNames) {\n if (!permissionName) {\n continue;\n }\n\n // Deduping is intentionally case-insensitive because MSSQL commonly compares these names using a\n // case-insensitive collation. Without that, a batch can think `Foo.Bar` is missing even when\n // `foo.bar` already exists in the database.\n const normalizedPermissionName = this.normalizePermissionName(permissionName);\n if (normalizedPermissionNames.has(normalizedPermissionName)) {\n continue;\n }\n\n normalizedPermissionNames.add(normalizedPermissionName);\n uniquePermissionNames.push(permissionName.trim());\n }\n\n return uniquePermissionNames;\n }\n\n private normalizePermissionName(permissionName: string): string {\n return permissionName.trim().toLowerCase();\n }\n\n // OK\n // private async seedDefaultMediaStorageProviders() {\n // await this.mediaStorageProviderSeederService.seed();\n // }\n\n // OK\n private async seedMediaStorageProviders(mediaStorageProviders: any[]): Promise<{ pruned: number; upserted: number }> {\n const providers = this.getSeedArray<any>(mediaStorageProviders);\n\n for (let i = 0; i < providers.length; i++) {\n const mediaStorageProvider = providers[i];\n await this.timeOperation('media-storage-provider-upsert', () => this.mediaStorageProviderMetadataService.upsert(mediaStorageProvider), {\n component: 'media-storage-providers',\n serviceCall: 'mediaStorageProviderMetadataService.upsert',\n details: `provider=${mediaStorageProvider?.name ?? mediaStorageProvider?.userKey ?? i}`,\n });\n }\n return { pruned: 0, upserted: providers.length };\n }\n\n private async seedModelSequences(overallMetadata: any): Promise<{ pruned: number; upserted: number }> {\n const modelSequences = this.getSeedArray<CreateModelSequenceDto>(overallMetadata?.modelSequences);\n const pruned = this.enablePruning ? await this.timeOperation('prune-model-sequences', () => this.pruneModelSequences(modelSequences, overallMetadata?.moduleMetadata?.name), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'model-sequences',\n serviceCall: 'pruneModelSequences',\n }) : 0;\n await this.timeOperation('handle-model-sequences', () => this.handleSeedModelSequences(modelSequences), {\n moduleName: overallMetadata?.moduleMetadata?.name,\n component: 'model-sequences',\n serviceCall: 'handleSeedModelSequences',\n });\n return { pruned, upserted: modelSequences.length };\n }\n\n // OK\n private async handleSeedEmailTemplates(emailTemplates: CreateEmailTemplateDto[], moduleName: string) {\n if (!emailTemplates) {\n return;\n }\n\n for (let i = 0; i < emailTemplates.length; i++) {\n const emailTemplate = emailTemplates[i];\n // this.logger.log(`Found ${emailTemplate.name} email template`);\n\n // We need to load the actual template contents. \n if (moduleName === 'solid-core') {\n let moduleRoot: string | null = null;\n\n try {\n // Always resolve package.json, never the module entry\n moduleRoot = path.dirname(\n require.resolve('@solidxai/core/package.json'),\n );\n } catch (err: any) {\n this.logger.debug(\n 'Could not resolve @solidxai/core from node_modules, assuming local execution',\n );\n }\n\n const filePathInternal = 'src/seeders/seed-data/email-templates/';\n let filePath: string;\n // Case 1: solid-core installed as dependency\n if (moduleRoot) {\n filePath = path.join(\n moduleRoot,\n filePathInternal,\n emailTemplate.body,\n );\n }\n else {\n // Case 2: running INSIDE solid-core repo\n const localCoreRoot = process.cwd(); // or configurable root\n filePath = path.join(\n localCoreRoot,\n filePathInternal,\n emailTemplate.body,\n );\n }\n\n if (fs.existsSync(filePath)) {\n emailTemplate.body = fs.readFileSync(filePath, 'utf-8');\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `src/${moduleName}/metadata/email-templates/${emailTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n // this.logger.log(`Seeding custom email template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n emailTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n // Save to DB.\n await this.timeOperation('email-template-remove', () => this.emailTemplateService.removeByName(emailTemplate.name), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'emailTemplateService.removeByName',\n details: `template=${emailTemplate.name}`,\n });\n await this.timeOperation('email-template-create', () => this.emailTemplateService.create(emailTemplate), {\n moduleName,\n component: 'email-templates',\n serviceCall: 'emailTemplateService.create',\n details: `template=${emailTemplate.name}`,\n });\n }\n\n }\n\n // Ok\n private async handleSeedSmsTemplates(smsTemplates: CreateSmsTemplateDto[], moduleName: string) {\n if (!smsTemplates) {\n return;\n }\n\n for (let i = 0; i < smsTemplates.length; i++) {\n const smsTemplate = smsTemplates[i];\n // this.logger.log(`Found ${smsTemplate.name} sms template`);\n\n // We need to load the actual template contents. \n if (moduleName === 'solid-core') {\n let moduleRoot: string | null = null;\n\n try {\n // Always resolve package.json, never the module entry\n moduleRoot = path.dirname(\n require.resolve('@solidxai/core/package.json'),\n );\n } catch (err: any) {\n this.logger.debug(\n 'Could not resolve @solidxai/core from node_modules, assuming local execution',\n );\n }\n\n const filePathInternal = 'src/seeders/seed-data/sms-templates/';\n let filePath: string;\n // Case 1: solid-core installed as dependency\n if (moduleRoot) {\n filePath = path.join(\n moduleRoot,\n filePathInternal,\n smsTemplate.body,\n );\n }\n else {\n // Case 2: running INSIDE solid-core repo\n const localCoreRoot = process.cwd(); // or configurable root\n filePath = path.join(\n localCoreRoot,\n filePathInternal,\n smsTemplate.body,\n );\n }\n\n if (fs.existsSync(filePath)) {\n smsTemplate.body = fs.readFileSync(filePath, 'utf-8');\n }\n }\n else {\n // Check if file exists\n const emailTemplateHandlebar = `src/${moduleName}/metadata/sms-templates/${smsTemplate.body}`\n const fullPath = path.join(process.cwd(), emailTemplateHandlebar);\n // this.logger.log(`Seeding custom sms template from consuming model at path: ${fullPath}`);\n if (fs.existsSync(fullPath)) {\n smsTemplate.body = fs.readFileSync(fullPath, 'utf-8').toString();\n }\n }\n\n\n // Save to DB.\n await this.timeOperation('sms-template-remove', () => this.smsTemplateService.removeByName(smsTemplate.name), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'smsTemplateService.removeByName',\n details: `template=${smsTemplate.name}`,\n });\n await this.timeOperation('sms-template-create', () => this.smsTemplateService.create(smsTemplate), {\n moduleName,\n component: 'sms-templates',\n serviceCall: 'smsTemplateService.create',\n details: `template=${smsTemplate.name}`,\n });\n }\n }\n\n // Ok\n private async handleSeedMenus(menus: any) {\n if (!menus) {\n return;\n }\n\n // Menu writes are now no-op aware, but this block still performs several serial relation lookups per menu.\n // That tradeoff is acceptable for now because the highest-value wins were elsewhere, but if menu seeding\n // becomes the next hotspot the natural next step is bulk-preloading actions/modules/existing menus here too.\n await this.timeOperation('menus-transaction', () => this.dataSource.transaction(async (trx) => {\n const menuRepo = trx.getRepository(MenuItemMetadata);\n const roleRepo = trx.getRepository(RoleMetadata);\n const actionRepo = trx.getRepository(ActionMetadata);\n const moduleRepo = trx.getRepository(ModuleMetadata);\n\n // 1) Upsert menus WITHOUT roles (manual upsert)\n for (const m of menus) {\n const action = m.actionUserKey\n ? await this.timeOperation('menu-action-find-one', () => actionRepo.findOne({ where: { name: m.actionUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'actionRepo.findOne',\n details: `action=${m.actionUserKey}`,\n })\n : null;\n\n const module = m.moduleUserKey\n ? await this.timeOperation('menu-module-find-one', () => moduleRepo.findOne({ where: { name: m.moduleUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'moduleRepo.findOne',\n details: `module=${m.moduleUserKey}`,\n })\n : null;\n\n const parentMenuItem = m.parentMenuItemUserKey\n ? await this.timeOperation('menu-parent-find-one', () => menuRepo.findOne({ where: { name: m.parentMenuItemUserKey }, select: [\"id\"] }), {\n component: 'menus',\n serviceCall: 'menuRepo.findOne',\n details: `parent=${m.parentMenuItemUserKey}`,\n })\n : null;\n\n // Check if a menu with this name already exists\n const existing = await this.timeOperation('menu-existing-find-one', () => menuRepo.findOne({\n where: { name: m.name },\n relations: {\n action: true,\n module: true,\n parentMenuItem: true,\n },\n }), {\n component: 'menus',\n serviceCall: 'menuRepo.findOne',\n details: `menu=${m.name}`,\n });\n\n // Build the entity data (without id)\n const base = {\n name: m.name,\n displayName: m.displayName,\n action,\n module,\n parentMenuItem,\n sequenceNumber: m.sequenceNumber,\n iconName: m.iconName,\n };\n\n const hasChanges = existing\n ? existing.displayName !== base.displayName\n || existing.sequenceNumber !== base.sequenceNumber\n || existing.iconName !== base.iconName\n || existing.action?.id !== base.action?.id\n || existing.module?.id !== base.module?.id\n || existing.parentMenuItem?.id !== base.parentMenuItem?.id\n : true;\n\n if (existing && !hasChanges) {\n this.logger.debug(`Skipping menu upsert for ${m.name}; no changes detected.`);\n continue;\n }\n\n // If existing, set its id so save() will perform an update, otherwise insert\n const entity = menuRepo.create(\n existing ? { id: existing.id, ...base } : base,\n );\n\n await this.timeOperation('menu-save', () => menuRepo.save(entity), {\n component: 'menus',\n serviceCall: 'menuRepo.save',\n details: `menu=${m.name}`,\n });\n }\n\n // 2) Fetch ids for batching\n const seeded = await this.timeOperation('menu-seeded-find', () => menuRepo.find({\n where: { name: In(menus.map((m: any) => m.name)) },\n select: [\"id\", \"name\"],\n }), {\n component: 'menus',\n serviceCall: 'menuRepo.find',\n details: `count=${menus.length}`,\n });\n const idByName = new Map(seeded.map(s => [s.name, s.id]));\n\n // 3) Build desired join rows once\n const admin = await this.timeOperation('menu-admin-role-find-one', () => roleRepo.findOne({ where: { name: ADMIN_ROLE_NAME }, select: [\"id\", \"name\"] }), {\n component: 'menus',\n serviceCall: 'roleRepo.findOne',\n details: `role=${ADMIN_ROLE_NAME}`,\n });\n const allRoleNames = new Set<string>();\n for (const m of menus) (m.roles ?? []).forEach((r: string) => allRoleNames.add(r));\n if (admin) allRoleNames.add(admin.name);\n\n const roles = await this.timeOperation('menu-roles-find', () => roleRepo.find({\n where: { name: In([...allRoleNames]) },\n select: [\"id\", \"name\"],\n }), {\n component: 'menus',\n serviceCall: 'roleRepo.find',\n details: `roleCount=${allRoleNames.size}`,\n });\n const roleByName = new Map(roles.map(r => [r.name, r]));\n\n const joinRows: Array<{ menuId: number; roleId: number }> = [];\n for (const m of menus) {\n const menuId = idByName.get(m.name)!;\n const roleNames = new Set<string>([...(m.roles ?? []), admin?.name].filter(Boolean) as string[]);\n for (const rn of roleNames) {\n const role = roleByName.get(rn);\n if (role) joinRows.push({ menuId, roleId: role.id });\n }\n }\n\n // 4) Replace in bulk — no orIgnore, safe for MSSQL\n // 4a) delete existing for affected menus\n const menuIds = [...new Set(joinRows.map(r => r.menuId))];\n if (menuIds.length) {\n await this.timeOperation('menu-role-joins-delete', () => trx\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME) // string table name is fine\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids: menuIds })\n .execute(), {\n component: 'menus',\n serviceCall: 'trx.delete.menuRoleJoins',\n details: `menuCount=${menuIds.length}`,\n });\n }\n\n // 4b) bulk insert all pairs\n if (joinRows.length) {\n const values = joinRows.map(r => ({\n [MENU_ROLE_JOIN_TABLE_NAME_MENU_COL]: r.menuId,\n [MENU_ROLE_JOIN_TABLE_NAME_ROLE_COL]: r.roleId,\n }));\n\n await this.timeOperation('menu-role-joins-insert', () => trx\n .createQueryBuilder()\n .insert()\n .into(MENU_ROLE_JOIN_TABLE_NAME)\n .values(values)\n // .orIgnore() // ❌ remove this – it triggers unsupported onUpdate path\n .execute(), {\n component: 'menus',\n serviceCall: 'trx.insert.menuRoleJoins',\n details: `rowCount=${values.length}`,\n });\n }\n }), { component: 'menus', serviceCall: 'dataSource.transaction' });\n }\n\n // Ok\n private async handleSeedActions(actions: any) {\n if (!actions) {\n return;\n }\n\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n // Prime related-entity caches once before iterating so we do not pay repeated user-key lookups per row.\n await this.timeOperation('action-prime-module-cache', () => this.primeModuleLookupCache(\n actions.map((action: any) => action?.moduleUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeModuleLookupCache',\n details: `count=${actions.length}`,\n });\n await this.timeOperation('action-prime-model-cache', () => this.primeModelLookupCache(\n actions.map((action: any) => action?.modelUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeModelLookupCache',\n details: `count=${actions.length}`,\n });\n await this.timeOperation('action-prime-view-cache', () => this.primeViewLookupCache(\n actions.map((action: any) => action?.viewUserKey),\n ), {\n component: 'actions',\n serviceCall: 'primeViewLookupCache',\n details: `count=${actions.length}`,\n });\n const existingActionsByName = await this.timeOperation('action-preload-existing', () => this.loadExistingActionsByName(\n actionRepo,\n actions.map((action: any) => action?.name).filter(Boolean),\n ), {\n component: 'actions',\n serviceCall: 'loadExistingActionsByName',\n details: `count=${actions.length}`,\n });\n // Keep the verbose output summarized rather than emitting forty separate \"skip\" lines.\n let created = 0;\n let updated = 0;\n let skipped = 0;\n\n for (let j = 0; j < actions.length; j++) {\n const actionData = actions[j];\n actionData['module'] = await this.getModuleByUserKeyCached(actionData.moduleUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `module=${actionData.moduleUserKey}`,\n });\n if (actionData.type === 'solid') {\n actionData['model'] = await this.getModelByUserKeyCached(actionData.modelUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `model=${actionData.modelUserKey}`,\n });\n actionData['view'] = await this.getViewByUserKeyCached(actionData.viewUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `view=${actionData.viewUserKey}`,\n });\n }\n else {\n if (actionData.modelUserKey) {\n actionData['model'] = await this.getModelByUserKeyCached(actionData.modelUserKey, {\n moduleName: actionData.moduleUserKey,\n component: 'actions',\n details: `model=${actionData.modelUserKey}`,\n });\n }\n }\n const result = await this.upsertActionMetadataWithPreloadedExisting(actionRepo, existingActionsByName, actionData);\n if (result.outcome === 'created') {\n created += 1;\n } else if (result.outcome === 'updated') {\n updated += 1;\n } else {\n skipped += 1;\n }\n }\n\n this.logger.debug(`Action seed summary: created=${created}, updated=${updated}, skipped=${skipped}.`);\n }\n\n // Ok\n private async handleSeedViews(views: any) {\n if (!views) {\n return;\n }\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n // Same preload/diff strategy as actions: resolve relation references in bulk, load existing rows once,\n // then do the rest of the work in memory so unchanged views never fall through to save().\n await this.timeOperation('view-prime-module-cache', () => this.primeModuleLookupCache(\n views.map((view: any) => view?.moduleUserKey),\n ), {\n component: 'views',\n serviceCall: 'primeModuleLookupCache',\n details: `count=${views.length}`,\n });\n await this.timeOperation('view-prime-model-cache', () => this.primeModelLookupCache(\n views.map((view: any) => view?.modelUserKey),\n ), {\n component: 'views',\n serviceCall: 'primeModelLookupCache',\n details: `count=${views.length}`,\n });\n const existingViewsByName = await this.timeOperation('view-preload-existing', () => this.loadExistingViewsByName(\n viewRepo,\n views.map((view: any) => view?.name).filter(Boolean),\n ), {\n component: 'views',\n serviceCall: 'loadExistingViewsByName',\n details: `count=${views.length}`,\n });\n let created = 0;\n let updated = 0;\n let skipped = 0;\n\n for (let j = 0; j < views.length; j++) {\n const viewData = views[j];\n\n // preety format the layout & context. \n viewData['layout'] = JSON.stringify(viewData['layout'], null, 2);\n\n viewData['module'] = await this.getModuleByUserKeyCached(viewData.moduleUserKey, {\n moduleName: viewData.moduleUserKey,\n component: 'views',\n details: `module=${viewData.moduleUserKey}`,\n });\n viewData['model'] = await this.getModelByUserKeyCached(viewData.modelUserKey, {\n moduleName: viewData.moduleUserKey,\n component: 'views',\n details: `model=${viewData.modelUserKey}`,\n });\n\n const result = await this.upsertViewMetadataWithPreloadedExisting(viewRepo, existingViewsByName, viewData);\n this.viewLookupCache.set(viewData.name, result.entity ?? null);\n if (result.outcome === 'created') {\n created += 1;\n } else if (result.outcome === 'updated') {\n updated += 1;\n } else {\n skipped += 1;\n }\n }\n\n this.logger.debug(`View seed summary: created=${created}, updated=${updated}, skipped=${skipped}.`);\n }\n\n // OK\n private async handleSeedUsers(users: SignUpDto[]) {\n if (!users) {\n return;\n }\n\n for (let l = 0; l < users.length; l++) {\n const user: SignUpDto = users[l];\n let exisitingUser = await this.timeOperation('user-find-by-username', () => this.userService.findOneByUsername(user.username), {\n component: 'users',\n serviceCall: 'userService.findOneByUsername',\n details: `username=${user.username}`,\n });\n if (!exisitingUser) {\n if (user.username === 'sa') {\n user.password = DEFAULT_SA_PASSWORD;\n }\n\n exisitingUser = await this.timeOperation('user-sign-up', () => this.authenticationService.signUp(user), {\n component: 'users',\n serviceCall: 'authenticationService.signUp',\n details: `username=${user.username}`,\n });\n this.logger.log(`Newly created user ${user.username}`);\n }\n //FIXME: Create the user roles assignment logic here.\n // now add Roles to user.\n // for (let m = 0; m < roles.length; m++) {\n // const role = roles[m];\n // await this.userService.addRoleToUser(user.email, role.name);\n // }\n }\n }\n\n // OK\n private async seedModuleModelFields(moduleMetadata: CreateModuleMetadataDto): Promise<{ pruned: number; upserted: number }> {\n const fieldMetadataRepo = this.dataSource.getRepository(FieldMetadata);\n\n // First we create the module. \n const module = await this.timeOperation('module-upsert', () => this.moduleMetadataService.upsert(moduleMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'moduleMetadataService.upsert',\n details: `module=${moduleMetadata.name}`,\n });\n this.moduleLookupCache.set(moduleMetadata.name, module ?? null);\n let pruned = 0;\n let upserted = 1;\n\n // Next create all the models. \n const modelsMetadata = this.getSeedArray<CreateModelMetadataDto>(moduleMetadata?.models);\n upserted += modelsMetadata.length;\n for (let j = 0; j < modelsMetadata.length; j++) {\n const modelMetadata = modelsMetadata[j];\n\n // Before creating the model, we need to make sure we are linking it to the newly created module.\n modelMetadata['module'] = module;\n const { fields: fieldsMetadata, ...modelMetaDataWithoutFields } = modelMetadata;\n\n // Load and set the parent model if it exists.\n if (modelMetadata.isChild && modelMetadata.parentModelUserKey) {\n const parentModel = await this.getModelByUserKeyCached(modelMetadata.parentModelUserKey, {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n details: `parentModel=${modelMetadata.parentModelUserKey}`,\n });\n modelMetaDataWithoutFields['parentModel'] = parentModel;\n }\n\n const upsertedModel = await this.timeOperation('model-upsert', () => this.modelMetadataService.upsert(modelMetaDataWithoutFields), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.upsert',\n details: `model=${modelMetadata.singularName}`,\n });\n this.modelLookupCache.set(modelMetadata.singularName, upsertedModel ?? null);\n const model = await this.timeOperation('model-find-by-singular-name', () => this.modelMetadataService.findOneBySingularName(modelMetadata.singularName), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.findOneBySingularName',\n details: `model=${modelMetadata.singularName}`,\n });\n\n // iterate over all fields and upsert. \n if (this.enablePruning) {\n pruned += await this.timeOperation('prune-fields-for-model', () => this.pruneFieldsForModel(model, fieldsMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'pruneFieldsForModel',\n details: `model=${modelMetadata.singularName}`,\n });\n }\n let userKeyField = null;\n const userKeyFieldName = modelMetadata.userKeyFieldUserKey;\n // Preload all existing fields for the model once. This is why field upserts are now effectively cheap:\n // we no longer do row-by-row existence checks for every field in steady-state runs.\n const existingFieldsByName = await this.timeOperation('field-preload-for-model', () => this.loadExistingFieldsByName(fieldMetadataRepo, model.id), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'loadExistingFieldsByName',\n details: `model=${modelMetadata.singularName}`,\n });\n upserted += fieldsMetadata?.length ?? 0;\n for (let k = 0; k < fieldsMetadata.length; k++) {\n const fieldMetadata = fieldsMetadata[k];\n\n // Link model & mediaStorageProvider. \n fieldMetadata['model'] = model;\n if (fieldMetadata.mediaStorageProviderUserKey) {\n fieldMetadata['mediaStorageProvider'] = await this.getMediaStorageProviderByUserKeyCached(fieldMetadata.mediaStorageProviderUserKey, {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n details: `provider=${fieldMetadata.mediaStorageProviderUserKey}`,\n });\n }\n // console.log(fieldMetadata.displayName);\n\n const affectedField = await this.timeOperation('field-upsert', () => this.upsertFieldMetadataWithPreloadedExisting(fieldMetadataRepo, existingFieldsByName, fieldMetadata), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'upsertFieldMetadataWithPreloadedExisting',\n details: `field=${fieldMetadata.name} model=${modelMetadata.singularName}`,\n });\n if (fieldMetadata.name === userKeyFieldName || fieldMetadata.isUserKey) {\n const { model, ...fieldData } = affectedField;\n userKeyField = fieldData;\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 await this.timeOperation('model-user-key-field-upsert', () => this.modelMetadataService.upsert(modelMetaDataWithoutFields), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'modelMetadataService.upsert',\n details: `model=${modelMetadata.singularName} userKeyField=${userKeyField?.name ?? 'unknown'}`,\n });\n }\n }\n if (this.enablePruning) {\n pruned += await this.timeOperation('prune-models', () => this.pruneModels(modelsMetadata, moduleMetadata.name), {\n moduleName: moduleMetadata.name,\n component: 'module-model-fields',\n serviceCall: 'pruneModels',\n });\n }\n return { pruned, upserted };\n }\n\n private getSeedArray<T>(value: T[] | null | undefined): T[] {\n return Array.isArray(value) ? value : [];\n }\n\n private async loadExistingFieldsByName(fieldMetadataRepo: Repository<FieldMetadata>, modelId: number): Promise<Map<string, FieldMetadata>> {\n const existingFields = await fieldMetadataRepo.find({\n where: {\n model: { id: modelId },\n },\n relations: {\n model: true,\n mediaStorageProvider: true,\n },\n });\n\n return new Map(existingFields.map((field) => [field.name, field]));\n }\n\n private async primeModuleLookupCache(moduleUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingModuleUserKeys = [...new Set(moduleUserKeys.filter((moduleUserKey): moduleUserKey is string =>\n Boolean(moduleUserKey) && !this.moduleLookupCache.has(moduleUserKey),\n ))];\n\n if (missingModuleUserKeys.length === 0) {\n return;\n }\n\n // Only bulk-load keys that are still missing from the process-local cache.\n const moduleRepo = this.dataSource.getRepository(ModuleMetadata);\n const existingModules = await moduleRepo.find({\n where: {\n name: In(missingModuleUserKeys),\n },\n });\n\n const moduleByName = new Map(existingModules.map((module) => [module.name, module]));\n for (const moduleUserKey of missingModuleUserKeys) {\n this.moduleLookupCache.set(moduleUserKey, moduleByName.get(moduleUserKey) ?? null);\n }\n }\n\n private async primeModelLookupCache(modelUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingModelUserKeys = [...new Set(modelUserKeys.filter((modelUserKey): modelUserKey is string =>\n Boolean(modelUserKey) && !this.modelLookupCache.has(modelUserKey),\n ))];\n\n if (missingModelUserKeys.length === 0) {\n return;\n }\n\n const modelRepo = this.dataSource.getRepository(ModelMetadata);\n const existingModels = await modelRepo.find({\n where: {\n singularName: In(missingModelUserKeys),\n },\n relations: {\n module: true,\n userKeyField: true,\n },\n });\n\n const modelBySingularName = new Map(existingModels.map((model) => [model.singularName, model]));\n for (const modelUserKey of missingModelUserKeys) {\n this.modelLookupCache.set(modelUserKey, modelBySingularName.get(modelUserKey) ?? null);\n }\n }\n\n private async primeViewLookupCache(viewUserKeys: Array<string | null | undefined>): Promise<void> {\n const missingViewUserKeys = [...new Set(viewUserKeys.filter((viewUserKey): viewUserKey is string =>\n Boolean(viewUserKey) && !this.viewLookupCache.has(viewUserKey),\n ))];\n\n if (missingViewUserKeys.length === 0) {\n return;\n }\n\n const viewRepo = this.dataSource.getRepository(ViewMetadata);\n const existingViews = await viewRepo.find({\n where: {\n name: In(missingViewUserKeys),\n },\n relations: {\n module: true,\n model: true,\n },\n });\n\n const viewByName = new Map(existingViews.map((view) => [view.name, view]));\n for (const viewUserKey of missingViewUserKeys) {\n this.viewLookupCache.set(viewUserKey, viewByName.get(viewUserKey) ?? null);\n }\n }\n\n private async loadExistingViewsByName(viewRepo: Repository<ViewMetadata>, viewNames: string[]): Promise<Map<string, ViewMetadata>> {\n const uniqueViewNames = [...new Set(viewNames.filter(Boolean))];\n if (uniqueViewNames.length === 0) {\n return new Map();\n }\n\n // Load relation ids needed for no-op detection. If module/model are not present here, unchanged rows look\n // dirty and every view falls through to save().\n const existingViews = await viewRepo.find({\n where: {\n name: In(uniqueViewNames),\n },\n relations: {\n module: true,\n model: true,\n },\n });\n\n return new Map(existingViews.map((view) => [view.name, view]));\n }\n\n private async loadExistingActionsByName(actionRepo: Repository<ActionMetadata>, actionNames: string[]): Promise<Map<string, ActionMetadata>> {\n const uniqueActionNames = [...new Set(actionNames.filter(Boolean))];\n if (uniqueActionNames.length === 0) {\n return new Map();\n }\n\n // Same reason as views: the diff logic compares relation ids, so those relations must be loaded here.\n const existingActions = await actionRepo.find({\n where: {\n name: In(uniqueActionNames),\n },\n relations: {\n module: true,\n model: true,\n view: true,\n },\n });\n\n return new Map(existingActions.map((action) => [action.name, action]));\n }\n\n private normalizeJsonFieldValue(value: any): any {\n // Normalize persisted JSON strings and in-memory objects/arrays into the same canonical shape before compare.\n if (typeof value === 'string') {\n const trimmedValue = value.trim();\n if (\n (trimmedValue.startsWith('{') && trimmedValue.endsWith('}'))\n || (trimmedValue.startsWith('[') && trimmedValue.endsWith(']'))\n ) {\n try {\n return this.normalizeJsonFieldValue(JSON.parse(trimmedValue));\n } catch {\n return value;\n }\n }\n\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeJsonFieldValue(item));\n }\n\n if (value && typeof value === 'object') {\n return Object.keys(value)\n .sort()\n .reduce((result, key) => {\n result[key] = this.normalizeJsonFieldValue(value[key]);\n return result;\n }, {} as Record<string, any>);\n }\n\n return value;\n }\n\n private getCanonicalJsonFieldString(value: any): string {\n return JSON.stringify(this.normalizeJsonFieldValue(value) ?? null);\n }\n\n private hasViewMetadataChanges(existingView: ViewMetadata, updateDto: any): boolean {\n const relationFields = new Set(['module', 'model']);\n const jsonFields = new Set(['layout', 'context']);\n\n // Compare only the persisted fields we explicitly care about. Generic object-wide diffing became fragile once\n // seeding DTOs started carrying transient helper properties that should not trigger writes.\n return this.viewComparableFields.some((key) => {\n const value = updateDto[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (relationFields.has(key)) {\n const relationValue = value as any;\n return (existingView as any)[key]?.id !== relationValue?.id;\n }\n\n if (jsonFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingView as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingView as any)[key] !== value;\n });\n }\n\n private hasActionMetadataChanges(existingAction: ActionMetadata, updateDto: any): boolean {\n const relationFields = new Set(['module', 'model', 'view']);\n const jsonFields = new Set(['domain', 'context']);\n\n return this.actionComparableFields.some((key) => {\n const value = updateDto[key];\n if (typeof value === 'undefined') {\n return false;\n }\n\n if (relationFields.has(key)) {\n const relationValue = value as any;\n return (existingAction as any)[key]?.id !== relationValue?.id;\n }\n\n if (jsonFields.has(key)) {\n return this.getCanonicalJsonFieldString((existingAction as any)[key]) !== this.getCanonicalJsonFieldString(value);\n }\n\n return (existingAction as any)[key] !== value;\n });\n }\n\n private async upsertViewMetadataWithPreloadedExisting(\n viewRepo: Repository<ViewMetadata>,\n existingViewsByName: Map<string, ViewMetadata>,\n updateDto: any,\n ): Promise<{ entity: ViewMetadata; outcome: 'created' | 'updated' | 'skipped' }> {\n const existingView = existingViewsByName.get(updateDto.name);\n\n if (existingView) {\n // In the steady-state case we want to return fast here and avoid save() entirely.\n if (!this.hasViewMetadataChanges(existingView, updateDto)) {\n return { entity: existingView, outcome: 'skipped' };\n }\n\n const updatedView = { ...existingView, ...updateDto };\n const savedView = await this.timeOperation('view-save', () => viewRepo.save(updatedView as ViewMetadata), {\n component: 'views',\n serviceCall: 'viewRepo.save',\n details: `view=${updateDto.name}`,\n }) as ViewMetadata;\n existingViewsByName.set(updateDto.name, savedView);\n return { entity: savedView, outcome: 'updated' };\n }\n\n const view = viewRepo.create(updateDto as Partial<ViewMetadata>);\n const savedView = await this.timeOperation('view-save', () => viewRepo.save(view as ViewMetadata), {\n component: 'views',\n serviceCall: 'viewRepo.save',\n details: `view=${updateDto.name}`,\n }) as ViewMetadata;\n existingViewsByName.set(updateDto.name, savedView);\n return { entity: savedView, outcome: 'created' };\n }\n\n private async upsertActionMetadataWithPreloadedExisting(\n actionRepo: Repository<ActionMetadata>,\n existingActionsByName: Map<string, ActionMetadata>,\n updateDto: any,\n ): Promise<{ entity: ActionMetadata; outcome: 'created' | 'updated' | 'skipped' }> {\n const existingAction = existingActionsByName.get(updateDto.name);\n\n if (existingAction) {\n if (!this.hasActionMetadataChanges(existingAction, updateDto)) {\n return { entity: existingAction, outcome: 'skipped' };\n }\n\n const updatedAction = { ...existingAction, ...updateDto };\n const savedAction = await this.timeOperation('action-save', () => actionRepo.save(updatedAction as ActionMetadata), {\n component: 'actions',\n serviceCall: 'actionRepo.save',\n details: `action=${updateDto.name}`,\n }) as ActionMetadata;\n existingActionsByName.set(updateDto.name, savedAction);\n return { entity: savedAction, outcome: 'updated' };\n }\n\n const action = actionRepo.create(updateDto as Partial<ActionMetadata>);\n const savedAction = await this.timeOperation('action-save', () => actionRepo.save(action as ActionMetadata), {\n component: 'actions',\n serviceCall: 'actionRepo.save',\n details: `action=${updateDto.name}`,\n }) as ActionMetadata;\n existingActionsByName.set(updateDto.name, savedAction);\n return { entity: savedAction, outcome: 'created' };\n }\n\n private async upsertFieldMetadataWithPreloadedExisting(\n fieldMetadataRepo: Repository<FieldMetadata>,\n existingFieldsByName: Map<string, FieldMetadata>,\n updateDto: any,\n ): Promise<FieldMetadata> {\n const existingFieldMetadata = existingFieldsByName.get(updateDto.name);\n\n if (existingFieldMetadata) {\n // Field metadata still uses a broad DTO diff because the major performance problem here was query volume,\n // not the in-memory comparison itself.\n const hasChanges = Object.entries(updateDto).some(([key, value]) => {\n const relationValue = value as any;\n if (key === 'model') {\n return existingFieldMetadata.model?.id !== relationValue?.id;\n }\n if (key === 'mediaStorageProvider') {\n return existingFieldMetadata.mediaStorageProvider?.id !== relationValue?.id;\n }\n const currentValue = (existingFieldMetadata as any)[key];\n if (Array.isArray(currentValue) || Array.isArray(value)) {\n return JSON.stringify(currentValue ?? null) !== JSON.stringify(value ?? null);\n }\n if (value && typeof value === 'object') {\n return JSON.stringify(currentValue ?? null) !== JSON.stringify(value ?? null);\n }\n return currentValue !== value;\n });\n\n if (!hasChanges) {\n return existingFieldMetadata;\n }\n\n const updatedFieldMetadata = { ...existingFieldMetadata, ...updateDto };\n const savedFieldMetadata = await fieldMetadataRepo.save(updatedFieldMetadata as FieldMetadata) as FieldMetadata;\n existingFieldsByName.set(updateDto.name, savedFieldMetadata);\n return savedFieldMetadata;\n }\n\n const fieldMetadata = fieldMetadataRepo.create(updateDto as Partial<FieldMetadata>);\n const savedFieldMetadata = await fieldMetadataRepo.save(fieldMetadata as FieldMetadata) as FieldMetadata;\n existingFieldsByName.set(updateDto.name, savedFieldMetadata);\n return savedFieldMetadata;\n }\n\n private async handleSeedSecurityRules(rulesDto: CreateSecurityRuleDto[]) {\n if (!rulesDto || rulesDto.length === 0) {\n this.logger.debug(`No security rules found to seed`);\n return;\n }\n for (const dto of rulesDto) {\n await this.timeOperation('security-rule-upsert', () => this.securityRuleRepo.upsertWithDto({ ...dto, securityRuleConfig: JSON.stringify(dto.securityRuleConfig) }), {\n component: 'security-rules',\n serviceCall: 'securityRuleRepo.upsertWithDto',\n details: `rule=${dto.name}`,\n });\n }\n }\n\n // Not Ok\n private async handleSeedListOfValues(listOfValuesDto: CreateListOfValuesDto[]) {\n if (!listOfValuesDto || listOfValuesDto.length === 0) {\n this.logger.debug(`No List Of Values found to seed`);\n return;\n }\n for (let j = 0; j < listOfValuesDto.length; j++) {\n const listOfValueDto = listOfValuesDto[j];\n listOfValueDto['module'] = await this.getModuleByUserKeyCached(listOfValueDto.moduleUserKey, {\n moduleName: listOfValueDto.moduleUserKey,\n component: 'list-of-values',\n details: `module=${listOfValueDto.moduleUserKey}`,\n });\n await this.timeOperation('lov-upsert', () => this.listOfValuesService.upsert(listOfValuesDto[j]), {\n component: 'list-of-values',\n serviceCall: 'listOfValuesService.upsert',\n details: `type=${listOfValueDto.type} value=${listOfValueDto.value}`,\n });\n }\n }\n\n private async handleSeedScheduledJobs(createScheduledJobDto: CreateScheduledJobDto[]) {\n if (!createScheduledJobDto || createScheduledJobDto.length === 0) {\n this.logger.debug(`No scheduled jobs found to seed`);\n return;\n }\n for (const dto of createScheduledJobDto) {\n await this.timeOperation('scheduled-job-upsert', () => this.scheduledJobRepository.upsertWithDto(dto), {\n component: 'scheduled-jobs',\n serviceCall: 'scheduledJobRepository.upsertWithDto',\n details: `schedule=${dto.scheduleName}`,\n });\n }\n }\n\n private async handleSeedSavedFilters(createSavedFilterDto: CreateSavedFiltersDto[]) {\n if (!createSavedFilterDto || createSavedFilterDto.length === 0) {\n this.logger.debug(`No saved filters found to seed`);\n return;\n }\n for (const dto of createSavedFilterDto) {\n this.validateSavedFilterQueryJsonWrapper(dto);\n await this.timeOperation('saved-filter-upsert', () => this.savedFiltersRepo.upsertWithDto({ ...dto, filterQueryJson: JSON.stringify(dto.filterQueryJson), isSeeded: true }), {\n component: 'saved-filters',\n serviceCall: 'savedFiltersRepo.upsertWithDto',\n details: `filter=${dto.name}`,\n });\n }\n }\n\n private async handleSeedLocales(localesDto: CreateLocaleDto[]) {\n if (!localesDto || localesDto.length === 0) {\n this.logger.debug(`No locales found to seed`);\n return;\n }\n\n for (const dto of localesDto) {\n if (dto.isDefault) {\n const existingDefaultLocales = await this.localeRepo.find({\n where: {\n isDefault: true,\n } as any,\n });\n\n for (const locale of existingDefaultLocales) {\n if (locale.locale !== dto.locale) {\n await this.localeRepo.save({\n ...locale,\n isDefault: false,\n });\n }\n }\n }\n\n const existingLocale = await this.localeRepo.findOne({\n where: {\n locale: dto.locale,\n } as any,\n });\n\n await this.localeRepo.save(\n this.localeRepo.create({\n ...existingLocale,\n ...dto,\n })\n );\n }\n\n const locales = await this.localeRepo.find();\n this.solidRegistry.registerlocales(locales);\n }\n\n private validateSavedFilterQueryJsonWrapper(dto: CreateSavedFiltersDto): void {\n const filterName = dto?.name ?? '<unnamed>';\n const filterQueryJson = dto?.filterQueryJson;\n const baseErrorMessage =\n `Invalid saved filter \"${filterName}\": filterQueryJson must be wrapped with a top-level \"$or\" or \"$and\". ` +\n `Example: {\"$or\":[{\"employeeStatus\":{\"$eq\":\"Active\"}}]}`;\n\n if (!filterQueryJson || typeof filterQueryJson !== 'object' || Array.isArray(filterQueryJson)) {\n throw new Error(baseErrorMessage);\n }\n\n const topLevelKeys = Object.keys(filterQueryJson);\n const hasLogicalWrapper = topLevelKeys.includes('$or') || topLevelKeys.includes('$and');\n if (!hasLogicalWrapper) {\n const receivedKeys = topLevelKeys.length > 0 ? topLevelKeys.join(', ') : '(none)';\n throw new Error(`${baseErrorMessage}. Received top-level keys: ${receivedKeys}`);\n }\n }\n\n private async handleSeedModelSequences(modelSequencesDto: CreateModelSequenceDto[]) {\n if (!modelSequencesDto || modelSequencesDto.length === 0) {\n this.logger.debug(`No Model Sequences found to seed`);\n return;\n }\n for (const dto of modelSequencesDto) {\n await this.timeOperation('model-sequence-upsert', () => this.modelSequenceRepo.upsertWithDto(dto), {\n component: 'model-sequences',\n serviceCall: 'modelSequenceRepo.upsertWithDto',\n details: `sequence=${dto.sequenceName}`,\n });\n }\n }\n\n private async pruneModelSequences(modelSequencesDto: CreateModelSequenceDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping model sequence prune: missing module name in metadata.`);\n return 0;\n }\n const sequences = modelSequencesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'model-sequences',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping model sequence prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const sequenceNames = [...new Set(sequences.map(dto => dto.sequenceName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ModelSequence);\n const idsToDeleteQuery = repo\n .createQueryBuilder('ms')\n .select('ms.id', 'id')\n .innerJoin('ms.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (sequenceNames.length > 0) {\n idsToDeleteQuery.andWhere('ms.sequenceName NOT IN (:...sequenceNames)', { sequenceNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ModelSequence)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneSavedFilters(savedFiltersDto: CreateSavedFiltersDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping saved filters prune: missing module name in metadata.`);\n return 0;\n }\n const savedFilters = savedFiltersDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'saved-filters',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping saved filters prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const filterNames = [...new Set(savedFilters.map(dto => dto.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(SavedFilters);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sf')\n .select('sf.id', 'id')\n .innerJoin('sf.view', 'view')\n .innerJoin('view.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (filterNames.length > 0) {\n idsToDeleteQuery.andWhere('sf.name NOT IN (:...filterNames)', { filterNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(SavedFilters)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneScheduledJobs(scheduledJobsDto: CreateScheduledJobDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping scheduled jobs prune: missing module name in metadata.`);\n return 0;\n }\n const scheduledJobs = scheduledJobsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'scheduled-jobs',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping scheduled jobs prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const scheduleNames = [...new Set(scheduledJobs.map(dto => dto.scheduleName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ScheduledJob);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sj')\n .select('sj.id', 'id')\n .innerJoin('sj.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (scheduleNames.length > 0) {\n idsToDeleteQuery.andWhere('sj.scheduleName NOT IN (:...scheduleNames)', { scheduleNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ScheduledJob)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneSecurityRules(securityRulesDto: CreateSecurityRuleDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping security rules prune: missing module name in metadata.`);\n return 0;\n }\n const securityRules = securityRulesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'security-rules',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping security rules prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const ruleNames = [...new Set(securityRules.map(dto => dto.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(SecurityRule);\n const idsToDeleteQuery = repo\n .createQueryBuilder('sr')\n .select('sr.id', 'id')\n .innerJoin('sr.modelMetadata', 'model')\n .innerJoin('model.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (ruleNames.length > 0) {\n idsToDeleteQuery.andWhere('sr.name NOT IN (:...ruleNames)', { ruleNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(SecurityRule)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneListOfValues(listOfValuesDto: CreateListOfValuesDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping list of values prune: missing module name in metadata.`);\n return 0;\n }\n const listOfValues = listOfValuesDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'list-of-values',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping list of values prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const pairs = listOfValues\n .filter(dto => dto.type && dto.value)\n .map(dto => ({ type: dto.type, value: dto.value }));\n const repo = this.dataSource.getRepository(ListOfValues);\n const idsToDeleteQuery = repo\n .createQueryBuilder('lov')\n .select('lov.id', 'id')\n .innerJoin('lov.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (pairs.length > 0) {\n const conditions = pairs.map((_, i) => `(lov.type = :t${i} AND lov.value = :v${i})`).join(' OR ');\n const params = pairs.reduce((acc, pair, i) => {\n acc[`t${i}`] = pair.type;\n acc[`v${i}`] = pair.value;\n return acc;\n }, {} as Record<string, string>);\n\n idsToDeleteQuery.andWhere(`NOT (${conditions})`, params);\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ListOfValues)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneMenus(menusDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping menus prune: missing module name in metadata.`);\n return 0;\n }\n const menus = menusDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'menus',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping menus prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const menuNames = [...new Set(menus.map(m => m.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(MenuItemMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('menu')\n .select('menu.id', 'id')\n .innerJoin('menu.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (menuNames.length > 0) {\n idsToDeleteQuery.andWhere('menu.name NOT IN (:...menuNames)', { menuNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME)\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids })\n .execute();\n }\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(MenuItemMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneViews(viewsDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping views prune: missing module name in metadata.`);\n return 0;\n }\n const views = viewsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'views',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping views prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const viewNames = [...new Set(views.map((v: any) => v.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(ViewMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('view')\n .select('view.id', 'id')\n .innerJoin('view.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (viewNames.length > 0) {\n idsToDeleteQuery.andWhere('view.name NOT IN (:...viewNames)', { viewNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n // Delete actions tied to these views before deleting the views themselves.\n const actionRepo = this.dataSource.getRepository(ActionMetadata);\n const actionRows = await actionRepo\n .createQueryBuilder('action')\n .select('action.id', 'id')\n .innerJoin('action.view', 'view')\n .where('view.id IN (:...viewIds)', { viewIds: ids })\n .getRawMany();\n const actionIds = actionRows.map((row) => row.id);\n if (actionIds.length > 0) {\n const result = await actionRepo\n .createQueryBuilder()\n .delete()\n .from(ActionMetadata)\n .whereInIds(actionIds)\n .execute();\n if ((result.affected ?? 0) === 0) {\n this.logger.warn(`No actions deleted for pruned views in module ${moduleName}.`);\n }\n }\n\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ViewMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneActions(actionsDto: any[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping actions prune: missing module name in metadata.`);\n return 0;\n }\n const actions = actionsDto ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'actions',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping actions prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const actionNames = [...new Set(actions.map((a: any) => a.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(ActionMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('action')\n .select('action.id', 'id')\n .innerJoin('action.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id });\n\n if (actionNames.length > 0) {\n idsToDeleteQuery.andWhere('action.name NOT IN (:...actionNames)', { actionNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const menuRepo = this.dataSource.getRepository(MenuItemMetadata);\n const menuRows = await menuRepo\n .createQueryBuilder('menu')\n .select('menu.id', 'id')\n .innerJoin('menu.action', 'action')\n .where('action.id IN (:...actionIds)', { actionIds: ids })\n .getRawMany();\n const menuIds = menuRows.map((row) => row.id);\n\n if (menuIds.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(MENU_ROLE_JOIN_TABLE_NAME)\n .where(`${MENU_ROLE_JOIN_TABLE_NAME_MENU_COL} IN (:...ids)`, { ids: menuIds })\n .execute();\n\n await menuRepo\n .createQueryBuilder()\n .delete()\n .from(MenuItemMetadata)\n .whereInIds(menuIds)\n .execute();\n }\n\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ActionMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneFieldsForModel(model: any, fieldsMetadata: any[] | undefined): Promise<number> {\n if (!model) {\n this.logger.warn(`Skipping fields prune: model not found.`);\n return 0;\n }\n const fields = fieldsMetadata ?? [];\n\n const fieldNames = [...new Set(fields.map(f => f.name).filter(Boolean))];\n const repo = this.dataSource.getRepository(FieldMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('field')\n .select('field.id', 'id')\n .innerJoin('field.model', 'model')\n .where('model.id = :modelId', { modelId: model.id })\n .andWhere('field.isSystem = :isSystem', { isSystem: false });\n\n if (fieldNames.length > 0) {\n idsToDeleteQuery.andWhere('field.name NOT IN (:...fieldNames)', { fieldNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(FieldMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private async pruneModels(modelsMetadata: CreateModelMetadataDto[] | undefined, moduleName?: string): Promise<number> {\n if (!moduleName) {\n this.logger.warn(`Skipping models prune: missing module name in metadata.`);\n return 0;\n }\n const models = modelsMetadata ?? [];\n\n const module = await this.getModuleByUserKeyCached(moduleName, {\n moduleName,\n component: 'module-model-fields',\n details: `module=${moduleName}`,\n });\n if (!module) {\n this.logger.warn(`Skipping models prune: module not found for ${moduleName}.`);\n return 0;\n }\n\n const modelNames = [...new Set(models.map(m => m.singularName).filter(Boolean))];\n const repo = this.dataSource.getRepository(ModelMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('model')\n .select('model.id', 'id')\n .innerJoin('model.module', 'module')\n .where('module.id = :moduleId', { moduleId: module.id })\n .andWhere('model.isSystem = :isSystem', { isSystem: false });\n\n if (modelNames.length > 0) {\n idsToDeleteQuery.andWhere('model.singularName NOT IN (:...modelNames)', { modelNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(ModelMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n private getRolePermissionJoinInfo(): { tableName: string; permissionIdColumn: string } | null {\n const roleMetadata = this.dataSource.getMetadata(RoleMetadata);\n const relation = roleMetadata.relations.find((r) => r.propertyName === 'permissions');\n if (!relation || !relation.junctionEntityMetadata) {\n this.logger.warn(`Role-permission join table metadata not found; skipping join cleanup.`);\n return null;\n }\n\n const permissionIdColumn = relation.inverseJoinColumns[0]?.databaseName;\n if (!permissionIdColumn) {\n this.logger.warn(`Role-permission join column not found; skipping join cleanup.`);\n return null;\n }\n\n return {\n tableName: relation.junctionEntityMetadata.tableName,\n permissionIdColumn,\n };\n }\n\n private async prunePermissions(permissionNames: string[]): Promise<number> {\n const uniqueNames = [...new Set(permissionNames.filter(Boolean))];\n const repo = this.dataSource.getRepository(PermissionMetadata);\n const idsToDeleteQuery = repo\n .createQueryBuilder('perm')\n .select('perm.id', 'id');\n\n if (uniqueNames.length > 0) {\n idsToDeleteQuery.andWhere('perm.name NOT IN (:...names)', { names: uniqueNames });\n }\n\n const rows = await idsToDeleteQuery.getRawMany();\n const ids = rows.map((row) => row.id);\n // Commented out to allow pruning when metadata is empty/missing.\n // if (ids.length === 0) {\n // return;\n // }\n\n const joinInfo = this.getRolePermissionJoinInfo();\n if (joinInfo && ids.length > 0) {\n await this.dataSource\n .createQueryBuilder()\n .delete()\n .from(joinInfo.tableName)\n .where(`${joinInfo.permissionIdColumn} IN (:...ids)`, { ids })\n .execute();\n }\n\n if (ids.length > 0) {\n const result = await repo\n .createQueryBuilder()\n .delete()\n .from(PermissionMetadata)\n .whereInIds(ids)\n .execute();\n return result.affected ?? 0;\n }\n return 0;\n }\n\n // private async resolvePruningChoice(conf?: any): Promise<boolean> {\n // if (typeof conf?.pruneMetadata === 'boolean') {\n // return conf.pruneMetadata;\n // }\n // if (!process.stdin.isTTY) {\n // return false;\n // }\n\n // const rl = readline.createInterface({\n // input: process.stdin,\n // output: process.stdout,\n // });\n\n // const question = `Prune metadata entries not in JSON? (y/N) `;\n // const answer: string = await new Promise((resolve) => {\n // rl.question(question, (input) => resolve(input));\n // });\n // rl.close();\n\n // return answer.trim().toLowerCase().startsWith('y');\n // }\n\n private logSeedFailureForCli(\n error: unknown,\n context: { moduleName: string; step: string; pruneEnabled: boolean; modulesToSeed: string[] | null }\n ): void {\n const err = error instanceof Error ? error : new Error(String(error));\n const stackLines = (err.stack ?? '')\n .split('\\n')\n .slice(0, 8)\n .map((line) => line.trim())\n .filter(Boolean);\n const logPayload = {\n module: context.moduleName,\n step: context.step,\n pruneEnabled: context.pruneEnabled,\n modulesToSeed: context.modulesToSeed?.length ? context.modulesToSeed : 'ALL',\n error: {\n name: err.name,\n message: err.message,\n stackPreview: stackLines.length > 0 ? stackLines : undefined,\n },\n };\n\n console.log('✖ Seeding failed');\n console.log(JSON.stringify(logPayload, null, 2));\n }\n\n private formatSeedResult(moduleName: string, label: string, counts: { pruned: number; upserted: number }): string {\n if (this.enablePruning) {\n return `✔ [${moduleName}] ${label} seeded (pruned ${counts.pruned}, upserted ${counts.upserted})`;\n }\n return `✔ [${moduleName}] ${label} seeded (upserted ${counts.upserted})`;\n }\n\n}\n"]}