@solidxai/core 0.1.13-beta.7 → 0.1.13-beta.8

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 (257) hide show
  1. package/.claude/settings.local.json +16 -0
  2. package/CHANGELOG.md +548 -0
  3. package/CLAUDE.md +26 -0
  4. package/dist/constants/draft-publish-fields.d.ts +2 -0
  5. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  6. package/dist/constants/draft-publish-fields.js +5 -0
  7. package/dist/constants/draft-publish-fields.js.map +1 -0
  8. package/dist/constants/media-file-types.d.ts +9 -0
  9. package/dist/constants/media-file-types.d.ts.map +1 -1
  10. package/dist/constants/media-file-types.js +27 -1
  11. package/dist/constants/media-file-types.js.map +1 -1
  12. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  13. package/dist/controllers/action-metadata.controller.js +1 -1
  14. package/dist/controllers/agent-event.controller.d.ts +1 -1
  15. package/dist/controllers/agent-event.controller.js +1 -1
  16. package/dist/controllers/agent-session.controller.d.ts +1 -1
  17. package/dist/controllers/agent-session.controller.js +1 -1
  18. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  19. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  20. package/dist/controllers/email-template.controller.d.ts +1 -1
  21. package/dist/controllers/email-template.controller.js +1 -1
  22. package/dist/controllers/export-template.controller.d.ts +1 -1
  23. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  24. package/dist/controllers/export-template.controller.js +6 -4
  25. package/dist/controllers/export-template.controller.js.map +1 -1
  26. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  27. package/dist/controllers/export-transaction.controller.js +1 -1
  28. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  29. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  30. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  31. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  32. package/dist/controllers/import-transaction.controller.js +7 -7
  33. package/dist/controllers/import-transaction.controller.js.map +1 -1
  34. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  35. package/dist/controllers/list-of-values.controller.js +1 -1
  36. package/dist/controllers/locale.controller.d.ts +1 -1
  37. package/dist/controllers/locale.controller.js +1 -1
  38. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  39. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  40. package/dist/controllers/media.controller.d.ts +1 -1
  41. package/dist/controllers/media.controller.d.ts.map +1 -1
  42. package/dist/controllers/media.controller.js +12 -7
  43. package/dist/controllers/media.controller.js.map +1 -1
  44. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  45. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  46. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  47. package/dist/controllers/model-sequence.controller.js +1 -1
  48. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  49. package/dist/controllers/module-package.controller.js +2 -3
  50. package/dist/controllers/module-package.controller.js.map +1 -1
  51. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  52. package/dist/controllers/mq-message-queue.controller.js +1 -1
  53. package/dist/controllers/mq-message.controller.d.ts +1 -1
  54. package/dist/controllers/mq-message.controller.js +1 -1
  55. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  56. package/dist/controllers/permission-metadata.controller.js +1 -1
  57. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  58. package/dist/controllers/role-metadata.controller.js +1 -1
  59. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  60. package/dist/controllers/saved-filters.controller.js +1 -1
  61. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  62. package/dist/controllers/scheduled-job.controller.js +1 -1
  63. package/dist/controllers/security-rule.controller.d.ts +1 -1
  64. package/dist/controllers/security-rule.controller.js +1 -1
  65. package/dist/controllers/sms-template.controller.d.ts +1 -1
  66. package/dist/controllers/sms-template.controller.js +1 -1
  67. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  68. package/dist/controllers/user-activity-history.controller.js +1 -1
  69. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  70. package/dist/controllers/user-view-metadata.controller.js +1 -1
  71. package/dist/controllers/user.controller.d.ts +2 -2
  72. package/dist/controllers/user.controller.js +2 -2
  73. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  74. package/dist/controllers/view-metadata.controller.js +1 -1
  75. package/dist/controllers/workflow-definition.controller.d.ts +1 -1
  76. package/dist/controllers/workflow-definition.controller.js +1 -1
  77. package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
  78. package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
  79. package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
  80. package/dist/controllers/workflow-execution-log.controller.js +1 -1
  81. package/dist/controllers/workflow-execution.controller.d.ts +1 -1
  82. package/dist/controllers/workflow-execution.controller.js +1 -1
  83. package/dist/controllers/workflow-secret.controller.d.ts +1 -1
  84. package/dist/controllers/workflow-secret.controller.js +1 -1
  85. package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
  86. package/dist/controllers/workflow-step-execution.controller.js +1 -1
  87. package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
  88. package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
  89. package/dist/dtos/basic-filters.dto.d.ts +0 -1
  90. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  91. package/dist/dtos/basic-filters.dto.js +1 -6
  92. package/dist/dtos/basic-filters.dto.js.map +1 -1
  93. package/dist/entities/common.entity.d.ts +4 -0
  94. package/dist/entities/common.entity.d.ts.map +1 -1
  95. package/dist/entities/common.entity.js +25 -1
  96. package/dist/entities/common.entity.js.map +1 -1
  97. package/dist/entities/user.entity.js +2 -2
  98. package/dist/entities/user.entity.js.map +1 -1
  99. package/dist/factories/mail.factory.d.ts.map +1 -1
  100. package/dist/factories/mail.factory.js +4 -0
  101. package/dist/factories/mail.factory.js.map +1 -1
  102. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  103. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  104. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
  105. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  106. package/dist/helpers/file-download.helper.d.ts +9 -0
  107. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  108. package/dist/helpers/file-download.helper.js +14 -0
  109. package/dist/helpers/file-download.helper.js.map +1 -0
  110. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  111. package/dist/helpers/model-metadata-helper.service.js +30 -1
  112. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  113. package/dist/helpers/solid-registry.js +1 -1
  114. package/dist/helpers/solid-registry.js.map +1 -1
  115. package/dist/index.d.ts +2 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +2 -0
  118. package/dist/index.js.map +1 -1
  119. package/dist/seeders/module-test-data.service.d.ts +3 -1
  120. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  121. package/dist/seeders/module-test-data.service.js +8 -2
  122. package/dist/seeders/module-test-data.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +2 -0
  124. package/dist/services/authentication.service.d.ts +4 -1
  125. package/dist/services/authentication.service.d.ts.map +1 -1
  126. package/dist/services/authentication.service.js +52 -4
  127. package/dist/services/authentication.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts +1 -0
  129. package/dist/services/chatter-message.service.d.ts.map +1 -1
  130. package/dist/services/chatter-message.service.js +8 -0
  131. package/dist/services/chatter-message.service.js.map +1 -1
  132. package/dist/services/crud-helper.service.d.ts +5 -2
  133. package/dist/services/crud-helper.service.d.ts.map +1 -1
  134. package/dist/services/crud-helper.service.js +30 -32
  135. package/dist/services/crud-helper.service.js.map +1 -1
  136. package/dist/services/crud.service.d.ts +11 -1
  137. package/dist/services/crud.service.d.ts.map +1 -1
  138. package/dist/services/crud.service.js +79 -66
  139. package/dist/services/crud.service.js.map +1 -1
  140. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  141. package/dist/services/datasource-introspection.service.js.map +1 -1
  142. package/dist/services/draft-publish-helper.service.d.ts +52 -0
  143. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  144. package/dist/services/draft-publish-helper.service.js +368 -0
  145. package/dist/services/draft-publish-helper.service.js.map +1 -0
  146. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  147. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  148. package/dist/services/internationalisation-helper.service.js +107 -0
  149. package/dist/services/internationalisation-helper.service.js.map +1 -0
  150. package/dist/services/locale.service.d.ts +1 -1
  151. package/dist/services/media.service.d.ts +2 -1
  152. package/dist/services/media.service.d.ts.map +1 -1
  153. package/dist/services/media.service.js +28 -2
  154. package/dist/services/media.service.js.map +1 -1
  155. package/dist/services/metadata-validation.service.d.ts +7 -0
  156. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  157. package/dist/services/metadata-validation.service.js +42 -0
  158. package/dist/services/metadata-validation.service.js.map +1 -0
  159. package/dist/services/model-metadata.service.d.ts.map +1 -1
  160. package/dist/services/model-metadata.service.js +2 -1
  161. package/dist/services/model-metadata.service.js.map +1 -1
  162. package/dist/services/object.utils.d.ts +2 -0
  163. package/dist/services/object.utils.d.ts.map +1 -0
  164. package/dist/services/object.utils.js +11 -0
  165. package/dist/services/object.utils.js.map +1 -0
  166. package/dist/services/settings/default-settings-provider.service.d.ts +6 -6
  167. package/dist/services/settings/default-settings-provider.service.js +3 -3
  168. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  169. package/dist/services/user.service.d.ts +2 -2
  170. package/dist/services/user.service.d.ts.map +1 -1
  171. package/dist/services/user.service.js +9 -3
  172. package/dist/services/user.service.js.map +1 -1
  173. package/dist/services/view-metadata.service.d.ts +1 -2
  174. package/dist/services/view-metadata.service.d.ts.map +1 -1
  175. package/dist/services/view-metadata.service.js +3 -55
  176. package/dist/services/view-metadata.service.js.map +1 -1
  177. package/dist/services/workflow-definition.service.d.ts +1 -1
  178. package/dist/solid-core.module.d.ts.map +1 -1
  179. package/dist/solid-core.module.js +10 -1
  180. package/dist/solid-core.module.js.map +1 -1
  181. package/package.json +1 -1
  182. package/src/constants/draft-publish-fields.ts +5 -0
  183. package/src/constants/media-file-types.ts +50 -0
  184. package/src/controllers/export-template.controller.ts +5 -3
  185. package/src/controllers/import-transaction.controller.ts +6 -6
  186. package/src/controllers/media.controller.ts +17 -6
  187. package/src/controllers/module-package.controller.ts +2 -3
  188. package/src/dtos/basic-filters.dto.ts +0 -4
  189. package/src/entities/common.entity.ts +20 -0
  190. package/src/entities/user.entity.ts +2 -2
  191. package/src/factories/mail.factory.ts +7 -1
  192. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
  193. package/src/helpers/file-download.helper.ts +31 -0
  194. package/src/helpers/model-metadata-helper.service.ts +32 -1
  195. package/src/helpers/solid-registry.ts +1 -1
  196. package/src/index.ts +2 -0
  197. package/src/seeders/module-test-data.service.ts +6 -0
  198. package/src/seeders/seed-data/solid-core-metadata.json +2 -0
  199. package/src/services/1.js +6 -0
  200. package/src/services/authentication.service.ts +76 -5
  201. package/src/services/chatter-message.service.ts +16 -0
  202. package/src/services/crud-helper.service.ts +16 -34
  203. package/src/services/crud.service.ts +98 -103
  204. package/src/services/datasource-introspection.service.ts +5 -0
  205. package/src/services/draft-publish-helper.service.ts +529 -0
  206. package/src/services/internationalisation-helper.service.ts +148 -0
  207. package/src/services/media.service.ts +48 -3
  208. package/src/services/metadata-validation.service.ts +39 -0
  209. package/src/services/model-metadata.service.ts +4 -1
  210. package/src/services/object.utils.ts +10 -0
  211. package/src/services/settings/default-settings-provider.service.ts +3 -3
  212. package/src/services/user.service.ts +18 -3
  213. package/src/services/view-metadata.service.ts +5 -145
  214. package/src/solid-core.module.ts +16 -3
  215. package/dist-tests/api/authenticate.spec.js +0 -119
  216. package/dist-tests/api/authenticate.spec.js.map +0 -1
  217. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +0 -97
  218. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +0 -1
  219. package/dist-tests/api/ping.spec.js +0 -21
  220. package/dist-tests/api/ping.spec.js.map +0 -1
  221. package/dist-tests/helpers/auth.js +0 -41
  222. package/dist-tests/helpers/auth.js.map +0 -1
  223. package/dist-tests/helpers/env.js +0 -11
  224. package/dist-tests/helpers/env.js.map +0 -1
  225. package/docs/agent-builder/notebook-lm-prompt-for-agent-builder.md +0 -136
  226. package/docs/agent-builder/team-ready-note-agent-builder.md +0 -305
  227. package/docs/agent-hub-grooming.md +0 -301
  228. package/docs/dashboards/AGENTIC_DASHBOARD_IMPLEMENTATION_PLAN.md +0 -438
  229. package/docs/dashboards/dashboard-curl-smoke-tests.txt +0 -146
  230. package/docs/dashboards/delete-legacy-dashboard-metadata.sql +0 -172
  231. package/docs/datasource-introspection-ddl-analysis.md +0 -326
  232. package/docs/datasource-introspection-implementation-plan.md +0 -306
  233. package/docs/grouping-enhancements.md +0 -89
  234. package/docs/java-spring/README.md +0 -3
  235. package/docs/java-spring/solid-core-module-deep-dive-report.md +0 -1317
  236. package/docs/module-package-import-handoff.md +0 -691
  237. package/docs/seed-changes.md +0 -65
  238. package/docs/test-data-workflow.md +0 -200
  239. package/docs/type-declaration-import-issue.md +0 -24
  240. package/docs/workflow/business-automation-example-notes.md +0 -309
  241. package/docs/workflow/control-flow-node-addition-sop.md +0 -324
  242. package/docs/workflow/data-engineering-pipeline-example-notes.md +0 -330
  243. package/docs/workflow/foreach-example-notes.md +0 -187
  244. package/docs/workflow/hello-world-example-notes.md +0 -271
  245. package/docs/workflow/kestra-concepts-plugins-blueprints.md +0 -315
  246. package/docs/workflow/loop-until-example-notes.md +0 -198
  247. package/docs/workflow/microservices-and-apis-example-notes.md +0 -264
  248. package/docs/workflow/samples.md +0 -25
  249. package/docs/workflow/what-is-kestra.md +0 -79
  250. package/docs/workflow/workflow-core-module-handoff-summary.md +0 -191
  251. package/docs/workflow/workflow-module-brd.md +0 -185
  252. package/docs/workflow/workflow-module-domain-model.md +0 -252
  253. package/docs/workflow/workflow-module-metadata-dsl.md +0 -302
  254. package/docs/workflow/workflow-module-technical-spec.md +0 -293
  255. package/docs/workflow/workflow-node-type-contracts.md +0 -635
  256. package/docs/workflow/workflow-node-ui-metadata-contract.md +0 -1262
  257. package/docs/workflow/workflow-solidx-model-field-spec.md +0 -284
@@ -1 +1 @@
1
- {"version":3,"file":"basic-filters.dto.d.ts","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,oBAAY,gBAAgB;IACxB,SAAS,cAAc;IACvB,SAAS,cAAc;CAC1B;AAED,qBAAa,cAAe,SAAQ,kBAAkB;IAIlD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAI3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAI5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAI/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAI7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAYlC,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAI5C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAIjC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IAIjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAIzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAK5B"}
1
+ {"version":3,"file":"basic-filters.dto.d.ts","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,oBAAY,gBAAgB;IACxB,SAAS,cAAc;IACvB,SAAS,cAAc;CAC1B;AAED,qBAAa,cAAe,SAAQ,kBAAkB;IAIlD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAI3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAIzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAI5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAI/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAI7B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAYlC,QAAQ,CAAC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IAI5C,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IAIjC,WAAW,CAAC,EAAE,mBAAmB,CAAA;IAIjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAK5B"}
@@ -22,7 +22,7 @@ var SoftDeleteFilter;
22
22
  })(SoftDeleteFilter || (exports.SoftDeleteFilter = SoftDeleteFilter = {}));
23
23
  class BasicFilterDto extends pagination_query_dto_1.PaginationQueryDto {
24
24
  static _OPENAPI_METADATA_FACTORY() {
25
- return { fields: { required: false, type: () => [String] }, sort: { required: false, type: () => [String] }, groupBy: { required: false, type: () => [String] }, aggregates: { required: false, type: () => [String] }, populate: { required: false, type: () => [String] }, populateMedia: { required: false, type: () => [String] }, showSoftDeleted: { required: false, enum: require("./basic-filters.dto").SoftDeleteFilter }, populateGroup: { required: false, type: () => Boolean }, groupFilter: { required: false, type: () => require("./basic-group-filters.dto").BasicGroupFilterDto }, locale: { required: false, type: () => String }, status: { required: false, type: () => String } };
25
+ return { fields: { required: false, type: () => [String] }, sort: { required: false, type: () => [String] }, groupBy: { required: false, type: () => [String] }, aggregates: { required: false, type: () => [String] }, populate: { required: false, type: () => [String] }, populateMedia: { required: false, type: () => [String] }, showSoftDeleted: { required: false, enum: require("./basic-filters.dto").SoftDeleteFilter }, populateGroup: { required: false, type: () => Boolean }, groupFilter: { required: false, type: () => require("./basic-group-filters.dto").BasicGroupFilterDto }, locale: { required: false, type: () => String } };
26
26
  }
27
27
  }
28
28
  exports.BasicFilterDto = BasicFilterDto;
@@ -80,9 +80,4 @@ __decorate([
80
80
  (0, swagger_1.ApiProperty)({ description: "locale" }),
81
81
  __metadata("design:type", String)
82
82
  ], BasicFilterDto.prototype, "locale", void 0);
83
- __decorate([
84
- (0, class_validator_1.IsOptional)(),
85
- (0, swagger_1.ApiProperty)({ description: "status publish draft" }),
86
- __metadata("design:type", String)
87
- ], BasicFilterDto.prototype, "status", void 0);
88
83
  //# sourceMappingURL=basic-filters.dto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"basic-filters.dto.js","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,6CAA8C;AAC9C,qDAAqD;AACrD,iEAA4D;AAE5D,uEAAgE;AAEhE,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,2CAAuB,CAAA;IACvB,2CAAuB,CAAA;AAC3B,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,MAAa,cAAe,SAAQ,yCAAkB;;;;CAyDrD;AAzDD,wCAyDC;AArDY;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACZ;AAIlB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;4CACZ;AAIhB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;;+CACZ;AAInB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;;kDACZ;AAItB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;;gDACZ;AAIpB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACZ;AAYzB;IANR,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,gBAAgB,CAAC;IACxB,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,gBAAgB;KACzB,CAAC;;uDAC0C;AAInC;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACb;AAIjC;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;8BAC9B,6CAAmB;mDAAA;AAIxB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACd;AAIhB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;;8CAC5B","sourcesContent":["\nimport { ApiProperty } from \"@nestjs/swagger\";\nimport { IsEnum, IsOptional } from \"class-validator\";\nimport { PaginationQueryDto } from \"./pagination-query.dto\";\nimport { Timestamp } from \"typeorm\";\nimport { BasicGroupFilterDto } from \"./basic-group-filters.dto\";\n\nexport enum SoftDeleteFilter {\n INCLUSIVE = \"inclusive\",\n EXCLUSIVE = \"exclusive\",\n}\n\nexport class BasicFilterDto extends PaginationQueryDto {\n\n @IsOptional()\n @ApiProperty({ description: \"Fields\" })\n readonly fields?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"sort\" })\n readonly sort?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"groupBy\" })\n readonly groupBy?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"aggregates\" })\n readonly aggregates?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populate\" })\n readonly populate?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populateMedia\" })\n readonly populateMedia?: string[];\n\n // @IsOptional()\n // @ApiProperty({ description: \"filters\" })\n // readonly filters: any[];\n\n @IsOptional()\n @IsEnum(SoftDeleteFilter)\n @ApiProperty({\n description: \"showSoftDeleted\",\n enum: SoftDeleteFilter,\n })\n readonly showSoftDeleted?: SoftDeleteFilter;\n\n @IsOptional()\n @ApiProperty({ description: \"populateGroup\" })\n readonly populateGroup?: boolean;\n\n @IsOptional()\n @ApiProperty({ description: \"groupFilter\" })\n groupFilter?: BasicGroupFilterDto\n\n @IsOptional()\n @ApiProperty({ description: \"locale\" })\n readonly locale?: string;\n\n @IsOptional()\n @ApiProperty({ description: \"status publish draft\" })\n readonly status?: string;\n\n // @IsOptional()\n // @ApiProperty({ description: \"default locale id\" })\n // readonly defaultEntityLocaleId?: number;\n}\n"]}
1
+ {"version":3,"file":"basic-filters.dto.js","sourceRoot":"","sources":["../../src/dtos/basic-filters.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;;AACA,6CAA8C;AAC9C,qDAAqD;AACrD,iEAA4D;AAE5D,uEAAgE;AAEhE,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,2CAAuB,CAAA;IACvB,2CAAuB,CAAA;AAC3B,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,MAAa,cAAe,SAAQ,yCAAkB;;;;CAqDrD;AArDD,wCAqDC;AAjDY;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACZ;AAIlB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;;4CACZ;AAIhB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;;+CACZ;AAInB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;;kDACZ;AAItB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;;gDACZ;AAIpB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACZ;AAYzB;IANR,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,gBAAgB,CAAC;IACxB,IAAA,qBAAW,EAAC;QACT,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,gBAAgB;KACzB,CAAC;;uDAC0C;AAInC;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;qDACb;AAIjC;IAFC,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;8BAC9B,6CAAmB;mDAAA;AAIxB;IAFR,IAAA,4BAAU,GAAE;IACZ,IAAA,qBAAW,EAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;;8CACd","sourcesContent":["\nimport { ApiProperty } from \"@nestjs/swagger\";\nimport { IsEnum, IsOptional } from \"class-validator\";\nimport { PaginationQueryDto } from \"./pagination-query.dto\";\nimport { Timestamp } from \"typeorm\";\nimport { BasicGroupFilterDto } from \"./basic-group-filters.dto\";\n\nexport enum SoftDeleteFilter {\n INCLUSIVE = \"inclusive\",\n EXCLUSIVE = \"exclusive\",\n}\n\nexport class BasicFilterDto extends PaginationQueryDto {\n\n @IsOptional()\n @ApiProperty({ description: \"Fields\" })\n readonly fields?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"sort\" })\n readonly sort?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"groupBy\" })\n readonly groupBy?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"aggregates\" })\n readonly aggregates?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populate\" })\n readonly populate?: string[];\n\n @IsOptional()\n @ApiProperty({ description: \"populateMedia\" })\n readonly populateMedia?: string[];\n\n // @IsOptional()\n // @ApiProperty({ description: \"filters\" })\n // readonly filters: any[];\n\n @IsOptional()\n @IsEnum(SoftDeleteFilter)\n @ApiProperty({\n description: \"showSoftDeleted\",\n enum: SoftDeleteFilter,\n })\n readonly showSoftDeleted?: SoftDeleteFilter;\n\n @IsOptional()\n @ApiProperty({ description: \"populateGroup\" })\n readonly populateGroup?: boolean;\n\n @IsOptional()\n @ApiProperty({ description: \"groupFilter\" })\n groupFilter?: BasicGroupFilterDto\n\n @IsOptional()\n @ApiProperty({ description: \"locale\" })\n readonly locale?: string;\n\n // @IsOptional()\n // @ApiProperty({ description: \"default locale id\" })\n // readonly defaultEntityLocaleId?: number;\n}\n"]}
@@ -5,6 +5,10 @@ export declare abstract class CommonEntity {
5
5
  deletedAt: Date;
6
6
  deletedTracker: string;
7
7
  publishedAt: Date;
8
+ isPublished: boolean;
9
+ isLatest: boolean;
10
+ initialEntityVersionId: number;
11
+ publishedTracker: string;
8
12
  localeName: string;
9
13
  defaultEntityLocaleId: number;
10
14
  createdBy: number;
@@ -1 +1 @@
1
- {"version":3,"file":"common.entity.d.ts","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":"AAIA,8BACsB,YAAY;IAG9B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAIhB,SAAS,EAAE,IAAI,CAAC;IAGhB,cAAc,EAAE,MAAM,CAAC;IAIvB,WAAW,EAAE,IAAI,CAAC;IAIlB,UAAU,EAAE,MAAM,CAAC;IAInB,qBAAqB,EAAE,MAAM,CAAC;IAc9B,SAAS,EAAE,MAAM,CAAC;IAIlB,SAAS,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"common.entity.d.ts","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":"AAIA,8BACsB,YAAY;IAG9B,EAAE,EAAE,MAAM,CAAA;IAGV,SAAS,EAAE,IAAI,CAAC;IAGhB,SAAS,EAAE,IAAI,CAAC;IAIhB,SAAS,EAAE,IAAI,CAAC;IAGhB,cAAc,EAAE,MAAM,CAAC;IAIvB,WAAW,EAAE,IAAI,CAAC;IAKlB,WAAW,EAAE,OAAO,CAAC;IAKrB,QAAQ,EAAE,OAAO,CAAC;IAKlB,sBAAsB,EAAE,MAAM,CAAC;IAK/B,gBAAgB,EAAE,MAAM,CAAC;IAIzB,UAAU,EAAE,MAAM,CAAC;IAInB,qBAAqB,EAAE,MAAM,CAAC;IAc9B,SAAS,EAAE,MAAM,CAAC;IAIlB,SAAS,EAAE,MAAM,CAAC;CACrB"}
@@ -16,7 +16,7 @@ const local_date_time_transformer_1 = require("../transformers/typeorm/local-dat
16
16
  const typeorm_1 = require("typeorm");
17
17
  let CommonEntity = class CommonEntity {
18
18
  static _OPENAPI_METADATA_FACTORY() {
19
- return { id: { required: true, type: () => Number }, createdAt: { required: true, type: () => Date }, updatedAt: { required: true, type: () => Date }, deletedAt: { required: true, type: () => Date }, deletedTracker: { required: true, type: () => String }, publishedAt: { required: true, type: () => Date }, localeName: { required: true, type: () => String }, defaultEntityLocaleId: { required: true, type: () => Number }, createdBy: { required: true, type: () => Number }, updatedBy: { required: true, type: () => Number } };
19
+ return { id: { required: true, type: () => Number }, createdAt: { required: true, type: () => Date }, updatedAt: { required: true, type: () => Date }, deletedAt: { required: true, type: () => Date }, deletedTracker: { required: true, type: () => String }, publishedAt: { required: true, type: () => Date }, isPublished: { required: true, type: () => Boolean }, isLatest: { required: true, type: () => Boolean }, initialEntityVersionId: { required: true, type: () => Number }, publishedTracker: { required: true, type: () => String }, localeName: { required: true, type: () => String }, defaultEntityLocaleId: { required: true, type: () => Number }, createdBy: { required: true, type: () => Number }, updatedBy: { required: true, type: () => Number } };
20
20
  }
21
21
  };
22
22
  exports.CommonEntity = CommonEntity;
@@ -47,6 +47,30 @@ __decorate([
47
47
  (0, typeorm_1.Column)({ name: 'published_at', default: null, nullable: true, transformer: local_date_time_transformer_1.LocalDateTimeTransformer }),
48
48
  __metadata("design:type", Date)
49
49
  ], CommonEntity.prototype, "publishedAt", void 0);
50
+ __decorate([
51
+ (0, class_transformer_1.Expose)(),
52
+ (0, typeorm_1.Column)({ name: 'is_published', default: false }),
53
+ (0, typeorm_1.Index)(),
54
+ __metadata("design:type", Boolean)
55
+ ], CommonEntity.prototype, "isPublished", void 0);
56
+ __decorate([
57
+ (0, class_transformer_1.Expose)(),
58
+ (0, typeorm_1.Column)({ name: 'is_latest', default: true }),
59
+ (0, typeorm_1.Index)(),
60
+ __metadata("design:type", Boolean)
61
+ ], CommonEntity.prototype, "isLatest", void 0);
62
+ __decorate([
63
+ (0, class_transformer_1.Expose)(),
64
+ (0, typeorm_1.Column)({ type: "int", name: 'initial_entity_version_id', default: null, nullable: true }),
65
+ (0, typeorm_1.Index)(),
66
+ __metadata("design:type", Number)
67
+ ], CommonEntity.prototype, "initialEntityVersionId", void 0);
68
+ __decorate([
69
+ (0, class_transformer_1.Expose)(),
70
+ (0, typeorm_1.Column)({ name: 'published_tracker', default: "na" }),
71
+ (0, typeorm_1.Index)(),
72
+ __metadata("design:type", String)
73
+ ], CommonEntity.prototype, "publishedTracker", void 0);
50
74
  __decorate([
51
75
  (0, class_transformer_1.Expose)(),
52
76
  (0, typeorm_1.Column)({ type: "varchar", name: 'locale_name', default: null }),
@@ -1 +1 @@
1
- {"version":3,"file":"common.entity.js","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,yDAAoD;AACpD,qGAAgG;AAChG,qCAAsH;AAG/G,IAAe,YAAY,GAA3B,MAAe,YAAY;;;;CA+CjC,CAAA;AA/CqB,oCAAY;AAG9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCAClC;AAGV;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAGhB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAIhB;IAFC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;IAC/E,IAAA,eAAK,GAAE;8BACG,IAAI;+CAAC;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;oDACpC;AAIvB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BAC1F,IAAI;iDAAC;AAIlB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;gDAC7C;AAInB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;2DAC3C;AAc9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;AAIlB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;uBA9CA,YAAY;IADjC,IAAA,2BAAO,GAAE;GACY,YAAY,CA+CjC","sourcesContent":["import { Exclude, Expose } from \"class-transformer\";\nimport { LocalDateTimeTransformer } from \"src/transformers/typeorm/local-date-time-transformer\";\nimport { Column, CreateDateColumn, DeleteDateColumn, Index, PrimaryGeneratedColumn, UpdateDateColumn } from \"typeorm\";\n\n@Exclude()\nexport abstract class CommonEntity {\n @Expose()\n @PrimaryGeneratedColumn({ type: 'integer' })\n id: number\n\n @CreateDateColumn({ name: \"created_at\", transformer: LocalDateTimeTransformer })\n createdAt: Date;\n\n @UpdateDateColumn({ name: \"updated_at\", transformer: LocalDateTimeTransformer })\n updatedAt: Date;\n\n @DeleteDateColumn({ name: \"deleted_at\", transformer: LocalDateTimeTransformer })\n @Index()\n deletedAt: Date;\n\n @Column({ name: \"deletedTracker\", default: \"not-deleted\" })\n deletedTracker: string;\n\n @Expose()\n @Column({ name: 'published_at', default: null, nullable: true, transformer: LocalDateTimeTransformer })\n publishedAt: Date;\n\n @Expose()\n @Column({ type: \"varchar\", name: 'locale_name', default: null })\n localeName: string;\n\n @Expose()\n @Column({ type: \"int\", name: 'default_entity_locale_id', default: null })\n defaultEntityLocaleId: number;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // createdBy: User;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // updatedBy: User;\n\n @Expose()\n @Column({ name: `created_by_id`, nullable: true })\n createdBy: number;\n\n @Expose()\n @Column({ name: `updated_by_id`, nullable: true })\n updatedBy: number;\n}\n"]}
1
+ {"version":3,"file":"common.entity.js","sourceRoot":"","sources":["../../src/entities/common.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,yDAAoD;AACpD,qGAAgG;AAChG,qCAAsH;AAG/G,IAAe,YAAY,GAA3B,MAAe,YAAY;;;;CAmEjC,CAAA;AAnEqB,oCAAY;AAG9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gCAAsB,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;wCAClC;AAGV;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAGhB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BACrE,IAAI;+CAAC;AAIhB;IAFC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;IAC/E,IAAA,eAAK,GAAE;8BACG,IAAI;+CAAC;AAGhB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;;oDACpC;AAIvB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,sDAAwB,EAAE,CAAC;8BAC1F,IAAI;iDAAC;AAKlB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChD,IAAA,eAAK,GAAE;;iDACa;AAKrB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAA,eAAK,GAAE;;8CACU;AAKlB;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzF,IAAA,eAAK,GAAE;;4DACuB;AAK/B;IAHC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpD,IAAA,eAAK,GAAE;;sDACiB;AAIzB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;gDAC7C;AAInB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;2DAC3C;AAc9B;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;AAIlB;IAFC,IAAA,0BAAM,GAAE;IACR,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAChC;uBAlEA,YAAY;IADjC,IAAA,2BAAO,GAAE;GACY,YAAY,CAmEjC","sourcesContent":["import { Exclude, Expose } from \"class-transformer\";\nimport { LocalDateTimeTransformer } from \"src/transformers/typeorm/local-date-time-transformer\";\nimport { Column, CreateDateColumn, DeleteDateColumn, Index, PrimaryGeneratedColumn, UpdateDateColumn } from \"typeorm\";\n\n@Exclude()\nexport abstract class CommonEntity {\n @Expose()\n @PrimaryGeneratedColumn({ type: 'integer' })\n id: number\n\n @CreateDateColumn({ name: \"created_at\", transformer: LocalDateTimeTransformer })\n createdAt: Date;\n\n @UpdateDateColumn({ name: \"updated_at\", transformer: LocalDateTimeTransformer })\n updatedAt: Date;\n\n @DeleteDateColumn({ name: \"deleted_at\", transformer: LocalDateTimeTransformer })\n @Index()\n deletedAt: Date;\n\n @Column({ name: \"deletedTracker\", default: \"not-deleted\" })\n deletedTracker: string;\n\n @Expose()\n @Column({ name: 'published_at', default: null, nullable: true, transformer: LocalDateTimeTransformer })\n publishedAt: Date;\n\n @Expose()\n @Column({ name: 'is_published', default: false })\n @Index()\n isPublished: boolean;\n\n @Expose()\n @Column({ name: 'is_latest', default: true })\n @Index()\n isLatest: boolean;\n\n @Expose()\n @Column({ type: \"int\", name: 'initial_entity_version_id', default: null, nullable: true })\n @Index()\n initialEntityVersionId: number;\n\n @Expose()\n @Column({ name: 'published_tracker', default: \"na\" })\n @Index()\n publishedTracker: string;\n\n @Expose()\n @Column({ type: \"varchar\", name: 'locale_name', default: null })\n localeName: string;\n\n @Expose()\n @Column({ type: \"int\", name: 'default_entity_locale_id', default: null })\n defaultEntityLocaleId: number;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // createdBy: User;\n\n // @Expose()\n // @Type( () => require('./user.entity').User?.default ?? require('./user.entity').User )\n // @ManyToOne(() => require('./user.entity').User?.default ?? require('./user.entity').User, { nullable: true })\n // updatedBy: User;\n\n @Expose()\n @Column({ name: `created_by_id`, nullable: true })\n createdBy: number;\n\n @Expose()\n @Column({ name: `updated_by_id`, nullable: true })\n updatedBy: number;\n}\n"]}
@@ -44,13 +44,13 @@ __decorate([
44
44
  __metadata("design:type", String)
45
45
  ], User.prototype, "username", void 0);
46
46
  __decorate([
47
- (0, typeorm_1.Index)(),
47
+ (0, typeorm_1.Index)({ unique: true }),
48
48
  (0, typeorm_1.Column)({ type: "varchar", nullable: true }),
49
49
  (0, class_transformer_1.Expose)(),
50
50
  __metadata("design:type", String)
51
51
  ], User.prototype, "email", void 0);
52
52
  __decorate([
53
- (0, typeorm_1.Index)(),
53
+ (0, typeorm_1.Index)({ unique: true }),
54
54
  (0, typeorm_1.Column)({ type: "varchar", nullable: true }),
55
55
  (0, class_transformer_1.Expose)(),
56
56
  __metadata("design:type", String)
@@ -1 +1 @@
1
- {"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../src/entities/user.entity.ts"],"names":[],"mappings":"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","sourcesContent":["import { CommonEntity } from \"src/entities/common.entity\"\nimport { Entity, Column, Index, JoinTable, ManyToMany, OneToMany, TableInheritance } from \"typeorm\";\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { UserViewMetadata } from 'src/entities/user-view-metadata.entity'\nimport { UserApiKey } from 'src/entities/user-api-key.entity'\nimport { Exclude, Expose } from \"class-transformer\";\n\n/**\n * Serialization is locked down twice over, and both halves are load-bearing:\n *\n * - The class-level `@Exclude()` below makes User itself an allowlist: only `@Expose()`d\n * properties are serialized.\n * - Every other property additionally carries its own `@Exclude()`. That looks redundant\n * here, and for `User` it is - but class-transformer resolves the *class-level* strategy\n * with a direct lookup on the exact constructor (MetadataStorage.getStrategy), so a\n * subclass inherits nothing and falls back to `exposeAll`. Since this entity is a\n * `@TableInheritance` root that consuming projects extend (see\n * IExtensionUserCreationProvider), an extension user that forgets its own `@Exclude()`\n * would otherwise serialize the password hash and every OAuth/verification token.\n * Property-level metadata *is* walked up the prototype chain, so the per-property\n * decorators are what actually protect subclasses.\n *\n * Keep both. Adding a new column? Give it `@Expose()` or `@Exclude()` - never neither.\n */\n@Entity(\"ss_user\")\n@TableInheritance({ column: { type: \"varchar\", name: \"type\", default: \"User\" } })\n@Exclude()\nexport class User extends CommonEntity {\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n fullName: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n @Expose()\n username: string;\n\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n email: string;\n\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n mobile: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n password: string;\n\n @Column({ nullable: true, default: true })\n @Expose()\n forcePasswordChange: boolean = true;\n\n @Column({ type: \"varchar\", default: \"local\" })\n @Exclude()\n lastLoginProvider: string = \"local\";\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n accessCode: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryProfilePicture: string;\n\n @Index()\n @Column({ default: true })\n @Expose()\n active: boolean = true;\n\n @Column({ nullable: true })\n @Exclude()\n forgotPasswordConfirmedAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n verificationTokenOnForgotPassword: string;\n\n @Column({ nullable: true })\n @Exclude()\n verificationTokenOnForgotPasswordExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n customPayload: string;\n\n @ManyToMany(() => RoleMetadata, roleMetadata => roleMetadata.users, { cascade: true })\n @JoinTable()\n @Expose()\n roles: RoleMetadata[];\n\n @OneToMany(() => UserViewMetadata, userViewMetadata => userViewMetadata.user, { cascade: true })\n @Exclude()\n userViewMetadata: UserViewMetadata[];\n\n @Exclude()\n @Column({ type: \"varchar\", default: \"bcrypt\" })\n passwordScheme: string;\n\n @Exclude()\n @Column({ type: \"int\", default: 1 })\n passwordSchemeVersion: number;\n\n @Exclude()\n @Column({ nullable: true })\n rehashedAt: Date;\n\n @Expose()\n @Column({ type: \"int\", default: 0 })\n failedLoginAttempts: number = 0;\n\n @Expose()\n _media: any;\n\n @Column({ default: false })\n @Expose()\n isAllowedToGenerateApiKeys: boolean = false;\n\n @OneToMany(() => UserApiKey, key => key.user)\n @Expose()\n apiKeys: UserApiKey[];\n\n}\n"]}
1
+ {"version":3,"file":"user.entity.js","sourceRoot":"","sources":["../../src/entities/user.entity.ts"],"names":[],"mappings":"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","sourcesContent":["import { CommonEntity } from \"src/entities/common.entity\"\nimport { Entity, Column, Index, JoinTable, ManyToMany, OneToMany, TableInheritance } from \"typeorm\";\nimport { RoleMetadata } from 'src/entities/role-metadata.entity';\nimport { UserViewMetadata } from 'src/entities/user-view-metadata.entity'\nimport { UserApiKey } from 'src/entities/user-api-key.entity'\nimport { Exclude, Expose } from \"class-transformer\";\n\n/**\n * Serialization is locked down twice over, and both halves are load-bearing:\n *\n * - The class-level `@Exclude()` below makes User itself an allowlist: only `@Expose()`d\n * properties are serialized.\n * - Every other property additionally carries its own `@Exclude()`. That looks redundant\n * here, and for `User` it is - but class-transformer resolves the *class-level* strategy\n * with a direct lookup on the exact constructor (MetadataStorage.getStrategy), so a\n * subclass inherits nothing and falls back to `exposeAll`. Since this entity is a\n * `@TableInheritance` root that consuming projects extend (see\n * IExtensionUserCreationProvider), an extension user that forgets its own `@Exclude()`\n * would otherwise serialize the password hash and every OAuth/verification token.\n * Property-level metadata *is* walked up the prototype chain, so the per-property\n * decorators are what actually protect subclasses.\n *\n * Keep both. Adding a new column? Give it `@Expose()` or `@Exclude()` - never neither.\n */\n@Entity(\"ss_user\")\n@TableInheritance({ column: { type: \"varchar\", name: \"type\", default: \"User\" } })\n@Exclude()\nexport class User extends CommonEntity {\n @Index()\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n fullName: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\" })\n @Expose()\n username: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n email: string;\n\n @Index({ unique: true })\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n mobile: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n password: string;\n\n @Column({ nullable: true, default: true })\n @Expose()\n forcePasswordChange: boolean = true;\n\n @Column({ type: \"varchar\", default: \"local\" })\n @Exclude()\n lastLoginProvider: string = \"local\";\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n accessCode: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n googleProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n facebookProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n appleAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftProfilePicture: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryId: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryAccessToken: string;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n microsoftActiveDirectoryProfilePicture: string;\n\n @Index()\n @Column({ default: true })\n @Expose()\n active: boolean = true;\n\n @Column({ nullable: true })\n @Exclude()\n forgotPasswordConfirmedAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n verificationTokenOnForgotPassword: string;\n\n @Column({ nullable: true })\n @Exclude()\n verificationTokenOnForgotPasswordExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnRegistrationAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistration: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnRegistrationExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n emailVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n emailVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerifiedOnLoginAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Exclude()\n mobileVerificationTokenOnLogin: string;\n\n @Column({ nullable: true })\n @Exclude()\n mobileVerificationTokenOnLoginExpiresAt: Date;\n\n @Column({ type: \"varchar\", nullable: true })\n @Expose()\n customPayload: string;\n\n @ManyToMany(() => RoleMetadata, roleMetadata => roleMetadata.users, { cascade: true })\n @JoinTable()\n @Expose()\n roles: RoleMetadata[];\n\n @OneToMany(() => UserViewMetadata, userViewMetadata => userViewMetadata.user, { cascade: true })\n @Exclude()\n userViewMetadata: UserViewMetadata[];\n\n @Exclude()\n @Column({ type: \"varchar\", default: \"bcrypt\" })\n passwordScheme: string;\n\n @Exclude()\n @Column({ type: \"int\", default: 1 })\n passwordSchemeVersion: number;\n\n @Exclude()\n @Column({ nullable: true })\n rehashedAt: Date;\n\n @Expose()\n @Column({ type: \"int\", default: 0 })\n failedLoginAttempts: number = 0;\n\n @Expose()\n _media: any;\n\n @Column({ default: false })\n @Expose()\n isAllowedToGenerateApiKeys: boolean = false;\n\n @OneToMany(() => UserApiKey, key => key.user)\n @Expose()\n apiKeys: UserApiKey[];\n\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mail.factory.d.ts","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAQ9D,qBACa,WAAW;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEvC,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc;IAGnD,cAAc,IAAI,KAAK;CAc1B"}
1
+ {"version":3,"file":"mail.factory.d.ts","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAQ9D,qBACa,WAAW;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;gBAEvC,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc;IAGnD,cAAc,IAAI,KAAK;CAoB1B"}
@@ -31,6 +31,10 @@ let MailFactory = class MailFactory {
31
31
  this.logger.error("No mail providers are registered.");
32
32
  }
33
33
  const mailServiceProvider = mailProviders.find(provider => provider.name === mailServiceName);
34
+ if (!mailServiceProvider?.instance) {
35
+ const registeredProviders = mailProviders.map((provider) => provider?.name).filter(Boolean).join(", ");
36
+ throw new Error(`Mail provider "${mailServiceName}" is not registered. Registered providers: ${registeredProviders || "none"}`);
37
+ }
34
38
  return mailServiceProvider.instance;
35
39
  }
36
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"mail.factory.js","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,uCAAyC;AACzC,8DAA2D;AAE3D,iEAA8D;AAG9D,SAAS,IAAI,CAAC,CAAU;IACpB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAIM,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEpB,YACqB,SAAoB,EACpB,aAA4B,EAC5B,cAA8B;QAF9B,cAAS,GAAT,SAAS,CAAW;QACpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,mBAAc,GAAd,cAAc,CAAgB;QAJlC,WAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAKxD,CAAC;IAEL,cAAc;QACV,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAmB,eAAe,CAAC,IAAI,kBAAkB,CAAC;QACpH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QAE9F,OAAO,mBAAmB,CAAC,QAAiB,CAAC;IACjD,CAAC;CAEJ,CAAA;AAtBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAIuB,gBAAS;QACL,8BAAa;QACZ,gCAAc;GAL1C,WAAW,CAsBvB","sourcesContent":["import { Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigType } from \"@nestjs/config\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IMail } from \"src/interfaces\";\nimport { SettingService } from \"src/services/setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nfunction norm(s?: string) {\n return s?.trim().toLowerCase();\n}\n\n// This factory will be use to return a mail service instance, using the configured environment variables\n@Injectable()\nexport class MailFactory {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n private readonly moduleRef: ModuleRef, // Use the module ref to dynamically resolve the mail service\n private readonly solidRegistry: SolidRegistry,\n private readonly settingService: SettingService,\n ) { }\n\n getMailService(): IMail {\n const mailServiceName = this.settingService.getConfigValue<SolidCoreSetting>(\"emailProvider\") ?? \"SMTPEMailService\";\n const mailProviders = this.solidRegistry.getMailProviders();\n // Return the instance which matches the mailServiceName\n if (!mailProviders.length) {\n // throw new Error(\"No mail providers are registered.\");\n this.logger.error(\"No mail providers are registered.\");\n }\n\n const mailServiceProvider = mailProviders.find(provider => provider.name === mailServiceName);\n\n return mailServiceProvider.instance as IMail;\n }\n\n}"]}
1
+ {"version":3,"file":"mail.factory.js","sourceRoot":"","sources":["../../src/factories/mail.factory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4D;AAE5D,uCAAyC;AACzC,8DAA2D;AAE3D,iEAA8D;AAG9D,SAAS,IAAI,CAAC,CAAU;IACpB,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAIM,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEpB,YACqB,SAAoB,EACpB,aAA4B,EAC5B,cAA8B;QAF9B,cAAS,GAAT,SAAS,CAAW;QACpB,kBAAa,GAAb,aAAa,CAAe;QAC5B,mBAAc,GAAd,cAAc,CAAgB;QAJlC,WAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAKxD,CAAC;IAEL,cAAc;QACV,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAmB,eAAe,CAAC,IAAI,kBAAkB,CAAC;QACpH,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE5D,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,mBAAmB,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;QAC9F,IAAI,CAAC,mBAAmB,EAAE,QAAQ,EAAE,CAAC;YACjC,MAAM,mBAAmB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvG,MAAM,IAAI,KAAK,CACX,kBAAkB,eAAe,8CAA8C,mBAAmB,IAAI,MAAM,EAAE,CACjH,CAAC;QACN,CAAC;QAED,OAAO,mBAAmB,CAAC,QAAiB,CAAC;IACjD,CAAC;CAEJ,CAAA;AA5BY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAIuB,gBAAS;QACL,8BAAa;QACZ,gCAAc;GAL1C,WAAW,CA4BvB","sourcesContent":["import { Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { ConfigType } from \"@nestjs/config\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { SolidRegistry } from \"src/helpers/solid-registry\";\nimport { IMail } from \"src/interfaces\";\nimport { SettingService } from \"src/services/setting.service\";\nimport type { SolidCoreSetting } from \"src/services/settings/default-settings-provider.service\";\n\nfunction norm(s?: string) {\n return s?.trim().toLowerCase();\n}\n\n// This factory will be use to return a mail service instance, using the configured environment variables\n@Injectable()\nexport class MailFactory {\n private readonly logger = new Logger(this.constructor.name);\n constructor(\n private readonly moduleRef: ModuleRef, // Use the module ref to dynamically resolve the mail service\n private readonly solidRegistry: SolidRegistry,\n private readonly settingService: SettingService,\n ) { }\n\n getMailService(): IMail {\n const mailServiceName = this.settingService.getConfigValue<SolidCoreSetting>(\"emailProvider\") ?? \"SMTPEMailService\";\n const mailProviders = this.solidRegistry.getMailProviders();\n // Return the instance which matches the mailServiceName\n if (!mailProviders.length) {\n // throw new Error(\"No mail providers are registered.\");\n this.logger.error(\"No mail providers are registered.\");\n }\n\n const mailServiceProvider = mailProviders.find(provider => provider.name === mailServiceName);\n if (!mailServiceProvider?.instance) {\n const registeredProviders = mailProviders.map((provider) => provider?.name).filter(Boolean).join(\", \");\n throw new Error(\n `Mail provider \"${mailServiceName}\" is not registered. Registered providers: ${registeredProviders || \"none\"}`,\n );\n }\n\n return mailServiceProvider.instance as IMail;\n }\n\n}\n"]}
@@ -17,6 +17,7 @@ export declare class MediaFieldCrudManager implements FieldCrudManager {
17
17
  private resolveMediaType;
18
18
  validate(dto: any, files: Array<Express.Multer.File>): ValidationError[];
19
19
  private applyValidations;
20
+ private validateDangerousFiles;
20
21
  private validateMediaSingle;
21
22
  private validateMediaMultiple;
22
23
  transformForCreate(dto: any): any;
@@ -1 +1 @@
1
- {"version":3,"file":"MediaFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGnE,oBAAY,cAAc;IACtB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;CAClC;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CACxC;AA6DD,qBAAa,qBAAsB,YAAW,gBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAGvD,OAAO,CAAC,gBAAgB;IA4BxB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,EAAE;IAKxE,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,mBAAmB;IAiD3B,OAAO,CAAC,qBAAqB;IAW7B,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAKpC"}
1
+ {"version":3,"file":"MediaFieldCrudManager.d.ts","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGnE,oBAAY,cAAc;IACtB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;CAClC;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CACxC;AA6DD,qBAAa,qBAAsB,YAAW,gBAAgB;IAE9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAGvD,OAAO,CAAC,gBAAgB;IA2BxB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,EAAE;IAKxE,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,mBAAmB;IAiD3B,OAAO,CAAC,qBAAqB;IAW7B,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAKpC"}
@@ -56,15 +56,12 @@ class MediaFieldCrudManager {
56
56
  constructor(options) {
57
57
  this.options = options;
58
58
  }
59
- resolveMediaType(mimetype, filename) {
60
- const ext = (filename || '').split('.').pop()?.toLowerCase();
61
- if (ext && media_file_types_1.DANGEROUS_EXTENSIONS.has(ext)) {
62
- return null;
63
- }
64
- const mt = (mimetype || '').toLowerCase().trim();
65
- if (mt === 'image/svg+xml' || mt === 'text/html' || mt === 'application/xhtml+xml') {
59
+ resolveMediaType(file) {
60
+ if ((0, media_file_types_1.isDangerousMediaFile)(file)) {
66
61
  return null;
67
62
  }
63
+ const ext = (0, media_file_types_1.getLowercaseFileExtension)((0, media_file_types_1.getUploadedFileName)(file));
64
+ const mt = (file.mimetype || '').toLowerCase().trim();
68
65
  if (mt && MIME_TO_MEDIA_TYPE[mt]) {
69
66
  return MIME_TO_MEDIA_TYPE[mt];
70
67
  }
@@ -84,15 +81,25 @@ class MediaFieldCrudManager {
84
81
  return this.applyValidations(fieldFiles);
85
82
  }
86
83
  applyValidations(fieldFiles) {
84
+ const errors = this.validateDangerousFiles(fieldFiles);
87
85
  switch (this.options.type) {
88
86
  case SolidMediaType.mediaSingle:
89
- return this.validateMediaSingle(fieldFiles);
87
+ return [...errors, ...this.validateMediaSingle(fieldFiles)];
90
88
  case SolidMediaType.mediaMultiple:
91
- return this.validateMediaMultiple(fieldFiles);
89
+ return [...errors, ...this.validateMediaMultiple(fieldFiles)];
92
90
  default:
93
- return [];
91
+ return errors;
94
92
  }
95
93
  }
94
+ validateDangerousFiles(fieldFiles) {
95
+ return fieldFiles
96
+ .filter(fieldFile => (0, media_file_types_1.isDangerousMediaFile)(fieldFile))
97
+ .map(fieldFile => ({
98
+ field: this.options.fieldName,
99
+ error: `${this.options.fieldName} file type not allowed. ` +
100
+ `${(0, media_file_types_1.getUploadedFileName)(fieldFile) || 'File'} is a potentially dangerous file type.`
101
+ }));
102
+ }
96
103
  validateMediaSingle(fieldFiles) {
97
104
  const errors = [];
98
105
  if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {
@@ -123,7 +130,7 @@ class MediaFieldCrudManager {
123
130
  const allowedFileTypes = this.options.mediaTypes;
124
131
  for (let i = 0; i < fieldFiles.length; i++) {
125
132
  const fieldFile = fieldFiles[i];
126
- const resolvedType = this.resolveMediaType(fieldFile.mimetype, fieldFile.originalname ?? fieldFile.filename ?? '');
133
+ const resolvedType = this.resolveMediaType(fieldFile);
127
134
  if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {
128
135
  errors.push({
129
136
  field: this.options.fieldName,
@@ -1 +1 @@
1
- {"version":3,"file":"MediaFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldCrudManager, ValidationError } from \"src/interfaces\";\nimport { DANGEROUS_EXTENSIONS, EXT_TO_MEDIA_TYPE, MediaCategory } from \"src/constants/media-file-types\";\n\nexport enum SolidMediaType {\n mediaSingle = 'mediaSingle',\n mediaMultiple = 'mediaMultiple'\n}\n\nexport interface MediaFieldOptions {\n type: SolidMediaType;\n required: boolean | undefined | null;\n fieldName: string | undefined | null;\n mediaMaxSizeKb: number | undefined | null;\n mediaTypes: string[];\n isUpdate: boolean | undefined | null;\n}\n\ntype MediaType = MediaCategory;\n\nconst MIME_TO_MEDIA_TYPE: Record<string, MediaType> = {\n // Images\n 'image/png': 'image',\n 'image/jpeg': 'image',\n 'image/jpg': 'image',\n 'image/webp': 'image',\n 'image/gif': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/heic': 'image',\n 'image/heif': 'image',\n\n // Audio\n 'audio/mpeg': 'audio', // mp3\n 'audio/mp3': 'audio',\n 'audio/wav': 'audio',\n 'audio/x-wav': 'audio',\n 'audio/webm': 'audio',\n 'audio/ogg': 'audio',\n 'audio/aac': 'audio',\n 'audio/mp4': 'audio', // m4a often shows as audio/mp4\n 'audio/x-m4a': 'audio',\n 'audio/flac': 'audio',\n\n // Video\n 'video/mp4': 'video',\n 'video/mpeg': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video', // mov\n 'video/x-msvideo': 'video', // avi\n 'video/x-matroska': 'video',// mkv\n 'video/3gpp': 'video',\n 'video/3gpp2': 'video',\n\n // Documents / files (treat as \"file\")\n 'application/pdf': 'pdf',\n 'text/plain': 'file',\n 'text/markdown': 'file',\n 'application/json': 'file',\n 'text/csv': 'file',\n\n // Office\n 'application/msword': 'file', // doc\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file', // docx\n 'application/vnd.ms-excel': 'file', // xls\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file', // xlsx\n 'application/vnd.ms-powerpoint': 'file', // ppt\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file', // pptx,\n\n // Archives (optional)\n 'application/zip': 'file',\n 'application/x-zip-compressed': 'file',\n 'application/x-rar-compressed': 'file',\n 'application/x-7z-compressed': 'file',\n};\n\nexport class MediaFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: MediaFieldOptions) {\n }\n\n private resolveMediaType(mimetype?: string, filename?: string): MediaType | null {\n const ext = (filename || '').split('.').pop()?.toLowerCase();\n if (ext && DANGEROUS_EXTENSIONS.has(ext)) {\n return null;\n }\n\n const mt = (mimetype || '').toLowerCase().trim();\n if (mt === 'image/svg+xml' || mt === 'text/html' || mt === 'application/xhtml+xml') {\n return null;\n }\n if (mt && MIME_TO_MEDIA_TYPE[mt]) {\n return MIME_TO_MEDIA_TYPE[mt];\n }\n\n // Some libs may send \"image/*\" etc. Treat broad families safely.\n if (mt.startsWith('image/')) return 'image';\n if (mt.startsWith('audio/')) return 'audio';\n if (mt.startsWith('video/')) return 'video';\n\n // Fallback to extension if provided (also covers generic/unrecognized\n // mimetypes such as application/octet-stream).\n if (ext && EXT_TO_MEDIA_TYPE[ext]) {\n return EXT_TO_MEDIA_TYPE[ext];\n }\n\n return null;\n }\n\n validate(dto: any, files: Array<Express.Multer.File>): ValidationError[] {\n const fieldFiles = files.filter(file => file.fieldname === this.options.fieldName);\n return this.applyValidations(fieldFiles);\n }\n\n private applyValidations(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n switch (this.options.type) {\n case SolidMediaType.mediaSingle:\n return this.validateMediaSingle(fieldFiles);\n case SolidMediaType.mediaMultiple:\n return this.validateMediaMultiple(fieldFiles);\n default:\n return [];\n }\n }\n\n private validateMediaSingle(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n if (fieldFiles.length > 1) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} must be a single file`\n });\n }\n // validate size\n if (this.options.mediaMaxSizeKb) {\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n const fieldFileSizeInBytes = Math.ceil(fieldFile.size / 1024);\n if (fieldFileSizeInBytes > this.options.mediaMaxSizeKb) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`\n });\n }\n }\n }\n // validate type\n if (this.options.mediaTypes && this.options.mediaTypes.length > 0) {\n const allowedFileTypes = this.options.mediaTypes as MediaType[];\n\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n\n const resolvedType = this.resolveMediaType(fieldFile.mimetype, fieldFile.originalname ?? fieldFile.filename ?? '');\n if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `Allowed: ${allowedFileTypes.join(', ')}. ` +\n `Received mimetype: ${fieldFile.mimetype}${resolvedType ? ` (mapped to ${resolvedType})` : ''}`\n });\n }\n }\n }\n\n return errors;\n }\n\n private validateMediaMultiple(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n}\n"]}
1
+ {"version":3,"file":"MediaFieldCrudManager.js","sourceRoot":"","sources":["../../../src/helpers/field-crud-managers/MediaFieldCrudManager.ts"],"names":[],"mappings":";;;AACA,uEAAwJ;AAExJ,IAAY,cAGX;AAHD,WAAY,cAAc;IACtB,6CAA2B,CAAA;IAC3B,iDAA+B,CAAA;AACnC,CAAC,EAHW,cAAc,8BAAd,cAAc,QAGzB;AAaD,MAAM,kBAAkB,GAA8B;IAElD,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,OAAO;IAGrB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,OAAO;IACpB,aAAa,EAAE,OAAO;IACtB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,OAAO;IACpB,aAAa,EAAE,OAAO;IACtB,YAAY,EAAE,OAAO;IAGrB,WAAW,EAAE,OAAO;IACpB,YAAY,EAAE,OAAO;IACrB,YAAY,EAAE,OAAO;IACrB,WAAW,EAAE,OAAO;IACpB,iBAAiB,EAAE,OAAO;IAC1B,iBAAiB,EAAE,OAAO;IAC1B,kBAAkB,EAAE,OAAO;IAC3B,YAAY,EAAE,OAAO;IACrB,aAAa,EAAE,OAAO;IAGtB,iBAAiB,EAAE,KAAK;IACxB,YAAY,EAAE,MAAM;IACpB,eAAe,EAAE,MAAM;IACvB,kBAAkB,EAAE,MAAM;IAC1B,UAAU,EAAE,MAAM;IAGlB,oBAAoB,EAAE,MAAM;IAC5B,yEAAyE,EAAE,MAAM;IACjF,0BAA0B,EAAE,MAAM;IAClC,mEAAmE,EAAE,MAAM;IAC3E,+BAA+B,EAAE,MAAM;IACvC,2EAA2E,EAAE,MAAM;IAGnF,iBAAiB,EAAE,MAAM;IACzB,8BAA8B,EAAE,MAAM;IACtC,8BAA8B,EAAE,MAAM;IACtC,6BAA6B,EAAE,MAAM;CACxC,CAAC;AAEF,MAAa,qBAAqB;IAE9B,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IACvD,CAAC;IAEO,gBAAgB,CAAC,IAAyB;QAG9C,IAAI,IAAA,uCAAoB,EAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,4CAAyB,EAAC,IAAA,sCAAmB,EAAC,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,EAAE,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,OAAO,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAGD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QAI5C,IAAI,GAAG,IAAI,oCAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,oCAAiB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,GAAQ,EAAE,KAAiC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEO,gBAAgB,CAAC,UAAsC;QAI3D,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAEvD,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,cAAc,CAAC,WAAW;gBAC3B,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;YAChE,KAAK,cAAc,CAAC,aAAa;gBAC7B,OAAO,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC;YAClE;gBACI,OAAO,MAAM,CAAC;QACtB,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,UAAsC;QACjE,OAAO,UAAU;aACZ,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAA,uCAAoB,EAAC,SAAS,CAAC,CAAC;aACpD,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,0BAA0B;gBACtD,GAAG,IAAA,sCAAmB,EAAC,SAAS,CAAC,IAAI,MAAM,wCAAwC;SAC1F,CAAC,CAAC,CAAC;IACZ,CAAC;IAEO,mBAAmB,CAAC,UAAsC;QAC9D,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;gBAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,cAAc;aACjD,CAAC,CAAC;QACP,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;gBAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,wBAAwB;aAC3D,CAAC,CAAC;QACP,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;gBAC9D,IAAI,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;oBACrD,MAAM,CAAC,IAAI,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;wBAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,cAAc,oBAAoB,iCAAiC,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK;qBACtI,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAyB,CAAC;YAEhE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACtD,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC5D,MAAM,CAAC,IAAI,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;wBAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,0BAA0B;4BACtD,YAAY,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;4BAC3C,sBAAsB,SAAS,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;qBACtG,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,qBAAqB,CAAC,UAAsC;QAChE,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;gBAC7B,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,cAAc;aACjD,CAAC,CAAC;QACP,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,kBAAkB,CAAC,GAAQ;QACvB,OAAO,GAAG,CAAC;IACf,CAAC;CAGJ;AAhID,sDAgIC","sourcesContent":["import { FieldCrudManager, ValidationError } from \"src/interfaces\";\nimport { EXT_TO_MEDIA_TYPE, getLowercaseFileExtension, getUploadedFileName, isDangerousMediaFile, MediaCategory } from \"src/constants/media-file-types\";\n\nexport enum SolidMediaType {\n mediaSingle = 'mediaSingle',\n mediaMultiple = 'mediaMultiple'\n}\n\nexport interface MediaFieldOptions {\n type: SolidMediaType;\n required: boolean | undefined | null;\n fieldName: string | undefined | null;\n mediaMaxSizeKb: number | undefined | null;\n mediaTypes: string[];\n isUpdate: boolean | undefined | null;\n}\n\ntype MediaType = MediaCategory;\n\nconst MIME_TO_MEDIA_TYPE: Record<string, MediaType> = {\n // Images\n 'image/png': 'image',\n 'image/jpeg': 'image',\n 'image/jpg': 'image',\n 'image/webp': 'image',\n 'image/gif': 'image',\n 'image/bmp': 'image',\n 'image/tiff': 'image',\n 'image/heic': 'image',\n 'image/heif': 'image',\n\n // Audio\n 'audio/mpeg': 'audio', // mp3\n 'audio/mp3': 'audio',\n 'audio/wav': 'audio',\n 'audio/x-wav': 'audio',\n 'audio/webm': 'audio',\n 'audio/ogg': 'audio',\n 'audio/aac': 'audio',\n 'audio/mp4': 'audio', // m4a often shows as audio/mp4\n 'audio/x-m4a': 'audio',\n 'audio/flac': 'audio',\n\n // Video\n 'video/mp4': 'video',\n 'video/mpeg': 'video',\n 'video/webm': 'video',\n 'video/ogg': 'video',\n 'video/quicktime': 'video', // mov\n 'video/x-msvideo': 'video', // avi\n 'video/x-matroska': 'video',// mkv\n 'video/3gpp': 'video',\n 'video/3gpp2': 'video',\n\n // Documents / files (treat as \"file\")\n 'application/pdf': 'pdf',\n 'text/plain': 'file',\n 'text/markdown': 'file',\n 'application/json': 'file',\n 'text/csv': 'file',\n\n // Office\n 'application/msword': 'file', // doc\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file', // docx\n 'application/vnd.ms-excel': 'file', // xls\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file', // xlsx\n 'application/vnd.ms-powerpoint': 'file', // ppt\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file', // pptx,\n\n // Archives (optional)\n 'application/zip': 'file',\n 'application/x-zip-compressed': 'file',\n 'application/x-rar-compressed': 'file',\n 'application/x-7z-compressed': 'file',\n};\n\nexport class MediaFieldCrudManager implements FieldCrudManager {\n\n constructor(private readonly options: MediaFieldOptions) {\n }\n\n private resolveMediaType(file: Express.Multer.File): MediaType | null {\n // Belt-and-braces: dangerous files are already rejected outright by\n // validateDangerousFiles, but never let one resolve to a usable category.\n if (isDangerousMediaFile(file)) {\n return null;\n }\n\n const ext = getLowercaseFileExtension(getUploadedFileName(file));\n const mt = (file.mimetype || '').toLowerCase().trim();\n if (mt && MIME_TO_MEDIA_TYPE[mt]) {\n return MIME_TO_MEDIA_TYPE[mt];\n }\n\n // Some libs may send \"image/*\" etc. Treat broad families safely.\n if (mt.startsWith('image/')) return 'image';\n if (mt.startsWith('audio/')) return 'audio';\n if (mt.startsWith('video/')) return 'video';\n\n // Fallback to extension if provided (also covers generic/unrecognized\n // mimetypes such as application/octet-stream).\n if (ext && EXT_TO_MEDIA_TYPE[ext]) {\n return EXT_TO_MEDIA_TYPE[ext];\n }\n\n return null;\n }\n\n validate(dto: any, files: Array<Express.Multer.File>): ValidationError[] {\n const fieldFiles = files.filter(file => file.fieldname === this.options.fieldName);\n return this.applyValidations(fieldFiles);\n }\n\n private applyValidations(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n // Runs for every media field type and regardless of the admin-configured mediaTypes\n // allowlist - a dangerous upload is never acceptable, so this must not sit behind\n // the optional type checks below.\n const errors = this.validateDangerousFiles(fieldFiles);\n\n switch (this.options.type) {\n case SolidMediaType.mediaSingle:\n return [...errors, ...this.validateMediaSingle(fieldFiles)];\n case SolidMediaType.mediaMultiple:\n return [...errors, ...this.validateMediaMultiple(fieldFiles)];\n default:\n return errors;\n }\n }\n\n private validateDangerousFiles(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n return fieldFiles\n .filter(fieldFile => isDangerousMediaFile(fieldFile))\n .map(fieldFile => ({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `${getUploadedFileName(fieldFile) || 'File'} is a potentially dangerous file type.`\n }));\n }\n\n private validateMediaSingle(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n if (fieldFiles.length > 1) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} must be a single file`\n });\n }\n // validate size\n if (this.options.mediaMaxSizeKb) {\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n const fieldFileSizeInBytes = Math.ceil(fieldFile.size / 1024);\n if (fieldFileSizeInBytes > this.options.mediaMaxSizeKb) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} with size ${fieldFileSizeInBytes} KB exceeds max size limit of ${this.options.mediaMaxSizeKb} KB`\n });\n }\n }\n }\n // validate type\n if (this.options.mediaTypes && this.options.mediaTypes.length > 0) {\n const allowedFileTypes = this.options.mediaTypes as MediaType[];\n\n for (let i = 0; i < fieldFiles.length; i++) {\n const fieldFile = fieldFiles[i];\n\n const resolvedType = this.resolveMediaType(fieldFile);\n if (!resolvedType || !allowedFileTypes.includes(resolvedType)) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} file type not allowed. ` +\n `Allowed: ${allowedFileTypes.join(', ')}. ` +\n `Received mimetype: ${fieldFile.mimetype}${resolvedType ? ` (mapped to ${resolvedType})` : ''}`\n });\n }\n }\n }\n\n return errors;\n }\n\n private validateMediaMultiple(fieldFiles: Array<Express.Multer.File>): ValidationError[] {\n const errors: ValidationError[] = [];\n if (!this.options.isUpdate && this.options.required && fieldFiles.length === 0) {\n errors.push({\n field: this.options.fieldName,\n error: `${this.options.fieldName} is required`\n });\n }\n return errors;\n }\n\n transformForCreate(dto: any): any {\n return dto;\n }\n\n // Validation to be applied\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { Response } from "express";
2
+ export interface FileDownloadHeaderOptions {
3
+ fileName: string;
4
+ mimeType: string;
5
+ disposition?: "inline" | "attachment";
6
+ crossOriginResourcePolicy?: boolean;
7
+ }
8
+ export declare function setFileDownloadHeaders(res: Response, options: FileDownloadHeaderOptions): void;
9
+ //# sourceMappingURL=file-download.helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-download.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/file-download.helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IAEtC,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC;AAMD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAe9F"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setFileDownloadHeaders = setFileDownloadHeaders;
4
+ function setFileDownloadHeaders(res, options) {
5
+ const disposition = options.disposition ?? "attachment";
6
+ res.setHeader("Content-Disposition", `${disposition}; filename="${options.fileName}"`);
7
+ res.setHeader("Content-Type", options.mimeType);
8
+ res.setHeader("Access-Control-Expose-Headers", "Content-Disposition, Content-Type");
9
+ res.setHeader("X-Content-Type-Options", "nosniff");
10
+ if (options.crossOriginResourcePolicy) {
11
+ res.setHeader("Cross-Origin-Resource-Policy", "cross-origin");
12
+ }
13
+ }
14
+ //# sourceMappingURL=file-download.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-download.helper.js","sourceRoot":"","sources":["../../src/helpers/file-download.helper.ts"],"names":[],"mappings":";;AAeA,wDAeC;AAfD,SAAgB,sBAAsB,CAAC,GAAa,EAAE,OAAkC;IACtF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;IAExD,GAAG,CAAC,SAAS,CAAC,qBAAqB,EAAE,GAAG,WAAW,eAAe,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,mCAAmC,CAAC,CAAC;IAKpF,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAC;IAEnD,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;QACtC,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;IAChE,CAAC;AACH,CAAC","sourcesContent":["import type { Response } from \"express\";\n\nexport interface FileDownloadHeaderOptions {\n fileName: string;\n mimeType: string;\n /** Defaults to 'attachment'; only pass 'inline' for types known safe to render. */\n disposition?: \"inline\" | \"attachment\";\n /** Opt in for assets loaded cross-origin by the UI (e.g. media served to :3000). */\n crossOriginResourcePolicy?: boolean;\n}\n\n/**\n * Single place that stamps the response headers for every streamed file download, so the\n * security headers can't be applied to one endpoint and forgotten on the next.\n */\nexport function setFileDownloadHeaders(res: Response, options: FileDownloadHeaderOptions): void {\n const disposition = options.disposition ?? \"attachment\";\n\n res.setHeader(\"Content-Disposition\", `${disposition}; filename=\"${options.fileName}\"`);\n res.setHeader(\"Content-Type\", options.mimeType);\n res.setHeader(\"Access-Control-Expose-Headers\", \"Content-Disposition, Content-Type\");\n\n // Prevent the browser from ever content-sniffing a served file into something more\n // dangerous than its declared Content-Type (e.g. rendering a mislabeled upload as HTML\n // and executing embedded script).\n res.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n\n if (options.crossOriginResourcePolicy) {\n res.setHeader(\"Cross-Origin-Resource-Policy\", \"cross-origin\");\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata-helper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBACa,0BAA0B;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAIzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAPtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;gBAGjD,QAAQ,EAAE,aAAa,EAIvB,iBAAiB,EAAE,uBAAuB;IAI/D,uBAAuB,CAAC,eAAe,GAAE,eAAsC,GAAG,GAAG,EAAE;IAmBvF,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,8BAA8B;IAoEtC,OAAO,CAAC,4CAA4C;IA2B9C,kBAAkB,CAAC,SAAS,EAAE,GAAG;CAwB1C"}
1
+ {"version":3,"file":"model-metadata-helper.service.d.ts","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,qBACa,0BAA0B;IAI/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAIzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAPtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;gBAGjD,QAAQ,EAAE,aAAa,EAIvB,iBAAiB,EAAE,uBAAuB;IAI/D,uBAAuB,CAAC,eAAe,GAAE,eAAsC,GAAG,GAAG,EAAE;IAmBvF,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,8BAA8B;IA8FtC,OAAO,CAAC,4CAA4C;IA+B9C,kBAAkB,CAAC,SAAS,EAAE,GAAG;CAwB1C"}
@@ -16,6 +16,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.ModelMetadataHelperService = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
18
  const lodash_1 = require("lodash");
19
+ const draft_publish_fields_1 = require("../constants/draft-publish-fields");
19
20
  const legacy_common_entity_with_existing_id_entity_1 = require("../entities/legacy-common.entity-with-existing-id.entity");
20
21
  const legacy_table_type_enum_1 = require("../enums/legacy-table-type.enum");
21
22
  const model_metadata_repository_1 = require("../repository/model-metadata.repository");
@@ -87,6 +88,32 @@ let ModelMetadataHelperService = ModelMetadataHelperService_1 = class ModelMetad
87
88
  isSystem: true,
88
89
  enableAuditTracking: true
89
90
  },
91
+ {
92
+ name: "isPublished",
93
+ displayName: "Is Published",
94
+ type: "boolean",
95
+ isSystem: true,
96
+ enableAuditTracking: true
97
+ },
98
+ {
99
+ name: "isLatest",
100
+ displayName: "Is Latest",
101
+ type: "boolean",
102
+ isSystem: true,
103
+ enableAuditTracking: true
104
+ },
105
+ {
106
+ name: "initialEntityVersionId",
107
+ displayName: "Initial Entity Version Id",
108
+ type: "int",
109
+ isSystem: true,
110
+ },
111
+ {
112
+ name: "publishedTracker",
113
+ displayName: "Published Tracker",
114
+ type: "shortText",
115
+ isSystem: true,
116
+ },
90
117
  {
91
118
  name: "localeName",
92
119
  displayName: "Locale",
@@ -116,7 +143,9 @@ let ModelMetadataHelperService = ModelMetadataHelperService_1 = class ModelMetad
116
143
  ];
117
144
  }
118
145
  getSystemFieldsMetadataMappingForLegacyTable(withId = true) {
119
- const systemFieldsMetadata = this.getSystemFieldsMetadataMapping();
146
+ const legacyExcludedFieldNames = draft_publish_fields_1.DRAFT_PUBLISH_VERSIONING_FIELD_NAMES;
147
+ const systemFieldsMetadata = this.getSystemFieldsMetadataMapping()
148
+ .filter(field => !legacyExcludedFieldNames.includes(field.name));
120
149
  if (!withId) {
121
150
  const index = systemFieldsMetadata.findIndex(field => field.name === 'id');
122
151
  if (index !== -1) {
@@ -1 +1 @@
1
- {"version":3,"file":"model-metadata-helper.service.js","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Return the system fields metadata for a model\n\nimport { forwardRef, Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { _ } from \"lodash\";\nimport { LEGACY_TABLE_FIELDS_PREFIX } from \"src/entities/legacy-common.entity-with-existing-id.entity\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { SolidRegistry } from \"./solid-registry\";\n\n@Injectable()\nexport class ModelMetadataHelperService {\n private readonly logger = new Logger(ModelMetadataHelperService.name);\n\n constructor(\n private readonly registry: SolidRegistry,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n ) {\n }\n\n getSystemFieldsMetadata(legacyTableType: LegacyTableType = LegacyTableType.NONE): any[] {\n let systemFieldsMetadata: any[];\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(true);\n }\n else if (legacyTableType === LegacyTableType.EXISTING_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(false);\n }\n else {\n systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n }\n\n this.checkWithRegistry(systemFieldsMetadata);\n\n return systemFieldsMetadata;\n }\n\n // TODO: Do an additional check and add a warning if the common entity keys and system field metadata keys don't match exactly\n // Ideally this should be reflection based code\n private checkWithRegistry(systemFieldsMetadata: ({ name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; isSystem: boolean; ormType?: undefined; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType: string; relationCoModelSingularName: string; relationCreateInverse: boolean; relationCascade: string; relationModelModuleName: string; })[]) {\n const commonEntityKeys = this.registry.getCommonEntityKeys();\n const systemFieldNames = systemFieldsMetadata.map(field => field.name);\n const missingKeys = commonEntityKeys.filter(key => !systemFieldNames.includes(key));\n if (missingKeys.length > 0) {\n this.logger.warn(`Missing system fields metadata for common entity keys: ${missingKeys.join(', ')}`);\n }\n }\n\n private getSystemFieldsMetadataMapping() {\n return [\n {\n name: \"id\",\n displayName: \"Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdAt\",\n displayName: \"Created At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"updatedAt\",\n displayName: \"Updated At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedAt\",\n displayName: \"Deleted At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedTracker\",\n displayName: \"Deleted Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"publishedAt\",\n displayName: \"Published At\",\n type: \"datetime\",\n isSystem: true,\n enableAuditTracking:true\n },\n {\n name: \"localeName\",\n displayName: \"Locale\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"defaultEntityLocaleId\",\n displayName: \"Default Entity Locale Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdBy\",\n displayName: \"Created By\",\n type: \"int\",\n isSystem: true,\n columnName: \"created_by_id\",\n },\n {\n name: \"updatedBy\",\n displayName: \"Updated By\",\n type: \"int\",\n isSystem: true,\n columnName: \"updated_by_id\",\n }\n ];\n }\n\n private getSystemFieldsMetadataMappingForLegacyTable(withId: boolean=true) {\n const systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n if (!withId) {\n // Remove the id field metadata\n const index = systemFieldsMetadata.findIndex(field => field.name === 'id');\n if (index !== -1) {\n systemFieldsMetadata.splice(index, 1);\n }\n }\n\n // For legacy table, system fields, remove the ormType atribute from the metadata\n // systemFieldsMetadata.forEach(field => {\n // delete field.ormType;\n // });\n\n // Except for createdBy and updatedBy fields, for which we need to keep the columnName as created_by_id and updated_by_id respectively,\n // we need to add a columnName attribute with legacy prefix concatenated with the kebab cased field name of the system field\n systemFieldsMetadata.forEach(field => {\n if (field.name === 'createdBy' || field.name === 'updatedBy') {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}_id`;\n } else {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}`;\n }\n });\n return systemFieldsMetadata;\n }\n\n async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields: any[] = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n}"]}
1
+ {"version":3,"file":"model-metadata-helper.service.js","sourceRoot":"","sources":["../../src/helpers/model-metadata-helper.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Return the system fields metadata for a model\n\nimport { forwardRef, Inject, Injectable, Logger } from \"@nestjs/common\";\nimport { _ } from \"lodash\";\nimport { DRAFT_PUBLISH_VERSIONING_FIELD_NAMES } from \"src/constants/draft-publish-fields\";\nimport { LEGACY_TABLE_FIELDS_PREFIX } from \"src/entities/legacy-common.entity-with-existing-id.entity\";\nimport { LegacyTableType } from \"src/enums/legacy-table-type.enum\";\nimport { ModelMetadataRepository } from \"src/repository/model-metadata.repository\";\nimport { SolidRegistry } from \"./solid-registry\";\n\n@Injectable()\nexport class ModelMetadataHelperService {\n private readonly logger = new Logger(ModelMetadataHelperService.name);\n\n constructor(\n private readonly registry: SolidRegistry,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n ) {\n }\n\n getSystemFieldsMetadata(legacyTableType: LegacyTableType = LegacyTableType.NONE): any[] {\n let systemFieldsMetadata: any[];\n if (legacyTableType === LegacyTableType.GENERATED_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(true);\n }\n else if (legacyTableType === LegacyTableType.EXISTING_ID) {\n systemFieldsMetadata = this.getSystemFieldsMetadataMappingForLegacyTable(false);\n }\n else {\n systemFieldsMetadata = this.getSystemFieldsMetadataMapping();\n }\n\n this.checkWithRegistry(systemFieldsMetadata);\n\n return systemFieldsMetadata;\n }\n\n // TODO: Do an additional check and add a warning if the common entity keys and system field metadata keys don't match exactly\n // Ideally this should be reflection based code\n private checkWithRegistry(systemFieldsMetadata: ({ name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; isSystem: boolean; ormType?: undefined; relationType?: undefined; relationCoModelSingularName?: undefined; relationCreateInverse?: undefined; relationCascade?: undefined; relationModelModuleName?: undefined; } | { name: string; displayName: string; type: string; ormType: string; isSystem: boolean; relationType: string; relationCoModelSingularName: string; relationCreateInverse: boolean; relationCascade: string; relationModelModuleName: string; })[]) {\n const commonEntityKeys = this.registry.getCommonEntityKeys();\n const systemFieldNames = systemFieldsMetadata.map(field => field.name);\n const missingKeys = commonEntityKeys.filter(key => !systemFieldNames.includes(key));\n if (missingKeys.length > 0) {\n this.logger.warn(`Missing system fields metadata for common entity keys: ${missingKeys.join(', ')}`);\n }\n }\n\n private getSystemFieldsMetadataMapping() {\n return [\n {\n name: \"id\",\n displayName: \"Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdAt\",\n displayName: \"Created At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"updatedAt\",\n displayName: \"Updated At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedAt\",\n displayName: \"Deleted At\",\n type: \"datetime\",\n isSystem: true,\n },\n {\n name: \"deletedTracker\",\n displayName: \"Deleted Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"publishedAt\",\n displayName: \"Published At\",\n type: \"datetime\",\n isSystem: true,\n enableAuditTracking:true\n },\n {\n name: \"isPublished\",\n displayName: \"Is Published\",\n type: \"boolean\",\n isSystem: true,\n enableAuditTracking: true\n },\n {\n name: \"isLatest\",\n displayName: \"Is Latest\",\n type: \"boolean\",\n isSystem: true,\n enableAuditTracking: true\n },\n {\n name: \"initialEntityVersionId\",\n displayName: \"Initial Entity Version Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"publishedTracker\",\n displayName: \"Published Tracker\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"localeName\",\n displayName: \"Locale\",\n type: \"shortText\",\n isSystem: true,\n },\n {\n name: \"defaultEntityLocaleId\",\n displayName: \"Default Entity Locale Id\",\n type: \"int\",\n isSystem: true,\n },\n {\n name: \"createdBy\",\n displayName: \"Created By\",\n type: \"int\",\n isSystem: true,\n columnName: \"created_by_id\",\n },\n {\n name: \"updatedBy\",\n displayName: \"Updated By\",\n type: \"int\",\n isSystem: true,\n columnName: \"updated_by_id\",\n }\n ];\n }\n\n private getSystemFieldsMetadataMappingForLegacyTable(withId: boolean=true) {\n // Legacy tables don't have the draft/publish versioning columns, so exclude\n // them from the legacy system fields metadata mapping.\n const legacyExcludedFieldNames: readonly string[] = DRAFT_PUBLISH_VERSIONING_FIELD_NAMES;\n const systemFieldsMetadata = this.getSystemFieldsMetadataMapping()\n .filter(field => !legacyExcludedFieldNames.includes(field.name));\n if (!withId) {\n // Remove the id field metadata\n const index = systemFieldsMetadata.findIndex(field => field.name === 'id');\n if (index !== -1) {\n systemFieldsMetadata.splice(index, 1);\n }\n }\n\n // For legacy table, system fields, remove the ormType atribute from the metadata\n // systemFieldsMetadata.forEach(field => {\n // delete field.ormType;\n // });\n\n // Except for createdBy and updatedBy fields, for which we need to keep the columnName as created_by_id and updated_by_id respectively,\n // we need to add a columnName attribute with legacy prefix concatenated with the kebab cased field name of the system field\n systemFieldsMetadata.forEach(field => {\n if (field.name === 'createdBy' || field.name === 'updatedBy') {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}_id`;\n } else {\n field['columnName'] = `${LEGACY_TABLE_FIELDS_PREFIX}_${_.snakeCase(field.name)}`;\n }\n });\n return systemFieldsMetadata;\n }\n\n async loadFieldHierarchy(modelName: any) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: modelName,\n },\n relations: {\n fields: true,\n parentModel: {\n fields: true,\n }\n }\n });\n const fields: any[] = [];\n if (model) {\n // Add the fields of the current model\n fields.push(...model.fields);\n\n // Add the fields of the parent model\n if (model.parentModel) {\n fields.push(...model.parentModel.fields);\n }\n }\n return fields;\n }\n}"]}
@@ -278,7 +278,7 @@ let SolidRegistry = SolidRegistry_1 = class SolidRegistry {
278
278
  return this.auditableModels.has(modelSingularName.toLowerCase());
279
279
  }
280
280
  getCommonEntityKeys() {
281
- return ['id', 'createdAt', 'updatedAt', 'deletedAt', 'createdBy', 'updatedBy', 'deletedTracker', 'localeName', 'defaultEntityLocaleId', 'publishedAt'];
281
+ return ['id', 'createdAt', 'updatedAt', 'deletedAt', 'createdBy', 'updatedBy', 'deletedTracker', 'localeName', 'defaultEntityLocaleId', 'publishedAt', 'isPublished', 'isLatest', 'initialEntityVersionId', 'publishedTracker'];
282
282
  }
283
283
  getAllSettingsProviderInstance() {
284
284
  const settingsProviders = this.getSettingsProviders();