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

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 (226) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/CLAUDE.md +26 -0
  3. package/dist/commands/migrate-removed-fields.command.d.ts +19 -0
  4. package/dist/commands/migrate-removed-fields.command.d.ts.map +1 -0
  5. package/dist/commands/migrate-removed-fields.command.js +77 -0
  6. package/dist/commands/migrate-removed-fields.command.js.map +1 -0
  7. package/dist/controllers/datasource-introspection.controller.d.ts +46 -1
  8. package/dist/controllers/datasource-introspection.controller.d.ts.map +1 -1
  9. package/dist/controllers/datasource-introspection.controller.js +38 -0
  10. package/dist/controllers/datasource-introspection.controller.js.map +1 -1
  11. package/dist/controllers/service.controller.d.ts +1 -0
  12. package/dist/controllers/service.controller.d.ts.map +1 -1
  13. package/dist/controllers/service.controller.js +2 -2
  14. package/dist/controllers/service.controller.js.map +1 -1
  15. package/dist/dtos/datasource-introspection-mapping.dto.d.ts +5 -0
  16. package/dist/dtos/datasource-introspection-mapping.dto.d.ts.map +1 -1
  17. package/dist/dtos/datasource-introspection-mapping.dto.js +24 -2
  18. package/dist/dtos/datasource-introspection-mapping.dto.js.map +1 -1
  19. package/dist/entities/{legacy-common-with-id.entity.d.ts → legacy-common-with-generated-id.entity.d.ts} +2 -2
  20. package/dist/entities/legacy-common-with-generated-id.entity.d.ts.map +1 -0
  21. package/dist/entities/{legacy-common-with-id.entity.js → legacy-common-with-generated-id.entity.js} +4 -4
  22. package/dist/entities/legacy-common-with-generated-id.entity.js.map +1 -0
  23. package/dist/entities/{legacy-common.entity.d.ts → legacy-common.entity-with-existing-id.entity.d.ts} +1 -1
  24. package/dist/entities/legacy-common.entity-with-existing-id.entity.d.ts.map +1 -0
  25. package/dist/entities/{legacy-common.entity.js → legacy-common.entity-with-existing-id.entity.js} +1 -1
  26. package/dist/entities/legacy-common.entity-with-existing-id.entity.js.map +1 -0
  27. package/dist/helpers/command.service.d.ts +2 -0
  28. package/dist/helpers/command.service.d.ts.map +1 -1
  29. package/dist/helpers/command.service.js +6 -2
  30. package/dist/helpers/command.service.js.map +1 -1
  31. package/dist/helpers/environment.helper.d.ts +1 -0
  32. package/dist/helpers/environment.helper.d.ts.map +1 -1
  33. package/dist/helpers/environment.helper.js +4 -0
  34. package/dist/helpers/environment.helper.js.map +1 -1
  35. package/dist/helpers/field-crud-managers/IntFieldCrudManager.d.ts.map +1 -1
  36. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js +4 -1
  37. package/dist/helpers/field-crud-managers/IntFieldCrudManager.js.map +1 -1
  38. package/dist/helpers/model-metadata-helper.service.d.ts +2 -1
  39. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  40. package/dist/helpers/model-metadata-helper.service.js +9 -5
  41. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  42. package/dist/helpers/nodemon-heartbeat.d.ts +5 -0
  43. package/dist/helpers/nodemon-heartbeat.d.ts.map +1 -0
  44. package/dist/helpers/nodemon-heartbeat.js +67 -0
  45. package/dist/helpers/nodemon-heartbeat.js.map +1 -0
  46. package/dist/helpers/solid-registry.d.ts +2 -1
  47. package/dist/helpers/solid-registry.d.ts.map +1 -1
  48. package/dist/helpers/solid-registry.js.map +1 -1
  49. package/dist/helpers/typeorm-db-helper.d.ts +1 -0
  50. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  51. package/dist/helpers/typeorm-db-helper.js +12 -0
  52. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  53. package/dist/index.d.ts +3 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/interfaces/datasource-introspection-provider.interface.d.ts +1 -0
  58. package/dist/interfaces/datasource-introspection-provider.interface.d.ts.map +1 -1
  59. package/dist/interfaces/datasource-introspection-provider.interface.js.map +1 -1
  60. package/dist/interfaces.d.ts +1 -0
  61. package/dist/interfaces.d.ts.map +1 -1
  62. package/dist/interfaces.js.map +1 -1
  63. package/dist/repository/scheduled-job.repository.d.ts +5 -2
  64. package/dist/repository/scheduled-job.repository.d.ts.map +1 -1
  65. package/dist/repository/scheduled-job.repository.js +66 -3
  66. package/dist/repository/scheduled-job.repository.js.map +1 -1
  67. package/dist/repository/security-rule.repository.d.ts +2 -2
  68. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  69. package/dist/repository/security-rule.repository.js +6 -3
  70. package/dist/repository/security-rule.repository.js.map +1 -1
  71. package/dist/seeders/module-metadata-seeder.service.d.ts +43 -2
  72. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  73. package/dist/seeders/module-metadata-seeder.service.js +1173 -232
  74. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  75. package/dist/seeders/seed-data/solid-core-metadata.json +128 -34
  76. package/dist/services/action-metadata.service.d.ts +7 -0
  77. package/dist/services/action-metadata.service.d.ts.map +1 -1
  78. package/dist/services/action-metadata.service.js +76 -3
  79. package/dist/services/action-metadata.service.js.map +1 -1
  80. package/dist/services/api-key.service.d.ts.map +1 -1
  81. package/dist/services/api-key.service.js.map +1 -1
  82. package/dist/services/authentication.service.d.ts +2 -0
  83. package/dist/services/authentication.service.d.ts.map +1 -1
  84. package/dist/services/authentication.service.js +32 -11
  85. package/dist/services/authentication.service.js.map +1 -1
  86. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  87. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  88. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  89. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts +4 -0
  90. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.d.ts.map +1 -1
  91. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js +18 -1
  92. package/dist/services/computed-fields/entity/concat-entity-computed-field-provider.service.js.map +1 -1
  93. package/dist/services/crud-helper.service.d.ts.map +1 -1
  94. package/dist/services/crud-helper.service.js +25 -12
  95. package/dist/services/crud-helper.service.js.map +1 -1
  96. package/dist/services/crud.service.d.ts +1 -0
  97. package/dist/services/crud.service.d.ts.map +1 -1
  98. package/dist/services/crud.service.js +27 -0
  99. package/dist/services/crud.service.js.map +1 -1
  100. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.d.ts.map +1 -1
  101. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js +12 -0
  102. package/dist/services/datasource-introspection/mssql-datasource-introspection-provider.service.js.map +1 -1
  103. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.d.ts.map +1 -1
  104. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js +2 -0
  105. package/dist/services/datasource-introspection/mysql-datasource-introspection-provider.service.js.map +1 -1
  106. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.d.ts.map +1 -1
  107. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js +28 -15
  108. package/dist/services/datasource-introspection/postgres-datasource-introspection-provider.service.js.map +1 -1
  109. package/dist/services/datasource-introspection.service.d.ts +62 -2
  110. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  111. package/dist/services/datasource-introspection.service.js +654 -186
  112. package/dist/services/datasource-introspection.service.js.map +1 -1
  113. package/dist/services/import-transaction.service.d.ts.map +1 -1
  114. package/dist/services/import-transaction.service.js +3 -0
  115. package/dist/services/import-transaction.service.js.map +1 -1
  116. package/dist/services/locale.service.d.ts +14 -0
  117. package/dist/services/locale.service.d.ts.map +1 -1
  118. package/dist/services/locale.service.js +83 -0
  119. package/dist/services/locale.service.js.map +1 -1
  120. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +10 -10
  121. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  122. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  123. package/dist/services/menu-item-metadata.service.js +1 -0
  124. package/dist/services/menu-item-metadata.service.js.map +1 -1
  125. package/dist/services/model-metadata.service.d.ts +3 -0
  126. package/dist/services/model-metadata.service.d.ts.map +1 -1
  127. package/dist/services/model-metadata.service.js +78 -0
  128. package/dist/services/model-metadata.service.js.map +1 -1
  129. package/dist/services/module-metadata.service.d.ts.map +1 -1
  130. package/dist/services/module-metadata.service.js +28 -0
  131. package/dist/services/module-metadata.service.js.map +1 -1
  132. package/dist/services/removed-field-migration.service.d.ts +30 -0
  133. package/dist/services/removed-field-migration.service.d.ts.map +1 -0
  134. package/dist/services/removed-field-migration.service.js +319 -0
  135. package/dist/services/removed-field-migration.service.js.map +1 -0
  136. package/dist/services/role-metadata.service.d.ts +5 -0
  137. package/dist/services/role-metadata.service.d.ts.map +1 -1
  138. package/dist/services/role-metadata.service.js +95 -33
  139. package/dist/services/role-metadata.service.js.map +1 -1
  140. package/dist/services/settings/default-settings-provider.service.d.ts +244 -0
  141. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  142. package/dist/services/settings/default-settings-provider.service.js +120 -0
  143. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  144. package/dist/services/solid-ts-morph.service.d.ts +6 -0
  145. package/dist/services/solid-ts-morph.service.d.ts.map +1 -1
  146. package/dist/services/solid-ts-morph.service.js +43 -0
  147. package/dist/services/solid-ts-morph.service.js.map +1 -1
  148. package/dist/services/view-metadata.service.d.ts +6 -0
  149. package/dist/services/view-metadata.service.d.ts.map +1 -1
  150. package/dist/services/view-metadata.service.js +70 -8
  151. package/dist/services/view-metadata.service.js.map +1 -1
  152. package/dist/solid-core.module.d.ts.map +1 -1
  153. package/dist/solid-core.module.js +4 -0
  154. package/dist/solid-core.module.js.map +1 -1
  155. package/dist/subscribers/audit.subscriber.d.ts +5 -1
  156. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  157. package/dist/subscribers/audit.subscriber.js +76 -12
  158. package/dist/subscribers/audit.subscriber.js.map +1 -1
  159. package/dist/subscribers/computed-entity-field.subscriber.d.ts +9 -1
  160. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  161. package/dist/subscribers/computed-entity-field.subscriber.js +45 -11
  162. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  163. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  164. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  165. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  166. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  167. package/dist/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
  168. package/dist/subscribers/scheduled-job.subscriber.js +3 -2
  169. package/dist/subscribers/scheduled-job.subscriber.js.map +1 -1
  170. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  171. package/dist/subscribers/security-rule.subscriber.js +5 -3
  172. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  173. package/package.json +1 -1
  174. package/src/commands/migrate-removed-fields.command.ts +81 -0
  175. package/src/controllers/datasource-introspection.controller.ts +27 -1
  176. package/src/controllers/service.controller.ts +3 -2
  177. package/src/dtos/datasource-introspection-mapping.dto.ts +15 -0
  178. package/src/entities/{legacy-common-with-id.entity.ts → legacy-common-with-generated-id.entity.ts} +1 -1
  179. package/src/helpers/command.service.ts +10 -2
  180. package/src/helpers/environment.helper.ts +11 -0
  181. package/src/helpers/field-crud-managers/IntFieldCrudManager.ts +4 -1
  182. package/src/helpers/model-metadata-helper.service.ts +8 -3
  183. package/src/helpers/nodemon-heartbeat.ts +59 -0
  184. package/src/helpers/solid-registry.ts +7 -1
  185. package/src/helpers/typeorm-db-helper.ts +15 -0
  186. package/src/index.ts +3 -2
  187. package/src/interfaces/datasource-introspection-provider.interface.ts +1 -0
  188. package/src/interfaces.ts +1 -0
  189. package/src/repository/scheduled-job.repository.ts +83 -4
  190. package/src/repository/security-rule.repository.ts +10 -4
  191. package/src/seeders/module-metadata-seeder.service.ts +1415 -264
  192. package/src/seeders/seed-data/solid-core-metadata.json +128 -34
  193. package/src/services/action-metadata.service.ts +87 -2
  194. package/src/services/api-key.service.ts +36 -36
  195. package/src/services/authentication.service.ts +46 -12
  196. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +11 -5
  197. package/src/services/computed-fields/entity/concat-entity-computed-field-provider.service.ts +15 -1
  198. package/src/services/crud-helper.service.ts +25 -12
  199. package/src/services/crud.service.ts +36 -11
  200. package/src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts +12 -0
  201. package/src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts +2 -0
  202. package/src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts +28 -15
  203. package/src/services/datasource-introspection.service.ts +811 -161
  204. package/src/services/import-transaction.service.ts +5 -0
  205. package/src/services/locale.service.ts +111 -3
  206. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +2 -2
  207. package/src/services/menu-item-metadata.service.ts +2 -1
  208. package/src/services/model-metadata.service.ts +109 -1
  209. package/src/services/module-metadata.service.ts +36 -0
  210. package/src/services/removed-field-migration.service.ts +334 -0
  211. package/src/services/role-metadata.service.ts +112 -49
  212. package/src/services/settings/default-settings-provider.service.ts +120 -0
  213. package/src/services/solid-ts-morph.service.ts +61 -1
  214. package/src/services/view-metadata.service.ts +83 -9
  215. package/src/solid-core.module.ts +4 -0
  216. package/src/subscribers/audit.subscriber.ts +101 -18
  217. package/src/subscribers/computed-entity-field.subscriber.ts +81 -28
  218. package/src/subscribers/created-by-updated-by.subscriber.ts +3 -0
  219. package/src/subscribers/field-metadata.subscriber.ts +3 -0
  220. package/src/subscribers/scheduled-job.subscriber.ts +3 -2
  221. package/src/subscribers/security-rule.subscriber.ts +8 -3
  222. package/dist/entities/legacy-common-with-id.entity.d.ts.map +0 -1
  223. package/dist/entities/legacy-common-with-id.entity.js.map +0 -1
  224. package/dist/entities/legacy-common.entity.d.ts.map +0 -1
  225. package/dist/entities/legacy-common.entity.js.map +0 -1
  226. /package/src/entities/{legacy-common.entity.ts → legacy-common.entity-with-existing-id.entity.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"crud.service.js","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, HttpException, InternalServerErrorException, NotFoundException } from \"@nestjs/common\";\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { isArray } from \"class-validator\";\nimport { CommonEntity } from \"../entities/common.entity\";\nimport { User } from \"../entities/user.entity\";\nimport { SolidBaseRepository } from \"../repository/solid-base.repository\";\nimport { SettingService } from \"./setting.service\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { SUCCESS_MESSAGES } from \"src/constants/success-messages\";\nimport { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from \"typeorm\";\nimport { QueryDeepPartialEntity } from \"typeorm/query-builder/QueryPartialEntity\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { ComputedFieldValueType, RelationType, SelectionValueType, SolidFieldType } from \"../dtos/create-field-metadata.dto\";\nimport { MediaStorageProviderType } from \"../dtos/create-media-storage-provider-metadata.dto\";\nimport { FieldMetadata } from \"../entities/field-metadata.entity\";\nimport { ModelMetadata } from \"../entities/model-metadata.entity\";\nimport { BigIntFieldCrudManager } from \"../helpers/field-crud-managers/BigIntFieldCrudManager\";\nimport { BooleanFieldCrudManager } from \"../helpers/field-crud-managers/BooleanFieldCrudManager\";\nimport { ComputedFieldCrudManager } from \"../helpers/field-crud-managers/ComputedFieldCrudManager\";\nimport { DateFieldCrudManager } from \"../helpers/field-crud-managers/DateFieldCrudManager\";\nimport { DecimalFieldCrudManager } from \"../helpers/field-crud-managers/DecimalFieldCrudManager\";\nimport { EmailFieldCrudManager, MAX_EMAIL_LENGTH } from \"../helpers/field-crud-managers/EmailFieldCrudManager\";\nimport { IntFieldCrudManager } from \"../helpers/field-crud-managers/IntFieldCrudManager\";\nimport { JsonFieldCrudManager } from \"../helpers/field-crud-managers/JsonFieldCrudManager\";\nimport { LongTextFieldCrudManager } from \"../helpers/field-crud-managers/LongTextFieldCrudManager\";\nimport { ManyToManyRelationFieldCrudManager, ManyToManyRelationFieldOptions } from \"../helpers/field-crud-managers/ManyToManyRelationFieldCrudManager\";\nimport { ManyToOneRelationFieldCrudManager, ManyToOneRelationFieldOptions } from \"../helpers/field-crud-managers/ManyToOneRelationFieldCrudManager\";\nimport { MediaFieldCrudManager, SolidMediaType } from \"../helpers/field-crud-managers/MediaFieldCrudManager\";\nimport { NoOpsFieldCrudManager } from \"../helpers/field-crud-managers/NoOpsFieldCrudManager\";\nimport { OneToManyRelationFieldCrudManager, OneToManyRelationFieldOptions } from \"../helpers/field-crud-managers/OneToManyRelationFieldCrudManager\";\nimport { PasswordFieldCrudManager } from \"../helpers/field-crud-managers/PasswordFieldCrudManager\";\nimport { RichTextFieldCrudManager } from \"../helpers/field-crud-managers/RichTextFieldCrudManager\";\nimport { SelectionDynamicFieldCrudManager } from \"../helpers/field-crud-managers/SelectionDynamicFieldCrudManager\";\nimport { SelectionStaticFieldCrudManager } from \"../helpers/field-crud-managers/SelectionStaticFieldCrudManager\";\nimport { ShortTextFieldCrudManager } from \"../helpers/field-crud-managers/ShortTextFieldCrudManager\";\nimport { UUIDFieldCrudManager } from \"../helpers/field-crud-managers/UUIDFieldCrudManager\";\nimport { FieldCrudManager, MediaWithFullUrl } from \"../interfaces\";\nimport { CrudHelperService, FilterCombinator, UserIdFields } from \"./crud-helper.service\";\nimport { HashingService } from \"./hashing.service\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\nimport { ModelMetadataService } from \"./model-metadata.service\";\nimport { RequestContextService } from \"./request-context.service\";\n\n\nexport class CRUDService<T extends CommonEntity> { // Add two generic value i.e Person,CreatePersonDto, so we get the proper types in our service\n\n private _modelMetadataService: ModelMetadataService;\n private _crudHelperService: CrudHelperService;\n private _discoveryService: DiscoveryService;\n private _settingService: SettingService;\n\n constructor(\n readonly entityManager: EntityManager,\n readonly repo: SolidBaseRepository<T>,\n readonly modelName: string,\n readonly moduleName: string,\n readonly moduleRef: ModuleRef,\n readonly defaultDatasourceEntityManager?: EntityManager\n ) { }\n\n protected get modelMetadataService(): ModelMetadataService {\n return this._modelMetadataService ??= this.moduleRef.get(ModelMetadataService, { strict: false });\n }\n\n protected get crudHelperService(): CrudHelperService {\n return this._crudHelperService ??= this.moduleRef.get(CrudHelperService, { strict: false });\n }\n\n protected get discoveryService(): DiscoveryService {\n return this._discoveryService ??= this.moduleRef.get(DiscoveryService, { strict: false });\n }\n\n protected get settingService(): SettingService {\n return this._settingService ??= this.moduleRef.get(SettingService, { strict: false });\n }\n\n private async tryCreateAsExtensionUser(createDto: any): Promise<T | null> {\n if (this.repo.metadata?.parentEntityMetadata?.target !== User) return null;\n const registry = this.moduleRef.get(SolidRegistry, { strict: false });\n if (!registry?.getExtensionUserCreationProvider()) {\n throw new InternalServerErrorException(\n `No ExtensionUserCreationProvider registered. Register one to create ${this.repo.metadata.name} entities.`,\n );\n }\n const { AuthenticationService } = await import('./authentication.service');\n const authService = this.moduleRef.get(AuthenticationService, { strict: false });\n return authService.signUp(createDto) as unknown as T;\n }\n\n async create(createDto: any, files: Express.Multer.File[] = [], solidRequestContext: any = {}): Promise<T> {\n const asExtensionUser = await this.tryCreateAsExtensionUser(createDto);\n if (asExtensionUser !== null) return asExtensionUser;\n\n // This class will be extended by the generated service class i.e PersonService\n // The data required to identify the model and module name will be passed from the generate CrudService subclass\n //TODO: Algorithm to create the entity\n // 1. Fire a query and load all the fields in the provided model name for a particular module\n // FIXME This can be optimized to take in module name i.e (handle scenario wherein same model exists in multiple modules)\n let hasMediaFields = false;\n\n const model = await this.loadModel();\n // Check wheather user has create permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasCreatePermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n // const inverseRelationFields = await this.loadInverseRelationFields();\n const fieldsToProcess = [...model.fields];\n\n // 2. Loop through the fields with a switch statement\n // 3. Handle the fields based on field type\n for (const field of fieldsToProcess) {\n const transformed = await this.validateAndTransformDto(field, createDto, files, hasMediaFields);\n createDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n };\n try {\n // 5. Save the entity\n // For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table\n const entity = this.repo.create(createDto);\n const savedEntity = await this.repo.save(entity) as unknown as T;\n\n // 6. Save the media\n if (hasMediaFields) {\n await this.saveMedia(model, files, savedEntity);\n }\n return savedEntity;\n } catch (error: any) {\n if (error instanceof QueryFailedError && error.message.includes('duplicate key value violates unique constraint')) {\n throw new BadRequestException(ERROR_MESSAGES.DUPLICATE_ENTRY);\n }\n throw error;\n }\n }\n\n private async loadModel() {\n return await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: {\n userKeyField: true\n },\n mediaStorageProvider: true,\n },\n module: true,\n });\n }\n\n private async validateAndTransformDto(field: FieldMetadata, dto: any, files: Express.Multer.File[], hasMediaFields: boolean, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {\n const fieldManager: FieldCrudManager = await this.fieldCrudManager(field, this.entityManager, isPartialUpdate, isUpdate, entityId);\n const validationErrors = fieldManager.validate(dto, files);\n const errors = (validationErrors instanceof Promise) ? await validationErrors : validationErrors;\n if (errors.length > 0) {\n throw new BadRequestException(`Validation errors in ${field.name} is invalid i.e ${errors.map(e => e.error).join(', ')}`); //FIXME: Better to return a validation error object\n }\n const dtoOrPromise = fieldManager.transformForCreate(dto);\n dto = (dtoOrPromise instanceof Promise) ? await dtoOrPromise : dtoOrPromise;\n hasMediaFields = hasMediaFields || field.type === 'mediaSingle' || field.type === 'mediaMultiple';\n return { dto, hasMediaFields };\n }\n\n private async saveMedia(model: ModelMetadata, files: Express.Multer.File[], savedEntity: T): Promise<void> {\n // Get all the media fields in the dto\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n // Depending upon media storage provider configured, get the appropriate storage provider\n // Using Promise.all to save all media fields in parallel\n await Promise.all(mediaFields.map(async (mediaField) => {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n\n // If media is present, then save the media\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n\n // Use the storage provider metadata to get the appropriate storage provider implementation\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n\n // Get the storage provider implementation\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n\n await storageProvider.store(media, savedEntity, mediaField);\n }\n }));\n }\n\n //TODO: Will the updates be partial i.e PATCH or full i.e PUT\n async update(id: number, updateDto: any, files: Express.Multer.File[] = [], isPartialUpdate: boolean = false, solidRequestContext: any = {}, isUpdate: boolean = false): Promise<T> {\n if (!id) {\n throw new Error(ERROR_MESSAGES.ID_REQUIRED_FOR_UPDATE);\n }\n isUpdate = true;\n const model = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasUpdatePermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n });\n if (!entity) {\n throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n\n if (model.draftPublishWorkflow === true && entity.publishedAt) {\n throw new BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`\n );\n }\n\n // // In some instances for legacy tables sometimes id is mapped as a bigint. \n // // in these cases the update method ends up attempting to insert records due to some type orm type mismatch issue.\n // const idFieldMetadata = model.fields.find(f => f.name === 'id');\n // updateDto.id = idFieldMetadata?.type === 'bigint' ? BigInt(id) : id;\n\n // This class will be extended by the generated service class i.e PersonService\n // The data required to identify the model and module name will be passed from the generate CrudService subclass\n //TODO: Algorithm to create the entity\n // 1. Fire a query and load all the fields in the provided model name for a particular module\n // FIXME This can be optimized to take in module name i.e (handle scenario wherein same model exists in multiple modules)\n let hasMediaFields = false;\n\n const fieldsToProcess = [...model.fields];\n\n // 2. Loop through the fields with a switch statement\n // 3. Handle the fields based on field type\n for (const field of fieldsToProcess) {\n const transformed = await this.validateAndTransformDto(field, updateDto, files, hasMediaFields, isPartialUpdate, isUpdate, id);\n updateDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n }\n\n // 5. Save the entity\n // For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table\n const mergedEntity = this.repo.merge(entity, updateDto);\n const savedEntity = await this.repo.save(mergedEntity) as T;\n\n //FIXME: Skip the many-to-many, and instead fire differential updates and avoid loading the entire association graph for the ids\n\n // 6. Save the media\n if (hasMediaFields) {\n await this.saveMedia(model, files, savedEntity);\n }\n return savedEntity;\n }\n\n //TODO: Will the updates be partial i.e PATCH or full i.e PUT\n async delete(id: number, solidRequestContext: any = {}) {\n if (!id) {\n throw new Error(ERROR_MESSAGES.ID_REQUIRED_FOR_DELETE);\n }\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasDeletePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n }\n );\n if (!entity) {\n throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n\n if (model.draftPublishWorkflow === true && entity.publishedAt) {\n throw new BadRequestException(`Cannot update a published record for model ${this.modelName}, Unpublish it first.`);\n }\n\n // If the model has internationalisation enabled, delete children with defaultEntityLocaleId === this entity's id\n if (model.internationalisation) {\n // Find all child entities where defaultEntityLocaleId === this entity's id\n const childEntities = await this.repo.find({\n where: { defaultEntityLocaleId: id } as any\n });\n\n if (childEntities.length > 0) {\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(childEntities);\n } else {\n await this.repo.remove(childEntities);\n }\n }\n }\n\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(entity);\n return this.repo.save(entity);\n } else {\n return this.repo.remove(entity);\n }\n }\n\n private async fieldCrudManager(fieldMetadata: FieldMetadata, entityManager: EntityManager, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {\n const commonOptions = { required: fieldMetadata.required && !isPartialUpdate, fieldName: fieldMetadata.name, isUpdate };\n switch (fieldMetadata.type) {\n case SolidFieldType.shortText: {\n const options = { ...commonOptions, length: fieldMetadata.max, regexPattern: fieldMetadata.regexPattern };\n return new ShortTextFieldCrudManager(options);\n }\n case SolidFieldType.longtext: {\n const options = { ...commonOptions, regexPattern: fieldMetadata.regexPattern };\n return new LongTextFieldCrudManager(options);\n }\n case SolidFieldType.boolean: {\n const options = { ...commonOptions };\n return new BooleanFieldCrudManager(options);\n }\n case SolidFieldType.richText: {\n const options = { ...commonOptions, regexPattern: fieldMetadata.regexPattern };\n return new RichTextFieldCrudManager(options);\n }\n case SolidFieldType.json: {\n const options = { ...commonOptions };\n return new JsonFieldCrudManager(options);\n }\n case SolidFieldType.int: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new IntFieldCrudManager(options);\n }\n case SolidFieldType.decimal: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new DecimalFieldCrudManager(options);\n }\n case SolidFieldType.bigint: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new BigIntFieldCrudManager(options);\n }\n case SolidFieldType.email: {\n const options = { ...commonOptions, max: fieldMetadata.max ?? MAX_EMAIL_LENGTH, regexPattern: fieldMetadata.regexPattern };\n return new EmailFieldCrudManager(options);\n }\n case SolidFieldType.date:\n case SolidFieldType.datetime: {\n const options = { ...commonOptions };\n return new DateFieldCrudManager(options);\n }\n case SolidFieldType.password: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max, regexPattern: fieldMetadata.regexPattern, hashingService: this.moduleRef.get(HashingService, { strict: false }) };\n return new PasswordFieldCrudManager(options);\n }\n case SolidFieldType.mediaSingle:\n case SolidFieldType.mediaMultiple: {\n // update will need to delete the existing media and save the new media \n // case 'mediaSingle':\n // Use the EntityController to extract uploaded content & pass to the entity service.\n // If embedded media, then the media uri will saved in the entity table,\n // else the uri will be saved in the media table\n // Plan the media table schema e.g id, uri, storageProvider, entity_id, entity_name, createdAt, updatedAt\n // break;\n // case 'mediaMultiple':\n // Use the EntityController to extract uploaded content & pass to the entity service.\n // If embedded media, then the media uri will saved in the entity table, else the uri will be saved in the media table\n // Plan the media table schema e.g id, uri, storageProvider, entity_id, entity_name, createdAt, updatedAt\n const options = {\n ...commonOptions,\n mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,\n mediaTypes: fieldMetadata.mediaTypes,\n type: fieldMetadata.type as unknown as SolidMediaType\n };\n return new MediaFieldCrudManager(options);\n }\n case SolidFieldType.relation: {\n // Identify if the field is for the inverse side or not\n if (fieldMetadata.relationType === RelationType.manyToOne) {\n const relationCoModelUserKeyFieldName = await this.getUserKeyFieldNameForModel(fieldMetadata.relationCoModelSingularName);\n const manyToOneOptions: ManyToOneRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n // modelUserKeyFieldName: fieldMetadata.model.userKeyField?.name,\n modelSingularName: fieldMetadata.model.singularName,\n relationCoModelUserKeyFieldName: relationCoModelUserKeyFieldName,\n entityManager,\n }\n return new ManyToOneRelationFieldCrudManager(manyToOneOptions);\n }\n else if (fieldMetadata.relationType === RelationType.oneToMany) {\n const oneToManyOptions: OneToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n entityManager,\n inverseFieldName: fieldMetadata.relationCoModelFieldName,\n inverseRelationCoModelFieldName: fieldMetadata.name,\n entityId,\n }\n return new OneToManyRelationFieldCrudManager(oneToManyOptions);\n }\n else if (fieldMetadata.relationType === RelationType.manyTomany) {\n if (fieldMetadata.isRelationManyToManyOwner) {\n const manyToManyOptions: ManyToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n isInverseSide: false,\n entityManager,\n fieldName: fieldMetadata.name,\n entityId,\n }\n return new ManyToManyRelationFieldCrudManager(manyToManyOptions);\n }\n else {\n const inverseManyToManyOptions: ManyToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n isInverseSide: true,\n entityManager,\n fieldName: fieldMetadata.relationCoModelFieldName,\n relationCoModelFieldName: fieldMetadata.name,\n entityId,\n }\n return new ManyToManyRelationFieldCrudManager(inverseManyToManyOptions);\n }\n }\n else throw new Error(ERROR_MESSAGES.RELATION_TYPE_NOT_SUPPORTED);\n // return (fieldMetadata.relationType === 'many-to-one') ? new ManyToOneRelationFieldCrudManager(fieldMetadata, entityManager) : new ManyToManyRelationFieldCrudManager(fieldMetadata, entityManager); //FIXME many-to-many pending\n // ManyToOne -> fieldId. The value is saved as is. No transformation is required\n // OneToMany -> fieldIds. Get the value of the oneToMany field side. No transformation is required (While saving special provision to be made)\n // ManyToMany\n // break;\n }\n case SolidFieldType.selectionStatic: {\n\n // Validation against the selectionStatic values. No transformation is required\n // If the value is not in the selectionStatic values, then throw\n // Also validate against the selectionType\n const options = { ...commonOptions, selectionStaticValues: fieldMetadata.selectionStaticValues, selectionValueType: fieldMetadata.selectionValueType as SelectionValueType, isMultiSelect: fieldMetadata.isMultiSelect };\n return new SelectionStaticFieldCrudManager(options);\n }\n case SolidFieldType.selectionDynamic: {// [HOLD]\n // Default implementation using list of values.\n // ISelectionProvider interface to be implemented for dynamic selection\n // dataSource: string; // The name of the selection provider\n // filterSchema : json // This is a custom json object that every data source will handle accordingly. We could validate the query against the selection provider\n // values : string[]; // The values returned by the selection provider\n const options = { ...commonOptions, selectionDynamicProvider: fieldMetadata.selectionDynamicProvider, selectionDynamicProviderCtxt: JSON.parse(fieldMetadata.selectionDynamicProviderCtxt), selectionValueType: fieldMetadata.selectionValueType as SelectionValueType, discoveryService: this.discoveryService, isMultiSelect: fieldMetadata.isMultiSelect };\n return new SelectionDynamicFieldCrudManager(options);\n }\n case SolidFieldType.uuid: {\n const options = { ...commonOptions };\n // If no value is provided, then generate a uuid. Add to the dto\n return new UUIDFieldCrudManager(options);\n }\n case SolidFieldType.computed: {\n\n // The value will be computed by the computed provider\n // Invoke the appropriate computed provider, get the value and add to the dto\n const options = { ...commonOptions, computedFieldProvider: fieldMetadata.computedFieldValueProvider, computedFieldValueProviderCtxt: fieldMetadata.computedFieldValueProviderCtxt, computedFieldValueType: fieldMetadata.computedFieldValueType as ComputedFieldValueType, discoveryService: this.discoveryService, skipComputation: this.isSkipComputation(isPartialUpdate, fieldMetadata) };\n return new ComputedFieldCrudManager(options);\n }\n default:\n return new NoOpsFieldCrudManager();\n }\n }\n\n private isSkipComputation(isPartialUpdate: boolean, computedFieldMetadata: FieldMetadata) {\n if (isPartialUpdate) return true; // If it is a partial update, then skip computation\n if (computedFieldMetadata.computedFieldTriggerConfig && computedFieldMetadata.computedFieldTriggerConfig.length > 0) {\n return true; // computedFieldTriggerConfig is a new field introduced as part of the IEntityComputedFieldProvider new interface, so this computation will be skiipped in crud service & will be called in the subscriber instead\n }\n return false; // If it is not a partial update, then do not skip computation\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}): Promise<any> {\n const alias = 'entity';\n // Extract the required keys from the input query\n let { limit, offset, populateMedia } = basicFilterDto;\n const populateUserIdFields = this.crudHelperService.extractUserIdFieldsFromPopulate(basicFilterDto.populate);\n\n const { singularName, internationalisation, draftPublishWorkflow } = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasReadPermissionOnModel(solidRequestContext.activeUser, singularName);\n if (!hasPermission) {\n throw new BadRequestException('Forbidden');\n }\n }\n\n // Set the request filter in the request context service\n const requestContextService = this.moduleRef.get(RequestContextService, { strict: false });\n requestContextService.setRequestFilter(basicFilterDto);\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)\n\n if (basicFilterDto.groupBy?.length) {\n const groupFilterQb = (internationalisation && draftPublishWorkflow)\n ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)\n : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);\n\n return this.crudHelperService.executeGroupPipeline(\n groupFilterQb, basicFilterDto, alias,\n () => this.repo.createSecurityRuleAwareQueryBuilder(alias),\n async (entities) => {\n if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);\n if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);\n }\n );\n }\n else {\n qb = (internationalisation && draftPublishWorkflow)\n ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)\n : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);\n return {\n meta,\n records,\n }\n }\n }\n\n private async handleNonGroupFind(qb: SelectQueryBuilder<T>, populateUserIdFields: UserIdFields[], populateMedia: string[], offset: number, limit: number, alias: string) {\n const [entities, count] = await qb.getManyAndCount();\n\n // Populate the entity with the userId fields\n if (populateUserIdFields && populateUserIdFields.length > 0) {\n await this.handlePopulateUserIdFields(populateUserIdFields, entities);\n }\n\n // Populate the entity with the media\n if (populateMedia && populateMedia.length > 0) {\n await this.handlePopulateMedia(populateMedia, entities);\n }\n\n return this.wrapFindResponse(offset, limit, count, entities);\n }\n\n private wrapFindResponse(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {\n return this.crudHelperService.pagedResponse(offset, limit, count, entities);\n }\n\n // entities is an array of T\n // T can contain createdBy and updatedBy fields\n // We need to populate the createdBy and updatedBy fields with the User entity\n private async handlePopulateUserIdFields(userIdFields: UserIdFields[], entities: T[]) {\n const userRepository = this.entityManager.getRepository(User);\n for (const entity of entities) {\n for (const userFieldPath of userIdFields) {\n const userId = entity[userFieldPath as keyof T] as unknown as number;\n if (userId) {\n const user = await userRepository.findOne({\n where: { id: userId },\n });\n // @ts-ignore\n entity[userFieldPath] = user;\n }\n }\n }\n }\n\n private async handlePopulateMedia(populateMedia: string[], entities: T[]) {\n const model = await this.getDatasourceDefaultEntityManager().getRepository(ModelMetadata).findOne({\n where: {\n singularName: this.modelName,\n },\n relations: ['fields', 'fields.mediaStorageProvider', 'fields.model', 'module'],\n });\n\n // Will iterate through every entity & all populateMedia & call getMediaDetails for each field\n for (const entity of entities) {\n for (const mediaFieldPath of populateMedia) {\n await this.populateMediaObject(mediaFieldPath, model, entity);\n }\n }\n return entities;\n }\n\n // Adds the media with full URL to the entity / nested entity\n private async populateMediaObject(mediaFieldPath: string, model: ModelMetadata, entity: T) {\n if (mediaFieldPath.includes('.')) { // mediaFieldPath is a nested field\n const pathParts = mediaFieldPath.split('.');\n const mediaFieldMetadata = await this.getFieldMetadataRecursively(pathParts, model.fields);\n if (!mediaFieldMetadata) {\n throw new BadRequestException(`Media field ${mediaFieldPath} not found in model ${this.modelName}`);\n }\n\n // We can assume that the media field entity model is already populated as part of the entity data\n const mediaFieldEntities = this.getMediaFieldEntities(entity, pathParts);\n if (!mediaFieldEntities || mediaFieldEntities.length === 0) {\n return;//no need to populate data if relation not exists\n }\n // Populate the media field entities with the full URL\n for (const mediaFieldEntity of mediaFieldEntities) {\n const mediaWithFullUrl = await this.getMediaWithFullUrl(mediaFieldEntity, mediaFieldMetadata);\n this.appendMediaKey(mediaWithFullUrl, mediaFieldEntity, mediaFieldMetadata.name);\n // mediaFieldEntity['_media'][mediaFieldPath] = mediaWithFullUrl\n }\n }\n else {\n // mediaFieldPath is a single field\n const mediaFieldMetadata = model.fields.find(field => field.name === mediaFieldPath);\n if (!mediaFieldMetadata) {\n throw new BadRequestException(`Media field ${mediaFieldPath} not found in model ${this.modelName}`);\n }\n const mediaWithFullUrl = await this.getMediaWithFullUrl(entity, mediaFieldMetadata);\n this.appendMediaKey(mediaWithFullUrl, entity, mediaFieldPath);\n // entity['_media'][mediaFieldPath] = mediaWithFullUrl;\n }\n }\n\n // // Add the media with full URL to the entity\n private appendMediaKey(mediaWithFullUrl: MediaWithFullUrl[], entity: T, mediaFieldPath: string) {\n // if _media key already exists, append the new media to the existing array\n if (entity['_media']) {\n entity['_media'][mediaFieldPath] = mediaWithFullUrl;\n }\n else {\n entity['_media'] = {\n [mediaFieldPath]: mediaWithFullUrl\n };\n }\n }\n\n private getMediaFieldEntities(entity: T, mediaPathParts: string[]): T[] {\n let entityPart = entity;\n for (let i = 0; i < mediaPathParts.length - 1; i++) {\n const pathPart = mediaPathParts[i];\n if (entity[pathPart]) {\n entityPart = entity[pathPart];\n } else {\n throw new BadRequestException(`Media field ${pathPart} not found in entity ${JSON.stringify(entity)}`);\n }\n }\n return isArray(entityPart) ? entityPart : [entityPart];\n }\n\n async getMediaWithFullUrl(mediaEntity: any, mediaFieldMetadata: FieldMetadata): Promise<MediaWithFullUrl[]> {\n const storageProviderMetadata = mediaFieldMetadata.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n const mediaDetails = await storageProvider.retrieve(mediaEntity, mediaFieldMetadata);\n return mediaDetails as MediaWithFullUrl[];\n }\n\n async findOne(id: number, query: any = {}, solidRequestContext: any = {}) {\n const { populate = [], fields = [], populateMedia = [] } = query;\n\n // const normalizedFields = this.crudHelperService.normalize(fields);\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.crudHelperService.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedPopulate.push(...additionalPopulate.filter((relation) => !normalizedPopulate.includes(relation)));\n\n const model = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasReadPermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n let entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n relations: normalizedPopulate,\n select: fields,\n });\n if (!entity) {\n throw new NotFoundException(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n // Populate the entity with the media\n if (normalizedPopulateMedia.length > 0) {\n const populatedEntities = await this.handlePopulateMedia(normalizedPopulateMedia, [entity]);\n entity = populatedEntities[0] as Awaited<T>;\n }\n return entity;\n }\n\n async createMany(createDtos: any[], solidRequestContext: any = {}): Promise<T[]> {\n const loadedmodel = await this.loadModel();\n\n // Check wheather user has create permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasCreatePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Fetch model metadata once\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const entitiesForSave: T[] = [];\n for (const createDto of createDtos) {\n // Validate and transform each createDto sequentially\n let transformedDto = createDto;\n for (const field of model.fields) {\n const fieldManager: FieldCrudManager = await this.fieldCrudManager(field, this.entityManager);\n const validationErrors = await fieldManager.validate(createDto, []); // TODO, This is set, because we are not supporting files for insertMany currently\n if (validationErrors.length > 0) {\n throw new BadRequestException(`Validation errors in ${field.name} are invalid: ${validationErrors.map(e => e.error).join(', ')}`);\n }\n transformedDto = await fieldManager.transformForCreate(createDto);\n }\n const entity = this.repo.create(transformedDto);\n entitiesForSave.push(entity as unknown as T);\n }\n // Save all entities in a single batch\n const savedEntities = await this.repo.save(entitiesForSave) as T[];\n return savedEntities;\n }\n\n async insertMany(createDtos: any[], filesArray: Express.Multer.File[][] = [], solidRequestContext: any = {}): Promise<T[]> {\n const savedEntities = await this.createMany(createDtos, solidRequestContext);\n return savedEntities;\n }\n\n async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {\n\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasDeletePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n\n\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n });\n\n removedEntities.push(entity);\n }\n\n\n // entity-level flag\n const isDraftPublishEnabled = model?.draftPublishWorkflow === true;\n\n let publishedEntitiesExists: T[] = [];\n\n if (isDraftPublishEnabled) {\n publishedEntitiesExists = removedEntities.filter(\n (x) => !!x?.publishedAt\n );\n }\n\n if (publishedEntitiesExists.length > 0) {\n const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);\n\n throw new BadRequestException(\n `Cannot delete published record(s) for model ${this.modelName} with Ids ${publishedEntitiesExistsID.join(', ')}. Unpublish them first.`\n );\n }\n\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(removedEntities);\n return this.repo.save(removedEntities);\n } else {\n return this.repo.remove(removedEntities);\n }\n // return removedEntities\n }\n\n async recover(id: number, solidRequestContext: any = {}) {\n try {\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasRecoverPermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n const softDeletedRows = await this.repo.findOne({\n where: {\n id, deletedAt: Not(IsNull())\n } as unknown as FindOptionsWhere<T>,\n withDeleted: true,\n });\n\n if (!softDeletedRows) {\n throw new NotFoundException(ERROR_MESSAGES.NO_SOFT_DELETED_RECORD_FOUND);\n }\n\n await this.repo.update(id, {\n deletedAt: null, deletedTracker: \"not-deleted\"\n } as unknown as QueryDeepPartialEntity<T>\n );\n\n return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };\n } catch (error: any) {\n if (error instanceof QueryFailedError && (error as any).code === '23505') {\n throw new ConflictException(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);\n }\n if (error instanceof HttpException) {\n throw error;\n }\n throw new InternalServerErrorException(error?.message ?? String(error));\n }\n }\n\n async recoverMany(ids: number[], solidRequestContext: any = {}) {\n try {\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasRecoverPermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // Find soft-deleted records matching the given IDs\n const softDeletedRows = await this.repo.find({\n where: {\n id: In(ids),\n deletedAt: Not(IsNull()),\n } as unknown as FindOptionsWhere<T>,\n withDeleted: true,\n });\n\n if (softDeletedRows.length === 0) {\n throw new NotFoundException(ERROR_MESSAGES.NO_SOFT_DELETED_RECORDS_FOUND);\n }\n\n // Recover the specific records by setting deletedAt to null\n await this.repo.update(\n { id: In(ids) } as unknown as FindOptionsWhere<T>,\n { deletedAt: null, deletedTracker: \"not-deleted\" } as unknown as QueryDeepPartialEntity<T>\n );\n\n return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };\n } catch (error: any) {\n if (error instanceof QueryFailedError && (error as any).code === \"23505\") {\n throw new ConflictException(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);\n }\n if (error instanceof HttpException) {\n throw error;\n }\n throw new InternalServerErrorException(error?.message ?? String(error));\n }\n }\n\n\n async getFieldMetadataRecursively(pathParts: string[], fields: FieldMetadata[]) {\n if (!pathParts || pathParts.length === 0) {\n throw new BadRequestException(ERROR_MESSAGES.EMPTY_PATH_PARTS);\n }\n\n const [currentPart, ...remainingParts] = pathParts;\n const field = fields.find(field => field.name === currentPart);\n\n if (!field) {\n throw new BadRequestException(`Field ${currentPart} not found in model ${this.modelName}`);\n }\n\n // Base case: last part, return the field\n if (remainingParts.length === 0) {\n return field;\n }\n\n if (!field.relationCoModelSingularName) {\n throw new BadRequestException(`Field ${field.name} does not define a relationCoModelSingularName`);\n }\n\n const relationCoModel = await this.getDatasourceDefaultEntityManager().getRepository(ModelMetadata).findOne({\n where: { singularName: field.relationCoModelSingularName },\n relations: ['fields', 'fields.mediaStorageProvider', 'fields.model'],\n });\n\n if (!relationCoModel) {\n throw new BadRequestException(`Model ${field.relationCoModelSingularName} not found`);\n }\n\n return this.getFieldMetadataRecursively(remainingParts, relationCoModel.fields);\n }\n\n async getUserKeyFieldNameForModel(modelSingularName: string): Promise<string> {\n const model = await this.modelMetadataService.findOneBySingularName(modelSingularName, ['userKeyField']);\n if (!model) {\n throw new BadRequestException(`Model ${modelSingularName} not found`);\n }\n return model.userKeyField?.name || '';\n }\n\n /* Publish a record - sets publishedAt timestamp */\n async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {\n\n const model = await this.loadModel();\n\n // Check if publish workflow is enabled for this model\n if (!model.draftPublishWorkflow) {\n throw new BadRequestException(\n `Publish workflow is not enabled for ${this.modelName}`\n );\n }\n\n // Check user permissions\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(\n solidRequestContext.activeUser,\n model.singularName\n );\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Find the entity\n const entity = await this.repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${this.modelName} with id ${id} not found`);\n }\n\n // Check if already published\n if (entity.publishedAt) {\n throw new BadRequestException(\n `${this.modelName} with id ${id} is already published`\n );\n }\n\n // Update publish status\n const updatedEntity = await this.repo.save({ ...entity, publishedAt: new Date() });\n\n return updatedEntity\n }\n\n /* Unpublish a record - clears publishedAt timestamp */\n async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {\n\n const model = await this.loadModel();\n\n // Check if publish workflow is enabled for this model\n if (!model.draftPublishWorkflow) {\n throw new BadRequestException(\n `Publish workflow is not enabled for ${this.modelName}`\n );\n }\n\n // Check user permissions\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(\n solidRequestContext.activeUser,\n model.singularName\n );\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Find the entity\n const entity = await this.repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${this.modelName} with id ${id} not found`);\n }\n\n // Check if already unpublished\n if (!entity.publishedAt) {\n throw new BadRequestException(\n `${this.modelName} with id ${id} is already unpublished`\n );\n }\n\n // Update unpublish status\n const updatedEntity = await this.repo.save({ ...entity, publishedAt: null });\n\n return updatedEntity\n }\n\n private getDatasourceDefaultEntityManager() {\n return this.defaultDatasourceEntityManager ?? this.entityManager;\n }\n}\n"]}
1
+ {"version":3,"file":"crud.service.js","sourceRoot":"","sources":["../../src/services/crud.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { BadRequestException, ConflictException, HttpException, InternalServerErrorException, NotFoundException } from \"@nestjs/common\";\nimport { DiscoveryService, ModuleRef } from \"@nestjs/core\";\nimport { isArray } from \"class-validator\";\nimport { CommonEntity } from \"../entities/common.entity\";\nimport { User } from \"../entities/user.entity\";\nimport { SolidBaseRepository } from \"../repository/solid-base.repository\";\nimport { SettingService } from \"./setting.service\";\nimport { ERROR_MESSAGES } from \"src/constants/error-messages\";\nimport { SUCCESS_MESSAGES } from \"src/constants/success-messages\";\nimport { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from \"typeorm\";\nimport { QueryDeepPartialEntity } from \"typeorm/query-builder/QueryPartialEntity\";\nimport { BasicFilterDto } from \"../dtos/basic-filters.dto\";\nimport { ComputedFieldValueType, RelationType, SelectionValueType, SolidFieldType } from \"../dtos/create-field-metadata.dto\";\nimport { MediaStorageProviderType } from \"../dtos/create-media-storage-provider-metadata.dto\";\nimport { FieldMetadata } from \"../entities/field-metadata.entity\";\nimport { ModelMetadata } from \"../entities/model-metadata.entity\";\nimport { BigIntFieldCrudManager } from \"../helpers/field-crud-managers/BigIntFieldCrudManager\";\nimport { BooleanFieldCrudManager } from \"../helpers/field-crud-managers/BooleanFieldCrudManager\";\nimport { ComputedFieldCrudManager } from \"../helpers/field-crud-managers/ComputedFieldCrudManager\";\nimport { DateFieldCrudManager } from \"../helpers/field-crud-managers/DateFieldCrudManager\";\nimport { DecimalFieldCrudManager } from \"../helpers/field-crud-managers/DecimalFieldCrudManager\";\nimport { EmailFieldCrudManager, MAX_EMAIL_LENGTH } from \"../helpers/field-crud-managers/EmailFieldCrudManager\";\nimport { IntFieldCrudManager } from \"../helpers/field-crud-managers/IntFieldCrudManager\";\nimport { JsonFieldCrudManager } from \"../helpers/field-crud-managers/JsonFieldCrudManager\";\nimport { LongTextFieldCrudManager } from \"../helpers/field-crud-managers/LongTextFieldCrudManager\";\nimport { ManyToManyRelationFieldCrudManager, ManyToManyRelationFieldOptions } from \"../helpers/field-crud-managers/ManyToManyRelationFieldCrudManager\";\nimport { ManyToOneRelationFieldCrudManager, ManyToOneRelationFieldOptions } from \"../helpers/field-crud-managers/ManyToOneRelationFieldCrudManager\";\nimport { MediaFieldCrudManager, SolidMediaType } from \"../helpers/field-crud-managers/MediaFieldCrudManager\";\nimport { NoOpsFieldCrudManager } from \"../helpers/field-crud-managers/NoOpsFieldCrudManager\";\nimport { OneToManyRelationFieldCrudManager, OneToManyRelationFieldOptions } from \"../helpers/field-crud-managers/OneToManyRelationFieldCrudManager\";\nimport { PasswordFieldCrudManager } from \"../helpers/field-crud-managers/PasswordFieldCrudManager\";\nimport { RichTextFieldCrudManager } from \"../helpers/field-crud-managers/RichTextFieldCrudManager\";\nimport { SelectionDynamicFieldCrudManager } from \"../helpers/field-crud-managers/SelectionDynamicFieldCrudManager\";\nimport { SelectionStaticFieldCrudManager } from \"../helpers/field-crud-managers/SelectionStaticFieldCrudManager\";\nimport { ShortTextFieldCrudManager } from \"../helpers/field-crud-managers/ShortTextFieldCrudManager\";\nimport { UUIDFieldCrudManager } from \"../helpers/field-crud-managers/UUIDFieldCrudManager\";\nimport { ModelMetadataHelperService } from \"src/helpers/model-metadata-helper.service\";\nimport { FieldCrudManager, MediaWithFullUrl } from \"../interfaces\";\nimport { CrudHelperService, FilterCombinator, UserIdFields } from \"./crud-helper.service\";\nimport { HashingService } from \"./hashing.service\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { getMediaStorageProvider } from \"./mediaStorageProviders\";\nimport { ModelMetadataService } from \"./model-metadata.service\";\nimport { RequestContextService } from \"./request-context.service\";\n\nconst AUDIT_BEFORE_SNAPSHOT = '__auditBeforeSnapshot';\n\nexport class CRUDService<T extends CommonEntity> { // Add two generic value i.e Person,CreatePersonDto, so we get the proper types in our service\n\n private _modelMetadataService: ModelMetadataService;\n private _crudHelperService: CrudHelperService;\n private _discoveryService: DiscoveryService;\n private _settingService: SettingService;\n\n constructor(\n readonly entityManager: EntityManager,\n readonly repo: SolidBaseRepository<T>,\n readonly modelName: string,\n readonly moduleName: string,\n readonly moduleRef: ModuleRef,\n readonly defaultDatasourceEntityManager?: EntityManager\n ) { }\n\n protected get modelMetadataService(): ModelMetadataService {\n return this._modelMetadataService ??= this.moduleRef.get(ModelMetadataService, { strict: false });\n }\n\n protected get crudHelperService(): CrudHelperService {\n return this._crudHelperService ??= this.moduleRef.get(CrudHelperService, { strict: false });\n }\n\n protected get discoveryService(): DiscoveryService {\n return this._discoveryService ??= this.moduleRef.get(DiscoveryService, { strict: false });\n }\n\n protected get settingService(): SettingService {\n return this._settingService ??= this.moduleRef.get(SettingService, { strict: false });\n }\n\n private async tryCreateAsExtensionUser(createDto: any): Promise<T | null> {\n if (this.repo.metadata?.parentEntityMetadata?.target !== User) return null;\n const registry = this.moduleRef.get(SolidRegistry, { strict: false });\n if (!registry?.getExtensionUserCreationProvider()) {\n throw new InternalServerErrorException(\n `No ExtensionUserCreationProvider registered. Register one to create ${this.repo.metadata.name} entities.`,\n );\n }\n const { AuthenticationService } = await import('./authentication.service');\n const authService = this.moduleRef.get(AuthenticationService, { strict: false });\n return authService.signUp(createDto) as unknown as T;\n }\n\n async create(createDto: any, files: Express.Multer.File[] = [], solidRequestContext: any = {}): Promise<T> {\n const asExtensionUser = await this.tryCreateAsExtensionUser(createDto);\n if (asExtensionUser !== null) return asExtensionUser;\n\n // This class will be extended by the generated service class i.e PersonService\n // The data required to identify the model and module name will be passed from the generate CrudService subclass\n //TODO: Algorithm to create the entity\n // 1. Fire a query and load all the fields in the provided model name for a particular module\n // FIXME This can be optimized to take in module name i.e (handle scenario wherein same model exists in multiple modules)\n let hasMediaFields = false;\n\n const model = await this.loadModel();\n // Check wheather user has create permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasCreatePermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n // const inverseRelationFields = await this.loadInverseRelationFields();\n const fieldsToProcess = [...model.fields];\n\n // 2. Loop through the fields with a switch statement\n // 3. Handle the fields based on field type\n for (const field of fieldsToProcess) {\n const transformed = await this.validateAndTransformDto(field, createDto, files, hasMediaFields);\n createDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n };\n try {\n // 5. Save the entity\n // For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table\n const entity = this.repo.create(createDto);\n const savedEntity = await this.repo.save(entity) as unknown as T;\n\n // 6. Save the media\n if (hasMediaFields) {\n await this.saveMedia(model, files, savedEntity);\n }\n return savedEntity;\n } catch (error: any) {\n if (error instanceof QueryFailedError && error.message.includes('duplicate key value violates unique constraint')) {\n throw new BadRequestException(ERROR_MESSAGES.DUPLICATE_ENTRY);\n }\n throw error;\n }\n }\n\n private async loadModel() {\n return await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: {\n userKeyField: true\n },\n mediaStorageProvider: true,\n },\n module: true,\n });\n }\n\n private async validateAndTransformDto(field: FieldMetadata, dto: any, files: Express.Multer.File[], hasMediaFields: boolean, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {\n const fieldManager: FieldCrudManager = await this.fieldCrudManager(field, this.entityManager, isPartialUpdate, isUpdate, entityId);\n const validationErrors = fieldManager.validate(dto, files);\n const errors = (validationErrors instanceof Promise) ? await validationErrors : validationErrors;\n if (errors.length > 0) {\n throw new BadRequestException(`Validation errors in ${field.name} is invalid i.e ${errors.map(e => e.error).join(', ')}`); //FIXME: Better to return a validation error object\n }\n const dtoOrPromise = fieldManager.transformForCreate(dto);\n dto = (dtoOrPromise instanceof Promise) ? await dtoOrPromise : dtoOrPromise;\n hasMediaFields = hasMediaFields || field.type === 'mediaSingle' || field.type === 'mediaMultiple';\n return { dto, hasMediaFields };\n }\n\n private async saveMedia(model: ModelMetadata, files: Express.Multer.File[], savedEntity: T): Promise<void> {\n // Get all the media fields in the dto\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n // Depending upon media storage provider configured, get the appropriate storage provider\n // Using Promise.all to save all media fields in parallel\n await Promise.all(mediaFields.map(async (mediaField) => {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n\n // If media is present, then save the media\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n\n // Use the storage provider metadata to get the appropriate storage provider implementation\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n\n // Get the storage provider implementation\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n\n await storageProvider.store(media, savedEntity, mediaField);\n }\n }));\n }\n\n //TODO: Will the updates be partial i.e PATCH or full i.e PUT\n async update(id: number, updateDto: any, files: Express.Multer.File[] = [], isPartialUpdate: boolean = false, solidRequestContext: any = {}, isUpdate: boolean = false): Promise<T> {\n if (!id) {\n throw new Error(ERROR_MESSAGES.ID_REQUIRED_FOR_UPDATE);\n }\n isUpdate = true;\n const model = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasUpdatePermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n });\n if (!entity) {\n throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n\n if (model.draftPublishWorkflow === true && entity.publishedAt) {\n throw new BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`\n );\n }\n\n // Capture pre-update many-to-many relation state for audit tracking\n await this.prepareManyToManyAuditSnapshot(entity,id,model.singularName);\n let hasMediaFields = false;\n\n const fieldsToProcess = [...model.fields];\n\n // 2. Loop through the fields with a switch statement\n // 3. Handle the fields based on field type\n for (const field of fieldsToProcess) {\n const transformed = await this.validateAndTransformDto(field, updateDto, files, hasMediaFields, isPartialUpdate, isUpdate, id);\n updateDto = transformed.dto;\n hasMediaFields = transformed.hasMediaFields;\n }\n\n // 5. Save the entity\n // For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table\n const mergedEntity = this.repo.merge(entity, updateDto);\n const savedEntity = await this.repo.save(mergedEntity) as T;\n\n //FIXME: Skip the many-to-many, and instead fire differential updates and avoid loading the entire association graph for the ids\n\n // 6. Save the media\n if (hasMediaFields) {\n await this.saveMedia(model, files, savedEntity);\n }\n return savedEntity;\n }\n\n/**\n * Captures the current state of audit-enabled many-to-many relations\n * before the entity is updated. The snapshot is attached to the entity\n * and can be used later for audit comparison.\n */\nprivate async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularName: string): Promise<void> {\n const modelMetadataHelperService = this.moduleRef.get(ModelMetadataHelperService, { strict: false });\n const auditRelationFields = (await modelMetadataHelperService.loadFieldHierarchy(modelSingularName)).filter(field =>\n field.enableAuditTracking &&\n field.type === 'relation' &&\n field.relationType !== 'one-to-many'\n );\n if (auditRelationFields.length > 0) {\n const relations: any = {};\n auditRelationFields.forEach(field => relations[field.name] = true);\n const auditBeforeEntity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n relations: relations as any,\n });\n if (auditBeforeEntity) {\n Object.defineProperty(entity, AUDIT_BEFORE_SNAPSHOT, {\n configurable: true,\n enumerable: false,\n value: auditBeforeEntity,\n writable: true,\n });\n }\n }\n }\n //TODO: Will the updates be partial i.e PATCH or full i.e PUT\n async delete(id: number, solidRequestContext: any = {}) {\n if (!id) {\n throw new Error(ERROR_MESSAGES.ID_REQUIRED_FOR_DELETE);\n }\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasDeletePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n }\n );\n if (!entity) {\n throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n\n if (model.draftPublishWorkflow === true && entity.publishedAt) {\n throw new BadRequestException(`Cannot update a published record for model ${this.modelName}, Unpublish it first.`);\n }\n\n // If the model has internationalisation enabled, delete children with defaultEntityLocaleId === this entity's id\n if (model.internationalisation) {\n // Find all child entities where defaultEntityLocaleId === this entity's id\n const childEntities = await this.repo.find({\n where: { defaultEntityLocaleId: id } as any\n });\n\n if (childEntities.length > 0) {\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(childEntities);\n } else {\n await this.repo.remove(childEntities);\n }\n }\n }\n\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(entity);\n return this.repo.save(entity);\n } else {\n return this.repo.remove(entity);\n }\n }\n\n private async fieldCrudManager(fieldMetadata: FieldMetadata, entityManager: EntityManager, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {\n const commonOptions = { required: fieldMetadata.required && !isPartialUpdate, fieldName: fieldMetadata.name, isUpdate };\n switch (fieldMetadata.type) {\n case SolidFieldType.shortText: {\n const options = { ...commonOptions, length: fieldMetadata.max, regexPattern: fieldMetadata.regexPattern };\n return new ShortTextFieldCrudManager(options);\n }\n case SolidFieldType.longtext: {\n const options = { ...commonOptions, regexPattern: fieldMetadata.regexPattern };\n return new LongTextFieldCrudManager(options);\n }\n case SolidFieldType.boolean: {\n const options = { ...commonOptions };\n return new BooleanFieldCrudManager(options);\n }\n case SolidFieldType.richText: {\n const options = { ...commonOptions, regexPattern: fieldMetadata.regexPattern };\n return new RichTextFieldCrudManager(options);\n }\n case SolidFieldType.json: {\n const options = { ...commonOptions };\n return new JsonFieldCrudManager(options);\n }\n case SolidFieldType.int: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new IntFieldCrudManager(options);\n }\n case SolidFieldType.decimal: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new DecimalFieldCrudManager(options);\n }\n case SolidFieldType.bigint: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max };\n return new BigIntFieldCrudManager(options);\n }\n case SolidFieldType.email: {\n const options = { ...commonOptions, max: fieldMetadata.max ?? MAX_EMAIL_LENGTH, regexPattern: fieldMetadata.regexPattern };\n return new EmailFieldCrudManager(options);\n }\n case SolidFieldType.date:\n case SolidFieldType.datetime: {\n const options = { ...commonOptions };\n return new DateFieldCrudManager(options);\n }\n case SolidFieldType.password: {\n const options = { ...commonOptions, min: fieldMetadata.min, max: fieldMetadata.max, regexPattern: fieldMetadata.regexPattern, hashingService: this.moduleRef.get(HashingService, { strict: false }) };\n return new PasswordFieldCrudManager(options);\n }\n case SolidFieldType.mediaSingle:\n case SolidFieldType.mediaMultiple: {\n // update will need to delete the existing media and save the new media \n // case 'mediaSingle':\n // Use the EntityController to extract uploaded content & pass to the entity service.\n // If embedded media, then the media uri will saved in the entity table,\n // else the uri will be saved in the media table\n // Plan the media table schema e.g id, uri, storageProvider, entity_id, entity_name, createdAt, updatedAt\n // break;\n // case 'mediaMultiple':\n // Use the EntityController to extract uploaded content & pass to the entity service.\n // If embedded media, then the media uri will saved in the entity table, else the uri will be saved in the media table\n // Plan the media table schema e.g id, uri, storageProvider, entity_id, entity_name, createdAt, updatedAt\n const options = {\n ...commonOptions,\n mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,\n mediaTypes: fieldMetadata.mediaTypes,\n type: fieldMetadata.type as unknown as SolidMediaType\n };\n return new MediaFieldCrudManager(options);\n }\n case SolidFieldType.relation: {\n // Identify if the field is for the inverse side or not\n if (fieldMetadata.relationType === RelationType.manyToOne) {\n const relationCoModelUserKeyFieldName = await this.getUserKeyFieldNameForModel(fieldMetadata.relationCoModelSingularName);\n const manyToOneOptions: ManyToOneRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n // modelUserKeyFieldName: fieldMetadata.model.userKeyField?.name,\n modelSingularName: fieldMetadata.model.singularName,\n relationCoModelUserKeyFieldName: relationCoModelUserKeyFieldName,\n entityManager,\n }\n return new ManyToOneRelationFieldCrudManager(manyToOneOptions);\n }\n else if (fieldMetadata.relationType === RelationType.oneToMany) {\n const oneToManyOptions: OneToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n entityManager,\n inverseFieldName: fieldMetadata.relationCoModelFieldName,\n inverseRelationCoModelFieldName: fieldMetadata.name,\n entityId,\n }\n return new OneToManyRelationFieldCrudManager(oneToManyOptions);\n }\n else if (fieldMetadata.relationType === RelationType.manyTomany) {\n if (fieldMetadata.isRelationManyToManyOwner) {\n const manyToManyOptions: ManyToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n isInverseSide: false,\n entityManager,\n fieldName: fieldMetadata.name,\n entityId,\n }\n return new ManyToManyRelationFieldCrudManager(manyToManyOptions);\n }\n else {\n const inverseManyToManyOptions: ManyToManyRelationFieldOptions = {\n ...commonOptions,\n relationCoModelSingularName: fieldMetadata.relationCoModelSingularName,\n modelSingularName: fieldMetadata.model.singularName,\n isInverseSide: true,\n entityManager,\n fieldName: fieldMetadata.relationCoModelFieldName,\n relationCoModelFieldName: fieldMetadata.name,\n entityId,\n }\n return new ManyToManyRelationFieldCrudManager(inverseManyToManyOptions);\n }\n }\n else throw new Error(ERROR_MESSAGES.RELATION_TYPE_NOT_SUPPORTED);\n // return (fieldMetadata.relationType === 'many-to-one') ? new ManyToOneRelationFieldCrudManager(fieldMetadata, entityManager) : new ManyToManyRelationFieldCrudManager(fieldMetadata, entityManager); //FIXME many-to-many pending\n // ManyToOne -> fieldId. The value is saved as is. No transformation is required\n // OneToMany -> fieldIds. Get the value of the oneToMany field side. No transformation is required (While saving special provision to be made)\n // ManyToMany\n // break;\n }\n case SolidFieldType.selectionStatic: {\n\n // Validation against the selectionStatic values. No transformation is required\n // If the value is not in the selectionStatic values, then throw\n // Also validate against the selectionType\n const options = { ...commonOptions, selectionStaticValues: fieldMetadata.selectionStaticValues, selectionValueType: fieldMetadata.selectionValueType as SelectionValueType, isMultiSelect: fieldMetadata.isMultiSelect };\n return new SelectionStaticFieldCrudManager(options);\n }\n case SolidFieldType.selectionDynamic: {// [HOLD]\n // Default implementation using list of values.\n // ISelectionProvider interface to be implemented for dynamic selection\n // dataSource: string; // The name of the selection provider\n // filterSchema : json // This is a custom json object that every data source will handle accordingly. We could validate the query against the selection provider\n // values : string[]; // The values returned by the selection provider\n const options = { ...commonOptions, selectionDynamicProvider: fieldMetadata.selectionDynamicProvider, selectionDynamicProviderCtxt: JSON.parse(fieldMetadata.selectionDynamicProviderCtxt), selectionValueType: fieldMetadata.selectionValueType as SelectionValueType, discoveryService: this.discoveryService, isMultiSelect: fieldMetadata.isMultiSelect };\n return new SelectionDynamicFieldCrudManager(options);\n }\n case SolidFieldType.uuid: {\n const options = { ...commonOptions };\n // If no value is provided, then generate a uuid. Add to the dto\n return new UUIDFieldCrudManager(options);\n }\n case SolidFieldType.computed: {\n\n // The value will be computed by the computed provider\n // Invoke the appropriate computed provider, get the value and add to the dto\n const options = { ...commonOptions, computedFieldProvider: fieldMetadata.computedFieldValueProvider, computedFieldValueProviderCtxt: fieldMetadata.computedFieldValueProviderCtxt, computedFieldValueType: fieldMetadata.computedFieldValueType as ComputedFieldValueType, discoveryService: this.discoveryService, skipComputation: this.isSkipComputation(isPartialUpdate, fieldMetadata) };\n return new ComputedFieldCrudManager(options);\n }\n default:\n return new NoOpsFieldCrudManager();\n }\n }\n\n private isSkipComputation(isPartialUpdate: boolean, computedFieldMetadata: FieldMetadata) {\n if (isPartialUpdate) return true; // If it is a partial update, then skip computation\n if (computedFieldMetadata.computedFieldTriggerConfig && computedFieldMetadata.computedFieldTriggerConfig.length > 0) {\n return true; // computedFieldTriggerConfig is a new field introduced as part of the IEntityComputedFieldProvider new interface, so this computation will be skiipped in crud service & will be called in the subscriber instead\n }\n return false; // If it is not a partial update, then do not skip computation\n }\n\n async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}): Promise<any> {\n const alias = 'entity';\n // Extract the required keys from the input query\n let { limit, offset, populateMedia } = basicFilterDto;\n const populateUserIdFields = this.crudHelperService.extractUserIdFieldsFromPopulate(basicFilterDto.populate);\n\n const { singularName, internationalisation, draftPublishWorkflow } = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasReadPermissionOnModel(solidRequestContext.activeUser, singularName);\n if (!hasPermission) {\n throw new BadRequestException('Forbidden');\n }\n }\n\n // Set the request filter in the request context service\n const requestContextService = this.moduleRef.get(RequestContextService, { strict: false });\n requestContextService.setRequestFilter(basicFilterDto);\n\n // Create above query on pincode table using query builder\n var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)\n\n if (basicFilterDto.groupBy?.length) {\n const groupFilterQb = (internationalisation && draftPublishWorkflow)\n ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)\n : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);\n\n return this.crudHelperService.executeGroupPipeline(\n groupFilterQb, basicFilterDto, alias,\n () => this.repo.createSecurityRuleAwareQueryBuilder(alias),\n async (entities) => {\n if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);\n if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);\n }\n );\n }\n else {\n qb = (internationalisation && draftPublishWorkflow)\n ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)\n : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);\n const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);\n return {\n meta,\n records,\n }\n }\n }\n\n private async handleNonGroupFind(qb: SelectQueryBuilder<T>, populateUserIdFields: UserIdFields[], populateMedia: string[], offset: number, limit: number, alias: string) {\n const [entities, count] = await qb.getManyAndCount();\n\n // Populate the entity with the userId fields\n if (populateUserIdFields && populateUserIdFields.length > 0) {\n await this.handlePopulateUserIdFields(populateUserIdFields, entities);\n }\n\n // Populate the entity with the media\n if (populateMedia && populateMedia.length > 0) {\n await this.handlePopulateMedia(populateMedia, entities);\n }\n\n return this.wrapFindResponse(offset, limit, count, entities);\n }\n\n private wrapFindResponse(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {\n return this.crudHelperService.pagedResponse(offset, limit, count, entities);\n }\n\n // entities is an array of T\n // T can contain createdBy and updatedBy fields\n // We need to populate the createdBy and updatedBy fields with the User entity\n private async handlePopulateUserIdFields(userIdFields: UserIdFields[], entities: T[]) {\n const userRepository = this.entityManager.getRepository(User);\n for (const entity of entities) {\n for (const userFieldPath of userIdFields) {\n const userId = entity[userFieldPath as keyof T] as unknown as number;\n if (userId) {\n const user = await userRepository.findOne({\n where: { id: userId },\n });\n // @ts-ignore\n entity[userFieldPath] = user;\n }\n }\n }\n }\n\n private async handlePopulateMedia(populateMedia: string[], entities: T[]) {\n const model = await this.getDatasourceDefaultEntityManager().getRepository(ModelMetadata).findOne({\n where: {\n singularName: this.modelName,\n },\n relations: ['fields', 'fields.mediaStorageProvider', 'fields.model', 'module'],\n });\n\n // Will iterate through every entity & all populateMedia & call getMediaDetails for each field\n for (const entity of entities) {\n for (const mediaFieldPath of populateMedia) {\n await this.populateMediaObject(mediaFieldPath, model, entity);\n }\n }\n return entities;\n }\n\n // Adds the media with full URL to the entity / nested entity\n private async populateMediaObject(mediaFieldPath: string, model: ModelMetadata, entity: T) {\n if (mediaFieldPath.includes('.')) { // mediaFieldPath is a nested field\n const pathParts = mediaFieldPath.split('.');\n const mediaFieldMetadata = await this.getFieldMetadataRecursively(pathParts, model.fields);\n if (!mediaFieldMetadata) {\n throw new BadRequestException(`Media field ${mediaFieldPath} not found in model ${this.modelName}`);\n }\n\n // We can assume that the media field entity model is already populated as part of the entity data\n const mediaFieldEntities = this.getMediaFieldEntities(entity, pathParts);\n if (!mediaFieldEntities || mediaFieldEntities.length === 0) {\n return;//no need to populate data if relation not exists\n }\n // Populate the media field entities with the full URL\n for (const mediaFieldEntity of mediaFieldEntities) {\n const mediaWithFullUrl = await this.getMediaWithFullUrl(mediaFieldEntity, mediaFieldMetadata);\n this.appendMediaKey(mediaWithFullUrl, mediaFieldEntity, mediaFieldMetadata.name);\n // mediaFieldEntity['_media'][mediaFieldPath] = mediaWithFullUrl\n }\n }\n else {\n // mediaFieldPath is a single field\n const mediaFieldMetadata = model.fields.find(field => field.name === mediaFieldPath);\n if (!mediaFieldMetadata) {\n throw new BadRequestException(`Media field ${mediaFieldPath} not found in model ${this.modelName}`);\n }\n const mediaWithFullUrl = await this.getMediaWithFullUrl(entity, mediaFieldMetadata);\n this.appendMediaKey(mediaWithFullUrl, entity, mediaFieldPath);\n // entity['_media'][mediaFieldPath] = mediaWithFullUrl;\n }\n }\n\n // // Add the media with full URL to the entity\n private appendMediaKey(mediaWithFullUrl: MediaWithFullUrl[], entity: T, mediaFieldPath: string) {\n // if _media key already exists, append the new media to the existing array\n if (entity['_media']) {\n entity['_media'][mediaFieldPath] = mediaWithFullUrl;\n }\n else {\n entity['_media'] = {\n [mediaFieldPath]: mediaWithFullUrl\n };\n }\n }\n\n private getMediaFieldEntities(entity: T, mediaPathParts: string[]): T[] {\n let entityPart = entity;\n for (let i = 0; i < mediaPathParts.length - 1; i++) {\n const pathPart = mediaPathParts[i];\n if (entity[pathPart]) {\n entityPart = entity[pathPart];\n } else {\n throw new BadRequestException(`Media field ${pathPart} not found in entity ${JSON.stringify(entity)}`);\n }\n }\n return isArray(entityPart) ? entityPart : [entityPart];\n }\n\n async getMediaWithFullUrl(mediaEntity: any, mediaFieldMetadata: FieldMetadata): Promise<MediaWithFullUrl[]> {\n const storageProviderMetadata = mediaFieldMetadata.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n const mediaDetails = await storageProvider.retrieve(mediaEntity, mediaFieldMetadata);\n return mediaDetails as MediaWithFullUrl[];\n }\n\n async findOne(id: number, query: any = {}, solidRequestContext: any = {}) {\n const { populate = [], fields = [], populateMedia = [] } = query;\n\n // const normalizedFields = this.crudHelperService.normalize(fields);\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n\n // if normalizedPopulateMedia, has any nested media paths, then add then to populate excluding the last part\n const additionalPopulate = this.crudHelperService.additionalRelationsRequiredForMediaPopulation(normalizedPopulateMedia);\n // Add the additional populate relations to the normalizedPopulate, if they are not already present\n normalizedPopulate.push(...additionalPopulate.filter((relation) => !normalizedPopulate.includes(relation)));\n\n const model = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasReadPermissionOnModel(solidRequestContext.activeUser, model.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n let entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n relations: normalizedPopulate,\n select: fields,\n });\n if (!entity) {\n throw new NotFoundException(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);\n }\n // Populate the entity with the media\n if (normalizedPopulateMedia.length > 0) {\n const populatedEntities = await this.handlePopulateMedia(normalizedPopulateMedia, [entity]);\n entity = populatedEntities[0] as Awaited<T>;\n }\n return entity;\n }\n\n async createMany(createDtos: any[], solidRequestContext: any = {}): Promise<T[]> {\n const loadedmodel = await this.loadModel();\n\n // Check wheather user has create permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasCreatePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Fetch model metadata once\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const entitiesForSave: T[] = [];\n for (const createDto of createDtos) {\n // Validate and transform each createDto sequentially\n let transformedDto = createDto;\n for (const field of model.fields) {\n const fieldManager: FieldCrudManager = await this.fieldCrudManager(field, this.entityManager);\n const validationErrors = await fieldManager.validate(createDto, []); // TODO, This is set, because we are not supporting files for insertMany currently\n if (validationErrors.length > 0) {\n throw new BadRequestException(`Validation errors in ${field.name} are invalid: ${validationErrors.map(e => e.error).join(', ')}`);\n }\n transformedDto = await fieldManager.transformForCreate(createDto);\n }\n const entity = this.repo.create(transformedDto);\n entitiesForSave.push(entity as unknown as T);\n }\n // Save all entities in a single batch\n const savedEntities = await this.repo.save(entitiesForSave) as T[];\n return savedEntities;\n }\n\n async insertMany(createDtos: any[], filesArray: Express.Multer.File[][] = [], solidRequestContext: any = {}): Promise<T[]> {\n const savedEntities = await this.createMany(createDtos, solidRequestContext);\n return savedEntities;\n }\n\n async deleteMany(ids: number[], solidRequestContext: any = {}): Promise<any> {\n\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasDeletePermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n const model = await this.modelMetadataService.findOneBySingularName(this.modelName, {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n\n\n const removedEntities = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]\n const entity = await this.repo.findOne({\n where: {\n id: id,\n } as unknown as FindOptionsWhere<T>,\n });\n\n removedEntities.push(entity);\n }\n\n\n // entity-level flag\n const isDraftPublishEnabled = model?.draftPublishWorkflow === true;\n\n let publishedEntitiesExists: T[] = [];\n\n if (isDraftPublishEnabled) {\n publishedEntitiesExists = removedEntities.filter(\n (x) => !!x?.publishedAt\n );\n }\n\n if (publishedEntitiesExists.length > 0) {\n const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);\n\n throw new BadRequestException(\n `Cannot delete published record(s) for model ${this.modelName} with Ids ${publishedEntitiesExistsID.join(', ')}. Unpublish them first.`\n );\n }\n\n if (model.enableSoftDelete === true) {\n await this.repo.softRemove(removedEntities);\n return this.repo.save(removedEntities);\n } else {\n return this.repo.remove(removedEntities);\n }\n // return removedEntities\n }\n\n async recover(id: number, solidRequestContext: any = {}) {\n try {\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasRecoverPermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n const softDeletedRows = await this.repo.findOne({\n where: {\n id, deletedAt: Not(IsNull())\n } as unknown as FindOptionsWhere<T>,\n withDeleted: true,\n });\n\n if (!softDeletedRows) {\n throw new NotFoundException(ERROR_MESSAGES.NO_SOFT_DELETED_RECORD_FOUND);\n }\n\n await this.repo.update(id, {\n deletedAt: null, deletedTracker: \"not-deleted\"\n } as unknown as QueryDeepPartialEntity<T>\n );\n\n return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };\n } catch (error: any) {\n if (error instanceof QueryFailedError && (error as any).code === '23505') {\n throw new ConflictException(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);\n }\n if (error instanceof HttpException) {\n throw error;\n }\n throw new InternalServerErrorException(error?.message ?? String(error));\n }\n }\n\n async recoverMany(ids: number[], solidRequestContext: any = {}) {\n try {\n const loadedmodel = await this.loadModel();\n // Check wheather user has update permission for model\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasRecoverPermissionOnModel(solidRequestContext.activeUser, loadedmodel.singularName);\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n if (!ids || ids.length === 0) {\n throw new Error(ERROR_MESSAGES.DELETE_IDS_REQUIRED);\n }\n\n // Find soft-deleted records matching the given IDs\n const softDeletedRows = await this.repo.find({\n where: {\n id: In(ids),\n deletedAt: Not(IsNull()),\n } as unknown as FindOptionsWhere<T>,\n withDeleted: true,\n });\n\n if (softDeletedRows.length === 0) {\n throw new NotFoundException(ERROR_MESSAGES.NO_SOFT_DELETED_RECORDS_FOUND);\n }\n\n // Recover the specific records by setting deletedAt to null\n await this.repo.update(\n { id: In(ids) } as unknown as FindOptionsWhere<T>,\n { deletedAt: null, deletedTracker: \"not-deleted\" } as unknown as QueryDeepPartialEntity<T>\n );\n\n return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };\n } catch (error: any) {\n if (error instanceof QueryFailedError && (error as any).code === \"23505\") {\n throw new ConflictException(ERROR_MESSAGES.CONFLICTING_RECORD_ON_UNARCHIVE);\n }\n if (error instanceof HttpException) {\n throw error;\n }\n throw new InternalServerErrorException(error?.message ?? String(error));\n }\n }\n\n\n async getFieldMetadataRecursively(pathParts: string[], fields: FieldMetadata[]) {\n if (!pathParts || pathParts.length === 0) {\n throw new BadRequestException(ERROR_MESSAGES.EMPTY_PATH_PARTS);\n }\n\n const [currentPart, ...remainingParts] = pathParts;\n const field = fields.find(field => field.name === currentPart);\n\n if (!field) {\n throw new BadRequestException(`Field ${currentPart} not found in model ${this.modelName}`);\n }\n\n // Base case: last part, return the field\n if (remainingParts.length === 0) {\n return field;\n }\n\n if (!field.relationCoModelSingularName) {\n throw new BadRequestException(`Field ${field.name} does not define a relationCoModelSingularName`);\n }\n\n const relationCoModel = await this.getDatasourceDefaultEntityManager().getRepository(ModelMetadata).findOne({\n where: { singularName: field.relationCoModelSingularName },\n relations: ['fields', 'fields.mediaStorageProvider', 'fields.model'],\n });\n\n if (!relationCoModel) {\n throw new BadRequestException(`Model ${field.relationCoModelSingularName} not found`);\n }\n\n return this.getFieldMetadataRecursively(remainingParts, relationCoModel.fields);\n }\n\n async getUserKeyFieldNameForModel(modelSingularName: string): Promise<string> {\n const model = await this.modelMetadataService.findOneBySingularName(modelSingularName, ['userKeyField']);\n if (!model) {\n throw new BadRequestException(`Model ${modelSingularName} not found`);\n }\n return model.userKeyField?.name || '';\n }\n\n /* Publish a record - sets publishedAt timestamp */\n async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {\n\n const model = await this.loadModel();\n\n // Check if publish workflow is enabled for this model\n if (!model.draftPublishWorkflow) {\n throw new BadRequestException(\n `Publish workflow is not enabled for ${this.modelName}`\n );\n }\n\n // Check user permissions\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(\n solidRequestContext.activeUser,\n model.singularName\n );\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Find the entity\n const entity = await this.repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${this.modelName} with id ${id} not found`);\n }\n\n // Check if already published\n if (entity.publishedAt) {\n throw new BadRequestException(\n `${this.modelName} with id ${id} is already published`\n );\n }\n\n // Update publish status\n const updatedEntity = await this.repo.save({ ...entity, publishedAt: new Date() });\n\n return updatedEntity\n }\n\n /* Unpublish a record - clears publishedAt timestamp */\n async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {\n\n const model = await this.loadModel();\n\n // Check if publish workflow is enabled for this model\n if (!model.draftPublishWorkflow) {\n throw new BadRequestException(\n `Publish workflow is not enabled for ${this.modelName}`\n );\n }\n\n // Check user permissions\n if (solidRequestContext.activeUser) {\n const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(\n solidRequestContext.activeUser,\n model.singularName\n );\n if (!hasPermission) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n }\n\n // Find the entity\n const entity = await this.repo.findOne({ where: { id } as any });\n if (!entity) {\n throw new NotFoundException(`${this.modelName} with id ${id} not found`);\n }\n\n // Check if already unpublished\n if (!entity.publishedAt) {\n throw new BadRequestException(\n `${this.modelName} with id ${id} is already unpublished`\n );\n }\n\n // Update unpublish status\n const updatedEntity = await this.repo.save({ ...entity, publishedAt: null });\n\n return updatedEntity\n }\n\n private getDatasourceDefaultEntityManager() {\n return this.defaultDatasourceEntityManager ?? this.entityManager;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAwC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuGhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"mssql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoD7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAuGhH,OAAO,CAAC,cAAc;CAQzB"}
@@ -38,6 +38,7 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
38
38
  c.name AS columnName,
39
39
  ty.name AS dataType,
40
40
  c.is_identity AS isAutoGenerated,
41
+ CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END AS isPrimaryKey,
41
42
  CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,
42
43
  dc.definition AS defaultValue,
43
44
  CASE
@@ -51,6 +52,16 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
51
52
  INNER JOIN sys.columns c ON c.object_id = t.object_id
52
53
  INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id
53
54
  LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id
55
+ LEFT JOIN (
56
+ SELECT ic.object_id, ic.column_id
57
+ FROM sys.index_columns ic
58
+ INNER JOIN sys.key_constraints kc
59
+ ON kc.parent_object_id = ic.object_id
60
+ AND kc.unique_index_id = ic.index_id
61
+ WHERE kc.type = 'PK'
62
+ ) pk
63
+ ON pk.object_id = c.object_id
64
+ AND pk.column_id = c.column_id
54
65
  WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')
55
66
  ORDER BY schema_name(t.schema_id), t.name, c.column_id
56
67
  `);
@@ -60,6 +71,7 @@ let MssqlDatasourceIntrospectionProviderService = class MssqlDatasourceIntrospec
60
71
  columnName: row.columnName,
61
72
  dataType: row.dataType,
62
73
  isAutoGenerated: Boolean(row.isAutoGenerated),
74
+ isPrimaryKey: Boolean(row.isPrimaryKey),
63
75
  isNullable: String(row.isNullable).toUpperCase() === "YES",
64
76
  defaultValue: row.defaultValue ?? null,
65
77
  characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
@@ -1 +1 @@
1
- {"version":3,"file":"mssql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IA8K5B,CAAC;IA5KG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;SAsBnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8FC,EACD,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AA/KY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CA+KvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MssqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mssql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n schema_name(t.schema_id) AS tableSchema,\n t.name AS tableName,\n c.name AS columnName,\n ty.name AS dataType,\n c.is_identity AS isAutoGenerated,\n CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,\n dc.definition AS defaultValue,\n CASE\n WHEN ty.name IN ('nchar', 'nvarchar') AND c.max_length > 0 THEN c.max_length / 2\n ELSE c.max_length\n END AS characterMaximumLength,\n c.precision AS numericPrecision,\n c.scale AS numericScale,\n c.column_id AS ordinalPosition\n FROM sys.tables t\n INNER JOIN sys.columns c ON c.object_id = t.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY schema_name(t.schema_id), t.name, c.column_id\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n DECLARE @schemaName NVARCHAR(128) = @0;\n DECLARE @tableName NVARCHAR(128) = @1;\n\n WITH target_table AS (\n SELECT t.object_id, s.name AS schema_name, t.name AS table_name\n FROM sys.tables t\n INNER JOIN sys.schemas s ON s.schema_id = t.schema_id\n WHERE t.name = @tableName\n AND (@schemaName IS NULL OR s.name = @schemaName)\n ),\n column_lines AS (\n SELECT\n c.column_id,\n ' [' + c.name + '] '\n + UPPER(ty.name)\n + CASE\n WHEN ty.name IN ('varchar', 'char', 'varbinary', 'binary') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('nvarchar', 'nchar') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('decimal', 'numeric') THEN\n '(' + CAST(c.precision AS VARCHAR(16)) + ',' + CAST(c.scale AS VARCHAR(16)) + ')'\n WHEN ty.name IN ('datetime2', 'datetimeoffset', 'time') THEN\n '(' + CAST(c.scale AS VARCHAR(16)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN ic.object_id IS NOT NULL THEN\n ' IDENTITY(' + CAST(CONVERT(BIGINT, ic.seed_value) AS VARCHAR(32)) + ',' + CAST(CONVERT(BIGINT, ic.increment_value) AS VARCHAR(32)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN dc.definition IS NOT NULL THEN ' DEFAULT ' + dc.definition\n ELSE ''\n END\n + CASE\n WHEN c.is_nullable = 1 THEN ' NULL'\n ELSE ' NOT NULL'\n END AS line\n FROM target_table tt\n INNER JOIN sys.columns c ON c.object_id = tt.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.identity_columns ic\n ON ic.object_id = c.object_id\n AND ic.column_id = c.column_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n ),\n constraint_lines AS (\n SELECT\n kc.name AS constraint_name,\n ' CONSTRAINT [' + kc.name + '] PRIMARY KEY ('\n + STUFF((\n SELECT ', [' + c.name + ']'\n FROM sys.index_columns ic\n INNER JOIN sys.columns c\n ON c.object_id = ic.object_id\n AND c.column_id = ic.column_id\n WHERE ic.object_id = kc.parent_object_id\n AND ic.index_id = kc.unique_index_id\n ORDER BY ic.key_ordinal\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n + ')' AS line\n FROM target_table tt\n INNER JOIN sys.key_constraints kc ON kc.parent_object_id = tt.object_id\n WHERE kc.type = 'PK'\n )\n SELECT\n 'CREATE TABLE [' + tt.schema_name + '].[' + tt.table_name + '] (' + CHAR(10)\n + ISNULL((\n SELECT STUFF((\n SELECT ',' + CHAR(10) + cl.line\n FROM column_lines cl\n ORDER BY cl.column_id\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ), '')\n + ISNULL((\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',' + CHAR(10) + STUFF((\n SELECT ',' + CHAR(10) + cn.line\n FROM constraint_lines cn\n ORDER BY cn.constraint_name\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ELSE ''\n END\n ), '')\n + CHAR(10) + ');' AS ddl\n FROM target_table tt\n `,\n [table.tableSchema, table.tableName],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
1
+ {"version":3,"file":"mssql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mssql-datasource-introspection-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,2CAA2C,GAAjD,MAAM,2CAA2C;IAAjD;QACM,SAAI,GAAG,OAAO,CAAC;IA0L5B,CAAC;IAxLG,QAAQ,CAAC,IAAY;QACjB,OAAO,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAsB;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;SAQnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;SAC3B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAsB;QACpC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAiCnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAC3B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC7C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,KAAK;YAC1D,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;YACtC,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACvE,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3D,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC;YACnD,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,eAAe,CAAC;SAC5D,CAAC,CAAC,CAAC;IACR,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAsB,EAAE,KAAsC;QACnF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,CAC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8FC,EACD,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,CACvC,CAAC;QAEF,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC;IAClC,CAAC;IAEO,cAAc,CAAC,KAAc;QACjC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACnD,CAAC;CACJ,CAAA;AA3LY,kGAA2C;sDAA3C,2CAA2C;IADvD,IAAA,mBAAU,GAAE;GACA,2CAA2C,CA2LvD","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MssqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mssql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n schema_name(t.schema_id) AS tableSchema,\n t.name AS tableName,\n c.name AS columnName,\n ty.name AS dataType,\n c.is_identity AS isAutoGenerated,\n CASE WHEN pk.column_id IS NOT NULL THEN 1 ELSE 0 END AS isPrimaryKey,\n CASE WHEN c.is_nullable = 1 THEN 'YES' ELSE 'NO' END AS isNullable,\n dc.definition AS defaultValue,\n CASE\n WHEN ty.name IN ('nchar', 'nvarchar') AND c.max_length > 0 THEN c.max_length / 2\n ELSE c.max_length\n END AS characterMaximumLength,\n c.precision AS numericPrecision,\n c.scale AS numericScale,\n c.column_id AS ordinalPosition\n FROM sys.tables t\n INNER JOIN sys.columns c ON c.object_id = t.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n LEFT JOIN (\n SELECT ic.object_id, ic.column_id\n FROM sys.index_columns ic\n INNER JOIN sys.key_constraints kc\n ON kc.parent_object_id = ic.object_id\n AND kc.unique_index_id = ic.index_id\n WHERE kc.type = 'PK'\n ) pk\n ON pk.object_id = c.object_id\n AND pk.column_id = c.column_id\n WHERE schema_name(t.schema_id) NOT IN ('sys', 'INFORMATION_SCHEMA')\n ORDER BY schema_name(t.schema_id), t.name, c.column_id\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: Boolean(row.isAutoGenerated),\n isPrimaryKey: Boolean(row.isPrimaryKey),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const rows = await dataSource.query(\n `\n DECLARE @schemaName NVARCHAR(128) = @0;\n DECLARE @tableName NVARCHAR(128) = @1;\n\n WITH target_table AS (\n SELECT t.object_id, s.name AS schema_name, t.name AS table_name\n FROM sys.tables t\n INNER JOIN sys.schemas s ON s.schema_id = t.schema_id\n WHERE t.name = @tableName\n AND (@schemaName IS NULL OR s.name = @schemaName)\n ),\n column_lines AS (\n SELECT\n c.column_id,\n ' [' + c.name + '] '\n + UPPER(ty.name)\n + CASE\n WHEN ty.name IN ('varchar', 'char', 'varbinary', 'binary') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('nvarchar', 'nchar') THEN\n '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(16)) END + ')'\n WHEN ty.name IN ('decimal', 'numeric') THEN\n '(' + CAST(c.precision AS VARCHAR(16)) + ',' + CAST(c.scale AS VARCHAR(16)) + ')'\n WHEN ty.name IN ('datetime2', 'datetimeoffset', 'time') THEN\n '(' + CAST(c.scale AS VARCHAR(16)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN ic.object_id IS NOT NULL THEN\n ' IDENTITY(' + CAST(CONVERT(BIGINT, ic.seed_value) AS VARCHAR(32)) + ',' + CAST(CONVERT(BIGINT, ic.increment_value) AS VARCHAR(32)) + ')'\n ELSE\n ''\n END\n + CASE\n WHEN dc.definition IS NOT NULL THEN ' DEFAULT ' + dc.definition\n ELSE ''\n END\n + CASE\n WHEN c.is_nullable = 1 THEN ' NULL'\n ELSE ' NOT NULL'\n END AS line\n FROM target_table tt\n INNER JOIN sys.columns c ON c.object_id = tt.object_id\n INNER JOIN sys.types ty ON ty.user_type_id = c.user_type_id\n LEFT JOIN sys.identity_columns ic\n ON ic.object_id = c.object_id\n AND ic.column_id = c.column_id\n LEFT JOIN sys.default_constraints dc ON dc.object_id = c.default_object_id\n ),\n constraint_lines AS (\n SELECT\n kc.name AS constraint_name,\n ' CONSTRAINT [' + kc.name + '] PRIMARY KEY ('\n + STUFF((\n SELECT ', [' + c.name + ']'\n FROM sys.index_columns ic\n INNER JOIN sys.columns c\n ON c.object_id = ic.object_id\n AND c.column_id = ic.column_id\n WHERE ic.object_id = kc.parent_object_id\n AND ic.index_id = kc.unique_index_id\n ORDER BY ic.key_ordinal\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n + ')' AS line\n FROM target_table tt\n INNER JOIN sys.key_constraints kc ON kc.parent_object_id = tt.object_id\n WHERE kc.type = 'PK'\n )\n SELECT\n 'CREATE TABLE [' + tt.schema_name + '].[' + tt.table_name + '] (' + CHAR(10)\n + ISNULL((\n SELECT STUFF((\n SELECT ',' + CHAR(10) + cl.line\n FROM column_lines cl\n ORDER BY cl.column_id\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ), '')\n + ISNULL((\n SELECT CASE\n WHEN EXISTS (SELECT 1 FROM constraint_lines)\n THEN ',' + CHAR(10) + STUFF((\n SELECT ',' + CHAR(10) + cn.line\n FROM constraint_lines cn\n ORDER BY cn.constraint_name\n FOR XML PATH(''), TYPE\n ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')\n ELSE ''\n END\n ), '')\n + CHAR(10) + ');' AS ddl\n FROM target_table tt\n `,\n [table.tableSchema, table.tableName],\n );\n\n return rows?.[0]?.ddl ?? null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mysql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAkC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"mysql-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,2CAA4C,YAAW,+BAA+B;IAC/F,QAAQ,CAAC,IAAI,WAAW;IAExB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAoC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAmBhH,OAAO,CAAC,cAAc;CAQzB"}
@@ -38,6 +38,7 @@ let MysqlDatasourceIntrospectionProviderService = class MysqlDatasourceIntrospec
38
38
  COLUMN_NAME AS columnName,
39
39
  DATA_TYPE AS dataType,
40
40
  EXTRA AS extra,
41
+ COLUMN_KEY AS columnKey,
41
42
  IS_NULLABLE AS isNullable,
42
43
  COLUMN_DEFAULT AS defaultValue,
43
44
  CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,
@@ -54,6 +55,7 @@ let MysqlDatasourceIntrospectionProviderService = class MysqlDatasourceIntrospec
54
55
  columnName: row.columnName,
55
56
  dataType: row.dataType,
56
57
  isAutoGenerated: String(row.extra ?? "").toLowerCase().includes("auto_increment"),
58
+ isPrimaryKey: String(row.columnKey ?? "").toUpperCase() === "PRI",
57
59
  isNullable: String(row.isNullable).toUpperCase() === "YES",
58
60
  defaultValue: row.defaultValue ?? null,
59
61
  characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),
@@ -1 +1 @@
1
- {"version":3,"file":"mysql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mysql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName,\n COLUMN_NAME AS columnName,\n DATA_TYPE AS dataType,\n EXTRA AS extra,\n IS_NULLABLE AS isNullable,\n COLUMN_DEFAULT AS defaultValue,\n CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,\n NUMERIC_PRECISION AS numericPrecision,\n NUMERIC_SCALE AS numericScale,\n ORDINAL_POSITION AS ordinalPosition\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: String(row.extra ?? \"\").toLowerCase().includes(\"auto_increment\"),\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const schemaName = table.tableSchema ?? dataSource.options.database;\n const rows = await dataSource.query(\n `SHOW CREATE TABLE \\`${schemaName}\\`.\\`${table.tableName}\\``,\n );\n\n const firstRow = rows?.[0];\n if (!firstRow || typeof firstRow !== \"object\") {\n return null;\n }\n\n const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith(\"create table\"));\n if (!ddlKey) {\n return null;\n }\n\n return String(firstRow[ddlKey] ?? \"\").trim() || null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
1
+ {"version":3,"file":"mysql-datasource-introspection-provider.service.js","sourceRoot":"","sources":["../../../src/services/datasource-introspection/mysql-datasource-introspection-provider.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from \"@nestjs/common\";\nimport { DataSource } from \"typeorm\";\nimport {\n DatasourceIntrospectionColumn,\n DatasourceIntrospectionProvider,\n DatasourceIntrospectionTableRef,\n} from \"src/interfaces/datasource-introspection-provider.interface\";\n\n@Injectable()\nexport class MysqlDatasourceIntrospectionProviderService implements DatasourceIntrospectionProvider {\n readonly type = \"mysql\";\n\n supports(type: string) {\n return type?.toLowerCase() === this.type;\n }\n\n async listTables(dataSource: DataSource): Promise<DatasourceIntrospectionTableRef[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName\n FROM INFORMATION_SCHEMA.TABLES\n WHERE TABLE_TYPE = 'BASE TABLE'\n AND TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n }));\n }\n\n async listColumns(dataSource: DataSource): Promise<DatasourceIntrospectionColumn[]> {\n const rows = await dataSource.query(`\n SELECT\n TABLE_SCHEMA AS tableSchema,\n TABLE_NAME AS tableName,\n COLUMN_NAME AS columnName,\n DATA_TYPE AS dataType,\n EXTRA AS extra,\n COLUMN_KEY AS columnKey,\n IS_NULLABLE AS isNullable,\n COLUMN_DEFAULT AS defaultValue,\n CHARACTER_MAXIMUM_LENGTH AS characterMaximumLength,\n NUMERIC_PRECISION AS numericPrecision,\n NUMERIC_SCALE AS numericScale,\n ORDINAL_POSITION AS ordinalPosition\n FROM INFORMATION_SCHEMA.COLUMNS\n WHERE TABLE_SCHEMA = DATABASE()\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n\n return rows.map((row: any) => ({\n tableSchema: row.tableSchema ?? null,\n tableName: row.tableName,\n columnName: row.columnName,\n dataType: row.dataType,\n isAutoGenerated: String(row.extra ?? \"\").toLowerCase().includes(\"auto_increment\"),\n isPrimaryKey: String(row.columnKey ?? \"\").toUpperCase() === \"PRI\",\n isNullable: String(row.isNullable).toUpperCase() === \"YES\",\n defaultValue: row.defaultValue ?? null,\n characterMaximumLength: this.toNumberOrNull(row.characterMaximumLength),\n numericPrecision: this.toNumberOrNull(row.numericPrecision),\n numericScale: this.toNumberOrNull(row.numericScale),\n ordinalPosition: this.toNumberOrNull(row.ordinalPosition),\n }));\n }\n\n async getTableDefinition(dataSource: DataSource, table: DatasourceIntrospectionTableRef): Promise<string | null> {\n const schemaName = table.tableSchema ?? dataSource.options.database;\n const rows = await dataSource.query(\n `SHOW CREATE TABLE \\`${schemaName}\\`.\\`${table.tableName}\\``,\n );\n\n const firstRow = rows?.[0];\n if (!firstRow || typeof firstRow !== \"object\") {\n return null;\n }\n\n const ddlKey = Object.keys(firstRow).find((key) => key.toLowerCase().startsWith(\"create table\"));\n if (!ddlKey) {\n return null;\n }\n\n return String(firstRow[ddlKey] ?? \"\").trim() || null;\n }\n\n private toNumberOrNull(value: unknown) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,8CAA+C,YAAW,+BAA+B;IAClG,QAAQ,CAAC,IAAI,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAsC7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhH,OAAO,CAAC,cAAc;CAQzB"}
1
+ {"version":3,"file":"postgres-datasource-introspection-provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/datasource-introspection/postgres-datasource-introspection-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACH,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAClC,MAAM,4DAA4D,CAAC;AAEpE,qBACa,8CAA+C,YAAW,+BAA+B;IAClG,QAAQ,CAAC,IAAI,cAAc;IAE3B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIf,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,+BAA+B,EAAE,CAAC;IAiB9E,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAmD7E,kBAAkB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgFhH,OAAO,CAAC,cAAc;CAQzB"}