@solidxai/core 0.1.11-beta.11 → 0.1.11-beta.13

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 (85) hide show
  1. package/dist/controllers/media.controller.js +0 -2
  2. package/dist/controllers/media.controller.js.map +1 -1
  3. package/dist/helpers/environment.helper.d.ts +0 -1
  4. package/dist/helpers/environment.helper.d.ts.map +1 -1
  5. package/dist/helpers/environment.helper.js +0 -4
  6. package/dist/helpers/environment.helper.js.map +1 -1
  7. package/dist/helpers/model-metadata-helper.service.d.ts +1 -2
  8. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  9. package/dist/helpers/model-metadata-helper.service.js +2 -6
  10. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  11. package/dist/helpers/module-metadata-helper.service.js +1 -1
  12. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  13. package/dist/helpers/solid-registry.d.ts +1 -2
  14. package/dist/helpers/solid-registry.d.ts.map +1 -1
  15. package/dist/helpers/solid-registry.js.map +1 -1
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +0 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/repository/scheduled-job.repository.d.ts +2 -2
  21. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  22. package/dist/repository/scheduled-job.repository.js +3 -6
  23. package/dist/repository/scheduled-job.repository.js.map +1 -1
  24. package/dist/repository/security-rule.repository.d.ts +2 -2
  25. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  26. package/dist/repository/security-rule.repository.js +3 -6
  27. package/dist/repository/security-rule.repository.js.map +1 -1
  28. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  29. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +5 -7
  30. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  31. package/dist/services/crud-helper.service.d.ts.map +1 -1
  32. package/dist/services/crud-helper.service.js +7 -0
  33. package/dist/services/crud-helper.service.js.map +1 -1
  34. package/dist/services/datasource-introspection.service.d.ts +1 -0
  35. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  36. package/dist/services/datasource-introspection.service.js +14 -5
  37. package/dist/services/datasource-introspection.service.js.map +1 -1
  38. package/dist/services/model-metadata.service.d.ts.map +1 -1
  39. package/dist/services/model-metadata.service.js +0 -16
  40. package/dist/services/model-metadata.service.js.map +1 -1
  41. package/dist/services/module-metadata.service.d.ts.map +1 -1
  42. package/dist/services/module-metadata.service.js +0 -28
  43. package/dist/services/module-metadata.service.js.map +1 -1
  44. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  45. package/dist/subscribers/audit.subscriber.js +2 -8
  46. package/dist/subscribers/audit.subscriber.js.map +1 -1
  47. package/dist/subscribers/computed-entity-field.subscriber.d.ts +0 -8
  48. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  49. package/dist/subscribers/computed-entity-field.subscriber.js +3 -36
  50. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  51. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  52. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  53. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  54. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  55. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  56. package/dist/subscribers/scheduled-job.subscriber.js +2 -3
  57. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  58. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  59. package/dist/subscribers/security-rule.subscriber.js +3 -5
  60. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  61. package/package.json +1 -1
  62. package/src/controllers/media.controller.ts +1 -1
  63. package/src/helpers/environment.helper.ts +0 -11
  64. package/src/helpers/model-metadata-helper.service.ts +2 -7
  65. package/src/helpers/module-metadata-helper.service.ts +1 -1
  66. package/src/helpers/solid-registry.ts +1 -7
  67. package/src/index.ts +0 -1
  68. package/src/repository/scheduled-job.repository.ts +4 -10
  69. package/src/repository/security-rule.repository.ts +4 -10
  70. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +5 -11
  71. package/src/services/crud-helper.service.ts +7 -0
  72. package/src/services/datasource-introspection.service.ts +18 -5
  73. package/src/services/model-metadata.service.ts +0 -22
  74. package/src/services/module-metadata.service.ts +0 -36
  75. package/src/subscribers/audit.subscriber.ts +2 -11
  76. package/src/subscribers/computed-entity-field.subscriber.ts +6 -63
  77. package/src/subscribers/created-by-updated-by.subscriber.ts +0 -3
  78. package/src/subscribers/field-metadata.subscriber.ts +0 -3
  79. package/src/subscribers/scheduled-job.subscriber.ts +2 -3
  80. package/src/subscribers/security-rule.subscriber.ts +3 -8
  81. package/dist/helpers/nodemon-heartbeat.d.ts +0 -5
  82. package/dist/helpers/nodemon-heartbeat.d.ts.map +0 -1
  83. package/dist/helpers/nodemon-heartbeat.js +0 -67
  84. package/dist/helpers/nodemon-heartbeat.js.map +0 -1
  85. package/src/helpers/nodemon-heartbeat.ts +0 -59
@@ -1 +1 @@
1
- {"version":3,"file":"datasource-introspection.service.js","sourceRoot":"","sources":["../../src/services/datasource-introspection.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable, NotFoundException } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { getDataSourceToken } from \"@nestjs/typeorm\";\nimport { createHash } from \"crypto\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { camelCase, kebabCase, startCase } from \"lodash\";\nimport { ArrayLiteralExpression, IndentationText, Node, ObjectLiteralExpression, Project, QuoteKind, SyntaxKind, VariableDeclarationKind } from \"ts-morph\";\nimport { DataSource } from \"typeorm\";\nimport { CreateModelMetadataDto } from \"src/dtos/create-model-metadata.dto\";\nimport { DatasourceIntrospectionMappingColumnDto, DatasourceIntrospectionMappingDto } from \"src/dtos/datasource-introspection-mapping.dto\";\nimport { UpdateModelMetaDataDto } from \"src/dtos/update-model-metadata.dto\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { classify } from \"src/helpers/string.helper\";\nimport type { DatasourceIntrospectionColumn, DatasourceIntrospectionProvider, DatasourceIntrospectionTableRef } from \"src/interfaces/datasource-introspection-provider.interface\";\nimport { ModuleMetadataHelperService } from \"src/helpers/module-metadata-helper.service\";\nimport { ModelMetadataHelperService } from \"src/helpers/model-metadata-helper.service\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { ModuleMetadataRepository } from \"src/repository/module-metadata.repository\";\nimport type { ModelMetadata } from \"src/entities/model-metadata.entity\";\nimport { DatasourceManagementService, type DatasourceRecord } from \"./datasource-management.service\";\nimport { CommandService } from \"src/helpers/command.service\";\nimport { FieldMetadataService } from \"./field-metadata.service\";\nimport { ModelMetadataService } from \"./model-metadata.service\";\nimport { ModuleMetadataService } from \"./module-metadata.service\";\nimport { MssqlDatasourceIntrospectionProviderService } from \"./datasource-introspection/mssql-datasource-introspection-provider.service\";\nimport { MysqlDatasourceIntrospectionProviderService } from \"./datasource-introspection/mysql-datasource-introspection-provider.service\";\nimport { PostgresDatasourceIntrospectionProviderService } from \"./datasource-introspection/postgres-datasource-introspection-provider.service\";\n\ntype TableInventoryRecord = {\n schema: string | null;\n tableName: string;\n mapped: boolean;\n mappedModelId: number | null;\n mappedModelSingularName: string | null;\n mappedModelDisplayName: string | null;\n mappedModuleId: number | null;\n mappedModuleName: string | null;\n mappedModuleDisplayName: string | null;\n suggestedLegacyTableType: LegacyTableType;\n suggestedBaseClassName: string;\n suggestedIdColumnName: string | null;\n suggestedUserKeyField: string;\n columnCount: number;\n physicalColumnCount: number;\n hasPrimaryKey: boolean;\n primaryKeyColumnCount: number;\n primaryKeyColumnNames: string[];\n mappingBlockedReason: string | null;\n};\n\ntype TableDetailColumnRecord = {\n columnName: string;\n fieldName: string;\n displayName: string;\n dataType: string;\n solidFieldType: string;\n ormType: string;\n nullable: boolean;\n defaultValue: string | null;\n characterMaximumLength: number | null;\n numericPrecision: number | null;\n numericScale: number | null;\n ordinalPosition: number | null;\n isAutoGenerated: boolean;\n isPrimaryKey: boolean;\n handledBySuperclass: boolean;\n superclassFieldName: string | null;\n};\n\ntype TableDdlRecord = {\n statement: string | null;\n available: boolean;\n note: string | null;\n};\n\ntype MappingPreviewRecord = {\n operation: \"create\" | \"update\";\n mappedModelId: number | null;\n metadataJson: {\n filePath: string;\n model: Record<string, any>;\n };\n migration: {\n willGenerate: boolean;\n filePath: string | null;\n fileName: string | null;\n className: string | null;\n timestamp: number | null;\n content: string | null;\n note: string;\n missingSystemColumns: string[];\n };\n datasourceFile: {\n filePath: string;\n created: boolean;\n updated: boolean;\n entityRegistered: boolean;\n migrationGlobRegistered: boolean;\n };\n summary: {\n includedColumnNames: string[];\n removedColumnNames: string[];\n missingSystemColumns: string[];\n generatedSystemColumnCount: number;\n };\n modelPayload: CreateModelMetadataDto | UpdateModelMetaDataDto;\n};\n\ntype ReviewedMetadataModel = {\n singularName: string;\n pluralName: string;\n displayName: string;\n description: string;\n dataSource: string;\n dataSourceType: string;\n tableName: string;\n userKeyFieldUserKey: string;\n isChild: boolean;\n legacyTableType: LegacyTableType;\n parentModelUserKey: string;\n enableAuditTracking: boolean;\n enableSoftDelete: boolean;\n draftPublishWorkflow: boolean;\n internationalisation: boolean;\n fields: Record<string, any>[];\n};\n\ntype SystemColumnDefinition = {\n columnName: string;\n type: string;\n length?: string | null;\n isNullable?: boolean;\n defaultExpression?: string | null;\n isGenerated?: boolean;\n isUnique?: boolean;\n};\n\ntype DatasourceTypeFamily =\n | \"boolean\"\n | \"bigint\"\n | \"int\"\n | \"numeric\"\n | \"decimal\"\n | \"float\"\n | \"date\"\n | \"time\"\n | \"datetime\"\n | \"datetimeWithTimezone\"\n | \"json\"\n | \"jsonb\"\n | \"uuid\"\n | \"longText\"\n | \"mediumText\"\n | \"shortText\"\n | \"unicodeShortText\";\n\nconst DATASOURCE_TYPE_FAMILY_ALIASES: Record<DatasourceTypeFamily, string[]> = {\n boolean: [\"bit\", \"bool\", \"boolean\"],\n bigint: [\"bigint\"],\n int: [\"int\", \"integer\", \"smallint\", \"tinyint\"],\n numeric: [\"numeric\"],\n decimal: [\"decimal\", \"money\", \"smallmoney\"],\n float: [\"float\", \"double\", \"double precision\", \"real\", \"float4\", \"float8\"],\n date: [\"date\"],\n time: [\"time\", \"time without time zone\", \"time with time zone\"],\n datetime: [\"datetime\", \"datetime2\", \"smalldatetime\", \"timestamp\", \"timestamp without time zone\"],\n datetimeWithTimezone: [\"timestamptz\", \"timestamp with time zone\"],\n json: [\"json\", \"simple-json\", \"simplejson\"],\n jsonb: [\"jsonb\"],\n uuid: [\"uniqueidentifier\", \"uuid\"],\n longText: [\"text\", \"ntext\", \"longtext\", \"clob\"],\n mediumText: [\"mediumtext\"],\n shortText: [\"varchar\", \"char\", \"citext\"],\n unicodeShortText: [\"nvarchar\", \"nchar\"],\n};\n\nconst ORM_TYPE_BY_DATASOURCE_FAMILY: Record<string, Partial<Record<DatasourceTypeFamily, string>>> = {\n mssql: {\n boolean: \"bit\",\n bigint: \"bigint\",\n int: \"int\",\n numeric: \"numeric\",\n decimal: \"decimal\",\n float: \"decimal\",\n date: \"date\",\n time: \"time\",\n datetime: \"datetime\",\n datetimeWithTimezone: \"datetime\",\n json: \"simple-json\",\n jsonb: \"simple-json\",\n uuid: \"uniqueidentifier\",\n longText: \"text\",\n mediumText: \"text\",\n shortText: \"varchar\",\n unicodeShortText: \"nvarchar\",\n },\n mysql: {\n boolean: \"boolean\",\n bigint: \"int\",\n int: \"int\",\n numeric: \"decimal\",\n decimal: \"decimal\",\n float: \"double\",\n date: \"date\",\n time: \"time\",\n datetime: \"datetime\",\n datetimeWithTimezone: \"datetime\",\n json: \"json\",\n jsonb: \"json\",\n uuid: \"varchar\",\n longText: \"longtext\",\n mediumText: \"mediumtext\",\n shortText: \"varchar\",\n unicodeShortText: \"varchar\",\n },\n postgres: {\n boolean: \"boolean\",\n bigint: \"bigint\",\n int: \"integer\",\n numeric: \"decimal\",\n decimal: \"decimal\",\n float: \"decimal\",\n date: \"date\",\n time: \"time\",\n datetime: \"timestamp\",\n datetimeWithTimezone: \"timestamptz\",\n json: \"json\",\n jsonb: \"jsonb\",\n uuid: \"uuid\",\n longText: \"text\",\n mediumText: \"text\",\n shortText: \"varchar\",\n unicodeShortText: \"varchar\",\n },\n};\n\n@Injectable()\nexport class DatasourceIntrospectionService {\n private readonly supportedDatasourceTypes = new Set([\"mssql\", \"mysql\", \"postgres\"]);\n\n constructor(\n private readonly moduleRef: ModuleRef,\n private readonly datasourceManagementService: DatasourceManagementService,\n private readonly moduleMetadataRepository: ModuleMetadataRepository,\n private readonly modelMetadataRepository: ModelMetadataRepository,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly modelMetadataService: ModelMetadataService,\n private readonly moduleMetadataService: ModuleMetadataService,\n private readonly commandService: CommandService,\n private readonly mssqlProvider: MssqlDatasourceIntrospectionProviderService,\n private readonly mysqlProvider: MysqlDatasourceIntrospectionProviderService,\n private readonly postgresProvider: PostgresDatasourceIntrospectionProviderService,\n ) { }\n\n async getBootstrap(moduleId: number) {\n const module = await this.loadModule(moduleId);\n const datasources = this.datasourceManagementService\n .listRecords()\n .filter((record) => this.supportedDatasourceTypes.has(record.type?.toLowerCase?.() ?? \"\"));\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasources: datasources.map((record) => this.toDatasourceSummary(record)),\n recommendedDatasourceName: datasources.find((record) => record.name === module.defaultDataSource)?.name\n ?? datasources[0]?.name\n ?? null,\n },\n };\n }\n\n async getTables(moduleId: number, datasourceName: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n\n if (datasource.synchronize === true) {\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n synchronizeBlocked: true,\n synchronizeMessage: this.buildSynchronizeBlockedMessage(datasource),\n records: [],\n meta: {\n totalRecords: 0,\n },\n },\n };\n }\n\n const inventory = await this.buildTableInventory(datasource);\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n synchronizeBlocked: false,\n synchronizeMessage: null,\n records: inventory.records,\n meta: {\n totalRecords: inventory.records.length,\n },\n },\n };\n }\n\n async getTableDetail(moduleId: number, datasourceName: string, tableName: string, schema?: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n\n if (datasource.synchronize === true) {\n throw new BadRequestException(this.buildSynchronizeBlockedMessage(datasource));\n }\n\n const inventory = await this.buildTableInventory(datasource);\n const tableKey = this.toTableKey(schema ?? null, tableName);\n const selectedTable = inventory.recordsByKey.get(tableKey);\n if (!selectedTable) {\n throw new NotFoundException(`Table \"${tableName}\" was not found on datasource \"${datasource.name}\".`);\n }\n\n const provider = this.getProvider(datasource.type);\n const runtimeDataSource = this.resolveDataSourceByName(datasource.name);\n const rawColumns = inventory.columnsByKey.get(tableKey) ?? [];\n const detailColumns = rawColumns.map((column) => this.toDetailColumnRecord(column, selectedTable.suggestedLegacyTableType, datasource.type));\n const userKeyCandidates = this.buildUserKeyCandidates(rawColumns);\n const suggestedSingularName = this.toSingularNameCandidate(tableName);\n const suggestedPluralName = this.toPluralNameCandidate(tableName, suggestedSingularName);\n const rawDdl = await this.buildRawDdl(provider, runtimeDataSource, {\n tableName: selectedTable.tableName,\n tableSchema: selectedTable.schema,\n });\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n table: selectedTable,\n columns: detailColumns,\n rawDdl,\n userKeyCandidates,\n suggestedMetadata: {\n singularName: suggestedSingularName,\n pluralName: suggestedPluralName,\n displayName: startCase(suggestedSingularName),\n tableName: selectedTable.tableName,\n schema: selectedTable.schema,\n dataSource: datasource.name,\n dataSourceType: datasource.type,\n legacyTableType: selectedTable.suggestedLegacyTableType,\n baseClassName: selectedTable.suggestedBaseClassName,\n userKeyField: selectedTable.suggestedUserKeyField,\n synchronize: false,\n },\n },\n };\n }\n\n async previewMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n\n return {\n data: {\n operation: plan.operation,\n mappedModelId: plan.mappedModelId,\n metadataJson: plan.metadataJson,\n migration: plan.migration,\n summary: plan.summary,\n },\n };\n }\n\n async applyMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n\n if (plan.operation === \"update\" && !mappingDto.modelId) {\n throw new BadRequestException(\"Mapped tables require a model id before changes can be applied.\");\n }\n\n const persistedModel = plan.operation === \"update\" && mappingDto.modelId\n ? await this.modelMetadataService.update(mappingDto.modelId, plan.modelPayload as UpdateModelMetaDataDto)\n : await this.modelMetadataService.create(plan.modelPayload as CreateModelMetadataDto);\n\n const persistedModelId = mappingDto.modelId ?? (persistedModel as ModelMetadata | undefined)?.id ?? null;\n\n return {\n data: {\n modelId: persistedModelId,\n operation: plan.operation,\n metadataJson: plan.metadataJson,\n summary: plan.summary,\n },\n };\n }\n\n async createMigrationArtifacts(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(mappingDto.dataSource);\n\n if (!mappingDto.modelId) {\n throw new BadRequestException(\"Persist the model mapping first so the generated entity can be registered before creating migration artifacts.\");\n }\n\n if (plan.migration.willGenerate && plan.migration.content && plan.migration.filePath) {\n await fs.mkdir(path.dirname(plan.migration.filePath), { recursive: true });\n await fs.writeFile(plan.migration.filePath, plan.migration.content, \"utf8\");\n }\n\n const datasourceFile = await this.syncTypeormDatasourceFile(\n module.name,\n datasource,\n plan.modelPayload.singularName,\n );\n\n return {\n data: {\n modelId: mappingDto.modelId,\n operation: plan.operation,\n migration: {\n ...plan.migration,\n written: Boolean(plan.migration.willGenerate && plan.migration.filePath),\n },\n datasourceFile,\n summary: plan.summary,\n },\n };\n }\n\n async generateCode(moduleId: number) {\n await this.loadModule(moduleId);\n const output = await this.moduleMetadataService.generateCodeViaCtl(moduleId);\n\n return {\n data: {\n moduleId,\n output,\n message: \"Module code generation completed.\",\n },\n };\n }\n\n async runMigration(moduleId: number, datasourceName: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n const cwd = path.join(process.cwd(), \"..\");\n const outputs: string[] = [];\n\n const migrationOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"migration\", \"-d\", datasource.name, \"run\"],\n cwd,\n });\n outputs.push([\n `npx @solidxai/solidctl@latest migration -d ${datasource.name} run`,\n migrationOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n const buildOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"build\"],\n cwd,\n });\n outputs.push([\n \"npx @solidxai/solidctl@latest build\",\n buildOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n const seedOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"seed\", \"--modules-to-seed\", module.name],\n cwd,\n });\n outputs.push([\n `npx @solidxai/solidctl@latest seed --modules-to-seed ${module.name}`,\n seedOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n return {\n data: {\n moduleId,\n datasource: datasource.name,\n output: outputs.join(\"\\n\\n\"),\n command: [\n `npx @solidxai/solidctl@latest migration -d ${datasource.name} run`,\n \"npx @solidxai/solidctl@latest build\",\n `npx @solidxai/solidctl@latest seed --modules-to-seed ${module.name}`,\n ].join(\"\\n\"),\n message: `Migration, build, and seed completed successfully for datasource \"${datasource.name}\".`,\n },\n };\n }\n\n private async buildMappingPreview(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto): Promise<MappingPreviewRecord> {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(mappingDto.dataSource);\n\n if (datasource.synchronize === true) {\n throw new BadRequestException(this.buildSynchronizeBlockedMessage(datasource));\n }\n\n const inventory = await this.buildTableInventory(datasource);\n const tableKey = this.toTableKey(mappingDto.schema ?? null, mappingDto.tableName);\n const tableRecord = inventory.recordsByKey.get(tableKey);\n if (!tableRecord) {\n throw new NotFoundException(`Table \"${mappingDto.tableName}\" was not found on datasource \"${datasource.name}\".`);\n }\n const tableColumns = inventory.columnsByKey.get(tableKey) ?? [];\n this.validateTablePrimaryKeyForMapping(tableRecord, tableColumns, mappingDto);\n\n const existingModel = mappingDto.mapped && mappingDto.modelId\n ? await this.modelMetadataRepository.findOne({\n where: { id: mappingDto.modelId },\n relations: [\"fields\", \"module\", \"parentModel\"],\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n })\n : null;\n\n if (mappingDto.mapped && !existingModel) {\n throw new NotFoundException(`Mapped model \"${mappingDto.modelId}\" was not found.`);\n }\n\n const reviewedModel = this.normalizeReviewedMetadataModel(mappingDto.reviewedModel, mappingDto, tableColumns);\n const modelPayload = reviewedModel\n ? this.buildModelPayloadFromReviewedModel(moduleId, mappingDto, existingModel, reviewedModel)\n : this.buildModelPayload(moduleId, mappingDto, existingModel);\n const metadataJson = reviewedModel\n ? await this.buildMetadataJsonPreviewFromReviewedModel(module.name, reviewedModel)\n : await this.buildMetadataJsonPreview(module.name, mappingDto, existingModel);\n const migration = await this.buildMigrationPreview(module.name, datasource, mappingDto, tableColumns);\n const includedColumnNames = mappingDto.columns\n .filter((column) => !column.handledBySuperclass && column.include)\n .map((column) => column.columnName);\n const removedColumnNames = mappingDto.columns\n .filter((column) => column.matched && !column.handledBySuperclass && !column.include)\n .map((column) => column.columnName);\n\n return {\n operation: mappingDto.mapped ? \"update\" : \"create\",\n mappedModelId: mappingDto.modelId ?? null,\n metadataJson,\n migration,\n datasourceFile: {\n filePath: path.resolve(process.cwd(), \"src\", `typeorm-${datasource.name}-datasource.ts`),\n created: false,\n updated: false,\n entityRegistered: false,\n migrationGlobRegistered: false,\n },\n summary: {\n includedColumnNames,\n removedColumnNames,\n missingSystemColumns: migration.missingSystemColumns,\n generatedSystemColumnCount: migration.missingSystemColumns.length,\n },\n modelPayload,\n };\n }\n\n private buildModelPayload(\n moduleId: number,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ): CreateModelMetadataDto | UpdateModelMetaDataDto {\n const includedColumns = mappingDto.columns.filter((column) => !column.handledBySuperclass && column.include);\n const matchedFieldIds = new Set<number>(\n mappingDto.columns\n .filter((column) => typeof column.fieldId === \"number\")\n .map((column) => column.fieldId as number),\n );\n\n const preservedFieldPayloads = existingModel\n ? existingModel.fields\n .filter((field) => field.isSystem || !matchedFieldIds.has(field.id))\n .map((field) => this.sanitizeExistingFieldPayload(field))\n : [];\n\n const updatedFieldPayloads = includedColumns.map((column) => {\n const existingField = existingModel?.fields?.find((field) => field.id === column.fieldId) ?? null;\n return this.buildFieldPayload(column, mappingDto, existingField);\n });\n\n return {\n singularName: mappingDto.singularName.trim(),\n pluralName: mappingDto.pluralName.trim(),\n displayName: mappingDto.displayName.trim(),\n description: mappingDto.description.trim() || mappingDto.displayName.trim(),\n dataSource: mappingDto.dataSource,\n dataSourceType: mappingDto.dataSourceType,\n tableName: mappingDto.tableName,\n enableSoftDelete: mappingDto.enableSoftDelete,\n enableAuditTracking: mappingDto.enableAuditTracking,\n internationalisation: mappingDto.internationalisation,\n draftPublishWorkflow: mappingDto.draftPublishWorkflow,\n moduleId,\n fields: [...preservedFieldPayloads, ...updatedFieldPayloads],\n isSystem: false,\n isChild: false,\n parentModelId: null,\n parentModelUserKey: \"\",\n legacyTableType: mappingDto.legacyTableType,\n };\n }\n\n private buildModelPayloadFromReviewedModel(\n moduleId: number,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n reviewedModel: ReviewedMetadataModel,\n ): CreateModelMetadataDto | UpdateModelMetaDataDto {\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n reviewedModel.fields,\n reviewedModel.userKeyFieldUserKey,\n mappingDto.userKeyField,\n );\n const systemFieldPayloads = existingModel\n ? existingModel.fields\n .filter((field) => field.isSystem)\n .map((field) => this.sanitizeExistingFieldPayload(field))\n : [];\n\n const reviewedFieldPayloads = reviewedModel.fields.map((field) => {\n const matchedExistingField = this.matchExistingFieldForReviewedModel(field, mappingDto, existingModel);\n return {\n ...field,\n ...(matchedExistingField?.id ? { id: matchedExistingField.id } : {}),\n isUserKey: field.name === resolvedUserKeyFieldName,\n isSystem: field.isSystem ?? false,\n };\n });\n\n return {\n singularName: reviewedModel.singularName.trim(),\n pluralName: reviewedModel.pluralName.trim(),\n displayName: reviewedModel.displayName.trim(),\n description: reviewedModel.description.trim() || reviewedModel.displayName.trim(),\n dataSource: reviewedModel.dataSource,\n dataSourceType: reviewedModel.dataSourceType,\n tableName: reviewedModel.tableName,\n enableSoftDelete: reviewedModel.enableSoftDelete,\n enableAuditTracking: reviewedModel.enableAuditTracking,\n internationalisation: reviewedModel.internationalisation,\n draftPublishWorkflow: reviewedModel.draftPublishWorkflow,\n moduleId,\n fields: [...systemFieldPayloads, ...reviewedFieldPayloads],\n isSystem: false,\n isChild: false,\n parentModelId: null,\n parentModelUserKey: reviewedModel.parentModelUserKey ?? \"\",\n legacyTableType: reviewedModel.legacyTableType,\n };\n }\n\n private async buildMetadataJsonPreview(\n moduleName: string,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n const previewFields = await this.buildMetadataPreviewFields(mappingDto, existingModel);\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n previewFields,\n mappingDto.userKeyField,\n mappingDto.userKeyField,\n ) ?? mappingDto.userKeyField;\n\n return {\n filePath,\n model: {\n singularName: mappingDto.singularName.trim(),\n pluralName: mappingDto.pluralName.trim(),\n displayName: mappingDto.displayName.trim(),\n description: mappingDto.description.trim() || mappingDto.displayName.trim(),\n dataSource: mappingDto.dataSource,\n dataSourceType: mappingDto.dataSourceType,\n tableName: mappingDto.tableName,\n userKeyFieldUserKey: resolvedUserKeyFieldName,\n isChild: false,\n legacyTableType: mappingDto.legacyTableType,\n parentModelUserKey: \"\",\n enableAuditTracking: mappingDto.enableAuditTracking,\n enableSoftDelete: mappingDto.enableSoftDelete,\n draftPublishWorkflow: mappingDto.draftPublishWorkflow,\n internationalisation: mappingDto.internationalisation,\n fields: previewFields,\n },\n };\n }\n\n private async buildMetadataJsonPreviewFromReviewedModel(\n moduleName: string,\n reviewedModel: ReviewedMetadataModel,\n ) {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n\n return {\n filePath,\n model: reviewedModel,\n };\n }\n\n private async buildMetadataPreviewFields(\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const finalFields = new Map<string, any>();\n const existingFields = existingModel?.fields ?? [];\n const matchedFieldIds = new Set<number>(\n mappingDto.columns\n .filter((column) => typeof column.fieldId === \"number\")\n .map((column) => column.fieldId as number),\n );\n const includedColumns = mappingDto.columns.filter((column) => !column.handledBySuperclass && column.include);\n\n for (const field of existingFields) {\n if (field.isSystem || !matchedFieldIds.has(field.id)) {\n finalFields.set(this.toFieldPreviewKey(field.id, field.name), this.sanitizeExistingFieldPayload(field));\n }\n }\n\n for (const column of includedColumns) {\n const existingField = existingFields.find((field) => field.id === column.fieldId) ?? null;\n const fieldPayload = this.buildFieldPayload(column, mappingDto, existingField);\n finalFields.set(this.toFieldPreviewKey(fieldPayload.id ?? null, fieldPayload.name), fieldPayload);\n }\n\n for (const column of mappingDto.columns.filter((entry) => entry.matched && !entry.include && entry.fieldId)) {\n const existingField = existingFields.find((field) => field.id === column.fieldId);\n if (!existingField || existingField.isSystem) {\n continue;\n }\n\n finalFields.set(\n this.toFieldPreviewKey(existingField.id, existingField.name),\n {\n ...this.sanitizeExistingFieldPayload(existingField),\n isMarkedForRemoval: true,\n isUserKey: false,\n },\n );\n }\n\n const serialized = Array.from(finalFields.values())\n .filter((field) => !field.isSystem)\n .sort((left, right) => {\n const leftOrder = typeof left.id === \"number\" ? left.id : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.id === \"number\" ? right.id : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return `${left.name}`.localeCompare(`${right.name}`);\n });\n\n const previewFields: Record<string, any>[] = [];\n for (const field of serialized) {\n previewFields.push(await this.fieldMetadataService.createFieldConfig(field as any));\n }\n\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n previewFields,\n mappingDto.userKeyField,\n mappingDto.userKeyField,\n );\n\n for (const field of previewFields) {\n field.isUserKey = field.name === resolvedUserKeyFieldName;\n }\n\n return previewFields;\n }\n\n private async buildMigrationPreview(\n moduleName: string,\n datasource: DatasourceRecord,\n mappingDto: DatasourceIntrospectionMappingDto,\n tableColumns: DatasourceIntrospectionColumn[],\n ) {\n const systemColumnDefinitions = this.getLegacySystemColumnDefinitions(mappingDto.legacyTableType, datasource.type);\n const existingColumns = new Set(tableColumns.map((column) => column.columnName.toLowerCase()));\n const missingSystemColumns = systemColumnDefinitions.filter((definition) => !existingColumns.has(definition.columnName.toLowerCase()));\n const removedLegacyMappings = mappingDto.columns.filter((column) => column.matched && !column.include && !column.handledBySuperclass);\n\n if (!missingSystemColumns.length) {\n return {\n willGenerate: false,\n filePath: null,\n fileName: null,\n className: null,\n timestamp: mappingDto.plannedMigrationTimestamp ?? null,\n content: null,\n note: removedLegacyMappings.length\n ? \"No migration will be generated for this change because it only updates metadata mapping for existing legacy columns.\"\n : \"All required SolidX system columns already exist on this table, so no migration will be generated.\",\n missingSystemColumns: [],\n };\n }\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(moduleName);\n const migrationTimestamp = mappingDto.plannedMigrationTimestamp ?? Date.now();\n const migrationBaseName = `Sync${startCase(this.toSingularNameCandidate(mappingDto.tableName)).replace(/\\s+/g, \"\")}SolidxSystemFields`;\n const className = `${migrationBaseName}${migrationTimestamp}`;\n const fileName = `${migrationTimestamp}-${migrationBaseName}.ts`;\n const filePath = path.join(modulePath, \"migrations\", datasource.name, fileName);\n\n return {\n willGenerate: true,\n filePath,\n fileName,\n className,\n timestamp: migrationTimestamp,\n content: this.renderMigrationTemplate(className, mappingDto, missingSystemColumns),\n note: `Saving this mapping will also write a template migration for the missing SolidX system columns: ${missingSystemColumns.map((column) => column.columnName).join(\", \")}.`,\n missingSystemColumns: missingSystemColumns.map((column) => column.columnName),\n };\n }\n\n private sanitizeExistingFieldPayload(field: any) {\n const {\n createdAt,\n updatedAt,\n deletedAt,\n model,\n mediaStorageProvider,\n identifier,\n ...rest\n } = field ?? {};\n\n if (mediaStorageProvider?.id && !rest.mediaStorageProviderId) {\n rest.mediaStorageProviderId = mediaStorageProvider.id;\n }\n\n return rest;\n }\n\n private sanitizeConfiguredFieldPayload(fieldConfig: Record<string, any> | undefined) {\n if (!fieldConfig || typeof fieldConfig !== \"object\" || Array.isArray(fieldConfig)) {\n return {};\n }\n\n return this.sanitizeExistingFieldPayload(fieldConfig);\n }\n\n private normalizeReviewedMetadataModel(\n reviewedModel: Record<string, any> | undefined,\n mappingDto: DatasourceIntrospectionMappingDto,\n tableColumns: DatasourceIntrospectionColumn[],\n ): ReviewedMetadataModel | null {\n if (!reviewedModel) {\n return null;\n }\n\n if (typeof reviewedModel !== \"object\" || Array.isArray(reviewedModel)) {\n throw new BadRequestException(\"Reviewed metadata JSON must be a valid object.\");\n }\n\n const readString = (key: string, allowEmpty = false) => {\n const value = reviewedModel[key];\n if (typeof value !== \"string\") {\n throw new BadRequestException(`Reviewed metadata JSON is missing a valid \"${key}\" string value.`);\n }\n\n const trimmed = value.trim();\n if (!allowEmpty && !trimmed) {\n throw new BadRequestException(`Reviewed metadata JSON cannot leave \"${key}\" blank.`);\n }\n\n return trimmed;\n };\n\n const readBoolean = (key: string) => {\n const value = reviewedModel[key];\n if (typeof value !== \"boolean\") {\n throw new BadRequestException(`Reviewed metadata JSON is missing a valid \"${key}\" boolean value.`);\n }\n return value;\n };\n\n const rawFields = reviewedModel.fields;\n if (!Array.isArray(rawFields)) {\n throw new BadRequestException(\"Reviewed metadata JSON must contain a fields array.\");\n }\n\n const immutableKeyChecks: Array<{ key: keyof DatasourceIntrospectionMappingDto; label: string }> = [\n { key: \"dataSource\", label: \"dataSource\" },\n { key: \"dataSourceType\", label: \"dataSourceType\" },\n { key: \"tableName\", label: \"tableName\" },\n { key: \"legacyTableType\", label: \"legacyTableType\" },\n ];\n\n for (const check of immutableKeyChecks) {\n if (`${reviewedModel[check.label] ?? \"\"}` !== `${mappingDto[check.key] ?? \"\"}`) {\n throw new BadRequestException(`Reviewed metadata JSON cannot change immutable binding key \"${check.label}\".`);\n }\n }\n\n const normalizedFields = rawFields.map((field, index) => this.normalizeReviewedField(field, index));\n const fieldNames = new Set<string>();\n for (const field of normalizedFields) {\n const loweredName = field.name.toLowerCase();\n if (fieldNames.has(loweredName)) {\n throw new BadRequestException(`Reviewed metadata JSON contains duplicate field name \"${field.name}\".`);\n }\n fieldNames.add(loweredName);\n }\n\n const requestedUserKeyFieldUserKey = readString(\"userKeyFieldUserKey\");\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n normalizedFields,\n requestedUserKeyFieldUserKey,\n mappingDto.userKeyField,\n );\n const inheritedGeneratedIdUserKey = this.isGeneratedIdInheritedUserKey(\n mappingDto.legacyTableType,\n requestedUserKeyFieldUserKey,\n );\n if (!resolvedUserKeyFieldName && !inheritedGeneratedIdUserKey) {\n throw new BadRequestException(\"Reviewed metadata JSON must keep the selected userKeyFieldUserKey in the fields array.\");\n }\n\n this.validateReviewedPrimaryKeyFields(normalizedFields, tableColumns);\n\n const userKeyFieldUserKey = resolvedUserKeyFieldName ?? requestedUserKeyFieldUserKey;\n\n return {\n singularName: readString(\"singularName\"),\n pluralName: readString(\"pluralName\"),\n displayName: readString(\"displayName\"),\n description: readString(\"description\", true),\n dataSource: readString(\"dataSource\"),\n dataSourceType: readString(\"dataSourceType\"),\n tableName: readString(\"tableName\"),\n userKeyFieldUserKey,\n isChild: false,\n legacyTableType: mappingDto.legacyTableType,\n parentModelUserKey: typeof reviewedModel.parentModelUserKey === \"string\" ? reviewedModel.parentModelUserKey : \"\",\n enableAuditTracking: readBoolean(\"enableAuditTracking\"),\n enableSoftDelete: readBoolean(\"enableSoftDelete\"),\n draftPublishWorkflow: readBoolean(\"draftPublishWorkflow\"),\n internationalisation: readBoolean(\"internationalisation\"),\n fields: normalizedFields.map((field) => ({\n ...field,\n isUserKey: field.name === resolvedUserKeyFieldName,\n })),\n };\n }\n\n private resolveReviewedUserKeyFieldName(\n reviewedFields: Array<Record<string, any>>,\n requestedUserKeyFieldName: string,\n fallbackUserKeyFieldName?: string,\n ) {\n const activeFields = reviewedFields.filter((field) => !field.isMarkedForRemoval);\n const normalizedRequested = `${requestedUserKeyFieldName ?? \"\"}`.trim().toLowerCase();\n const normalizedFallback = `${fallbackUserKeyFieldName ?? \"\"}`.trim().toLowerCase();\n\n const byExactRequested = activeFields.find((field) => field.name?.toLowerCase?.() === normalizedRequested);\n if (byExactRequested) {\n return byExactRequested.name;\n }\n\n const byExistingUserKeyFlag = activeFields.find((field) => field.isUserKey);\n if (byExistingUserKeyFlag) {\n return byExistingUserKeyFlag.name;\n }\n\n const byPrimaryKeyFallback = activeFields.find((field) => {\n if (!field.isPrimaryKey) {\n return false;\n }\n\n const normalizedName = `${field.name ?? \"\"}`.trim().toLowerCase();\n return normalizedName === normalizedFallback || normalizedName === \"id\" || normalizedName === \"legacyid\";\n });\n if (byPrimaryKeyFallback) {\n return byPrimaryKeyFallback.name;\n }\n\n const byFallbackFieldName = activeFields.find((field) => field.name?.toLowerCase?.() === normalizedFallback);\n return byFallbackFieldName?.name ?? null;\n }\n\n private isGeneratedIdInheritedUserKey(\n legacyTableType: LegacyTableType,\n requestedUserKeyFieldName: string | null | undefined,\n ) {\n return legacyTableType === LegacyTableType.GENERATED_ID\n && `${requestedUserKeyFieldName ?? \"\"}`.trim().toLowerCase() === \"id\";\n }\n\n private normalizeReviewedField(field: any, index: number) {\n if (!field || typeof field !== \"object\" || Array.isArray(field)) {\n throw new BadRequestException(`Reviewed metadata JSON field at index ${index} is not a valid object.`);\n }\n\n if (typeof field.name !== \"string\" || !field.name.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field at index ${index} must include a non-empty \"name\".`);\n }\n\n if (typeof field.type !== \"string\" || !field.type.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"type\".`);\n }\n\n if (typeof field.ormType !== \"string\" || !field.ormType.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"ormType\".`);\n }\n\n if (typeof field.columnName !== \"string\" || !field.columnName.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"columnName\".`);\n }\n\n return {\n ...field,\n name: field.name.trim(),\n type: field.type.trim(),\n ormType: field.ormType.trim(),\n columnName: field.columnName.trim(),\n displayName: typeof field.displayName === \"string\" && field.displayName.trim()\n ? field.displayName.trim()\n : startCase(field.name),\n description: typeof field.description === \"string\" ? field.description : \"\",\n };\n }\n\n private matchExistingFieldForReviewedModel(\n reviewedField: Record<string, any>,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const nonSystemFields = existingModel?.fields?.filter((field) => !field.isSystem) ?? [];\n const byColumnName = typeof reviewedField.columnName === \"string\"\n ? mappingDto.columns.find((column) => column.columnName.toLowerCase() === reviewedField.columnName.toLowerCase())\n : null;\n if (byColumnName?.fieldId) {\n return nonSystemFields.find((field) => field.id === byColumnName.fieldId) ?? null;\n }\n\n const byColumnOnExisting = typeof reviewedField.columnName === \"string\"\n ? nonSystemFields.find((field) => `${field.columnName ?? \"\"}`.toLowerCase() === reviewedField.columnName.toLowerCase())\n : null;\n if (byColumnOnExisting) {\n return byColumnOnExisting;\n }\n\n const byName = nonSystemFields.find((field) => field.name?.toLowerCase?.() === reviewedField.name.toLowerCase());\n return byName ?? null;\n }\n\n private buildFieldPayload(\n column: DatasourceIntrospectionMappingColumnDto,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingField?: any,\n ) {\n const preserved = existingField ? this.sanitizeExistingFieldPayload(existingField) : {};\n const configured = this.sanitizeConfiguredFieldPayload(column.fieldConfig);\n const merged = {\n ...preserved,\n ...configured,\n };\n const maxLength =\n column.characterMaximumLength && [\"shortText\", \"longText\"].includes(column.solidFieldType)\n ? column.characterMaximumLength\n : merged.max;\n\n return {\n ...merged,\n ...(column.fieldId ? { id: column.fieldId } : {}),\n name: column.fieldName,\n displayName: column.displayName?.trim() || merged.displayName || startCase(column.fieldName),\n description: merged.description ?? \"\",\n type: column.solidFieldType,\n ormType: column.ormType,\n length: merged.length ?? column.characterMaximumLength ?? undefined,\n defaultValue: merged.defaultValue ?? column.defaultValue ?? undefined,\n required: merged.required ?? (!column.nullable || column.isPrimaryKey),\n unique: merged.unique ?? false,\n encrypt: merged.encrypt ?? false,\n index: merged.index ?? false,\n max: maxLength ?? undefined,\n min: merged.min ?? undefined,\n private: merged.private ?? false,\n isSystem: merged.isSystem ?? false,\n isMarkedForRemoval: false,\n columnName: column.columnName,\n isUserKey: mappingDto.userKeyField === column.fieldName,\n enableAuditTracking: merged.enableAuditTracking ?? mappingDto.enableAuditTracking,\n isMultiSelect: merged.isMultiSelect ?? false,\n isPrimaryKey: column.isPrimaryKey,\n };\n }\n\n private toFieldPreviewKey(id: number | null | undefined, name: string) {\n return typeof id === \"number\" ? `id:${id}` : `name:${name.toLowerCase()}`;\n }\n\n private getLegacySystemColumnDefinitions(legacyTableType: LegacyTableType, datasourceType: string): SystemColumnDefinition[] {\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const timestampType = normalizedDatasourceType === \"postgres\"\n ? \"timestamp\"\n : normalizedDatasourceType === \"mysql\"\n ? \"datetime\"\n : \"datetime2\";\n const publishedAtType = normalizedDatasourceType === \"postgres\"\n ? \"timestamp\"\n : \"datetime\";\n const integerType = normalizedDatasourceType === \"postgres\" ? \"integer\" : \"int\";\n const varcharType = normalizedDatasourceType === \"mssql\" ? \"nvarchar\" : \"varchar\";\n const currentTimestampDefault = normalizedDatasourceType === \"postgres\"\n ? \"now()\"\n : normalizedDatasourceType === \"mysql\"\n ? \"CURRENT_TIMESTAMP\"\n : \"getdate()\";\n return this.modelMetadataHelperService\n .getSystemFieldsMetadata(legacyTableType)\n .map((field) => {\n switch (field.name) {\n case \"id\":\n return {\n columnName: field.columnName,\n type: integerType,\n isNullable: false,\n isGenerated: true,\n isUnique: true,\n } satisfies SystemColumnDefinition;\n case \"createdAt\":\n case \"updatedAt\":\n return {\n columnName: field.columnName,\n type: timestampType,\n isNullable: false,\n defaultExpression: currentTimestampDefault,\n } satisfies SystemColumnDefinition;\n case \"deletedAt\":\n return {\n columnName: field.columnName,\n type: timestampType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"deletedTracker\":\n return {\n columnName: field.columnName,\n type: varcharType,\n length: \"255\",\n isNullable: false,\n defaultExpression: \"'not-deleted'\",\n } satisfies SystemColumnDefinition;\n case \"publishedAt\":\n return {\n columnName: field.columnName,\n type: publishedAtType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"localeName\":\n return {\n columnName: field.columnName,\n type: \"varchar\",\n length: \"255\",\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"defaultEntityLocaleId\":\n case \"createdBy\":\n case \"updatedBy\":\n return {\n columnName: field.columnName,\n type: integerType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n default:\n return {\n columnName: field.columnName,\n type: \"varchar\",\n isNullable: true,\n } satisfies SystemColumnDefinition;\n }\n });\n }\n\n private renderMigrationTemplate(\n className: string,\n mappingDto: DatasourceIntrospectionMappingDto,\n missingSystemColumns: SystemColumnDefinition[],\n ) {\n const tableNameLiteral = this.toMigrationTableName(mappingDto.schema, mappingDto.tableName);\n const deletedAtIndexName = this.buildMigrationObjectName(\"IDX\", tableNameLiteral, \"ss_deleted_at\");\n const generatedIdUniqueName = this.buildMigrationObjectName(\"UQ\", tableNameLiteral, \"ss_id\");\n\n const upColumnStatements = missingSystemColumns.map((definition) => {\n const columnLiteral = this.renderTableColumnLiteral(definition);\n return ` if (!(await queryRunner.hasColumn(tableName, ${JSON.stringify(definition.columnName)})))\\n`\n + ` await queryRunner.addColumn(tableName, new TableColumn(${columnLiteral}));`;\n }).join(\"\\n\\n\");\n\n const postUpStatements: string[] = [];\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_deleted_at\")) {\n postUpStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` if (table && !table.indices.some((index) => index.name === ${JSON.stringify(deletedAtIndexName)}))`,\n ` await queryRunner.createIndex(tableName, new TableIndex(${this.renderTableIndexLiteral({\n name: deletedAtIndexName,\n columnNames: [\"ss_deleted_at\"],\n })}));`,\n \" }\",\n ].join(\"\\n\"),\n );\n }\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_id\")) {\n postUpStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` if (table && !table.indices.some((index) => index.name === ${JSON.stringify(generatedIdUniqueName)}))`,\n ` await queryRunner.createIndex(tableName, new TableIndex(${this.renderTableIndexLiteral({\n name: generatedIdUniqueName,\n columnNames: [\"ss_id\"],\n isUnique: true,\n })}));`,\n \" }\",\n ].join(\"\\n\"),\n );\n }\n\n const downStatements: string[] = [];\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_id\")) {\n downStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` const index = table?.indices.find((entry) => entry.name === ${JSON.stringify(generatedIdUniqueName)});`,\n \" if (index)\",\n \" await queryRunner.dropIndex(tableName, index);\",\n \" }\",\n ].join(\"\\n\"),\n );\n }\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_deleted_at\")) {\n downStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` const index = table?.indices.find((entry) => entry.name === ${JSON.stringify(deletedAtIndexName)});`,\n \" if (index)\",\n \" await queryRunner.dropIndex(tableName, index);\",\n \" }\",\n ].join(\"\\n\"),\n );\n }\n downStatements.push(\n ...missingSystemColumns\n .slice()\n .reverse()\n .map((definition) => ` if (await queryRunner.hasColumn(tableName, ${JSON.stringify(definition.columnName)}))\\n`\n + ` await queryRunner.dropColumn(tableName, ${JSON.stringify(definition.columnName)});`),\n );\n\n return [\n \"import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from \\\"typeorm\\\";\",\n \"\",\n `export class ${className} implements MigrationInterface {`,\n ` name = '${className}'`,\n \"\",\n \" public async up(queryRunner: QueryRunner): Promise<void> {\",\n ` const tableName = ${JSON.stringify(tableNameLiteral)};`,\n upColumnStatements,\n postUpStatements.length ? `\\n${postUpStatements.join(\"\\n\\n\")}` : \"\",\n \" }\",\n \"\",\n \" public async down(queryRunner: QueryRunner): Promise<void> {\",\n ` const tableName = ${JSON.stringify(tableNameLiteral)};`,\n downStatements.join(\"\\n\\n\"),\n \" }\",\n \"}\",\n \"\",\n ].filter(Boolean).join(\"\\n\");\n }\n\n private renderTableColumnLiteral(definition: SystemColumnDefinition) {\n const properties: string[] = [\n `name: ${JSON.stringify(definition.columnName)}`,\n `type: ${JSON.stringify(definition.type)}`,\n ];\n\n if (definition.length) {\n properties.push(`length: ${JSON.stringify(definition.length)}`);\n }\n if (typeof definition.isNullable === \"boolean\") {\n properties.push(`isNullable: ${definition.isNullable}`);\n }\n if (definition.defaultExpression) {\n properties.push(`default: ${JSON.stringify(definition.defaultExpression)}`);\n }\n if (definition.isGenerated) {\n properties.push(\"isGenerated: true\");\n properties.push(\"generationStrategy: \\\"increment\\\"\");\n }\n if (definition.isUnique) {\n properties.push(\"isUnique: true\");\n }\n\n return `{ ${properties.join(\", \")}, }`;\n }\n\n private renderTableIndexLiteral(definition: { name: string; columnNames: string[]; isUnique?: boolean }) {\n const properties: string[] = [\n `name: ${JSON.stringify(definition.name)}`,\n `columnNames: ${JSON.stringify(definition.columnNames)}`,\n ];\n\n if (definition.isUnique) {\n properties.push(\"isUnique: true\");\n }\n\n return `{ ${properties.join(\", \")}, }`;\n }\n\n private buildMigrationObjectName(prefix: string, tableName: string, columnName: string) {\n const hash = createHash(\"md5\").update(`${tableName}:${columnName}:${prefix}`).digest(\"hex\").slice(0, 24);\n return `${prefix}_${hash}`;\n }\n\n private toMigrationTableName(schema: string | null | undefined, tableName: string) {\n return schema ? `${schema}.${tableName}` : tableName;\n }\n\n private async buildRawDdl(\n provider: DatasourceIntrospectionProvider,\n dataSource: DataSource,\n table: DatasourceIntrospectionTableRef,\n ): Promise<TableDdlRecord> {\n try {\n const statement = await provider.getTableDefinition(dataSource, table);\n return {\n statement,\n available: Boolean(statement),\n note: statement ? null : \"The datasource provider did not return a CREATE TABLE statement for this table.\",\n };\n } catch (error) {\n return {\n statement: null,\n available: false,\n note: `DDL preview is unavailable right now: ${(error as Error)?.message ?? \"Unknown error.\"}`,\n };\n }\n }\n\n private async buildTableInventory(datasource: DatasourceRecord) {\n const provider = this.getProvider(datasource.type);\n const runtimeDataSource = this.resolveDataSourceByName(datasource.name);\n const [rawTables, rawColumns, models] = await Promise.all([\n provider.listTables(runtimeDataSource),\n provider.listColumns(runtimeDataSource),\n this.modelMetadataRepository.find({ relations: { module: true } as any }),\n ]);\n const tables = rawTables.filter((table) => !this.isSolidxInternalTableName(table.tableName));\n const columns = rawColumns.filter((column) => !this.isSolidxInternalTableName(column.tableName));\n\n const modelLookup = this.buildModelLookup(models);\n const columnsByKey = this.groupColumnsByTable(columns);\n const tableKeys = new Set<string>();\n\n for (const table of tables) {\n tableKeys.add(this.toTableKey(table.tableSchema, table.tableName));\n }\n\n for (const column of columns) {\n tableKeys.add(this.toTableKey(column.tableSchema, column.tableName));\n }\n\n const records = Array.from(tableKeys)\n .map((tableKey) => {\n const matchingTable = tables.find((table) => this.toTableKey(table.tableSchema, table.tableName) === tableKey);\n const tableColumns = columnsByKey.get(tableKey) ?? [];\n const schema = matchingTable?.tableSchema ?? tableColumns[0]?.tableSchema ?? null;\n const tableName = matchingTable?.tableName ?? tableColumns[0]?.tableName;\n if (!tableName) {\n return null;\n }\n\n const suggestedLegacyTableType = this.detectLegacyTableType(datasource.type, tableColumns);\n const suggestedIdColumn = this.getSuggestedIdColumn(datasource.type, tableColumns, suggestedLegacyTableType);\n const mappedModel = this.resolveMappedModel(modelLookup, datasource.name, tableName);\n const physicalColumns = tableColumns.filter((column) => !this.isHandledBySuperclass(column.columnName, suggestedLegacyTableType));\n const primaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n const hasPrimaryKey = primaryKeyColumns.length > 0;\n\n return {\n schema,\n tableName,\n mapped: Boolean(mappedModel),\n mappedModelId: mappedModel?.id ?? null,\n mappedModelSingularName: mappedModel?.singularName ?? null,\n mappedModelDisplayName: mappedModel?.displayName ?? null,\n mappedModuleId: mappedModel?.module?.id ?? null,\n mappedModuleName: mappedModel?.module?.name ?? null,\n mappedModuleDisplayName: mappedModel?.module?.displayName ?? null,\n suggestedLegacyTableType,\n suggestedBaseClassName: this.getBaseClassName(suggestedLegacyTableType),\n suggestedIdColumnName: suggestedIdColumn?.columnName ?? null,\n suggestedUserKeyField: this.buildUserKeyCandidates(tableColumns)[0]?.name ?? \"id\",\n columnCount: tableColumns.length,\n physicalColumnCount: physicalColumns.length,\n hasPrimaryKey,\n primaryKeyColumnCount: primaryKeyColumns.length,\n primaryKeyColumnNames: primaryKeyColumns.map((column) => column.columnName),\n mappingBlockedReason: hasPrimaryKey\n ? null\n : this.buildMissingPrimaryKeyMessage(tableName),\n } satisfies TableInventoryRecord;\n })\n .filter((record): record is TableInventoryRecord => Boolean(record))\n .sort((left, right) => {\n if (left.mapped !== right.mapped) {\n return left.mapped ? 1 : -1;\n }\n\n const leftLabel = `${left.schema ?? \"\"}.${left.tableName}`.toLowerCase();\n const rightLabel = `${right.schema ?? \"\"}.${right.tableName}`.toLowerCase();\n return leftLabel.localeCompare(rightLabel);\n });\n\n return {\n records,\n recordsByKey: new Map(records.map((record) => [this.toTableKey(record.schema, record.tableName), record])),\n columnsByKey,\n };\n }\n\n private buildModelLookup(models: ModelMetadata[]) {\n const byDatasourceAndTable = new Map<string, ModelMetadata>();\n const byTableName = new Map<string, ModelMetadata[]>();\n\n for (const model of models) {\n if (!model.tableName) {\n continue;\n }\n\n byDatasourceAndTable.set(this.toModelMapKey(model.dataSource, model.tableName), model);\n\n const normalizedTableName = model.tableName.trim().toLowerCase();\n const bucket = byTableName.get(normalizedTableName);\n if (bucket) {\n bucket.push(model);\n continue;\n }\n\n byTableName.set(normalizedTableName, [model]);\n }\n\n return {\n byDatasourceAndTable,\n byTableName,\n };\n }\n\n private resolveMappedModel(\n lookup: {\n byDatasourceAndTable: Map<string, ModelMetadata>;\n byTableName: Map<string, ModelMetadata[]>;\n },\n datasourceName: string,\n tableName: string,\n ) {\n const exactMatch = lookup.byDatasourceAndTable.get(this.toModelMapKey(datasourceName, tableName));\n if (exactMatch) {\n return exactMatch;\n }\n\n const fallbackMatches = lookup.byTableName.get(tableName.trim().toLowerCase()) ?? [];\n if (fallbackMatches.length === 1) {\n return fallbackMatches[0];\n }\n\n return fallbackMatches[0] ?? null;\n }\n\n private groupColumnsByTable(columns: DatasourceIntrospectionColumn[]) {\n const grouped = new Map<string, DatasourceIntrospectionColumn[]>();\n\n for (const column of columns) {\n const key = this.toTableKey(column.tableSchema, column.tableName);\n const bucket = grouped.get(key);\n if (bucket) {\n bucket.push(column);\n continue;\n }\n\n grouped.set(key, [column]);\n }\n\n return grouped;\n }\n\n private isSolidxInternalTableName(tableName: string | null | undefined) {\n return typeof tableName === \"string\" && tableName.toLowerCase().startsWith(\"ss_\");\n }\n\n private detectLegacyTableType(datasourceType: string, columns: DatasourceIntrospectionColumn[]): LegacyTableType {\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const hasExistingGeneratedId = columns.some((column) => column.isAutoGenerated);\n\n if ((normalizedDatasourceType === \"mssql\" || normalizedDatasourceType === \"mysql\") && hasExistingGeneratedId) {\n return LegacyTableType.EXISTING_ID;\n }\n\n return LegacyTableType.GENERATED_ID;\n }\n\n private getSuggestedIdColumn(\n datasourceType: string,\n columns: DatasourceIntrospectionColumn[],\n legacyTableType: LegacyTableType,\n ) {\n if (legacyTableType !== LegacyTableType.EXISTING_ID) {\n return null;\n }\n\n const normalizedDatasourceType = datasourceType.toLowerCase();\n if (normalizedDatasourceType !== \"mssql\" && normalizedDatasourceType !== \"mysql\") {\n return null;\n }\n\n return columns.find((column) => column.isAutoGenerated) ?? null;\n }\n\n private buildUserKeyCandidates(columns: DatasourceIntrospectionColumn[]) {\n const eligibleColumns = columns.filter((column) => !column.columnName.toLowerCase().startsWith(\"ss_\"));\n const scoreMap = new Map<string, { name: string; label: string; score: number; reason: string }>();\n const priorityMatchers = [\n { score: 100, reason: \"Exact legacy external identifier\", test: (name: string) => name === \"external_id\" || name === \"externalid\" },\n { score: 95, reason: \"Exact user key style column\", test: (name: string) => name === \"user_key\" || name === \"userkey\" },\n { score: 90, reason: \"Code-style business identifier\", test: (name: string) => name === \"code\" || name.endsWith(\"_code\") },\n { score: 85, reason: \"Reference-style business identifier\", test: (name: string) => name.includes(\"reference\") || name.endsWith(\"_number\") || name.endsWith(\"_no\") },\n { score: 80, reason: \"Human readable display field\", test: (name: string) => name === \"name\" || name === \"display_name\" || name.endsWith(\"_name\") },\n { score: 70, reason: \"Contact field that could identify a record\", test: (name: string) => name === \"email\" || name === \"mobile\" || name === \"phone\" },\n { score: 60, reason: \"Fallback primary identifier\", test: (name: string) => name === \"id\" },\n ];\n\n for (const column of eligibleColumns) {\n const normalizedName = column.columnName.toLowerCase();\n\n for (const matcher of priorityMatchers) {\n if (!matcher.test(normalizedName)) {\n continue;\n }\n\n const existing = scoreMap.get(column.columnName);\n if (!existing || matcher.score > existing.score) {\n scoreMap.set(column.columnName, {\n name: this.toFieldName(column.columnName),\n label: column.columnName,\n score: matcher.score,\n reason: matcher.reason,\n });\n }\n }\n }\n\n const candidates = Array.from(scoreMap.values())\n .sort((left, right) => right.score - left.score || left.label.localeCompare(right.label))\n .map((candidate, index) => ({\n ...candidate,\n isDefault: index === 0,\n }));\n\n if (candidates.length) {\n return candidates;\n }\n\n const hasIdColumn = eligibleColumns.some((column) => column.columnName.toLowerCase() === \"id\");\n return [{\n name: \"id\",\n label: hasIdColumn ? \"id\" : \"id (fallback)\",\n score: 0,\n reason: \"Default to the SolidX id field when no stronger user key candidate is available.\",\n isDefault: true,\n }];\n }\n\n private toDetailColumnRecord(\n column: DatasourceIntrospectionColumn,\n legacyTableType: LegacyTableType,\n datasourceType: string,\n ): TableDetailColumnRecord {\n const superclassFieldName = this.getSuperclassFieldName(column.columnName, legacyTableType);\n const normalizedColumnName = column.columnName.toLowerCase();\n const fieldName = legacyTableType === LegacyTableType.EXISTING_ID && column.isAutoGenerated\n ? \"id\"\n : legacyTableType === LegacyTableType.GENERATED_ID && normalizedColumnName === \"id\"\n ? \"legacyId\"\n : this.toFieldName(column.columnName);\n\n return {\n columnName: column.columnName,\n fieldName,\n displayName: startCase(fieldName),\n dataType: column.dataType,\n solidFieldType: this.toSolidFieldType(column),\n ormType: this.toOrmFieldType(column, datasourceType),\n nullable: column.isNullable,\n defaultValue: column.defaultValue,\n characterMaximumLength: column.characterMaximumLength,\n numericPrecision: column.numericPrecision,\n numericScale: column.numericScale,\n ordinalPosition: column.ordinalPosition,\n isAutoGenerated: column.isAutoGenerated,\n isPrimaryKey: column.isPrimaryKey,\n handledBySuperclass: Boolean(superclassFieldName),\n superclassFieldName,\n };\n }\n\n private validateTablePrimaryKeyForMapping(\n tableRecord: TableInventoryRecord,\n tableColumns: DatasourceIntrospectionColumn[],\n mappingDto: DatasourceIntrospectionMappingDto,\n ) {\n const detectedPrimaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n if (!detectedPrimaryKeyColumns.length) {\n throw new BadRequestException(tableRecord.mappingBlockedReason ?? this.buildMissingPrimaryKeyMessage(tableRecord.tableName));\n }\n\n const requestColumnsByName = new Map(\n mappingDto.columns.map((column) => [column.columnName.trim().toLowerCase(), column]),\n );\n\n for (const primaryKeyColumn of detectedPrimaryKeyColumns) {\n const matchingRequestColumn = requestColumnsByName.get(primaryKeyColumn.columnName.trim().toLowerCase());\n if (!matchingRequestColumn) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" must remain present in the mapping request for table \"${tableRecord.tableName}\".`);\n }\n\n if (!matchingRequestColumn.include) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" cannot be excluded from the mapping for table \"${tableRecord.tableName}\".`);\n }\n\n if (!matchingRequestColumn.isPrimaryKey) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" must stay marked as isPrimaryKey for table \"${tableRecord.tableName}\".`);\n }\n }\n }\n\n private validateReviewedPrimaryKeyFields(\n reviewedFields: Array<Record<string, any>>,\n tableColumns: DatasourceIntrospectionColumn[],\n ) {\n const detectedPrimaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n if (!detectedPrimaryKeyColumns.length) {\n return;\n }\n\n const activeReviewedFields = reviewedFields.filter((field) => !field.isMarkedForRemoval);\n\n for (const primaryKeyColumn of detectedPrimaryKeyColumns) {\n const matchingReviewedField = activeReviewedFields.find((field) =>\n `${field.columnName ?? \"\"}`.trim().toLowerCase() === primaryKeyColumn.columnName.trim().toLowerCase(),\n );\n\n if (!matchingReviewedField) {\n throw new BadRequestException(`Reviewed metadata JSON must keep datasource primary key column \"${primaryKeyColumn.columnName}\" in the fields array.`);\n }\n\n if (!matchingReviewedField.isPrimaryKey) {\n throw new BadRequestException(`Reviewed metadata JSON must keep datasource primary key column \"${primaryKeyColumn.columnName}\" marked with isPrimaryKey: true.`);\n }\n }\n }\n\n private buildMissingPrimaryKeyMessage(tableName: string) {\n return `Table \"${tableName}\" cannot be mapped because the datasource table does not define any primary key. Add a real primary key to the table before continuing with SolidX mapping.`;\n }\n\n private getSuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {\n return this.getLegacySuperclassFieldName(columnName, legacyTableType);\n }\n\n private getLegacySuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {\n const normalized = columnName.toLowerCase();\n const legacyFieldMap: Record<string, string> = {\n ss_created_at: \"createdAt\",\n ss_updated_at: \"updatedAt\",\n ss_deleted_at: \"deletedAt\",\n ss_deleted_tracker: \"deletedTracker\",\n ss_published_at: \"publishedAt\",\n ss_locale_name: \"localeName\",\n ss_default_entity_locale_id: \"defaultEntityLocaleId\",\n ss_created_by_id: \"createdBy\",\n ss_updated_by_id: \"updatedBy\",\n };\n\n if (normalized === \"ss_id\" && legacyTableType === LegacyTableType.GENERATED_ID) {\n return \"id\";\n }\n\n return legacyFieldMap[normalized] ?? null;\n }\n\n private isHandledBySuperclass(columnName: string, legacyTableType: LegacyTableType) {\n return Boolean(this.getSuperclassFieldName(columnName, legacyTableType));\n }\n\n private getBaseClassName(legacyTableType: LegacyTableType) {\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n return \"LegacyCommonEntityWithGeneratedId\";\n }\n\n return \"LegacyCommonEntityWithExistingId\";\n }\n\n private getDatasourceTypeFamily(dataType: string): DatasourceTypeFamily | null {\n const normalized = dataType.toLowerCase();\n\n for (const [family, aliases] of Object.entries(DATASOURCE_TYPE_FAMILY_ALIASES) as Array<[DatasourceTypeFamily, string[]]>) {\n if (aliases.includes(normalized)) {\n return family;\n }\n }\n\n if (normalized.includes(\"json\")) {\n return \"json\";\n }\n\n if (normalized.includes(\"date\")) {\n return \"datetime\";\n }\n\n return null;\n }\n\n private toSolidFieldType(column: DatasourceIntrospectionColumn) {\n const family = this.getDatasourceTypeFamily(column.dataType);\n const charLength = column.characterMaximumLength ?? null;\n\n switch (family) {\n case \"boolean\":\n return \"boolean\";\n case \"bigint\":\n return \"bigint\";\n case \"int\":\n return \"int\";\n case \"numeric\":\n case \"decimal\":\n case \"float\":\n return \"decimal\";\n case \"date\":\n return \"date\";\n case \"time\":\n return \"time\";\n case \"datetime\":\n case \"datetimeWithTimezone\":\n return \"datetime\";\n case \"json\":\n case \"jsonb\":\n return \"json\";\n case \"uuid\":\n return \"uuid\";\n case \"mediumText\":\n case \"longText\":\n return \"longText\";\n case \"shortText\":\n case \"unicodeShortText\":\n if (charLength !== null && charLength > 255) {\n return \"longText\";\n }\n\n return \"shortText\";\n default:\n return \"shortText\";\n }\n }\n\n private toOrmFieldType(column: DatasourceIntrospectionColumn, datasourceType: string) {\n const family = this.getDatasourceTypeFamily(column.dataType);\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const ormType = family\n ? ORM_TYPE_BY_DATASOURCE_FAMILY[normalizedDatasourceType]?.[family]\n : undefined;\n\n if (ormType) {\n return ormType;\n }\n\n return normalizedDatasourceType === \"postgres\" ? \"varchar\" : \"varchar\";\n }\n\n private toFieldName(columnName: string) {\n return camelCase(columnName.replace(/^ss_/, \"\"));\n }\n\n private toSingularNameCandidate(tableName: string) {\n const normalized = camelCase(tableName);\n if (normalized.endsWith(\"ies\")) {\n return `${normalized.slice(0, -3)}y`;\n }\n\n if (normalized.endsWith(\"ses\")) {\n return normalized.slice(0, -2);\n }\n\n if (normalized.endsWith(\"s\") && !normalized.endsWith(\"ss\")) {\n return normalized.slice(0, -1);\n }\n\n return normalized;\n }\n\n private toPluralNameCandidate(tableName: string, singularName: string) {\n const normalized = camelCase(tableName);\n if (normalized && normalized !== singularName) {\n return normalized;\n }\n\n if (singularName.endsWith(\"y\")) {\n return `${singularName.slice(0, -1)}ies`;\n }\n\n if (singularName.endsWith(\"s\")) {\n return `${singularName}es`;\n }\n\n return `${singularName}s`;\n }\n\n private toTableKey(schema: string | null, tableName: string) {\n return `${(schema ?? \"\").toLowerCase()}::${tableName.toLowerCase()}`;\n }\n\n private toModelMapKey(datasourceName: string, tableName: string) {\n return `${datasourceName.toLowerCase()}::${tableName.toLowerCase()}`;\n }\n\n private async syncTypeormDatasourceFile(moduleName: string, datasource: DatasourceRecord, singularName: string) {\n const datasourceFilePath = path.resolve(process.cwd(), \"src\", `typeorm-${datasource.name}-datasource.ts`);\n const entityClassName = classify(singularName);\n const entityImportPath = `./${moduleName}/entities/${kebabCase(singularName)}.entity`;\n const migrationGlob = `join(__dirname, './${moduleName}/migrations/${datasource.name}/*.{ts,js}')`;\n\n const existingContent = await fs.readFile(datasourceFilePath, \"utf8\").catch(() => null);\n if (!existingContent) {\n const rendered = this.renderTypeormDatasourceTemplate({\n datasource,\n entityClassName,\n entityImportPath,\n migrationGlob,\n });\n await fs.writeFile(datasourceFilePath, rendered, \"utf8\");\n return {\n filePath: datasourceFilePath,\n created: true,\n updated: false,\n entityRegistered: true,\n migrationGlobRegistered: true,\n };\n }\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n const sourceFile = project.createSourceFile(datasourceFilePath, existingContent, { overwrite: true });\n\n const entityImportDeclaration = sourceFile.getImportDeclarations().find((declaration) =>\n declaration.getModuleSpecifierValue() === entityImportPath,\n );\n if (entityImportDeclaration) {\n const alreadyImported = entityImportDeclaration.getNamedImports().some((namedImport) => namedImport.getName() === entityClassName);\n if (!alreadyImported) {\n entityImportDeclaration.addNamedImport(entityClassName);\n }\n } else {\n sourceFile.addImportDeclaration({\n moduleSpecifier: entityImportPath,\n namedImports: [entityClassName],\n });\n }\n\n const entitiesArray = sourceFile\n .getVariableDeclarationOrThrow(\"entities\")\n .getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n const entityAlreadyRegistered = this.arrayLiteralContainsValue(entitiesArray, entityClassName);\n if (!entityAlreadyRegistered) {\n entitiesArray.addElement(entityClassName);\n }\n\n const dataSourceOptions = this.getTypeormDatasourceOptions(sourceFile);\n const migrationsArray = this.getObjectPropertyArrayLiteral(dataSourceOptions, \"migrations\");\n const migrationAlreadyRegistered = this.arrayLiteralContainsValue(migrationsArray, migrationGlob);\n if (!migrationAlreadyRegistered) {\n migrationsArray.addElement(migrationGlob);\n }\n\n sourceFile.organizeImports();\n sourceFile.formatText();\n\n const nextContent = sourceFile.getFullText();\n const updated = nextContent !== existingContent;\n if (updated) {\n await fs.writeFile(datasourceFilePath, nextContent, \"utf8\");\n }\n\n return {\n filePath: datasourceFilePath,\n created: false,\n updated,\n entityRegistered: true,\n migrationGlobRegistered: true,\n };\n }\n\n private renderTypeormDatasourceTemplate(input: {\n datasource: DatasourceRecord;\n entityClassName: string;\n entityImportPath: string;\n migrationGlob: string;\n }) {\n const { datasource, entityClassName, entityImportPath, migrationGlob } = input;\n const envPrefix = datasource.envPrefix?.toUpperCase?.() || \"DEFAULT\";\n const portFallback = datasource.type === \"postgres\" ? 5432 : datasource.type === \"mysql\" ? 3306 : 1433;\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n const sourceFile = project.createSourceFile(\"typeorm-template.ts\", \"\", { overwrite: true });\n\n sourceFile.addImportDeclaration({ moduleSpecifier: \"reflect-metadata\" });\n sourceFile.addImportDeclaration({ moduleSpecifier: \"path\", namedImports: [\"join\"] });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"dotenv\",\n namedImports: [{ name: \"config\", alias: \"dotenvConfig\" }],\n });\n sourceFile.addStatements(\"dotenvConfig({ path: join(__dirname, '../.env') });\");\n sourceFile.addStatements(\"\");\n\n sourceFile.addImportDeclaration({ moduleSpecifier: \"typeorm\", namedImports: [\"DataSource\"] });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"@solidxai/core\",\n namespaceImport: \"SolidCoreModuleExports\",\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"@solidxai/core\",\n namedImports: [\"getDynamicModuleNames\", \"parseBooleanEnv\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"typeorm\",\n namedImports: [\"getMetadataArgsStorage\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"typeorm-naming-strategies\",\n namedImports: [\"SnakeNamingStrategy\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: entityImportPath,\n namedImports: [entityClassName],\n });\n\n sourceFile.addFunction({\n name: \"getEntitiesFromExports\",\n parameters: [{ name: \"exports\", type: \"Record<string, any>\" }],\n statements: (writer) => {\n writer.writeLine(\"const metadataStorage = getMetadataArgsStorage();\");\n writer.writeLine(\"return Object.values(exports).filter((item) =>\");\n writer.indent(() => {\n writer.writeLine(\"metadataStorage.tables.some((table) => table.target === item),\");\n });\n writer.write(\");\");\n },\n });\n\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"coreEntities\",\n initializer: \"getEntitiesFromExports(SolidCoreModuleExports)\",\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"dynamicModules\",\n initializer: \"getDynamicModuleNames()\",\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"entities\",\n initializer: `[\\n ...coreEntities,\\n ${entityClassName},\\n]`,\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"logging\",\n initializer: `parseBooleanEnv('${envPrefix}_DATABASE_LOGGING')`,\n },\n ],\n });\n\n sourceFile.addStatements(\"// IMPORTANT: synchronize must be false when using migrations\");\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: \"DefaultDataSource\",\n initializer: (writer) => {\n writer.write(\"new DataSource(\");\n writer.inlineBlock(() => {\n writer.writeLine(`type: '${datasource.type}',`);\n writer.blankLine();\n writer.writeLine(`host: process.env.${envPrefix}_DATABASE_HOST,`);\n writer.writeLine(`port: +(process.env.${envPrefix}_DATABASE_PORT || ${portFallback}),`);\n writer.writeLine(`username: process.env.${envPrefix}_DATABASE_USER,`);\n writer.writeLine(`password: process.env.${envPrefix}_DATABASE_PASSWORD,`);\n writer.writeLine(`database: process.env.${envPrefix}_DATABASE_NAME,`);\n writer.blankLine();\n writer.writeLine(\"entities,\");\n writer.writeLine(\"migrations: [\");\n writer.indent(() => {\n writer.writeLine(`${migrationGlob},`);\n });\n writer.writeLine(\"],\");\n writer.writeLine(\"synchronize: false,\");\n writer.writeLine(\"logging,\");\n writer.writeLine(\"namingStrategy: new SnakeNamingStrategy(),\");\n if (datasource.type === \"mssql\") {\n writer.writeLine(\"options: {\");\n writer.indent(() => {\n writer.writeLine(\"encrypt: false,\");\n writer.writeLine(\"trustServerCertificate: true,\");\n });\n writer.writeLine(\"},\");\n }\n });\n writer.write(\")\");\n },\n },\n ],\n });\n\n sourceFile.organizeImports();\n sourceFile.formatText();\n return sourceFile.getFullText();\n }\n\n private arrayLiteralContainsValue(arrayLiteral: ArrayLiteralExpression, rawValue: string) {\n const normalizedTarget = rawValue.replace(/\\s+/g, \"\");\n return arrayLiteral.getElements().some((element) => element.getText().replace(/\\s+/g, \"\") === normalizedTarget);\n }\n\n private getTypeormDatasourceOptions(sourceFile: import(\"ts-morph\").SourceFile) {\n const defaultDataSourceDeclaration = sourceFile.getVariableDeclarationOrThrow(\"DefaultDataSource\");\n const initializer = defaultDataSourceDeclaration.getInitializer();\n if (!initializer || !Node.isNewExpression(initializer)) {\n throw new BadRequestException(\"Unable to locate DefaultDataSource initializer in datasource file.\");\n }\n\n const options = initializer.getArguments()[0];\n if (!options || !Node.isObjectLiteralExpression(options)) {\n throw new BadRequestException(\"Unable to locate DefaultDataSource options object in datasource file.\");\n }\n\n return options;\n }\n\n private getObjectPropertyArrayLiteral(objectLiteral: ObjectLiteralExpression, propertyName: string) {\n const property = objectLiteral.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n throw new BadRequestException(`Unable to locate \"${propertyName}\" property in datasource file.`);\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new BadRequestException(`Unable to locate \"${propertyName}\" array in datasource file.`);\n }\n\n return initializer;\n }\n\n private buildSynchronizeBlockedMessage(datasource: DatasourceRecord) {\n return `Datasource \"${datasource.displayName}\" has synchronize enabled. Set ${datasource.envPrefix}_DATABASE_SYNCHRONIZE=false before starting legacy table introspection.`;\n }\n\n private resolveDataSourceByName(datasourceName: string) {\n const token = datasourceName === \"default\" ? getDataSourceToken() : getDataSourceToken(datasourceName);\n\n try {\n const dataSource = this.moduleRef.get<DataSource>(token, { strict: false });\n if (!dataSource) {\n throw new NotFoundException(`Datasource \"${datasourceName}\" is not registered in the current runtime.`);\n }\n\n return dataSource;\n } catch (error: any) {\n throw new NotFoundException(\n `Failed to resolve datasource \"${datasourceName}\": ${error?.message ?? error}`,\n );\n }\n }\n\n private getProvider(type: string): DatasourceIntrospectionProvider {\n const providers: DatasourceIntrospectionProvider[] = [\n this.mssqlProvider,\n this.mysqlProvider,\n this.postgresProvider,\n ];\n\n const provider = providers.find((candidate) => candidate.supports(type));\n if (!provider) {\n throw new BadRequestException(`Datasource type \"${type}\" is not supported for introspection yet.`);\n }\n\n return provider;\n }\n\n private requireDatasource(datasourceName: string) {\n const datasource = this.datasourceManagementService.findOneByName(datasourceName);\n if (!datasource) {\n throw new NotFoundException(`Datasource \"${datasourceName}\" is not configured.`);\n }\n\n if (!this.supportedDatasourceTypes.has(datasource.type?.toLowerCase?.() ?? \"\")) {\n throw new BadRequestException(`Datasource \"${datasource.type}\" is not supported for introspection yet.`);\n }\n\n return datasource;\n }\n\n private async loadModule(moduleId: number) {\n const module = await this.moduleMetadataRepository.findOne({\n where: { id: moduleId },\n });\n\n if (!module) {\n throw new NotFoundException(`Module with id \"${moduleId}\" was not found.`);\n }\n\n return module;\n }\n\n private toModuleSummary(module: any) {\n return {\n id: module.id,\n name: module.name,\n displayName: module.displayName,\n description: module.description ?? \"\",\n defaultDataSource: module.defaultDataSource ?? \"\",\n };\n }\n\n private toDatasourceSummary(record: DatasourceRecord) {\n return {\n name: record.name,\n displayName: record.displayName,\n type: record.type,\n envPrefix: record.envPrefix,\n isDefault: record.isDefault,\n synchronize: record.synchronize,\n host: record.host,\n port: record.port,\n database: record.database,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"datasource-introspection.service.js","sourceRoot":"","sources":["../../src/services/datasource-introspection.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, Injectable, NotFoundException } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { getDataSourceToken } from \"@nestjs/typeorm\";\nimport { createHash } from \"crypto\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { camelCase, kebabCase, startCase } from \"lodash\";\nimport { ArrayLiteralExpression, IndentationText, Node, ObjectLiteralExpression, Project, QuoteKind, SyntaxKind, VariableDeclarationKind } from \"ts-morph\";\nimport { DataSource } from \"typeorm\";\nimport { CreateModelMetadataDto } from \"src/dtos/create-model-metadata.dto\";\nimport { DatasourceIntrospectionMappingColumnDto, DatasourceIntrospectionMappingDto } from \"src/dtos/datasource-introspection-mapping.dto\";\nimport { UpdateModelMetaDataDto } from \"src/dtos/update-model-metadata.dto\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { classify } from \"src/helpers/string.helper\";\nimport type { DatasourceIntrospectionColumn, DatasourceIntrospectionProvider, DatasourceIntrospectionTableRef } from \"src/interfaces/datasource-introspection-provider.interface\";\nimport { ModuleMetadataHelperService } from \"src/helpers/module-metadata-helper.service\";\nimport { ModelMetadataHelperService } from \"src/helpers/model-metadata-helper.service\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { ModuleMetadataRepository } from \"src/repository/module-metadata.repository\";\nimport type { ModelMetadata } from \"src/entities/model-metadata.entity\";\nimport { DatasourceManagementService, type DatasourceRecord } from \"./datasource-management.service\";\nimport { CommandService } from \"src/helpers/command.service\";\nimport { FieldMetadataService } from \"./field-metadata.service\";\nimport { ModelMetadataService } from \"./model-metadata.service\";\nimport { ModuleMetadataService } from \"./module-metadata.service\";\nimport { MssqlDatasourceIntrospectionProviderService } from \"./datasource-introspection/mssql-datasource-introspection-provider.service\";\nimport { MysqlDatasourceIntrospectionProviderService } from \"./datasource-introspection/mysql-datasource-introspection-provider.service\";\nimport { PostgresDatasourceIntrospectionProviderService } from \"./datasource-introspection/postgres-datasource-introspection-provider.service\";\n\ntype TableInventoryRecord = {\n schema: string | null;\n tableName: string;\n mapped: boolean;\n mappedModelId: number | null;\n mappedModelSingularName: string | null;\n mappedModelDisplayName: string | null;\n mappedModuleId: number | null;\n mappedModuleName: string | null;\n mappedModuleDisplayName: string | null;\n suggestedLegacyTableType: LegacyTableType;\n suggestedBaseClassName: string;\n suggestedIdColumnName: string | null;\n suggestedUserKeyField: string;\n columnCount: number;\n physicalColumnCount: number;\n hasPrimaryKey: boolean;\n primaryKeyColumnCount: number;\n primaryKeyColumnNames: string[];\n mappingBlockedReason: string | null;\n};\n\ntype TableDetailColumnRecord = {\n columnName: string;\n fieldName: string;\n displayName: string;\n dataType: string;\n solidFieldType: string;\n ormType: string;\n nullable: boolean;\n defaultValue: string | null;\n characterMaximumLength: number | null;\n numericPrecision: number | null;\n numericScale: number | null;\n ordinalPosition: number | null;\n isAutoGenerated: boolean;\n isPrimaryKey: boolean;\n handledBySuperclass: boolean;\n superclassFieldName: string | null;\n};\n\ntype TableDdlRecord = {\n statement: string | null;\n available: boolean;\n note: string | null;\n};\n\ntype MappingPreviewRecord = {\n operation: \"create\" | \"update\";\n mappedModelId: number | null;\n metadataJson: {\n filePath: string;\n model: Record<string, any>;\n };\n migration: {\n willGenerate: boolean;\n filePath: string | null;\n fileName: string | null;\n className: string | null;\n timestamp: number | null;\n content: string | null;\n note: string;\n missingSystemColumns: string[];\n };\n datasourceFile: {\n filePath: string;\n created: boolean;\n updated: boolean;\n entityRegistered: boolean;\n migrationGlobRegistered: boolean;\n };\n summary: {\n includedColumnNames: string[];\n removedColumnNames: string[];\n missingSystemColumns: string[];\n generatedSystemColumnCount: number;\n };\n modelPayload: CreateModelMetadataDto | UpdateModelMetaDataDto;\n};\n\ntype ReviewedMetadataModel = {\n singularName: string;\n pluralName: string;\n displayName: string;\n description: string;\n dataSource: string;\n dataSourceType: string;\n tableName: string;\n userKeyFieldUserKey: string;\n isChild: boolean;\n legacyTableType: LegacyTableType;\n parentModelUserKey: string;\n enableAuditTracking: boolean;\n enableSoftDelete: boolean;\n draftPublishWorkflow: boolean;\n internationalisation: boolean;\n fields: Record<string, any>[];\n};\n\ntype SystemColumnDefinition = {\n columnName: string;\n type: string;\n length?: string | null;\n isNullable?: boolean;\n defaultExpression?: string | null;\n isGenerated?: boolean;\n isUnique?: boolean;\n};\n\ntype DatasourceTypeFamily =\n | \"boolean\"\n | \"bigint\"\n | \"int\"\n | \"numeric\"\n | \"decimal\"\n | \"float\"\n | \"date\"\n | \"time\"\n | \"datetime\"\n | \"datetimeWithTimezone\"\n | \"json\"\n | \"jsonb\"\n | \"uuid\"\n | \"longText\"\n | \"mediumText\"\n | \"shortText\"\n | \"unicodeShortText\";\n\nconst DATASOURCE_TYPE_FAMILY_ALIASES: Record<DatasourceTypeFamily, string[]> = {\n boolean: [\"bit\", \"bool\", \"boolean\"],\n bigint: [\"bigint\"],\n int: [\"int\", \"integer\", \"smallint\", \"tinyint\"],\n numeric: [\"numeric\"],\n decimal: [\"decimal\", \"money\", \"smallmoney\"],\n float: [\"float\", \"double\", \"double precision\", \"real\", \"float4\", \"float8\"],\n date: [\"date\"],\n time: [\"time\", \"time without time zone\", \"time with time zone\"],\n datetime: [\"datetime\", \"datetime2\", \"smalldatetime\", \"timestamp\", \"timestamp without time zone\"],\n datetimeWithTimezone: [\"timestamptz\", \"timestamp with time zone\"],\n json: [\"json\", \"simple-json\", \"simplejson\"],\n jsonb: [\"jsonb\"],\n uuid: [\"uniqueidentifier\", \"uuid\"],\n longText: [\"text\", \"ntext\", \"longtext\", \"clob\"],\n mediumText: [\"mediumtext\"],\n shortText: [\"varchar\", \"char\", \"citext\"],\n unicodeShortText: [\"nvarchar\", \"nchar\"],\n};\n\nconst ORM_TYPE_BY_DATASOURCE_FAMILY: Record<string, Partial<Record<DatasourceTypeFamily, string>>> = {\n mssql: {\n boolean: \"bit\",\n bigint: \"bigint\",\n int: \"int\",\n numeric: \"numeric\",\n decimal: \"decimal\",\n float: \"decimal\",\n date: \"date\",\n time: \"time\",\n datetime: \"datetime\",\n datetimeWithTimezone: \"datetime\",\n json: \"simple-json\",\n jsonb: \"simple-json\",\n uuid: \"uniqueidentifier\",\n longText: \"text\",\n mediumText: \"text\",\n shortText: \"varchar\",\n unicodeShortText: \"nvarchar\",\n },\n mysql: {\n boolean: \"boolean\",\n bigint: \"int\",\n int: \"int\",\n numeric: \"decimal\",\n decimal: \"decimal\",\n float: \"double\",\n date: \"date\",\n time: \"time\",\n datetime: \"datetime\",\n datetimeWithTimezone: \"datetime\",\n json: \"json\",\n jsonb: \"json\",\n uuid: \"varchar\",\n longText: \"longtext\",\n mediumText: \"mediumtext\",\n shortText: \"varchar\",\n unicodeShortText: \"varchar\",\n },\n postgres: {\n boolean: \"boolean\",\n bigint: \"bigint\",\n int: \"integer\",\n numeric: \"decimal\",\n decimal: \"decimal\",\n float: \"decimal\",\n date: \"date\",\n time: \"time\",\n datetime: \"timestamp\",\n datetimeWithTimezone: \"timestamptz\",\n json: \"json\",\n jsonb: \"jsonb\",\n uuid: \"uuid\",\n longText: \"text\",\n mediumText: \"text\",\n shortText: \"varchar\",\n unicodeShortText: \"varchar\",\n },\n};\n\n@Injectable()\nexport class DatasourceIntrospectionService {\n private readonly supportedDatasourceTypes = new Set([\"mssql\", \"mysql\", \"postgres\"]);\n\n constructor(\n private readonly moduleRef: ModuleRef,\n private readonly datasourceManagementService: DatasourceManagementService,\n private readonly moduleMetadataRepository: ModuleMetadataRepository,\n private readonly modelMetadataRepository: ModelMetadataRepository,\n private readonly moduleMetadataHelperService: ModuleMetadataHelperService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n private readonly fieldMetadataService: FieldMetadataService,\n private readonly modelMetadataService: ModelMetadataService,\n private readonly moduleMetadataService: ModuleMetadataService,\n private readonly commandService: CommandService,\n private readonly mssqlProvider: MssqlDatasourceIntrospectionProviderService,\n private readonly mysqlProvider: MysqlDatasourceIntrospectionProviderService,\n private readonly postgresProvider: PostgresDatasourceIntrospectionProviderService,\n ) { }\n\n async getBootstrap(moduleId: number) {\n const module = await this.loadModule(moduleId);\n const datasources = this.datasourceManagementService\n .listRecords()\n .filter((record) => this.supportedDatasourceTypes.has(record.type?.toLowerCase?.() ?? \"\"));\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasources: datasources.map((record) => this.toDatasourceSummary(record)),\n recommendedDatasourceName: datasources.find((record) => record.name === module.defaultDataSource)?.name\n ?? datasources[0]?.name\n ?? null,\n },\n };\n }\n\n async getTables(moduleId: number, datasourceName: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n\n if (datasource.synchronize === true) {\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n synchronizeBlocked: true,\n synchronizeMessage: this.buildSynchronizeBlockedMessage(datasource),\n records: [],\n meta: {\n totalRecords: 0,\n },\n },\n };\n }\n\n const inventory = await this.buildTableInventory(datasource);\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n synchronizeBlocked: false,\n synchronizeMessage: null,\n records: inventory.records,\n meta: {\n totalRecords: inventory.records.length,\n },\n },\n };\n }\n\n async getTableDetail(moduleId: number, datasourceName: string, tableName: string, schema?: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n\n if (datasource.synchronize === true) {\n throw new BadRequestException(this.buildSynchronizeBlockedMessage(datasource));\n }\n\n const inventory = await this.buildTableInventory(datasource);\n const tableKey = this.toTableKey(schema ?? null, tableName);\n const selectedTable = inventory.recordsByKey.get(tableKey);\n if (!selectedTable) {\n throw new NotFoundException(`Table \"${tableName}\" was not found on datasource \"${datasource.name}\".`);\n }\n\n const provider = this.getProvider(datasource.type);\n const runtimeDataSource = this.resolveDataSourceByName(datasource.name);\n const rawColumns = inventory.columnsByKey.get(tableKey) ?? [];\n const detailColumns = rawColumns.map((column) => this.toDetailColumnRecord(column, selectedTable.suggestedLegacyTableType, datasource.type));\n const userKeyCandidates = this.buildUserKeyCandidates(rawColumns);\n const suggestedSingularName = this.toSingularNameCandidate(tableName);\n const suggestedPluralName = this.toPluralNameCandidate(tableName, suggestedSingularName);\n const rawDdl = await this.buildRawDdl(provider, runtimeDataSource, {\n tableName: selectedTable.tableName,\n tableSchema: selectedTable.schema,\n });\n\n return {\n data: {\n module: this.toModuleSummary(module),\n datasource: this.toDatasourceSummary(datasource),\n table: selectedTable,\n columns: detailColumns,\n rawDdl,\n userKeyCandidates,\n suggestedMetadata: {\n singularName: suggestedSingularName,\n pluralName: suggestedPluralName,\n displayName: startCase(suggestedSingularName),\n tableName: selectedTable.tableName,\n schema: selectedTable.schema,\n dataSource: datasource.name,\n dataSourceType: datasource.type,\n legacyTableType: selectedTable.suggestedLegacyTableType,\n baseClassName: selectedTable.suggestedBaseClassName,\n userKeyField: selectedTable.suggestedUserKeyField,\n synchronize: false,\n },\n },\n };\n }\n\n async previewMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n\n return {\n data: {\n operation: plan.operation,\n mappedModelId: plan.mappedModelId,\n metadataJson: plan.metadataJson,\n migration: plan.migration,\n summary: plan.summary,\n },\n };\n }\n\n async applyMapping(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n\n if (plan.operation === \"update\" && !mappingDto.modelId) {\n throw new BadRequestException(\"Mapped tables require a model id before changes can be applied.\");\n }\n\n const persistedModel = plan.operation === \"update\" && mappingDto.modelId\n ? await this.modelMetadataService.update(mappingDto.modelId, plan.modelPayload as UpdateModelMetaDataDto)\n : await this.modelMetadataService.create(plan.modelPayload as CreateModelMetadataDto);\n\n const persistedModelId = mappingDto.modelId ?? (persistedModel as ModelMetadata | undefined)?.id ?? null;\n\n return {\n data: {\n modelId: persistedModelId,\n operation: plan.operation,\n metadataJson: plan.metadataJson,\n summary: plan.summary,\n },\n };\n }\n\n async createMigrationArtifacts(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto) {\n const plan = await this.buildMappingPreview(moduleId, mappingDto);\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(mappingDto.dataSource);\n\n if (!mappingDto.modelId) {\n throw new BadRequestException(\"Persist the model mapping first so the generated entity can be registered before creating migration artifacts.\");\n }\n\n const migrationWritten = await this.writeMigrationFile(plan.migration);\n\n const datasourceFile = await this.syncTypeormDatasourceFile(\n module.name,\n datasource,\n plan.modelPayload.singularName,\n );\n\n return {\n data: {\n modelId: mappingDto.modelId,\n operation: plan.operation,\n migration: {\n ...plan.migration,\n written: migrationWritten,\n },\n datasourceFile,\n summary: plan.summary,\n },\n };\n }\n\n async generateCode(moduleId: number) {\n await this.loadModule(moduleId);\n const output = await this.moduleMetadataService.generateCodeViaCtl(moduleId);\n\n return {\n data: {\n moduleId,\n output,\n message: \"Module code generation completed.\",\n },\n };\n }\n\n async runMigration(moduleId: number, datasourceName: string) {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(datasourceName);\n const cwd = path.join(process.cwd(), \"..\");\n const outputs: string[] = [];\n\n const migrationOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"migration\", \"-d\", datasource.name, \"run\"],\n cwd,\n });\n outputs.push([\n `npx @solidxai/solidctl@latest migration -d ${datasource.name} run`,\n migrationOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n const buildOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"build\"],\n cwd,\n });\n outputs.push([\n \"npx @solidxai/solidctl@latest build\",\n buildOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n const seedOutput = await this.commandService.executeCommandWithArgs({\n command: \"npx\",\n args: [\"-y\", \"@solidxai/solidctl@latest\", \"seed\", \"--modules-to-seed\", module.name],\n cwd,\n });\n outputs.push([\n `npx @solidxai/solidctl@latest seed --modules-to-seed ${module.name}`,\n seedOutput,\n ].filter(Boolean).join(\"\\n\"));\n\n return {\n data: {\n moduleId,\n datasource: datasource.name,\n output: outputs.join(\"\\n\\n\"),\n command: [\n `npx @solidxai/solidctl@latest migration -d ${datasource.name} run`,\n \"npx @solidxai/solidctl@latest build\",\n `npx @solidxai/solidctl@latest seed --modules-to-seed ${module.name}`,\n ].join(\"\\n\"),\n message: `Migration, build, and seed completed successfully for datasource \"${datasource.name}\".`,\n },\n };\n }\n\n private async buildMappingPreview(moduleId: number, mappingDto: DatasourceIntrospectionMappingDto): Promise<MappingPreviewRecord> {\n const module = await this.loadModule(moduleId);\n const datasource = this.requireDatasource(mappingDto.dataSource);\n\n if (datasource.synchronize === true) {\n throw new BadRequestException(this.buildSynchronizeBlockedMessage(datasource));\n }\n\n const inventory = await this.buildTableInventory(datasource);\n const tableKey = this.toTableKey(mappingDto.schema ?? null, mappingDto.tableName);\n const tableRecord = inventory.recordsByKey.get(tableKey);\n if (!tableRecord) {\n throw new NotFoundException(`Table \"${mappingDto.tableName}\" was not found on datasource \"${datasource.name}\".`);\n }\n const tableColumns = inventory.columnsByKey.get(tableKey) ?? [];\n this.validateTablePrimaryKeyForMapping(tableRecord, tableColumns, mappingDto);\n\n const existingModel = mappingDto.mapped && mappingDto.modelId\n ? await this.modelMetadataRepository.findOne({\n where: { id: mappingDto.modelId },\n relations: [\"fields\", \"module\", \"parentModel\"],\n order: {\n fields: {\n id: \"ASC\",\n },\n },\n })\n : null;\n\n if (mappingDto.mapped && !existingModel) {\n throw new NotFoundException(`Mapped model \"${mappingDto.modelId}\" was not found.`);\n }\n\n const reviewedModel = this.normalizeReviewedMetadataModel(mappingDto.reviewedModel, mappingDto, tableColumns);\n const modelPayload = reviewedModel\n ? this.buildModelPayloadFromReviewedModel(moduleId, mappingDto, existingModel, reviewedModel)\n : this.buildModelPayload(moduleId, mappingDto, existingModel);\n const metadataJson = reviewedModel\n ? await this.buildMetadataJsonPreviewFromReviewedModel(module.name, reviewedModel)\n : await this.buildMetadataJsonPreview(module.name, mappingDto, existingModel);\n const migration = await this.buildMigrationPreview(module.name, datasource, mappingDto, tableColumns);\n const includedColumnNames = mappingDto.columns\n .filter((column) => !column.handledBySuperclass && column.include)\n .map((column) => column.columnName);\n const removedColumnNames = mappingDto.columns\n .filter((column) => column.matched && !column.handledBySuperclass && !column.include)\n .map((column) => column.columnName);\n\n return {\n operation: mappingDto.mapped ? \"update\" : \"create\",\n mappedModelId: mappingDto.modelId ?? null,\n metadataJson,\n migration,\n datasourceFile: {\n filePath: path.resolve(process.cwd(), \"src\", `typeorm-${datasource.name}-datasource.ts`),\n created: false,\n updated: false,\n entityRegistered: false,\n migrationGlobRegistered: false,\n },\n summary: {\n includedColumnNames,\n removedColumnNames,\n missingSystemColumns: migration.missingSystemColumns,\n generatedSystemColumnCount: migration.missingSystemColumns.length,\n },\n modelPayload,\n };\n }\n\n private buildModelPayload(\n moduleId: number,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ): CreateModelMetadataDto | UpdateModelMetaDataDto {\n const includedColumns = mappingDto.columns.filter((column) => !column.handledBySuperclass && column.include);\n const matchedFieldIds = new Set<number>(\n mappingDto.columns\n .filter((column) => typeof column.fieldId === \"number\")\n .map((column) => column.fieldId as number),\n );\n\n const preservedFieldPayloads = existingModel\n ? existingModel.fields\n .filter((field) => field.isSystem || !matchedFieldIds.has(field.id))\n .map((field) => this.sanitizeExistingFieldPayload(field))\n : [];\n\n const updatedFieldPayloads = includedColumns.map((column) => {\n const existingField = existingModel?.fields?.find((field) => field.id === column.fieldId) ?? null;\n return this.buildFieldPayload(column, mappingDto, existingField);\n });\n\n return {\n singularName: mappingDto.singularName.trim(),\n pluralName: mappingDto.pluralName.trim(),\n displayName: mappingDto.displayName.trim(),\n description: mappingDto.description.trim() || mappingDto.displayName.trim(),\n dataSource: mappingDto.dataSource,\n dataSourceType: mappingDto.dataSourceType,\n tableName: mappingDto.tableName,\n enableSoftDelete: mappingDto.enableSoftDelete,\n enableAuditTracking: mappingDto.enableAuditTracking,\n internationalisation: mappingDto.internationalisation,\n draftPublishWorkflow: mappingDto.draftPublishWorkflow,\n moduleId,\n fields: [...preservedFieldPayloads, ...updatedFieldPayloads],\n isSystem: false,\n isChild: false,\n parentModelId: null,\n parentModelUserKey: \"\",\n legacyTableType: mappingDto.legacyTableType,\n };\n }\n\n private buildModelPayloadFromReviewedModel(\n moduleId: number,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n reviewedModel: ReviewedMetadataModel,\n ): CreateModelMetadataDto | UpdateModelMetaDataDto {\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n reviewedModel.fields,\n reviewedModel.userKeyFieldUserKey,\n mappingDto.userKeyField,\n );\n const systemFieldPayloads = existingModel\n ? existingModel.fields\n .filter((field) => field.isSystem)\n .map((field) => this.sanitizeExistingFieldPayload(field))\n : [];\n\n const reviewedFieldPayloads = reviewedModel.fields.map((field) => {\n const matchedExistingField = this.matchExistingFieldForReviewedModel(field, mappingDto, existingModel);\n return {\n ...field,\n ...(matchedExistingField?.id ? { id: matchedExistingField.id } : {}),\n isUserKey: field.name === resolvedUserKeyFieldName,\n isSystem: field.isSystem ?? false,\n };\n });\n\n return {\n singularName: reviewedModel.singularName.trim(),\n pluralName: reviewedModel.pluralName.trim(),\n displayName: reviewedModel.displayName.trim(),\n description: reviewedModel.description.trim() || reviewedModel.displayName.trim(),\n dataSource: reviewedModel.dataSource,\n dataSourceType: reviewedModel.dataSourceType,\n tableName: reviewedModel.tableName,\n enableSoftDelete: reviewedModel.enableSoftDelete,\n enableAuditTracking: reviewedModel.enableAuditTracking,\n internationalisation: reviewedModel.internationalisation,\n draftPublishWorkflow: reviewedModel.draftPublishWorkflow,\n moduleId,\n fields: [...systemFieldPayloads, ...reviewedFieldPayloads],\n isSystem: false,\n isChild: false,\n parentModelId: null,\n parentModelUserKey: reviewedModel.parentModelUserKey ?? \"\",\n legacyTableType: reviewedModel.legacyTableType,\n };\n }\n\n private async buildMetadataJsonPreview(\n moduleName: string,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n const previewFields = await this.buildMetadataPreviewFields(mappingDto, existingModel);\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n previewFields,\n mappingDto.userKeyField,\n mappingDto.userKeyField,\n ) ?? mappingDto.userKeyField;\n\n return {\n filePath,\n model: {\n singularName: mappingDto.singularName.trim(),\n pluralName: mappingDto.pluralName.trim(),\n displayName: mappingDto.displayName.trim(),\n description: mappingDto.description.trim() || mappingDto.displayName.trim(),\n dataSource: mappingDto.dataSource,\n dataSourceType: mappingDto.dataSourceType,\n tableName: mappingDto.tableName,\n userKeyFieldUserKey: resolvedUserKeyFieldName,\n isChild: false,\n legacyTableType: mappingDto.legacyTableType,\n parentModelUserKey: \"\",\n enableAuditTracking: mappingDto.enableAuditTracking,\n enableSoftDelete: mappingDto.enableSoftDelete,\n draftPublishWorkflow: mappingDto.draftPublishWorkflow,\n internationalisation: mappingDto.internationalisation,\n fields: previewFields,\n },\n };\n }\n\n private async buildMetadataJsonPreviewFromReviewedModel(\n moduleName: string,\n reviewedModel: ReviewedMetadataModel,\n ) {\n const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);\n\n return {\n filePath,\n model: reviewedModel,\n };\n }\n\n private async buildMetadataPreviewFields(\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const finalFields = new Map<string, any>();\n const existingFields = existingModel?.fields ?? [];\n const matchedFieldIds = new Set<number>(\n mappingDto.columns\n .filter((column) => typeof column.fieldId === \"number\")\n .map((column) => column.fieldId as number),\n );\n const includedColumns = mappingDto.columns.filter((column) => !column.handledBySuperclass && column.include);\n\n for (const field of existingFields) {\n if (field.isSystem || !matchedFieldIds.has(field.id)) {\n finalFields.set(this.toFieldPreviewKey(field.id, field.name), this.sanitizeExistingFieldPayload(field));\n }\n }\n\n for (const column of includedColumns) {\n const existingField = existingFields.find((field) => field.id === column.fieldId) ?? null;\n const fieldPayload = this.buildFieldPayload(column, mappingDto, existingField);\n finalFields.set(this.toFieldPreviewKey(fieldPayload.id ?? null, fieldPayload.name), fieldPayload);\n }\n\n for (const column of mappingDto.columns.filter((entry) => entry.matched && !entry.include && entry.fieldId)) {\n const existingField = existingFields.find((field) => field.id === column.fieldId);\n if (!existingField || existingField.isSystem) {\n continue;\n }\n\n finalFields.set(\n this.toFieldPreviewKey(existingField.id, existingField.name),\n {\n ...this.sanitizeExistingFieldPayload(existingField),\n isMarkedForRemoval: true,\n isUserKey: false,\n },\n );\n }\n\n const serialized = Array.from(finalFields.values())\n .filter((field) => !field.isSystem)\n .sort((left, right) => {\n const leftOrder = typeof left.id === \"number\" ? left.id : Number.MAX_SAFE_INTEGER;\n const rightOrder = typeof right.id === \"number\" ? right.id : Number.MAX_SAFE_INTEGER;\n if (leftOrder !== rightOrder) {\n return leftOrder - rightOrder;\n }\n\n return `${left.name}`.localeCompare(`${right.name}`);\n });\n\n const previewFields: Record<string, any>[] = [];\n for (const field of serialized) {\n previewFields.push(await this.fieldMetadataService.createFieldConfig(field as any));\n }\n\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n previewFields,\n mappingDto.userKeyField,\n mappingDto.userKeyField,\n );\n\n for (const field of previewFields) {\n field.isUserKey = field.name === resolvedUserKeyFieldName;\n }\n\n return previewFields;\n }\n\n private async buildMigrationPreview(\n moduleName: string,\n datasource: DatasourceRecord,\n mappingDto: DatasourceIntrospectionMappingDto,\n tableColumns: DatasourceIntrospectionColumn[],\n ) {\n const systemColumnDefinitions = this.getLegacySystemColumnDefinitions(mappingDto.legacyTableType, datasource.type);\n const existingColumns = new Set(tableColumns.map((column) => column.columnName.toLowerCase()));\n const missingSystemColumns = systemColumnDefinitions.filter((definition) => !existingColumns.has(definition.columnName.toLowerCase()));\n const removedLegacyMappings = mappingDto.columns.filter((column) => column.matched && !column.include && !column.handledBySuperclass);\n\n if (!missingSystemColumns.length) {\n return {\n willGenerate: false,\n filePath: null,\n fileName: null,\n className: null,\n timestamp: mappingDto.plannedMigrationTimestamp ?? null,\n content: null,\n note: removedLegacyMappings.length\n ? \"No migration will be generated for this change because it only updates metadata mapping for existing legacy columns.\"\n : \"All required SolidX system columns already exist on this table, so no migration will be generated.\",\n missingSystemColumns: [],\n };\n }\n\n const modulePath = await this.moduleMetadataHelperService.getModulePath(moduleName);\n const migrationTimestamp = mappingDto.plannedMigrationTimestamp ?? Date.now();\n const migrationBaseName = `Sync${startCase(this.toSingularNameCandidate(mappingDto.tableName)).replace(/\\s+/g, \"\")}SolidxSystemFields`;\n const className = `${migrationBaseName}${migrationTimestamp}`;\n const fileName = `${migrationTimestamp}-${migrationBaseName}.ts`;\n const filePath = path.join(modulePath, \"migrations\", datasource.name, fileName);\n\n return {\n willGenerate: true,\n filePath,\n fileName,\n className,\n timestamp: migrationTimestamp,\n content: this.renderMigrationTemplate(className, mappingDto, missingSystemColumns),\n note: `Saving this mapping will also write a template migration for the missing SolidX system columns: ${missingSystemColumns.map((column) => column.columnName).join(\", \")}.`,\n missingSystemColumns: missingSystemColumns.map((column) => column.columnName),\n };\n }\n\n private sanitizeExistingFieldPayload(field: any) {\n const {\n createdAt,\n updatedAt,\n deletedAt,\n model,\n mediaStorageProvider,\n identifier,\n ...rest\n } = field ?? {};\n\n if (mediaStorageProvider?.id && !rest.mediaStorageProviderId) {\n rest.mediaStorageProviderId = mediaStorageProvider.id;\n }\n\n return rest;\n }\n\n private sanitizeConfiguredFieldPayload(fieldConfig: Record<string, any> | undefined) {\n if (!fieldConfig || typeof fieldConfig !== \"object\" || Array.isArray(fieldConfig)) {\n return {};\n }\n\n return this.sanitizeExistingFieldPayload(fieldConfig);\n }\n\n private normalizeReviewedMetadataModel(\n reviewedModel: Record<string, any> | undefined,\n mappingDto: DatasourceIntrospectionMappingDto,\n tableColumns: DatasourceIntrospectionColumn[],\n ): ReviewedMetadataModel | null {\n if (!reviewedModel) {\n return null;\n }\n\n if (typeof reviewedModel !== \"object\" || Array.isArray(reviewedModel)) {\n throw new BadRequestException(\"Reviewed metadata JSON must be a valid object.\");\n }\n\n const readString = (key: string, allowEmpty = false) => {\n const value = reviewedModel[key];\n if (typeof value !== \"string\") {\n throw new BadRequestException(`Reviewed metadata JSON is missing a valid \"${key}\" string value.`);\n }\n\n const trimmed = value.trim();\n if (!allowEmpty && !trimmed) {\n throw new BadRequestException(`Reviewed metadata JSON cannot leave \"${key}\" blank.`);\n }\n\n return trimmed;\n };\n\n const readBoolean = (key: string) => {\n const value = reviewedModel[key];\n if (typeof value !== \"boolean\") {\n throw new BadRequestException(`Reviewed metadata JSON is missing a valid \"${key}\" boolean value.`);\n }\n return value;\n };\n\n const rawFields = reviewedModel.fields;\n if (!Array.isArray(rawFields)) {\n throw new BadRequestException(\"Reviewed metadata JSON must contain a fields array.\");\n }\n\n const immutableKeyChecks: Array<{ key: keyof DatasourceIntrospectionMappingDto; label: string }> = [\n { key: \"dataSource\", label: \"dataSource\" },\n { key: \"dataSourceType\", label: \"dataSourceType\" },\n { key: \"tableName\", label: \"tableName\" },\n { key: \"legacyTableType\", label: \"legacyTableType\" },\n ];\n\n for (const check of immutableKeyChecks) {\n if (`${reviewedModel[check.label] ?? \"\"}` !== `${mappingDto[check.key] ?? \"\"}`) {\n throw new BadRequestException(`Reviewed metadata JSON cannot change immutable binding key \"${check.label}\".`);\n }\n }\n\n const normalizedFields = rawFields.map((field, index) => this.normalizeReviewedField(field, index));\n const fieldNames = new Set<string>();\n for (const field of normalizedFields) {\n const loweredName = field.name.toLowerCase();\n if (fieldNames.has(loweredName)) {\n throw new BadRequestException(`Reviewed metadata JSON contains duplicate field name \"${field.name}\".`);\n }\n fieldNames.add(loweredName);\n }\n\n const requestedUserKeyFieldUserKey = readString(\"userKeyFieldUserKey\");\n const resolvedUserKeyFieldName = this.resolveReviewedUserKeyFieldName(\n normalizedFields,\n requestedUserKeyFieldUserKey,\n mappingDto.userKeyField,\n );\n const inheritedGeneratedIdUserKey = this.isGeneratedIdInheritedUserKey(\n mappingDto.legacyTableType,\n requestedUserKeyFieldUserKey,\n );\n if (!resolvedUserKeyFieldName && !inheritedGeneratedIdUserKey) {\n throw new BadRequestException(\"Reviewed metadata JSON must keep the selected userKeyFieldUserKey in the fields array.\");\n }\n\n this.validateReviewedPrimaryKeyFields(normalizedFields, tableColumns);\n\n const userKeyFieldUserKey = resolvedUserKeyFieldName ?? requestedUserKeyFieldUserKey;\n\n return {\n singularName: readString(\"singularName\"),\n pluralName: readString(\"pluralName\"),\n displayName: readString(\"displayName\"),\n description: readString(\"description\", true),\n dataSource: readString(\"dataSource\"),\n dataSourceType: readString(\"dataSourceType\"),\n tableName: readString(\"tableName\"),\n userKeyFieldUserKey,\n isChild: false,\n legacyTableType: mappingDto.legacyTableType,\n parentModelUserKey: typeof reviewedModel.parentModelUserKey === \"string\" ? reviewedModel.parentModelUserKey : \"\",\n enableAuditTracking: readBoolean(\"enableAuditTracking\"),\n enableSoftDelete: readBoolean(\"enableSoftDelete\"),\n draftPublishWorkflow: readBoolean(\"draftPublishWorkflow\"),\n internationalisation: readBoolean(\"internationalisation\"),\n fields: normalizedFields.map((field) => ({\n ...field,\n isUserKey: field.name === resolvedUserKeyFieldName,\n })),\n };\n }\n\n private resolveReviewedUserKeyFieldName(\n reviewedFields: Array<Record<string, any>>,\n requestedUserKeyFieldName: string,\n fallbackUserKeyFieldName?: string,\n ) {\n const activeFields = reviewedFields.filter((field) => !field.isMarkedForRemoval);\n const normalizedRequested = `${requestedUserKeyFieldName ?? \"\"}`.trim().toLowerCase();\n const normalizedFallback = `${fallbackUserKeyFieldName ?? \"\"}`.trim().toLowerCase();\n\n const byExactRequested = activeFields.find((field) => field.name?.toLowerCase?.() === normalizedRequested);\n if (byExactRequested) {\n return byExactRequested.name;\n }\n\n const byExistingUserKeyFlag = activeFields.find((field) => field.isUserKey);\n if (byExistingUserKeyFlag) {\n return byExistingUserKeyFlag.name;\n }\n\n const byPrimaryKeyFallback = activeFields.find((field) => {\n if (!field.isPrimaryKey) {\n return false;\n }\n\n const normalizedName = `${field.name ?? \"\"}`.trim().toLowerCase();\n return normalizedName === normalizedFallback || normalizedName === \"id\" || normalizedName === \"legacyid\";\n });\n if (byPrimaryKeyFallback) {\n return byPrimaryKeyFallback.name;\n }\n\n const byFallbackFieldName = activeFields.find((field) => field.name?.toLowerCase?.() === normalizedFallback);\n return byFallbackFieldName?.name ?? null;\n }\n\n private isGeneratedIdInheritedUserKey(\n legacyTableType: LegacyTableType,\n requestedUserKeyFieldName: string | null | undefined,\n ) {\n return legacyTableType === LegacyTableType.GENERATED_ID\n && `${requestedUserKeyFieldName ?? \"\"}`.trim().toLowerCase() === \"id\";\n }\n\n private normalizeReviewedField(field: any, index: number) {\n if (!field || typeof field !== \"object\" || Array.isArray(field)) {\n throw new BadRequestException(`Reviewed metadata JSON field at index ${index} is not a valid object.`);\n }\n\n if (typeof field.name !== \"string\" || !field.name.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field at index ${index} must include a non-empty \"name\".`);\n }\n\n if (typeof field.type !== \"string\" || !field.type.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"type\".`);\n }\n\n if (typeof field.ormType !== \"string\" || !field.ormType.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"ormType\".`);\n }\n\n if (typeof field.columnName !== \"string\" || !field.columnName.trim()) {\n throw new BadRequestException(`Reviewed metadata JSON field \"${field.name}\" must include a non-empty \"columnName\".`);\n }\n\n return {\n ...field,\n name: field.name.trim(),\n type: field.type.trim(),\n ormType: field.ormType.trim(),\n columnName: field.columnName.trim(),\n displayName: typeof field.displayName === \"string\" && field.displayName.trim()\n ? field.displayName.trim()\n : startCase(field.name),\n description: typeof field.description === \"string\" ? field.description : \"\",\n };\n }\n\n private matchExistingFieldForReviewedModel(\n reviewedField: Record<string, any>,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingModel: ModelMetadata | null,\n ) {\n const nonSystemFields = existingModel?.fields?.filter((field) => !field.isSystem) ?? [];\n const byColumnName = typeof reviewedField.columnName === \"string\"\n ? mappingDto.columns.find((column) => column.columnName.toLowerCase() === reviewedField.columnName.toLowerCase())\n : null;\n if (byColumnName?.fieldId) {\n return nonSystemFields.find((field) => field.id === byColumnName.fieldId) ?? null;\n }\n\n const byColumnOnExisting = typeof reviewedField.columnName === \"string\"\n ? nonSystemFields.find((field) => `${field.columnName ?? \"\"}`.toLowerCase() === reviewedField.columnName.toLowerCase())\n : null;\n if (byColumnOnExisting) {\n return byColumnOnExisting;\n }\n\n const byName = nonSystemFields.find((field) => field.name?.toLowerCase?.() === reviewedField.name.toLowerCase());\n return byName ?? null;\n }\n\n private buildFieldPayload(\n column: DatasourceIntrospectionMappingColumnDto,\n mappingDto: DatasourceIntrospectionMappingDto,\n existingField?: any,\n ) {\n const preserved = existingField ? this.sanitizeExistingFieldPayload(existingField) : {};\n const configured = this.sanitizeConfiguredFieldPayload(column.fieldConfig);\n const merged = {\n ...preserved,\n ...configured,\n };\n const maxLength =\n column.characterMaximumLength && [\"shortText\", \"longText\"].includes(column.solidFieldType)\n ? column.characterMaximumLength\n : merged.max;\n\n return {\n ...merged,\n ...(column.fieldId ? { id: column.fieldId } : {}),\n name: column.fieldName,\n displayName: column.displayName?.trim() || merged.displayName || startCase(column.fieldName),\n description: merged.description ?? \"\",\n type: column.solidFieldType,\n ormType: column.ormType,\n length: merged.length ?? column.characterMaximumLength ?? undefined,\n defaultValue: merged.defaultValue ?? column.defaultValue ?? undefined,\n required: merged.required ?? (!column.nullable || column.isPrimaryKey),\n unique: merged.unique ?? false,\n encrypt: merged.encrypt ?? false,\n index: merged.index ?? false,\n max: maxLength ?? undefined,\n min: merged.min ?? undefined,\n private: merged.private ?? false,\n isSystem: merged.isSystem ?? false,\n isMarkedForRemoval: false,\n columnName: column.columnName,\n isUserKey: mappingDto.userKeyField === column.fieldName,\n enableAuditTracking: merged.enableAuditTracking ?? mappingDto.enableAuditTracking,\n isMultiSelect: merged.isMultiSelect ?? false,\n isPrimaryKey: column.isPrimaryKey,\n };\n }\n\n private toFieldPreviewKey(id: number | null | undefined, name: string) {\n return typeof id === \"number\" ? `id:${id}` : `name:${name.toLowerCase()}`;\n }\n\n private getLegacySystemColumnDefinitions(legacyTableType: LegacyTableType, datasourceType: string): SystemColumnDefinition[] {\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const timestampType = normalizedDatasourceType === \"postgres\"\n ? \"timestamp\"\n : normalizedDatasourceType === \"mysql\"\n ? \"datetime\"\n : \"datetime2\";\n const publishedAtType = normalizedDatasourceType === \"postgres\"\n ? \"timestamp\"\n : \"datetime\";\n const integerType = normalizedDatasourceType === \"postgres\" ? \"integer\" : \"int\";\n const varcharType = normalizedDatasourceType === \"mssql\" ? \"nvarchar\" : \"varchar\";\n const currentTimestampDefault = normalizedDatasourceType === \"postgres\"\n ? \"now()\"\n : normalizedDatasourceType === \"mysql\"\n ? \"CURRENT_TIMESTAMP\"\n : \"getdate()\";\n return this.modelMetadataHelperService\n .getSystemFieldsMetadata(legacyTableType)\n .map((field) => {\n switch (field.name) {\n case \"id\":\n return {\n columnName: field.columnName,\n type: integerType,\n isNullable: false,\n isGenerated: true,\n isUnique: true,\n } satisfies SystemColumnDefinition;\n case \"createdAt\":\n case \"updatedAt\":\n return {\n columnName: field.columnName,\n type: timestampType,\n isNullable: false,\n defaultExpression: currentTimestampDefault,\n } satisfies SystemColumnDefinition;\n case \"deletedAt\":\n return {\n columnName: field.columnName,\n type: timestampType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"deletedTracker\":\n return {\n columnName: field.columnName,\n type: varcharType,\n length: \"255\",\n isNullable: false,\n defaultExpression: \"'not-deleted'\",\n } satisfies SystemColumnDefinition;\n case \"publishedAt\":\n return {\n columnName: field.columnName,\n type: publishedAtType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"localeName\":\n return {\n columnName: field.columnName,\n type: \"varchar\",\n length: \"255\",\n isNullable: true,\n } satisfies SystemColumnDefinition;\n case \"defaultEntityLocaleId\":\n case \"createdBy\":\n case \"updatedBy\":\n return {\n columnName: field.columnName,\n type: integerType,\n isNullable: true,\n } satisfies SystemColumnDefinition;\n default:\n return {\n columnName: field.columnName,\n type: \"varchar\",\n isNullable: true,\n } satisfies SystemColumnDefinition;\n }\n });\n }\n\n private renderMigrationTemplate(\n className: string,\n mappingDto: DatasourceIntrospectionMappingDto,\n missingSystemColumns: SystemColumnDefinition[],\n ) {\n const tableNameLiteral = this.toMigrationTableName(mappingDto.schema, mappingDto.tableName);\n const deletedAtIndexName = this.buildMigrationObjectName(\"IDX\", tableNameLiteral, \"ss_deleted_at\");\n const generatedIdUniqueName = this.buildMigrationObjectName(\"UQ\", tableNameLiteral, \"ss_id\");\n\n const upColumnStatements = missingSystemColumns.map((definition) => {\n const columnLiteral = this.renderTableColumnLiteral(definition);\n return ` if (!(await queryRunner.hasColumn(tableName, ${JSON.stringify(definition.columnName)})))\\n`\n + ` await queryRunner.addColumn(tableName, new TableColumn(${columnLiteral}));`;\n }).join(\"\\n\\n\");\n\n const postUpStatements: string[] = [];\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_deleted_at\")) {\n postUpStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` if (table && !table.indices.some((index) => index.name === ${JSON.stringify(deletedAtIndexName)}))`,\n ` await queryRunner.createIndex(tableName, new TableIndex(${this.renderTableIndexLiteral({\n name: deletedAtIndexName,\n columnNames: [\"ss_deleted_at\"],\n })}));`,\n \" }\",\n ].join(\"\\n\"),\n );\n }\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_id\")) {\n postUpStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` if (table && !table.indices.some((index) => index.name === ${JSON.stringify(generatedIdUniqueName)}))`,\n ` await queryRunner.createIndex(tableName, new TableIndex(${this.renderTableIndexLiteral({\n name: generatedIdUniqueName,\n columnNames: [\"ss_id\"],\n isUnique: true,\n })}));`,\n \" }\",\n ].join(\"\\n\"),\n );\n }\n\n const downStatements: string[] = [];\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_id\")) {\n downStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` const index = table?.indices.find((entry) => entry.name === ${JSON.stringify(generatedIdUniqueName)});`,\n \" if (index)\",\n \" await queryRunner.dropIndex(tableName, index);\",\n \" }\",\n ].join(\"\\n\"),\n );\n }\n if (missingSystemColumns.some((definition) => definition.columnName === \"ss_deleted_at\")) {\n downStatements.push(\n [\n \" {\",\n \" const table = await queryRunner.getTable(tableName);\",\n ` const index = table?.indices.find((entry) => entry.name === ${JSON.stringify(deletedAtIndexName)});`,\n \" if (index)\",\n \" await queryRunner.dropIndex(tableName, index);\",\n \" }\",\n ].join(\"\\n\"),\n );\n }\n downStatements.push(\n ...missingSystemColumns\n .slice()\n .reverse()\n .map((definition) => ` if (await queryRunner.hasColumn(tableName, ${JSON.stringify(definition.columnName)}))\\n`\n + ` await queryRunner.dropColumn(tableName, ${JSON.stringify(definition.columnName)});`),\n );\n\n return [\n \"import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from \\\"typeorm\\\";\",\n \"\",\n `export class ${className} implements MigrationInterface {`,\n ` name = '${className}'`,\n \"\",\n \" public async up(queryRunner: QueryRunner): Promise<void> {\",\n ` const tableName = ${JSON.stringify(tableNameLiteral)};`,\n upColumnStatements,\n postUpStatements.length ? `\\n${postUpStatements.join(\"\\n\\n\")}` : \"\",\n \" }\",\n \"\",\n \" public async down(queryRunner: QueryRunner): Promise<void> {\",\n ` const tableName = ${JSON.stringify(tableNameLiteral)};`,\n downStatements.join(\"\\n\\n\"),\n \" }\",\n \"}\",\n \"\",\n ].filter(Boolean).join(\"\\n\");\n }\n\n private renderTableColumnLiteral(definition: SystemColumnDefinition) {\n const properties: string[] = [\n `name: ${JSON.stringify(definition.columnName)}`,\n `type: ${JSON.stringify(definition.type)}`,\n ];\n\n if (definition.length) {\n properties.push(`length: ${JSON.stringify(definition.length)}`);\n }\n if (typeof definition.isNullable === \"boolean\") {\n properties.push(`isNullable: ${definition.isNullable}`);\n }\n if (definition.defaultExpression) {\n properties.push(`default: ${JSON.stringify(definition.defaultExpression)}`);\n }\n if (definition.isGenerated) {\n properties.push(\"isGenerated: true\");\n properties.push(\"generationStrategy: \\\"increment\\\"\");\n }\n if (definition.isUnique) {\n properties.push(\"isUnique: true\");\n }\n\n return `{ ${properties.join(\", \")}, }`;\n }\n\n private renderTableIndexLiteral(definition: { name: string; columnNames: string[]; isUnique?: boolean }) {\n const properties: string[] = [\n `name: ${JSON.stringify(definition.name)}`,\n `columnNames: ${JSON.stringify(definition.columnNames)}`,\n ];\n\n if (definition.isUnique) {\n properties.push(\"isUnique: true\");\n }\n\n return `{ ${properties.join(\", \")}, }`;\n }\n\n private buildMigrationObjectName(prefix: string, tableName: string, columnName: string) {\n const hash = createHash(\"md5\").update(`${tableName}:${columnName}:${prefix}`).digest(\"hex\").slice(0, 24);\n return `${prefix}_${hash}`;\n }\n\n private toMigrationTableName(schema: string | null | undefined, tableName: string) {\n return schema ? `${schema}.${tableName}` : tableName;\n }\n\n private async buildRawDdl(\n provider: DatasourceIntrospectionProvider,\n dataSource: DataSource,\n table: DatasourceIntrospectionTableRef,\n ): Promise<TableDdlRecord> {\n try {\n const statement = await provider.getTableDefinition(dataSource, table);\n return {\n statement,\n available: Boolean(statement),\n note: statement ? null : \"The datasource provider did not return a CREATE TABLE statement for this table.\",\n };\n } catch (error) {\n return {\n statement: null,\n available: false,\n note: `DDL preview is unavailable right now: ${(error as Error)?.message ?? \"Unknown error.\"}`,\n };\n }\n }\n\n private async buildTableInventory(datasource: DatasourceRecord) {\n const provider = this.getProvider(datasource.type);\n const runtimeDataSource = this.resolveDataSourceByName(datasource.name);\n const [rawTables, rawColumns, models] = await Promise.all([\n provider.listTables(runtimeDataSource),\n provider.listColumns(runtimeDataSource),\n this.modelMetadataRepository.find({ relations: { module: true } as any }),\n ]);\n const tables = rawTables.filter((table) => !this.isSolidxInternalTableName(table.tableName));\n const columns = rawColumns.filter((column) => !this.isSolidxInternalTableName(column.tableName));\n\n const modelLookup = this.buildModelLookup(models);\n const columnsByKey = this.groupColumnsByTable(columns);\n const tableKeys = new Set<string>();\n\n for (const table of tables) {\n tableKeys.add(this.toTableKey(table.tableSchema, table.tableName));\n }\n\n for (const column of columns) {\n tableKeys.add(this.toTableKey(column.tableSchema, column.tableName));\n }\n\n const records = Array.from(tableKeys)\n .map((tableKey) => {\n const matchingTable = tables.find((table) => this.toTableKey(table.tableSchema, table.tableName) === tableKey);\n const tableColumns = columnsByKey.get(tableKey) ?? [];\n const schema = matchingTable?.tableSchema ?? tableColumns[0]?.tableSchema ?? null;\n const tableName = matchingTable?.tableName ?? tableColumns[0]?.tableName;\n if (!tableName) {\n return null;\n }\n\n const suggestedLegacyTableType = this.detectLegacyTableType(datasource.type, tableColumns);\n const suggestedIdColumn = this.getSuggestedIdColumn(datasource.type, tableColumns, suggestedLegacyTableType);\n const mappedModel = this.resolveMappedModel(modelLookup, datasource.name, tableName);\n const physicalColumns = tableColumns.filter((column) => !this.isHandledBySuperclass(column.columnName, suggestedLegacyTableType));\n const primaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n const hasPrimaryKey = primaryKeyColumns.length > 0;\n\n return {\n schema,\n tableName,\n mapped: Boolean(mappedModel),\n mappedModelId: mappedModel?.id ?? null,\n mappedModelSingularName: mappedModel?.singularName ?? null,\n mappedModelDisplayName: mappedModel?.displayName ?? null,\n mappedModuleId: mappedModel?.module?.id ?? null,\n mappedModuleName: mappedModel?.module?.name ?? null,\n mappedModuleDisplayName: mappedModel?.module?.displayName ?? null,\n suggestedLegacyTableType,\n suggestedBaseClassName: this.getBaseClassName(suggestedLegacyTableType),\n suggestedIdColumnName: suggestedIdColumn?.columnName ?? null,\n suggestedUserKeyField: this.buildUserKeyCandidates(tableColumns)[0]?.name ?? \"id\",\n columnCount: tableColumns.length,\n physicalColumnCount: physicalColumns.length,\n hasPrimaryKey,\n primaryKeyColumnCount: primaryKeyColumns.length,\n primaryKeyColumnNames: primaryKeyColumns.map((column) => column.columnName),\n mappingBlockedReason: hasPrimaryKey\n ? null\n : this.buildMissingPrimaryKeyMessage(tableName),\n } satisfies TableInventoryRecord;\n })\n .filter((record): record is TableInventoryRecord => Boolean(record))\n .sort((left, right) => {\n if (left.mapped !== right.mapped) {\n return left.mapped ? 1 : -1;\n }\n\n const leftLabel = `${left.schema ?? \"\"}.${left.tableName}`.toLowerCase();\n const rightLabel = `${right.schema ?? \"\"}.${right.tableName}`.toLowerCase();\n return leftLabel.localeCompare(rightLabel);\n });\n\n return {\n records,\n recordsByKey: new Map(records.map((record) => [this.toTableKey(record.schema, record.tableName), record])),\n columnsByKey,\n };\n }\n\n private buildModelLookup(models: ModelMetadata[]) {\n const byDatasourceAndTable = new Map<string, ModelMetadata>();\n const byTableName = new Map<string, ModelMetadata[]>();\n\n for (const model of models) {\n if (!model.tableName) {\n continue;\n }\n\n byDatasourceAndTable.set(this.toModelMapKey(model.dataSource, model.tableName), model);\n\n const normalizedTableName = model.tableName.trim().toLowerCase();\n const bucket = byTableName.get(normalizedTableName);\n if (bucket) {\n bucket.push(model);\n continue;\n }\n\n byTableName.set(normalizedTableName, [model]);\n }\n\n return {\n byDatasourceAndTable,\n byTableName,\n };\n }\n\n private resolveMappedModel(\n lookup: {\n byDatasourceAndTable: Map<string, ModelMetadata>;\n byTableName: Map<string, ModelMetadata[]>;\n },\n datasourceName: string,\n tableName: string,\n ) {\n const exactMatch = lookup.byDatasourceAndTable.get(this.toModelMapKey(datasourceName, tableName));\n if (exactMatch) {\n return exactMatch;\n }\n\n const fallbackMatches = lookup.byTableName.get(tableName.trim().toLowerCase()) ?? [];\n if (fallbackMatches.length === 1) {\n return fallbackMatches[0];\n }\n\n return fallbackMatches[0] ?? null;\n }\n\n private groupColumnsByTable(columns: DatasourceIntrospectionColumn[]) {\n const grouped = new Map<string, DatasourceIntrospectionColumn[]>();\n\n for (const column of columns) {\n const key = this.toTableKey(column.tableSchema, column.tableName);\n const bucket = grouped.get(key);\n if (bucket) {\n bucket.push(column);\n continue;\n }\n\n grouped.set(key, [column]);\n }\n\n return grouped;\n }\n\n private isSolidxInternalTableName(tableName: string | null | undefined) {\n return typeof tableName === \"string\" && tableName.toLowerCase().startsWith(\"ss_\");\n }\n\n private detectLegacyTableType(datasourceType: string, columns: DatasourceIntrospectionColumn[]): LegacyTableType {\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const hasExistingGeneratedId = columns.some((column) => column.isAutoGenerated);\n\n if ((normalizedDatasourceType === \"mssql\" || normalizedDatasourceType === \"mysql\") && hasExistingGeneratedId) {\n return LegacyTableType.EXISTING_ID;\n }\n\n return LegacyTableType.GENERATED_ID;\n }\n\n private getSuggestedIdColumn(\n datasourceType: string,\n columns: DatasourceIntrospectionColumn[],\n legacyTableType: LegacyTableType,\n ) {\n if (legacyTableType !== LegacyTableType.EXISTING_ID) {\n return null;\n }\n\n const normalizedDatasourceType = datasourceType.toLowerCase();\n if (normalizedDatasourceType !== \"mssql\" && normalizedDatasourceType !== \"mysql\") {\n return null;\n }\n\n return columns.find((column) => column.isAutoGenerated) ?? null;\n }\n\n private buildUserKeyCandidates(columns: DatasourceIntrospectionColumn[]) {\n const eligibleColumns = columns.filter((column) => !column.columnName.toLowerCase().startsWith(\"ss_\"));\n const scoreMap = new Map<string, { name: string; label: string; score: number; reason: string }>();\n const priorityMatchers = [\n { score: 100, reason: \"Exact legacy external identifier\", test: (name: string) => name === \"external_id\" || name === \"externalid\" },\n { score: 95, reason: \"Exact user key style column\", test: (name: string) => name === \"user_key\" || name === \"userkey\" },\n { score: 90, reason: \"Code-style business identifier\", test: (name: string) => name === \"code\" || name.endsWith(\"_code\") },\n { score: 85, reason: \"Reference-style business identifier\", test: (name: string) => name.includes(\"reference\") || name.endsWith(\"_number\") || name.endsWith(\"_no\") },\n { score: 80, reason: \"Human readable display field\", test: (name: string) => name === \"name\" || name === \"display_name\" || name.endsWith(\"_name\") },\n { score: 70, reason: \"Contact field that could identify a record\", test: (name: string) => name === \"email\" || name === \"mobile\" || name === \"phone\" },\n { score: 60, reason: \"Fallback primary identifier\", test: (name: string) => name === \"id\" },\n ];\n\n for (const column of eligibleColumns) {\n const normalizedName = column.columnName.toLowerCase();\n\n for (const matcher of priorityMatchers) {\n if (!matcher.test(normalizedName)) {\n continue;\n }\n\n const existing = scoreMap.get(column.columnName);\n if (!existing || matcher.score > existing.score) {\n scoreMap.set(column.columnName, {\n name: this.toFieldName(column.columnName),\n label: column.columnName,\n score: matcher.score,\n reason: matcher.reason,\n });\n }\n }\n }\n\n const candidates = Array.from(scoreMap.values())\n .sort((left, right) => right.score - left.score || left.label.localeCompare(right.label))\n .map((candidate, index) => ({\n ...candidate,\n isDefault: index === 0,\n }));\n\n if (candidates.length) {\n return candidates;\n }\n\n const hasIdColumn = eligibleColumns.some((column) => column.columnName.toLowerCase() === \"id\");\n return [{\n name: \"id\",\n label: hasIdColumn ? \"id\" : \"id (fallback)\",\n score: 0,\n reason: \"Default to the SolidX id field when no stronger user key candidate is available.\",\n isDefault: true,\n }];\n }\n\n private toDetailColumnRecord(\n column: DatasourceIntrospectionColumn,\n legacyTableType: LegacyTableType,\n datasourceType: string,\n ): TableDetailColumnRecord {\n const superclassFieldName = this.getSuperclassFieldName(column.columnName, legacyTableType);\n const normalizedColumnName = column.columnName.toLowerCase();\n const fieldName = legacyTableType === LegacyTableType.EXISTING_ID && column.isAutoGenerated\n ? \"id\"\n : legacyTableType === LegacyTableType.GENERATED_ID && normalizedColumnName === \"id\"\n ? \"legacyId\"\n : this.toFieldName(column.columnName);\n\n return {\n columnName: column.columnName,\n fieldName,\n displayName: startCase(fieldName),\n dataType: column.dataType,\n solidFieldType: this.toSolidFieldType(column),\n ormType: this.toOrmFieldType(column, datasourceType),\n nullable: column.isNullable,\n defaultValue: column.defaultValue,\n characterMaximumLength: column.characterMaximumLength,\n numericPrecision: column.numericPrecision,\n numericScale: column.numericScale,\n ordinalPosition: column.ordinalPosition,\n isAutoGenerated: column.isAutoGenerated,\n isPrimaryKey: column.isPrimaryKey,\n handledBySuperclass: Boolean(superclassFieldName),\n superclassFieldName,\n };\n }\n\n private validateTablePrimaryKeyForMapping(\n tableRecord: TableInventoryRecord,\n tableColumns: DatasourceIntrospectionColumn[],\n mappingDto: DatasourceIntrospectionMappingDto,\n ) {\n const detectedPrimaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n if (!detectedPrimaryKeyColumns.length) {\n throw new BadRequestException(tableRecord.mappingBlockedReason ?? this.buildMissingPrimaryKeyMessage(tableRecord.tableName));\n }\n\n const requestColumnsByName = new Map(\n mappingDto.columns.map((column) => [column.columnName.trim().toLowerCase(), column]),\n );\n\n for (const primaryKeyColumn of detectedPrimaryKeyColumns) {\n const matchingRequestColumn = requestColumnsByName.get(primaryKeyColumn.columnName.trim().toLowerCase());\n if (!matchingRequestColumn) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" must remain present in the mapping request for table \"${tableRecord.tableName}\".`);\n }\n\n if (!matchingRequestColumn.include) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" cannot be excluded from the mapping for table \"${tableRecord.tableName}\".`);\n }\n\n if (!matchingRequestColumn.isPrimaryKey) {\n throw new BadRequestException(`Primary key column \"${primaryKeyColumn.columnName}\" must stay marked as isPrimaryKey for table \"${tableRecord.tableName}\".`);\n }\n }\n }\n\n private validateReviewedPrimaryKeyFields(\n reviewedFields: Array<Record<string, any>>,\n tableColumns: DatasourceIntrospectionColumn[],\n ) {\n const detectedPrimaryKeyColumns = tableColumns.filter((column) => column.isPrimaryKey);\n if (!detectedPrimaryKeyColumns.length) {\n return;\n }\n\n const activeReviewedFields = reviewedFields.filter((field) => !field.isMarkedForRemoval);\n\n for (const primaryKeyColumn of detectedPrimaryKeyColumns) {\n const matchingReviewedField = activeReviewedFields.find((field) =>\n `${field.columnName ?? \"\"}`.trim().toLowerCase() === primaryKeyColumn.columnName.trim().toLowerCase(),\n );\n\n if (!matchingReviewedField) {\n throw new BadRequestException(`Reviewed metadata JSON must keep datasource primary key column \"${primaryKeyColumn.columnName}\" in the fields array.`);\n }\n\n if (!matchingReviewedField.isPrimaryKey) {\n throw new BadRequestException(`Reviewed metadata JSON must keep datasource primary key column \"${primaryKeyColumn.columnName}\" marked with isPrimaryKey: true.`);\n }\n }\n }\n\n private buildMissingPrimaryKeyMessage(tableName: string) {\n return `Table \"${tableName}\" cannot be mapped because the datasource table does not define any primary key. Add a real primary key to the table before continuing with SolidX mapping.`;\n }\n\n private getSuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {\n return this.getLegacySuperclassFieldName(columnName, legacyTableType);\n }\n\n private getLegacySuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {\n const normalized = columnName.toLowerCase();\n const legacyFieldMap: Record<string, string> = {\n ss_created_at: \"createdAt\",\n ss_updated_at: \"updatedAt\",\n ss_deleted_at: \"deletedAt\",\n ss_deleted_tracker: \"deletedTracker\",\n ss_published_at: \"publishedAt\",\n ss_locale_name: \"localeName\",\n ss_default_entity_locale_id: \"defaultEntityLocaleId\",\n ss_created_by_id: \"createdBy\",\n ss_updated_by_id: \"updatedBy\",\n };\n\n if (normalized === \"ss_id\" && legacyTableType === LegacyTableType.GENERATED_ID) {\n return \"id\";\n }\n\n return legacyFieldMap[normalized] ?? null;\n }\n\n private isHandledBySuperclass(columnName: string, legacyTableType: LegacyTableType) {\n return Boolean(this.getSuperclassFieldName(columnName, legacyTableType));\n }\n\n private getBaseClassName(legacyTableType: LegacyTableType) {\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n return \"LegacyCommonEntityWithGeneratedId\";\n }\n\n return \"LegacyCommonEntityWithExistingId\";\n }\n\n private getDatasourceTypeFamily(dataType: string): DatasourceTypeFamily | null {\n const normalized = dataType.toLowerCase();\n\n for (const [family, aliases] of Object.entries(DATASOURCE_TYPE_FAMILY_ALIASES) as Array<[DatasourceTypeFamily, string[]]>) {\n if (aliases.includes(normalized)) {\n return family;\n }\n }\n\n if (normalized.includes(\"json\")) {\n return \"json\";\n }\n\n if (normalized.includes(\"date\")) {\n return \"datetime\";\n }\n\n return null;\n }\n\n private toSolidFieldType(column: DatasourceIntrospectionColumn) {\n const family = this.getDatasourceTypeFamily(column.dataType);\n const charLength = column.characterMaximumLength ?? null;\n\n switch (family) {\n case \"boolean\":\n return \"boolean\";\n case \"bigint\":\n return \"bigint\";\n case \"int\":\n return \"int\";\n case \"numeric\":\n case \"decimal\":\n case \"float\":\n return \"decimal\";\n case \"date\":\n return \"date\";\n case \"time\":\n return \"time\";\n case \"datetime\":\n case \"datetimeWithTimezone\":\n return \"datetime\";\n case \"json\":\n case \"jsonb\":\n return \"json\";\n case \"uuid\":\n return \"uuid\";\n case \"mediumText\":\n case \"longText\":\n return \"longText\";\n case \"shortText\":\n case \"unicodeShortText\":\n if (charLength !== null && charLength > 255) {\n return \"longText\";\n }\n\n return \"shortText\";\n default:\n return \"shortText\";\n }\n }\n\n private toOrmFieldType(column: DatasourceIntrospectionColumn, datasourceType: string) {\n const family = this.getDatasourceTypeFamily(column.dataType);\n const normalizedDatasourceType = datasourceType.toLowerCase();\n const ormType = family\n ? ORM_TYPE_BY_DATASOURCE_FAMILY[normalizedDatasourceType]?.[family]\n : undefined;\n\n if (ormType) {\n return ormType;\n }\n\n return normalizedDatasourceType === \"postgres\" ? \"varchar\" : \"varchar\";\n }\n\n private toFieldName(columnName: string) {\n return camelCase(columnName.replace(/^ss_/, \"\"));\n }\n\n private toSingularNameCandidate(tableName: string) {\n const normalized = camelCase(tableName);\n if (normalized.endsWith(\"ies\")) {\n return `${normalized.slice(0, -3)}y`;\n }\n\n if (normalized.endsWith(\"ses\")) {\n return normalized.slice(0, -2);\n }\n\n if (normalized.endsWith(\"s\") && !normalized.endsWith(\"ss\")) {\n return normalized.slice(0, -1);\n }\n\n return normalized;\n }\n\n private toPluralNameCandidate(tableName: string, singularName: string) {\n const normalized = camelCase(tableName);\n if (normalized && normalized !== singularName) {\n return normalized;\n }\n\n if (singularName.endsWith(\"y\")) {\n return `${singularName.slice(0, -1)}ies`;\n }\n\n if (singularName.endsWith(\"s\")) {\n return `${singularName}es`;\n }\n\n return `${singularName}s`;\n }\n\n private toTableKey(schema: string | null, tableName: string) {\n return `${(schema ?? \"\").toLowerCase()}::${tableName.toLowerCase()}`;\n }\n\n private toModelMapKey(datasourceName: string, tableName: string) {\n return `${datasourceName.toLowerCase()}::${tableName.toLowerCase()}`;\n }\n\n private async syncTypeormDatasourceFile(moduleName: string, datasource: DatasourceRecord, singularName: string) {\n const datasourceFilePath = path.resolve(process.cwd(), \"src\", `typeorm-${datasource.name}-datasource.ts`);\n const entityClassName = classify(singularName);\n const entityImportPath = `./${moduleName}/entities/${kebabCase(singularName)}.entity`;\n const migrationGlob = `join(__dirname, './${moduleName}/migrations/${datasource.name}/*.{ts,js}')`;\n\n const existingContent = await fs.readFile(datasourceFilePath, \"utf8\").catch(() => null);\n if (!existingContent) {\n const rendered = this.renderTypeormDatasourceTemplate({\n datasource,\n entityClassName,\n entityImportPath,\n migrationGlob,\n });\n await fs.writeFile(datasourceFilePath, rendered, \"utf8\");\n return {\n filePath: datasourceFilePath,\n created: true,\n updated: false,\n entityRegistered: true,\n migrationGlobRegistered: true,\n };\n }\n\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n const sourceFile = project.createSourceFile(datasourceFilePath, existingContent, { overwrite: true });\n\n const entityImportDeclaration = sourceFile.getImportDeclarations().find((declaration) =>\n declaration.getModuleSpecifierValue() === entityImportPath,\n );\n if (entityImportDeclaration) {\n const alreadyImported = entityImportDeclaration.getNamedImports().some((namedImport) => namedImport.getName() === entityClassName);\n if (!alreadyImported) {\n entityImportDeclaration.addNamedImport(entityClassName);\n }\n } else {\n sourceFile.addImportDeclaration({\n moduleSpecifier: entityImportPath,\n namedImports: [entityClassName],\n });\n }\n\n const entitiesArray = sourceFile\n .getVariableDeclarationOrThrow(\"entities\")\n .getInitializerIfKindOrThrow(SyntaxKind.ArrayLiteralExpression);\n const entityAlreadyRegistered = this.arrayLiteralContainsValue(entitiesArray, entityClassName);\n if (!entityAlreadyRegistered) {\n entitiesArray.addElement(entityClassName);\n }\n\n const dataSourceOptions = this.getTypeormDatasourceOptions(sourceFile);\n const migrationsArray = this.getObjectPropertyArrayLiteral(dataSourceOptions, \"migrations\");\n const migrationAlreadyRegistered = this.arrayLiteralContainsValue(migrationsArray, migrationGlob);\n if (!migrationAlreadyRegistered) {\n migrationsArray.addElement(migrationGlob);\n }\n\n sourceFile.organizeImports();\n sourceFile.formatText();\n\n const nextContent = sourceFile.getFullText();\n const updated = nextContent !== existingContent;\n if (updated) {\n await fs.writeFile(datasourceFilePath, nextContent, \"utf8\");\n }\n\n return {\n filePath: datasourceFilePath,\n created: false,\n updated,\n entityRegistered: true,\n migrationGlobRegistered: true,\n };\n }\n\n private async writeMigrationFile(migration: MappingPreviewRecord[\"migration\"]) {\n if (!migration.willGenerate || !migration.content || !migration.filePath) {\n return false;\n }\n\n await fs.mkdir(path.dirname(migration.filePath), { recursive: true });\n await fs.writeFile(migration.filePath, migration.content, \"utf8\");\n\n const writtenContent = await fs.readFile(migration.filePath, \"utf8\").catch(() => null);\n if (writtenContent !== migration.content) {\n throw new BadRequestException(`Migration file could not be verified after writing: ${migration.filePath}`);\n }\n\n return true;\n }\n\n private renderTypeormDatasourceTemplate(input: {\n datasource: DatasourceRecord;\n entityClassName: string;\n entityImportPath: string;\n migrationGlob: string;\n }) {\n const { datasource, entityClassName, entityImportPath, migrationGlob } = input;\n const envPrefix = datasource.envPrefix?.toUpperCase?.() || \"DEFAULT\";\n const portFallback = datasource.type === \"postgres\" ? 5432 : datasource.type === \"mysql\" ? 3306 : 1433;\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n indentationText: IndentationText.FourSpaces,\n insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: true,\n },\n });\n const sourceFile = project.createSourceFile(\"typeorm-template.ts\", \"\", { overwrite: true });\n\n sourceFile.addImportDeclaration({ moduleSpecifier: \"reflect-metadata\" });\n sourceFile.addImportDeclaration({ moduleSpecifier: \"path\", namedImports: [\"join\"] });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"dotenv\",\n namedImports: [{ name: \"config\", alias: \"dotenvConfig\" }],\n });\n sourceFile.addStatements(\"dotenvConfig({ path: join(__dirname, '../.env') });\");\n sourceFile.addStatements(\"\");\n\n sourceFile.addImportDeclaration({ moduleSpecifier: \"typeorm\", namedImports: [\"DataSource\"] });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"@solidxai/core\",\n namespaceImport: \"SolidCoreModuleExports\",\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"@solidxai/core\",\n namedImports: [\"getDynamicModuleNames\", \"parseBooleanEnv\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"typeorm\",\n namedImports: [\"getMetadataArgsStorage\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: \"typeorm-naming-strategies\",\n namedImports: [\"SnakeNamingStrategy\"],\n });\n sourceFile.addImportDeclaration({\n moduleSpecifier: entityImportPath,\n namedImports: [entityClassName],\n });\n\n sourceFile.addFunction({\n name: \"getEntitiesFromExports\",\n parameters: [{ name: \"exports\", type: \"Record<string, any>\" }],\n statements: (writer) => {\n writer.writeLine(\"const metadataStorage = getMetadataArgsStorage();\");\n writer.writeLine(\"return Object.values(exports).filter((item) =>\");\n writer.indent(() => {\n writer.writeLine(\"metadataStorage.tables.some((table) => table.target === item),\");\n });\n writer.write(\");\");\n },\n });\n\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"coreEntities\",\n initializer: \"getEntitiesFromExports(SolidCoreModuleExports)\",\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"dynamicModules\",\n initializer: \"getDynamicModuleNames()\",\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"entities\",\n initializer: `[\\n ...coreEntities,\\n ${entityClassName},\\n]`,\n },\n ],\n });\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [\n {\n name: \"logging\",\n initializer: `parseBooleanEnv('${envPrefix}_DATABASE_LOGGING')`,\n },\n ],\n });\n\n sourceFile.addStatements(\"// IMPORTANT: synchronize must be false when using migrations\");\n sourceFile.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n isExported: true,\n declarations: [\n {\n name: \"DefaultDataSource\",\n initializer: (writer) => {\n writer.write(\"new DataSource(\");\n writer.inlineBlock(() => {\n writer.writeLine(`type: '${datasource.type}',`);\n writer.blankLine();\n writer.writeLine(`host: process.env.${envPrefix}_DATABASE_HOST,`);\n writer.writeLine(`port: +(process.env.${envPrefix}_DATABASE_PORT || ${portFallback}),`);\n writer.writeLine(`username: process.env.${envPrefix}_DATABASE_USER,`);\n writer.writeLine(`password: process.env.${envPrefix}_DATABASE_PASSWORD,`);\n writer.writeLine(`database: process.env.${envPrefix}_DATABASE_NAME,`);\n writer.blankLine();\n writer.writeLine(\"entities,\");\n writer.writeLine(\"migrations: [\");\n writer.indent(() => {\n writer.writeLine(`${migrationGlob},`);\n });\n writer.writeLine(\"],\");\n writer.writeLine(\"synchronize: false,\");\n writer.writeLine(\"logging,\");\n writer.writeLine(\"namingStrategy: new SnakeNamingStrategy(),\");\n if (datasource.type === \"mssql\") {\n writer.writeLine(\"options: {\");\n writer.indent(() => {\n writer.writeLine(\"encrypt: false,\");\n writer.writeLine(\"trustServerCertificate: true,\");\n });\n writer.writeLine(\"},\");\n }\n });\n writer.write(\")\");\n },\n },\n ],\n });\n\n sourceFile.organizeImports();\n sourceFile.formatText();\n return sourceFile.getFullText();\n }\n\n private arrayLiteralContainsValue(arrayLiteral: ArrayLiteralExpression, rawValue: string) {\n const normalizedTarget = rawValue.replace(/\\s+/g, \"\");\n return arrayLiteral.getElements().some((element) => element.getText().replace(/\\s+/g, \"\") === normalizedTarget);\n }\n\n private getTypeormDatasourceOptions(sourceFile: import(\"ts-morph\").SourceFile) {\n const defaultDataSourceDeclaration = sourceFile.getVariableDeclarationOrThrow(\"DefaultDataSource\");\n const initializer = defaultDataSourceDeclaration.getInitializer();\n if (!initializer || !Node.isNewExpression(initializer)) {\n throw new BadRequestException(\"Unable to locate DefaultDataSource initializer in datasource file.\");\n }\n\n const options = initializer.getArguments()[0];\n if (!options || !Node.isObjectLiteralExpression(options)) {\n throw new BadRequestException(\"Unable to locate DefaultDataSource options object in datasource file.\");\n }\n\n return options;\n }\n\n private getObjectPropertyArrayLiteral(objectLiteral: ObjectLiteralExpression, propertyName: string) {\n const property = objectLiteral.getProperty(propertyName);\n if (!property || !Node.isPropertyAssignment(property)) {\n throw new BadRequestException(`Unable to locate \"${propertyName}\" property in datasource file.`);\n }\n\n const initializer = property.getInitializer();\n if (!initializer || !Node.isArrayLiteralExpression(initializer)) {\n throw new BadRequestException(`Unable to locate \"${propertyName}\" array in datasource file.`);\n }\n\n return initializer;\n }\n\n private buildSynchronizeBlockedMessage(datasource: DatasourceRecord) {\n return `Datasource \"${datasource.displayName}\" has synchronize enabled. Set ${datasource.envPrefix}_DATABASE_SYNCHRONIZE=false before starting legacy table introspection.`;\n }\n\n private resolveDataSourceByName(datasourceName: string) {\n const token = datasourceName === \"default\" ? getDataSourceToken() : getDataSourceToken(datasourceName);\n\n try {\n const dataSource = this.moduleRef.get<DataSource>(token, { strict: false });\n if (!dataSource) {\n throw new NotFoundException(`Datasource \"${datasourceName}\" is not registered in the current runtime.`);\n }\n\n return dataSource;\n } catch (error: any) {\n throw new NotFoundException(\n `Failed to resolve datasource \"${datasourceName}\": ${error?.message ?? error}`,\n );\n }\n }\n\n private getProvider(type: string): DatasourceIntrospectionProvider {\n const providers: DatasourceIntrospectionProvider[] = [\n this.mssqlProvider,\n this.mysqlProvider,\n this.postgresProvider,\n ];\n\n const provider = providers.find((candidate) => candidate.supports(type));\n if (!provider) {\n throw new BadRequestException(`Datasource type \"${type}\" is not supported for introspection yet.`);\n }\n\n return provider;\n }\n\n private requireDatasource(datasourceName: string) {\n const datasource = this.datasourceManagementService.findOneByName(datasourceName);\n if (!datasource) {\n throw new NotFoundException(`Datasource \"${datasourceName}\" is not configured.`);\n }\n\n if (!this.supportedDatasourceTypes.has(datasource.type?.toLowerCase?.() ?? \"\")) {\n throw new BadRequestException(`Datasource \"${datasource.type}\" is not supported for introspection yet.`);\n }\n\n return datasource;\n }\n\n private async loadModule(moduleId: number) {\n const module = await this.moduleMetadataRepository.findOne({\n where: { id: moduleId },\n });\n\n if (!module) {\n throw new NotFoundException(`Module with id \"${moduleId}\" was not found.`);\n }\n\n return module;\n }\n\n private toModuleSummary(module: any) {\n return {\n id: module.id,\n name: module.name,\n displayName: module.displayName,\n description: module.description ?? \"\",\n defaultDataSource: module.defaultDataSource ?? \"\",\n };\n }\n\n private toDatasourceSummary(record: DatasourceRecord) {\n return {\n name: record.name,\n displayName: record.displayName,\n type: record.type,\n envPrefix: record.envPrefix,\n isDefault: record.isDefault,\n synchronize: record.synchronize,\n host: record.host,\n port: record.port,\n database: record.database,\n };\n }\n}\n"]}