@solidxai/core 0.1.4 → 0.1.5-beta.0

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 (209) hide show
  1. package/.claude/settings.local.json +8 -0
  2. package/dist/constants/error-messages.d.ts +1 -0
  3. package/dist/constants/error-messages.d.ts.map +1 -1
  4. package/dist/constants/error-messages.js +1 -0
  5. package/dist/constants/error-messages.js.map +1 -1
  6. package/dist/constants.d.ts +3 -3
  7. package/dist/constants.d.ts.map +1 -1
  8. package/dist/constants.js +12 -12
  9. package/dist/constants.js.map +1 -1
  10. package/dist/controllers/otp-authentication.controller.d.ts +1 -4
  11. package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
  12. package/dist/controllers/otp-authentication.controller.js +1 -1
  13. package/dist/controllers/role-metadata.controller.d.ts +1 -0
  14. package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
  15. package/dist/controllers/role-metadata.controller.js +15 -0
  16. package/dist/controllers/role-metadata.controller.js.map +1 -1
  17. package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
  18. package/dist/dtos/create-email-template.dto.js.map +1 -1
  19. package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
  20. package/dist/dtos/create-list-of-values.dto.js.map +1 -1
  21. package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
  22. package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
  23. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  24. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  25. package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
  26. package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
  27. package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
  28. package/dist/dtos/create-security-rule.dto.js.map +1 -1
  29. package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
  30. package/dist/dtos/create-sms-template.dto.js.map +1 -1
  31. package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
  32. package/dist/dtos/create-view-metadata.dto.js.map +1 -1
  33. package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
  34. package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
  35. package/dist/dtos/otp-sign-in.dto.js +2 -2
  36. package/dist/dtos/otp-sign-in.dto.js.map +1 -1
  37. package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
  38. package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
  39. package/dist/dtos/otp-sign-up.dto.js +2 -2
  40. package/dist/dtos/otp-sign-up.dto.js.map +1 -1
  41. package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
  42. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  43. package/dist/dtos/resolve-s3-url.dto.js +1 -13
  44. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  45. package/dist/dtos/sign-up.dto.d.ts.map +1 -1
  46. package/dist/dtos/sign-up.dto.js.map +1 -1
  47. package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
  48. package/dist/dtos/update-email-template.dto.js.map +1 -1
  49. package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
  50. package/dist/dtos/update-list-of-values.dto.js.map +1 -1
  51. package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
  52. package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
  53. package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
  54. package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
  55. package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
  56. package/dist/dtos/update-security-rule.dto.js.map +1 -1
  57. package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
  58. package/dist/dtos/update-sms-template.dto.js.map +1 -1
  59. package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
  60. package/dist/dtos/update-view-metadata.dto.js.map +1 -1
  61. package/dist/entities/user.entity.d.ts +1 -0
  62. package/dist/entities/user.entity.d.ts.map +1 -1
  63. package/dist/entities/user.entity.js +6 -1
  64. package/dist/entities/user.entity.js.map +1 -1
  65. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
  66. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  67. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
  68. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  69. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
  70. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  71. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
  72. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  73. package/dist/helpers/security.helper.js +1 -0
  74. package/dist/helpers/security.helper.js.map +1 -1
  75. package/dist/index.d.ts +0 -4
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +0 -4
  78. package/dist/index.js.map +1 -1
  79. package/dist/repository/solid-base.repository.d.ts +10 -1
  80. package/dist/repository/solid-base.repository.d.ts.map +1 -1
  81. package/dist/repository/solid-base.repository.js +109 -0
  82. package/dist/repository/solid-base.repository.js.map +1 -1
  83. package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
  84. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  85. package/dist/seeders/module-metadata-seeder.service.js +141 -71
  86. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  87. package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
  88. package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
  89. package/dist/seeders/permission-metadata-seeder.service.js +1 -1
  90. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  91. package/dist/seeders/seed-data/solid-core-metadata.json +12 -25
  92. package/dist/services/authentication.service.d.ts +22 -8
  93. package/dist/services/authentication.service.d.ts.map +1 -1
  94. package/dist/services/authentication.service.js +228 -214
  95. package/dist/services/authentication.service.js.map +1 -1
  96. package/dist/services/crud-helper.service.d.ts +4 -0
  97. package/dist/services/crud-helper.service.d.ts.map +1 -1
  98. package/dist/services/crud-helper.service.js +66 -32
  99. package/dist/services/crud-helper.service.js.map +1 -1
  100. package/dist/services/crud.service.d.ts.map +1 -1
  101. package/dist/services/crud.service.js +7 -4
  102. package/dist/services/crud.service.js.map +1 -1
  103. package/dist/services/field-metadata.service.d.ts.map +1 -1
  104. package/dist/services/field-metadata.service.js.map +1 -1
  105. package/dist/services/file/disk-file.service.d.ts +0 -2
  106. package/dist/services/file/disk-file.service.d.ts.map +1 -1
  107. package/dist/services/file/disk-file.service.js +7 -16
  108. package/dist/services/file/disk-file.service.js.map +1 -1
  109. package/dist/services/file/index.d.ts +1 -0
  110. package/dist/services/file/index.d.ts.map +1 -1
  111. package/dist/services/file/index.js +1 -0
  112. package/dist/services/file/index.js.map +1 -1
  113. package/dist/services/file/storage-path-builder.d.ts +17 -0
  114. package/dist/services/file/storage-path-builder.d.ts.map +1 -0
  115. package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
  116. package/dist/services/file/storage-path-builder.js.map +1 -0
  117. package/dist/services/media.service.d.ts +1 -1
  118. package/dist/services/media.service.d.ts.map +1 -1
  119. package/dist/services/media.service.js +45 -6
  120. package/dist/services/media.service.js.map +1 -1
  121. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  122. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  123. package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
  124. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  125. package/dist/services/module-metadata.service.d.ts +4 -6
  126. package/dist/services/module-metadata.service.d.ts.map +1 -1
  127. package/dist/services/module-metadata.service.js +16 -14
  128. package/dist/services/module-metadata.service.js.map +1 -1
  129. package/dist/services/setting.service.d.ts +3 -2
  130. package/dist/services/setting.service.d.ts.map +1 -1
  131. package/dist/services/setting.service.js +7 -4
  132. package/dist/services/setting.service.js.map +1 -1
  133. package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
  134. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  135. package/dist/services/settings/default-settings-provider.service.js +8 -6
  136. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  137. package/dist/solid-core.module.d.ts +3 -1
  138. package/dist/solid-core.module.d.ts.map +1 -1
  139. package/dist/solid-core.module.js +45 -9
  140. package/dist/solid-core.module.js.map +1 -1
  141. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  142. package/dist/testing/adapters/ui/playwright-adapter.js +35 -2
  143. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  144. package/package.json +8 -2
  145. package/src/constants/error-messages.ts +1 -0
  146. package/src/constants.ts +3 -3
  147. package/src/controllers/role-metadata.controller.ts +26 -18
  148. package/src/dtos/create-email-template.dto.ts +7 -0
  149. package/src/dtos/create-list-of-values.dto.ts +7 -0
  150. package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
  151. package/src/dtos/create-role-metadata.dto.ts +9 -0
  152. package/src/dtos/create-scheduled-job.dto.ts +14 -0
  153. package/src/dtos/create-security-rule.dto.ts +6 -0
  154. package/src/dtos/create-sms-template.dto.ts +6 -0
  155. package/src/dtos/create-view-metadata.dto.ts +11 -0
  156. package/src/dtos/otp-sign-in.dto.ts +3 -3
  157. package/src/dtos/otp-sign-up.dto.ts +3 -3
  158. package/src/dtos/resolve-s3-url.dto.ts +2 -12
  159. package/src/dtos/sign-up.dto.ts +0 -2
  160. package/src/dtos/update-email-template.dto.ts +6 -0
  161. package/src/dtos/update-list-of-values.dto.ts +8 -0
  162. package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
  163. package/src/dtos/update-scheduled-job.dto.ts +15 -0
  164. package/src/dtos/update-security-rule.dto.ts +7 -0
  165. package/src/dtos/update-sms-template.dto.ts +32 -32
  166. package/src/dtos/update-view-metadata.dto.ts +12 -0
  167. package/src/entities/user.entity.ts +3 -0
  168. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
  169. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
  170. package/src/helpers/security.helper.ts +1 -1
  171. package/src/index.ts +0 -4
  172. package/src/repository/solid-base.repository.ts +172 -1
  173. package/src/seeders/module-metadata-seeder.service.ts +188 -126
  174. package/src/seeders/permission-metadata-seeder.service.ts +1 -4
  175. package/src/seeders/seed-data/solid-core-metadata.json +12 -25
  176. package/src/services/authentication.service.ts +268 -266
  177. package/src/services/crud-helper.service.ts +79 -36
  178. package/src/services/crud.service.ts +9 -4
  179. package/src/services/field-metadata.service.ts +0 -71
  180. package/src/services/file/disk-file.service.ts +8 -18
  181. package/src/services/file/index.ts +1 -0
  182. package/src/services/file/storage-path-builder.ts +56 -0
  183. package/src/services/media.service.ts +13 -7
  184. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
  185. package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
  186. package/src/services/module-metadata.service.ts +18 -15
  187. package/src/services/setting.service.ts +5 -3
  188. package/src/services/settings/default-settings-provider.service.ts +5 -3
  189. package/src/solid-core.module.ts +16 -12
  190. package/src/testing/adapters/ui/playwright-adapter.ts +1 -1
  191. package/dist/passport-strategies/local.strategy.d.ts +0 -15
  192. package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
  193. package/dist/passport-strategies/local.strategy.js +0 -44
  194. package/dist/passport-strategies/local.strategy.js.map +0 -1
  195. package/dist/seeders/email-template-seeder.service.d.ts +0 -10
  196. package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
  197. package/dist/seeders/email-template-seeder.service.js +0 -84
  198. package/dist/seeders/email-template-seeder.service.js.map +0 -1
  199. package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
  200. package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
  201. package/dist/seeders/sms-template-seeder.service.js.map +0 -1
  202. package/dist/seeders/user-seeder.service.d.ts +0 -10
  203. package/dist/seeders/user-seeder.service.d.ts.map +0 -1
  204. package/dist/seeders/user-seeder.service.js +0 -44
  205. package/dist/seeders/user-seeder.service.js.map +0 -1
  206. package/src/passport-strategies/local.strategy.ts +0 -28
  207. package/src/seeders/email-template-seeder.service.ts +0 -49
  208. package/src/seeders/sms-template-seeder.service.ts +0 -50
  209. package/src/seeders/user-seeder.service.ts +0 -33
@@ -1 +1 @@
1
- {"version":3,"file":"solid-base.repository.js","sourceRoot":"","sources":["../../src/repository/solid-base.repository.ts"],"names":[],"mappings":";;;AAAA,oEAAkE;AAClE,2CAAwC;AAExC,6EAAmE;AAGnE,qCAUiB;AAGjB,MAAa,mBAA4C,SAAQ,oBAAa;IAG1E,YACI,MAAuB,EACvB,UAAsB,EACH,qBAAmD,EACnD,sBAAqD;QAExE,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAH7B,0BAAqB,GAArB,qBAAqB,CAA8B;QACnD,2BAAsB,GAAtB,sBAAsB,CAA+B;QAGxE,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,iBAAiB;QACb,OAAO,IAAA,kBAAQ,EAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,YAA6B;QAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qCAAa,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YAC1C,KAAK,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC1C,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,sCAAsC,iBAAiB,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,EAAyB,CAAC,CAAC;IAClG,CAAC;IAEQ,kBAAkB,CAAC,KAAc,EAAE,WAAyB;QACjE,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,CAAC,mCAAmC,CAAC,KAAc,EAAE,WAAyB;QAC/E,MAAM,EAAE,GAAG,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAExD,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE,OAAO,EAAE,CAAC;QAE3C,MAAM,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC;QACzE,IAAI,CAAC,qBAAqB;YAAE,OAAO,EAAE,CAAC;QAEtC,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CACvD,EAAE,EACF,IAAI,CAAC,iBAAiB,EAAE,EACxB,qBAAuC,CAC1C,CAAC;IACN,CAAC;IAMQ,KAAK,CAAC,OAAO,CAAC,OAA2B;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,OAAO,EAAE,CAAC;YAEV,IAAI,OAAO;gBAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAKQ,KAAK,CAAC,SAAS,CAAC,KAAkD;QACvE,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAKQ,KAAK,CAAC,aAAa,CAAC,OAA2B;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,6BAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAMQ,KAAK,CAAC,IAAI,CAAC,OAA4B;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,OAAO,EAAE,CAAC;YACV,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAMQ,KAAK,CAAC,YAAY,CAAC,OAA4B;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,KAAK,CAAC,CAAC;QAEjE,IAAI,OAAO,EAAE,CAAC;YACV,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;CACJ;AAnHD,kDAmHC","sourcesContent":["import { camelize } from '@angular-devkit/core/src/utils/strings';\nimport { Logger } from '@nestjs/common';\nimport { CommonEntity } from 'src/entities/common.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { RequestContextService } from 'src/services/request-context.service';\nimport {\n DataSource,\n EntityNotFoundError,\n EntityTarget,\n FindManyOptions,\n FindOneOptions,\n FindOptionsWhere,\n QueryRunner,\n Repository,\n SelectQueryBuilder\n} from 'typeorm';\nimport { SecurityRuleRepository } from './security-rule.repository';\n\nexport class SolidBaseRepository<T extends CommonEntity> extends Repository<T> {\n protected readonly logger: Logger;\n\n constructor(\n entity: EntityTarget<T>,\n dataSource: DataSource,\n protected readonly requestContextService: RequestContextService | null,\n protected readonly securityRuleRepository: SecurityRuleRepository | null,\n ) {\n super(entity, dataSource.createEntityManager());\n this.logger = new Logger(this.constructor.name);\n }\n\n modelSingularName(): string {\n return camelize(this.metadata.name);\n }\n\n async findOneByUserKey(userKeyValue: string | number): Promise<T | null> {\n const modelSingularName = this.modelSingularName();\n const modelMetaRepo = this.manager.getRepository(ModelMetadata);\n const modelMeta = await modelMetaRepo.findOne({\n where: { singularName: modelSingularName },\n relations: { userKeyField: true },\n });\n\n if (!modelMeta?.userKeyField?.name) {\n throw new Error(`User key field not found for model ${modelSingularName}`);\n }\n\n return this.findOneBy({ [modelMeta.userKeyField.name]: userKeyValue } as FindOptionsWhere<T>);\n }\n\n override createQueryBuilder(alias?: string, queryRunner?: QueryRunner): SelectQueryBuilder<T> {\n throw new Error('createQueryBuilder() is disabled. Use createSecurityRuleAwareQueryBuilder instead');\n }\n\n async createSecurityRuleAwareQueryBuilder(alias?: string, queryRunner?: QueryRunner): Promise<SelectQueryBuilder<T>> {\n const qb = super.createQueryBuilder(alias, queryRunner);\n\n if (!this.securityRuleRepository) return qb;\n if (!this.requestContextService) return qb;\n\n const activeUserOrUndefined = this.requestContextService.getActiveUser();\n if (!activeUserOrUndefined) return qb;\n\n return await this.securityRuleRepository.applySecurityRules(\n qb,\n this.modelSingularName(),\n activeUserOrUndefined as ActiveUserData\n );\n }\n\n /**\n * Security-aware findOne: applies FindOneOptions via FindOptionsUtils,\n * but builds from our security-wrapped QueryBuilder.\n */\n override async findOne(options?: FindOneOptions<T>): Promise<T | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n // Apply all standard find options (relations, selects, order, where, etc.)\n if (options) qb.setFindOptions(options); // <- applies where, relations, select, order, etc.\n }\n\n return qb.getOne();\n }\n\n /**\n * Convenience: route findOneBy through the same path so rules apply.\n */\n override async findOneBy(where: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<T | null> {\n return this.findOne({ where });\n }\n\n /**\n * Optional: an OrFail that still honors security rules.\n */\n override async findOneOrFail(options?: FindOneOptions<T>): Promise<T> {\n const entity = await this.findOne(options);\n if (!entity) {\n throw new EntityNotFoundError(this.metadata.target, options?.where ?? {});\n }\n return entity;\n }\n\n /**\n * Security-aware find(): builds from our secured QB and preserves all FindManyOptions\n * (where, relations, select, order, take/skip, withDeleted, etc.).\n */\n override async find(options?: FindManyOptions<T>): Promise<T[]> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n qb.setFindOptions(options);\n }\n\n return qb.getMany();\n }\n\n /**\n * (Optional) Security-aware findAndCount(): same as find(), plus a total count.\n * Mirrors Repository.findAndCount semantics.\n */\n override async findAndCount(options?: FindManyOptions<T>): Promise<[T[], number]> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n qb.setFindOptions(options);\n }\n\n return qb.getManyAndCount();\n }\n}\n"]}
1
+ {"version":3,"file":"solid-base.repository.js","sourceRoot":"","sources":["../../src/repository/solid-base.repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { camelize } from '@angular-devkit/core/src/utils/strings';\nimport { Logger } from '@nestjs/common';\nimport { CommonEntity } from 'src/entities/common.entity';\nimport { ModelMetadata } from 'src/entities/model-metadata.entity';\nimport { ActiveUserData } from 'src/interfaces/active-user-data.interface';\nimport { RequestContextService } from 'src/services/request-context.service';\nimport {\n DataSource,\n EntityNotFoundError,\n EntityTarget,\n FindManyOptions,\n FindOneOptions,\n FindOptionsWhere,\n QueryRunner,\n Repository,\n SelectQueryBuilder,\n UpdateResult\n} from 'typeorm';\nimport { SecurityRuleRepository } from './security-rule.repository';\nimport { PickKeysByType } from 'typeorm/common/PickKeysByType';\n\nexport class SolidBaseRepository<T extends CommonEntity> extends Repository<T> {\n protected readonly logger: Logger;\n\n constructor(\n entity: EntityTarget<T>,\n dataSource: DataSource,\n protected readonly requestContextService: RequestContextService | null,\n protected readonly securityRuleRepository: SecurityRuleRepository | null,\n ) {\n super(entity, dataSource.createEntityManager());\n this.logger = new Logger(this.constructor.name);\n }\n\n modelSingularName(): string {\n return camelize(this.metadata.name);\n }\n\n async findOneByUserKey(userKeyValue: string | number): Promise<T | null> {\n const modelSingularName = this.modelSingularName();\n const modelMetaRepo = this.manager.getRepository(ModelMetadata);\n const modelMeta = await modelMetaRepo.findOne({\n where: { singularName: modelSingularName },\n relations: { userKeyField: true },\n });\n\n if (!modelMeta?.userKeyField?.name) {\n throw new Error(`User key field not found for model ${modelSingularName}`);\n }\n\n return this.findOneBy({ [modelMeta.userKeyField.name]: userKeyValue } as FindOptionsWhere<T>);\n }\n\n override createQueryBuilder(alias?: string, queryRunner?: QueryRunner): SelectQueryBuilder<T> {\n throw new Error('createQueryBuilder() is disabled. Use createSecurityRuleAwareQueryBuilder instead');\n }\n\n async createSecurityRuleAwareQueryBuilder(alias?: string, queryRunner?: QueryRunner): Promise<SelectQueryBuilder<T>> {\n const qb = super.createQueryBuilder(alias, queryRunner);\n\n if (!this.securityRuleRepository) return qb;\n if (!this.requestContextService) return qb;\n\n const activeUserOrUndefined = this.requestContextService.getActiveUser();\n if (!activeUserOrUndefined) return qb;\n\n return await this.securityRuleRepository.applySecurityRules(\n qb,\n this.modelSingularName(),\n activeUserOrUndefined as ActiveUserData\n );\n }\n\n /**\n * Security-aware findOne: applies FindOneOptions via FindOptionsUtils,\n * but builds from our security-wrapped QueryBuilder.\n */\n override async findOne(options?: FindOneOptions<T>): Promise<T | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n // Apply all standard find options (relations, selects, order, where, etc.)\n if (options) qb.setFindOptions(options); // <- applies where, relations, select, order, etc.\n }\n\n return qb.getOne();\n }\n\n /**\n * Convenience: route findOneBy through the same path so rules apply.\n */\n override async findOneBy(where: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<T | null> {\n return this.findOne({ where });\n }\n\n /**\n * Optional: an OrFail that still honors security rules.\n */\n override async findOneOrFail(options?: FindOneOptions<T>): Promise<T> {\n const entity = await this.findOne(options);\n if (!entity) {\n throw new EntityNotFoundError(this.metadata.target, options?.where ?? {});\n }\n return entity;\n }\n\n /**\n * Security-aware find(): builds from our secured QB and preserves all FindManyOptions\n * (where, relations, select, order, take/skip, withDeleted, etc.).\n */\n override async find(options?: FindManyOptions<T>): Promise<T[]> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n qb.setFindOptions(options);\n }\n\n return qb.getMany();\n }\n\n /**\n * (Optional) Security-aware findAndCount(): same as find(), plus a total count.\n * Mirrors Repository.findAndCount semantics.\n */\n override async findAndCount(options?: FindManyOptions<T>): Promise<[T[], number]> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n qb.setFindOptions(options);\n }\n\n return qb.getManyAndCount();\n }\n\n /**\n * Security-aware count(): applies security rules before counting.\n */\n override async count(options?: FindManyOptions<T>): Promise<number> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (options) {\n qb.setFindOptions(options);\n }\n\n return qb.getCount();\n }\n\n /**\n * Security-aware countBy(): convenience wrapper routed through count().\n */\n override async countBy(where: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<number> {\n return this.count({ where });\n }\n\n /**\n * Security-aware average(): applies security rules before computing the average.\n */\n override async average(columnName: PickKeysByType<T, number>, where?: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<number | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (where) {\n qb.setFindOptions({ where });\n }\n\n const result = await qb\n .select(`AVG(CAST(${alias}.${String(columnName)} AS FLOAT))`, 'avg')\n .getRawOne<{ avg: string | number | null }>();\n\n if (result?.avg === null || result?.avg === undefined) {\n return null;\n }\n\n return typeof result.avg === 'number'\n ? result.avg\n : parseFloat(result.avg);\n }\n\n /**\n * Security-aware sum(): applies security rules before computing the sum.\n */\n override async sum(columnName: PickKeysByType<T, number>, where?: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<number | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (where) {\n qb.setFindOptions({ where });\n }\n\n const result = await qb\n .select(`SUM(CAST(${alias}.${String(columnName)} AS FLOAT))`, 'sum')\n .getRawOne<{ sum: string | number | null }>();\n\n if (result?.sum === null || result?.sum === undefined) {\n return null;\n }\n\n return typeof result.sum === 'number'\n ? result.sum\n : parseFloat(result.sum);\n }\n\n /**\n * Security-aware minimum(): applies security rules before computing the minimum.\n */\n override async minimum(columnName: PickKeysByType<T, number>, where?: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<number | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (where) {\n qb.setFindOptions({ where });\n }\n\n const result = await qb\n .select(`MIN(CAST(${alias}.${String(columnName)} AS FLOAT))`, 'min')\n .getRawOne<{ min: string | number | null }>();\n\n if (result?.min === null || result?.min === undefined) {\n return null;\n }\n\n return typeof result.min === 'number'\n ? result.min\n : parseFloat(result.min);\n }\n\n /**\n * Security-aware maximum(): applies security rules before computing the maximum.\n */\n override async maximum(columnName: PickKeysByType<T, number>, where?: FindOptionsWhere<T> | FindOptionsWhere<T>[]): Promise<number | null> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n if (where) {\n qb.setFindOptions({ where });\n }\n\n const result = await qb\n .select(`MAX(CAST(${alias}.${String(columnName)} AS FLOAT))`, 'max')\n .getRawOne<{ max: string | number | null }>();\n\n if (result?.max === null || result?.max === undefined) {\n return null;\n }\n\n return typeof result.max === 'number'\n ? result.max\n : parseFloat(result.max);\n }\n\n /**\n * Security-aware increment(): increments a column by a given value for all matching rows.\n * Security rules are applied to determine which rows the user is allowed to modify.\n */\n override async increment(where: FindOptionsWhere<T>, propertyPath: string, value: string | number,): Promise<UpdateResult> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n qb.setFindOptions({ where });\n\n const rows = await qb.select(`${alias}.id`).getMany();\n const ids = rows.map((r) => (r as any).id);\n\n if (ids.length === 0) {\n return { raw: [], affected: 0, generatedMaps: [] };\n }\n\n return this.manager\n .createQueryBuilder()\n .update(this.metadata.target)\n .set({ [propertyPath]: () => `${propertyPath} + :value` } as any)\n .whereInIds(ids)\n .setParameter('value', value)\n .execute();\n }\n\n /**\n * Security-aware decrement(): decrements a column by a given value for all matching rows.\n * Security rules are applied to determine which rows the user is allowed to modify.\n */\n override async decrement(where: FindOptionsWhere<T>, propertyPath: string, value: string | number,): Promise<UpdateResult> {\n const alias = this.modelSingularName();\n const qb = await this.createSecurityRuleAwareQueryBuilder(alias);\n\n qb.setFindOptions({ where });\n\n const rows = await qb.select(`${alias}.id`).getMany();\n const ids = rows.map((r) => (r as any).id);\n\n if (ids.length === 0) {\n return { raw: [], affected: 0, generatedMaps: [] };\n }\n\n return this.manager\n .createQueryBuilder()\n .update(this.metadata.target)\n .set({ [propertyPath]: () => `${propertyPath} - :value` } as any)\n .whereInIds(ids)\n .setParameter('value', value)\n .execute();\n }\n}\n"]}
@@ -81,6 +81,7 @@ export declare class ModuleMetadataSeederService {
81
81
  private handleSeedDashboards;
82
82
  private handleSeedScheduledJobs;
83
83
  private handleSeedSavedFilters;
84
+ private validateSavedFilterQueryJsonWrapper;
84
85
  private handleSeedModelSequences;
85
86
  private pruneModelSequences;
86
87
  private pruneSavedFilters;
@@ -95,6 +96,7 @@ export declare class ModuleMetadataSeederService {
95
96
  private pruneModels;
96
97
  private getRolePermissionJoinInfo;
97
98
  private prunePermissions;
99
+ private logSeedFailureForCli;
98
100
  private formatSeedResult;
99
101
  }
100
102
  //# sourceMappingURL=module-metadata-seeder.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-metadata-seeder.service.d.ts","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-metadata-seeder.service.d.ts","sourceRoot":"","sources":["../../src/seeders/module-metadata-seeder.service.ts"],"names":[],"mappings":"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"}
@@ -119,79 +119,112 @@ let ModuleMetadataSeederService = ModuleMetadataSeederService_1 = class ModuleMe
119
119
  this.enablePruning = false;
120
120
  }
121
121
  async seed(conf) {
122
- this.enablePruning = Boolean(conf?.pruneMetadata);
123
- console.log(this.enablePruning ? '▶ Pruning enabled: metadata not present in JSON will be removed.' : '▶ Pruning disabled: existing metadata will be kept.');
124
- await this.seedGlobalMetadata();
125
- const seedDataFiles = this.seedDataFiles;
126
- this.logger.debug(`Found seed data for modules: ${seedDataFiles.map(s => s.moduleMetadata?.name)}`);
122
+ let currentModule = 'global';
123
+ let currentStep = 'bootstrap';
127
124
  let modulesToSeed = null;
128
- if (conf && Array.isArray(conf.modulesToSeed)) {
129
- modulesToSeed = conf.modulesToSeed;
130
- console.log(`▶ Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);
131
- this.logger.log(`Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);
132
- }
133
- else {
134
- console.log(`▶ No modulesToSeed provided. Seeding ALL modules.`);
135
- this.logger.log(`No modulesToSeed provided. Seeding ALL modules.`);
136
- }
137
- const filteredSeedDataFiles = modulesToSeed ? seedDataFiles.filter((file) => modulesToSeed.includes(file.moduleMetadata?.name)) : seedDataFiles;
138
- if (filteredSeedDataFiles.length === 0) {
139
- this.logger.warn(`No modules matched the provided modulesToSeed list.`);
140
- return;
125
+ try {
126
+ this.enablePruning = Boolean(conf?.pruneMetadata);
127
+ console.log(this.enablePruning ? '▶ Pruning enabled: metadata not present in JSON will be removed.' : '▶ Pruning disabled: existing metadata will be kept.');
128
+ currentStep = 'seedGlobalMetadata';
129
+ await this.seedGlobalMetadata();
130
+ const seedDataFiles = this.seedDataFiles;
131
+ this.logger.debug(`Found seed data for modules: ${seedDataFiles.map(s => s.moduleMetadata?.name)}`);
132
+ currentStep = 'resolveModulesToSeed';
133
+ if (conf && Array.isArray(conf.modulesToSeed)) {
134
+ modulesToSeed = conf.modulesToSeed;
135
+ console.log(`▶ Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);
136
+ this.logger.log(`Selective seeding enabled. Modules to seed: ${modulesToSeed.join(', ')}`);
137
+ }
138
+ else {
139
+ console.log(`▶ No modulesToSeed provided. Seeding ALL modules.`);
140
+ this.logger.log(`No modulesToSeed provided. Seeding ALL modules.`);
141
+ }
142
+ const filteredSeedDataFiles = modulesToSeed ? seedDataFiles.filter((file) => modulesToSeed.includes(file.moduleMetadata?.name)) : seedDataFiles;
143
+ if (filteredSeedDataFiles.length === 0) {
144
+ this.logger.warn(`No modules matched the provided modulesToSeed list.`);
145
+ return;
146
+ }
147
+ for (let i = 0; i < filteredSeedDataFiles.length; i++) {
148
+ const overallMetadata = filteredSeedDataFiles[i];
149
+ const moduleMetadata = overallMetadata.moduleMetadata;
150
+ currentModule = moduleMetadata?.name ?? 'unknown';
151
+ console.log(`▶ Seeding Metadata for Module: ${moduleMetadata.name}`);
152
+ this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);
153
+ currentStep = 'seedModuleModelFields';
154
+ this.logger.log(`Seeding Module / Model / Fields`);
155
+ const moduleModelFieldCounts = await this.seedModuleModelFields(moduleMetadata);
156
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Module/Model/Fields', moduleModelFieldCounts)}`);
157
+ currentStep = 'seedMediaStorageProviders';
158
+ this.logger.log(`Seeding Media Storage Providers`);
159
+ const mediaStorageCounts = await this.seedMediaStorageProviders(overallMetadata.mediaStorageProviders);
160
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Media Storage Providers', mediaStorageCounts)}`);
161
+ currentStep = 'seedRoles';
162
+ this.logger.log(`Seeding Roles`);
163
+ const roleCounts = await this.seedRoles(overallMetadata);
164
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Roles', roleCounts)}`);
165
+ currentStep = 'seedUsers';
166
+ this.logger.log(`Seeding Users`);
167
+ const userCounts = await this.seedUsers(overallMetadata);
168
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Users', userCounts)}`);
169
+ currentStep = 'seedViews';
170
+ this.logger.log(`Seeding Views`);
171
+ const viewCounts = await this.seedViews(overallMetadata);
172
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Views', viewCounts)}`);
173
+ currentStep = 'seedActions';
174
+ this.logger.log(`Seeding Actions`);
175
+ const actionCounts = await this.seedActions(overallMetadata);
176
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Actions', actionCounts)}`);
177
+ currentStep = 'seedMenus';
178
+ this.logger.log(`Seeding Menus`);
179
+ const menuCounts = await this.seedMenus(overallMetadata);
180
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Menus', menuCounts)}`);
181
+ currentStep = 'seedEmailTemplates';
182
+ this.logger.log(`Seeding Email Templates`);
183
+ const emailTemplateCounts = await this.seedEmailTemplates(overallMetadata, moduleMetadata.name);
184
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Email Templates', emailTemplateCounts)}`);
185
+ currentStep = 'seedSmsTemplates';
186
+ this.logger.log(`Seeding Sms Templates`);
187
+ const smsTemplateCounts = await this.seedSmsTemplates(overallMetadata, moduleMetadata.name);
188
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Sms Templates', smsTemplateCounts)}`);
189
+ currentStep = 'seedSecurityRules';
190
+ this.logger.log(`Seeding Security Rules`);
191
+ const securityRuleCounts = await this.seedSecurityRules(overallMetadata);
192
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Security Rules', securityRuleCounts)}`);
193
+ currentStep = 'seedListOfValues';
194
+ this.logger.log(`Seeding List Of Values`);
195
+ const lovCounts = await this.seedListOfValues(moduleMetadata, overallMetadata);
196
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'List Of Values', lovCounts)}`);
197
+ currentStep = 'seedDashboards';
198
+ this.logger.log(`Seeding Dashboards`);
199
+ const dashboardCounts = await this.seedDashboards(moduleMetadata, overallMetadata);
200
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Dashboards', dashboardCounts)}`);
201
+ currentStep = 'seedScheduledJobs';
202
+ this.logger.log(`Seeding Scheduled Jobs`);
203
+ const scheduledJobCounts = await this.seedScheduledJobs(moduleMetadata, overallMetadata);
204
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Scheduled Jobs', scheduledJobCounts)}`);
205
+ currentStep = 'seedSavedFilters';
206
+ this.logger.log(`Seeding Saved Filters`);
207
+ const savedFilterCounts = await this.seedSavedFilters(moduleMetadata, overallMetadata);
208
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Saved Filters', savedFilterCounts)}`);
209
+ currentStep = 'seedModelSequences';
210
+ this.logger.log(`Seeding Model Sequences`);
211
+ const modelSequenceCounts = await this.seedModelSequences(overallMetadata);
212
+ console.log(`${this.formatSeedResult(moduleMetadata.name, 'Model Sequences', modelSequenceCounts)}`);
213
+ }
214
+ currentModule = 'global';
215
+ currentStep = 'setupDefaultRolesWithPermissions';
216
+ await this.setupDefaultRolesWithPermissions();
217
+ console.log(`✔ Seeding completed.`);
218
+ }
219
+ catch (error) {
220
+ this.logSeedFailureForCli(error, {
221
+ moduleName: currentModule,
222
+ step: currentStep,
223
+ pruneEnabled: this.enablePruning,
224
+ modulesToSeed,
225
+ });
226
+ throw error;
141
227
  }
142
- for (let i = 0; i < filteredSeedDataFiles.length; i++) {
143
- const overallMetadata = filteredSeedDataFiles[i];
144
- const moduleMetadata = overallMetadata.moduleMetadata;
145
- console.log(`▶ Seeding Metadata for Module: ${moduleMetadata.name}`);
146
- this.logger.log(`Seeding Metadata for Module: ${moduleMetadata.name}`);
147
- this.logger.log(`Seeding Module / Model / Fields`);
148
- const moduleModelFieldCounts = await this.seedModuleModelFields(moduleMetadata);
149
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Module/Model/Fields', moduleModelFieldCounts)}`);
150
- this.logger.log(`Seeding Media Storage Providers`);
151
- const mediaStorageCounts = await this.seedMediaStorageProviders(overallMetadata.mediaStorageProviders);
152
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Media Storage Providers', mediaStorageCounts)}`);
153
- this.logger.log(`Seeding Roles`);
154
- const roleCounts = await this.seedRoles(overallMetadata);
155
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Roles', roleCounts)}`);
156
- this.logger.log(`Seeding Users`);
157
- const userCounts = await this.seedUsers(overallMetadata);
158
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Users', userCounts)}`);
159
- this.logger.log(`Seeding Views`);
160
- const viewCounts = await this.seedViews(overallMetadata);
161
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Views', viewCounts)}`);
162
- this.logger.log(`Seeding Actions`);
163
- const actionCounts = await this.seedActions(overallMetadata);
164
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Actions', actionCounts)}`);
165
- this.logger.log(`Seeding Menus`);
166
- const menuCounts = await this.seedMenus(overallMetadata);
167
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Menus', menuCounts)}`);
168
- this.logger.log(`Seeding Email Templates`);
169
- const emailTemplateCounts = await this.seedEmailTemplates(overallMetadata, moduleMetadata.name);
170
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Email Templates', emailTemplateCounts)}`);
171
- this.logger.log(`Seeding Sms Templates`);
172
- const smsTemplateCounts = await this.seedSmsTemplates(overallMetadata, moduleMetadata.name);
173
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Sms Templates', smsTemplateCounts)}`);
174
- this.logger.log(`Seeding Security Rules`);
175
- const securityRuleCounts = await this.seedSecurityRules(overallMetadata);
176
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Security Rules', securityRuleCounts)}`);
177
- this.logger.log(`Seeding List Of Values`);
178
- const lovCounts = await this.seedListOfValues(moduleMetadata, overallMetadata);
179
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'List Of Values', lovCounts)}`);
180
- this.logger.log(`Seeding Dashboards`);
181
- const dashboardCounts = await this.seedDashboards(moduleMetadata, overallMetadata);
182
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Dashboards', dashboardCounts)}`);
183
- this.logger.log(`Seeding Scheduled Jobs`);
184
- const scheduledJobCounts = await this.seedScheduledJobs(moduleMetadata, overallMetadata);
185
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Scheduled Jobs', scheduledJobCounts)}`);
186
- this.logger.log(`Seeding Saved Filters`);
187
- const savedFilterCounts = await this.seedSavedFilters(moduleMetadata, overallMetadata);
188
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Saved Filters', savedFilterCounts)}`);
189
- this.logger.log(`Seeding Model Sequences`);
190
- const modelSequenceCounts = await this.seedModelSequences(overallMetadata);
191
- console.log(`${this.formatSeedResult(moduleMetadata.name, 'Model Sequences', modelSequenceCounts)}`);
192
- }
193
- await this.setupDefaultRolesWithPermissions();
194
- console.log(`✔ Seeding completed.`);
195
228
  }
196
229
  async seedScheduledJobs(moduleMetadata, overallMetadata) {
197
230
  this.logger.debug(`[Start] Processing scheduled jobs for ${moduleMetadata.name}`);
@@ -675,9 +708,25 @@ let ModuleMetadataSeederService = ModuleMetadataSeederService_1 = class ModuleMe
675
708
  return;
676
709
  }
677
710
  for (const dto of createSavedFilterDto) {
711
+ this.validateSavedFilterQueryJsonWrapper(dto);
678
712
  await this.savedFiltersRepo.upsertWithDto({ ...dto, filterQueryJson: JSON.stringify(dto.filterQueryJson) });
679
713
  }
680
714
  }
715
+ validateSavedFilterQueryJsonWrapper(dto) {
716
+ const filterName = dto?.name ?? '<unnamed>';
717
+ const filterQueryJson = dto?.filterQueryJson;
718
+ const baseErrorMessage = `Invalid saved filter "${filterName}": filterQueryJson must be wrapped with a top-level "$or" or "$and". ` +
719
+ `Example: {"$or":[{"employeeStatus":{"$eq":"Active"}}]}`;
720
+ if (!filterQueryJson || typeof filterQueryJson !== 'object' || Array.isArray(filterQueryJson)) {
721
+ throw new Error(baseErrorMessage);
722
+ }
723
+ const topLevelKeys = Object.keys(filterQueryJson);
724
+ const hasLogicalWrapper = topLevelKeys.includes('$or') || topLevelKeys.includes('$and');
725
+ if (!hasLogicalWrapper) {
726
+ const receivedKeys = topLevelKeys.length > 0 ? topLevelKeys.join(', ') : '(none)';
727
+ throw new Error(`${baseErrorMessage}. Received top-level keys: ${receivedKeys}`);
728
+ }
729
+ }
681
730
  async handleSeedModelSequences(modelSequencesDto) {
682
731
  if (!modelSequencesDto || modelSequencesDto.length === 0) {
683
732
  this.logger.debug(`No Model Sequences found to seed`);
@@ -1165,6 +1214,27 @@ let ModuleMetadataSeederService = ModuleMetadataSeederService_1 = class ModuleMe
1165
1214
  }
1166
1215
  return 0;
1167
1216
  }
1217
+ logSeedFailureForCli(error, context) {
1218
+ const err = error instanceof Error ? error : new Error(String(error));
1219
+ const stackLines = (err.stack ?? '')
1220
+ .split('\n')
1221
+ .slice(0, 8)
1222
+ .map((line) => line.trim())
1223
+ .filter(Boolean);
1224
+ const logPayload = {
1225
+ module: context.moduleName,
1226
+ step: context.step,
1227
+ pruneEnabled: context.pruneEnabled,
1228
+ modulesToSeed: context.modulesToSeed?.length ? context.modulesToSeed : 'ALL',
1229
+ error: {
1230
+ name: err.name,
1231
+ message: err.message,
1232
+ stackPreview: stackLines.length > 0 ? stackLines : undefined,
1233
+ },
1234
+ };
1235
+ console.log('✖ Seeding failed');
1236
+ console.log(JSON.stringify(logPayload, null, 2));
1237
+ }
1168
1238
  formatSeedResult(moduleName, label, counts) {
1169
1239
  if (this.enablePruning) {
1170
1240
  return `✔ [${moduleName}] ${label} seeded (pruned ${counts.pruned}, upserted ${counts.upserted})`;