@solidstarters/solid-core 1.2.200 → 1.2.201

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 (371) hide show
  1. package/dist/commands/fixtures/fixtures-setup.command.d.ts +15 -0
  2. package/dist/commands/fixtures/fixtures-setup.command.d.ts.map +1 -0
  3. package/dist/commands/fixtures/fixtures-setup.command.js +58 -0
  4. package/dist/commands/fixtures/fixtures-setup.command.js.map +1 -0
  5. package/dist/commands/fixtures/fixtures-tear-down.command.d.ts +16 -0
  6. package/dist/commands/fixtures/fixtures-tear-down.command.d.ts.map +1 -0
  7. package/dist/commands/fixtures/fixtures-tear-down.command.js +59 -0
  8. package/dist/commands/fixtures/fixtures-tear-down.command.js.map +1 -0
  9. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  10. package/dist/commands/refresh-model.command.js +4 -0
  11. package/dist/commands/refresh-model.command.js.map +1 -1
  12. package/dist/constants/error-messages.d.ts +2 -0
  13. package/dist/constants/error-messages.d.ts.map +1 -1
  14. package/dist/constants/error-messages.js +4 -0
  15. package/dist/constants/error-messages.js.map +1 -1
  16. package/dist/controllers/model-sequence.controller.d.ts +43 -0
  17. package/dist/controllers/model-sequence.controller.d.ts.map +1 -0
  18. package/dist/controllers/model-sequence.controller.js +179 -0
  19. package/dist/controllers/model-sequence.controller.js.map +1 -0
  20. package/dist/controllers/setting.controller.d.ts +1 -0
  21. package/dist/controllers/setting.controller.d.ts.map +1 -1
  22. package/dist/controllers/setting.controller.js +15 -0
  23. package/dist/controllers/setting.controller.js.map +1 -1
  24. package/dist/dtos/basic-filters.dto.d.ts +3 -1
  25. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  26. package/dist/dtos/basic-filters.dto.js +8 -2
  27. package/dist/dtos/basic-filters.dto.js.map +1 -1
  28. package/dist/dtos/basic-group-filters.dto.d.ts +6 -0
  29. package/dist/dtos/basic-group-filters.dto.d.ts.map +1 -0
  30. package/dist/dtos/basic-group-filters.dto.js +46 -0
  31. package/dist/dtos/basic-group-filters.dto.js.map +1 -0
  32. package/dist/dtos/create-field-metadata.dto.js +2 -2
  33. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  34. package/dist/dtos/create-model-sequence.dto.d.ts +14 -0
  35. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -0
  36. package/dist/dtos/create-model-sequence.dto.js +90 -0
  37. package/dist/dtos/create-model-sequence.dto.js.map +1 -0
  38. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  39. package/dist/dtos/create-role-metadata.dto.js +1 -0
  40. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  41. package/dist/dtos/get-mcp-url.dto.d.ts +5 -0
  42. package/dist/dtos/get-mcp-url.dto.d.ts.map +1 -0
  43. package/dist/dtos/get-mcp-url.dto.js +31 -0
  44. package/dist/dtos/get-mcp-url.dto.js.map +1 -0
  45. package/dist/dtos/resolve-s3-url.dto.d.ts +5 -5
  46. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
  47. package/dist/dtos/resolve-s3-url.dto.js +7 -7
  48. package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
  49. package/dist/dtos/update-model-sequence.dto.d.ts +15 -0
  50. package/dist/dtos/update-model-sequence.dto.d.ts.map +1 -0
  51. package/dist/dtos/update-model-sequence.dto.js +94 -0
  52. package/dist/dtos/update-model-sequence.dto.js.map +1 -0
  53. package/dist/entities/common.entity.d.ts.map +1 -1
  54. package/dist/entities/common.entity.js +1 -0
  55. package/dist/entities/common.entity.js.map +1 -1
  56. package/dist/entities/legacy-common.entity.d.ts.map +1 -1
  57. package/dist/entities/legacy-common.entity.js +1 -0
  58. package/dist/entities/legacy-common.entity.js.map +1 -1
  59. package/dist/entities/model-sequence.entity.d.ts +15 -0
  60. package/dist/entities/model-sequence.entity.d.ts.map +1 -0
  61. package/dist/entities/model-sequence.entity.js +67 -0
  62. package/dist/entities/model-sequence.entity.js.map +1 -0
  63. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts.map +1 -1
  64. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js +13 -2
  65. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  66. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +0 -1
  67. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  68. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +4 -9
  69. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  70. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +0 -1
  71. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts.map +1 -1
  72. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +7 -8
  73. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
  74. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +0 -1
  75. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  76. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +4 -9
  77. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  78. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  79. package/dist/helpers/model-metadata-helper.service.js +6 -2
  80. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  81. package/dist/helpers/module-metadata-helper.service.d.ts +1 -0
  82. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  83. package/dist/helpers/module-metadata-helper.service.js +9 -0
  84. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  85. package/dist/helpers/module.helper.d.ts +1 -0
  86. package/dist/helpers/module.helper.d.ts.map +1 -1
  87. package/dist/helpers/module.helper.js +29 -3
  88. package/dist/helpers/module.helper.js.map +1 -1
  89. package/dist/helpers/solid-registry.d.ts +11 -0
  90. package/dist/helpers/solid-registry.d.ts.map +1 -1
  91. package/dist/helpers/solid-registry.js.map +1 -1
  92. package/dist/index.d.ts +3 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +4 -2
  95. package/dist/index.js.map +1 -1
  96. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts +1 -0
  97. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
  98. package/dist/jobs/computed-field-evaluation-subscriber.service.js +16 -4
  99. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -1
  100. package/dist/repository/media.repository.d.ts.map +1 -1
  101. package/dist/repository/media.repository.js +4 -0
  102. package/dist/repository/media.repository.js.map +1 -1
  103. package/dist/repository/model-sequence.repository.d.ts +14 -0
  104. package/dist/repository/model-sequence.repository.d.ts.map +1 -0
  105. package/dist/repository/model-sequence.repository.js +103 -0
  106. package/dist/repository/model-sequence.repository.js.map +1 -0
  107. package/dist/seeders/module-metadata-seeder.service.d.ts +7 -12
  108. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  109. package/dist/seeders/module-metadata-seeder.service.js +64 -26
  110. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  111. package/dist/seeders/seed-data/solid-core-metadata.json +343 -27
  112. package/dist/seeders/system-fields-seeder.service.d.ts +1 -0
  113. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  114. package/dist/seeders/system-fields-seeder.service.js +11 -2
  115. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  116. package/dist/services/action-metadata.service.d.ts.map +1 -1
  117. package/dist/services/action-metadata.service.js +1 -0
  118. package/dist/services/action-metadata.service.js.map +1 -1
  119. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  120. package/dist/services/ai-interaction.service.js +1 -0
  121. package/dist/services/ai-interaction.service.js.map +1 -1
  122. package/dist/services/authentication.service.d.ts.map +1 -1
  123. package/dist/services/authentication.service.js +22 -14
  124. package/dist/services/authentication.service.js.map +1 -1
  125. package/dist/services/chatter-message-details.service.d.ts.map +1 -1
  126. package/dist/services/chatter-message-details.service.js +1 -0
  127. package/dist/services/chatter-message-details.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts.map +1 -1
  129. package/dist/services/chatter-message.service.js +7 -3
  130. package/dist/services/chatter-message.service.js.map +1 -1
  131. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  132. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
  133. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  134. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +15 -0
  135. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -0
  136. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +72 -0
  137. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -0
  138. package/dist/services/crud-helper.service.d.ts +23 -6
  139. package/dist/services/crud-helper.service.d.ts.map +1 -1
  140. package/dist/services/crud-helper.service.js +257 -45
  141. package/dist/services/crud-helper.service.js.map +1 -1
  142. package/dist/services/crud.service.d.ts +3 -1
  143. package/dist/services/crud.service.d.ts.map +1 -1
  144. package/dist/services/crud.service.js +53 -24
  145. package/dist/services/crud.service.js.map +1 -1
  146. package/dist/services/database/database-bootstrap.service.d.ts +12 -0
  147. package/dist/services/database/database-bootstrap.service.d.ts.map +1 -0
  148. package/dist/services/database/database-bootstrap.service.js +115 -0
  149. package/dist/services/database/database-bootstrap.service.js.map +1 -0
  150. package/dist/services/email-template.service.d.ts +7 -7
  151. package/dist/services/email-template.service.d.ts.map +1 -1
  152. package/dist/services/email-template.service.js +8 -7
  153. package/dist/services/email-template.service.js.map +1 -1
  154. package/dist/services/excel.service.d.ts +10 -0
  155. package/dist/services/excel.service.d.ts.map +1 -1
  156. package/dist/services/excel.service.js +100 -0
  157. package/dist/services/excel.service.js.map +1 -1
  158. package/dist/services/field-metadata.service.d.ts +4 -1
  159. package/dist/services/field-metadata.service.d.ts.map +1 -1
  160. package/dist/services/field-metadata.service.js +35 -30
  161. package/dist/services/field-metadata.service.js.map +1 -1
  162. package/dist/services/file.service.d.ts +1 -0
  163. package/dist/services/file.service.d.ts.map +1 -1
  164. package/dist/services/file.service.js +9 -0
  165. package/dist/services/file.service.js.map +1 -1
  166. package/dist/services/fixtures.service.d.ts +13 -0
  167. package/dist/services/fixtures.service.d.ts.map +1 -0
  168. package/dist/services/fixtures.service.js +95 -0
  169. package/dist/services/fixtures.service.js.map +1 -0
  170. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  171. package/dist/services/genai/ingest-metadata.service.js +1 -1
  172. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  173. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  174. package/dist/services/import-transaction-error-log.service.js +1 -0
  175. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  176. package/dist/services/import-transaction.service.d.ts.map +1 -1
  177. package/dist/services/import-transaction.service.js +7 -1
  178. package/dist/services/import-transaction.service.js.map +1 -1
  179. package/dist/services/list-of-values.service.d.ts +2 -2
  180. package/dist/services/list-of-values.service.d.ts.map +1 -1
  181. package/dist/services/list-of-values.service.js +2 -1
  182. package/dist/services/list-of-values.service.js.map +1 -1
  183. package/dist/services/locale.service.d.ts.map +1 -1
  184. package/dist/services/locale.service.js +1 -0
  185. package/dist/services/locale.service.js.map +1 -1
  186. package/dist/services/mail/smtp-email.service.js +0 -1
  187. package/dist/services/mail/smtp-email.service.js.map +1 -1
  188. package/dist/services/media.service.d.ts +3 -3
  189. package/dist/services/media.service.d.ts.map +1 -1
  190. package/dist/services/media.service.js +6 -4
  191. package/dist/services/media.service.js.map +1 -1
  192. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  193. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +17 -6
  194. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  195. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  196. package/dist/services/mediaStorageProviders/file-storage-provider.js +0 -13
  197. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  198. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  199. package/dist/services/menu-item-metadata.service.js +4 -0
  200. package/dist/services/menu-item-metadata.service.js.map +1 -1
  201. package/dist/services/model-metadata.service.d.ts.map +1 -1
  202. package/dist/services/model-metadata.service.js +2 -42
  203. package/dist/services/model-metadata.service.js.map +1 -1
  204. package/dist/services/model-sequence.service.d.ts +23 -0
  205. package/dist/services/model-sequence.service.d.ts.map +1 -0
  206. package/dist/services/model-sequence.service.js +55 -0
  207. package/dist/services/model-sequence.service.js.map +1 -0
  208. package/dist/services/module-metadata.service.d.ts +1 -0
  209. package/dist/services/module-metadata.service.d.ts.map +1 -1
  210. package/dist/services/module-metadata.service.js +35 -1
  211. package/dist/services/module-metadata.service.js.map +1 -1
  212. package/dist/services/permission-metadata.service.d.ts +5 -5
  213. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  214. package/dist/services/permission-metadata.service.js +6 -5
  215. package/dist/services/permission-metadata.service.js.map +1 -1
  216. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  217. package/dist/services/queues/database-subscriber.service.js +2 -1
  218. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  219. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  220. package/dist/services/queues/rabbitmq-subscriber.service.js +2 -2
  221. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  222. package/dist/services/role-metadata.service.d.ts.map +1 -1
  223. package/dist/services/role-metadata.service.js +1 -0
  224. package/dist/services/role-metadata.service.js.map +1 -1
  225. package/dist/services/scheduled-job.service.d.ts +6 -6
  226. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  227. package/dist/services/scheduled-job.service.js +8 -8
  228. package/dist/services/scheduled-job.service.js.map +1 -1
  229. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  230. package/dist/services/scheduled-jobs/scheduler.service.js +4 -0
  231. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  232. package/dist/services/security-rule.service.d.ts.map +1 -1
  233. package/dist/services/security-rule.service.js +1 -0
  234. package/dist/services/security-rule.service.js.map +1 -1
  235. package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts.map +1 -1
  236. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +4 -0
  237. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  238. package/dist/services/setting.service.d.ts +7 -5
  239. package/dist/services/setting.service.d.ts.map +1 -1
  240. package/dist/services/setting.service.js +26 -4
  241. package/dist/services/setting.service.js.map +1 -1
  242. package/dist/services/sms-template.service.d.ts +7 -7
  243. package/dist/services/sms-template.service.d.ts.map +1 -1
  244. package/dist/services/sms-template.service.js +8 -7
  245. package/dist/services/sms-template.service.js.map +1 -1
  246. package/dist/services/solid-introspect.service.d.ts +4 -13
  247. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  248. package/dist/services/solid-introspect.service.js +4 -22
  249. package/dist/services/solid-introspect.service.js.map +1 -1
  250. package/dist/services/solid-ts-morph.service.js +2 -2
  251. package/dist/services/solid-ts-morph.service.js.map +1 -1
  252. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  253. package/dist/services/user-activity-history.service.js +1 -0
  254. package/dist/services/user-activity-history.service.js.map +1 -1
  255. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  256. package/dist/services/user-view-metadata.service.js +3 -2
  257. package/dist/services/user-view-metadata.service.js.map +1 -1
  258. package/dist/services/user.service.d.ts.map +1 -1
  259. package/dist/services/user.service.js +1 -0
  260. package/dist/services/user.service.js.map +1 -1
  261. package/dist/services/view-metadata.service.d.ts +1 -1
  262. package/dist/services/view-metadata.service.d.ts.map +1 -1
  263. package/dist/services/view-metadata.service.js +3 -1
  264. package/dist/services/view-metadata.service.js.map +1 -1
  265. package/dist/solid-core-cli-db.module.d.ts.map +1 -1
  266. package/dist/solid-core-cli-db.module.js +5 -2
  267. package/dist/solid-core-cli-db.module.js.map +1 -1
  268. package/dist/solid-core.module.d.ts.map +1 -1
  269. package/dist/solid-core.module.js +18 -0
  270. package/dist/solid-core.module.js.map +1 -1
  271. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  272. package/dist/subscribers/audit.subscriber.js +5 -1
  273. package/dist/subscribers/audit.subscriber.js.map +1 -1
  274. package/dist/subscribers/computed-entity-field.subscriber.d.ts +4 -2
  275. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  276. package/dist/subscribers/computed-entity-field.subscriber.js +53 -12
  277. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  278. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +5 -0
  279. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -0
  280. package/dist/transformers/typeorm/local-date-time-transformer.js +26 -0
  281. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -0
  282. package/dist/tsconfig.tsbuildinfo +1 -1
  283. package/docs/grouping-enhancements.md +89 -0
  284. package/package.json +1 -1
  285. package/src/commands/fixtures/fixtures-setup.command.ts +44 -0
  286. package/src/commands/fixtures/fixtures-tear-down.command.ts +45 -0
  287. package/src/commands/refresh-model.command.ts +3 -1
  288. package/src/constants/error-messages.ts +7 -1
  289. package/src/controllers/model-sequence.controller.ts +93 -0
  290. package/src/controllers/setting.controller.ts +33 -21
  291. package/src/dtos/basic-filters.dto.ts +6 -1
  292. package/src/dtos/basic-group-filters.dto.ts +23 -0
  293. package/src/dtos/create-field-metadata.dto.ts +1 -1
  294. package/src/dtos/create-model-sequence.dto.ts +51 -0
  295. package/src/dtos/create-role-metadata.dto.ts +16 -3
  296. package/src/dtos/get-mcp-url.dto.ts +13 -0
  297. package/src/dtos/resolve-s3-url.dto.ts +9 -11
  298. package/src/dtos/update-model-sequence.dto.ts +53 -0
  299. package/src/entities/common.entity.ts +2 -2
  300. package/src/entities/legacy-common.entity.ts +2 -1
  301. package/src/entities/model-sequence.entity.ts +32 -0
  302. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +18 -5
  303. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +9 -9
  304. package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +16 -8
  305. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +9 -9
  306. package/src/helpers/model-metadata-helper.service.ts +6 -4
  307. package/src/helpers/module-metadata-helper.service.ts +18 -1
  308. package/src/helpers/module.helper.ts +40 -5
  309. package/src/helpers/solid-registry.ts +14 -0
  310. package/src/index.ts +3 -1
  311. package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
  312. package/src/repository/media.repository.ts +3 -2
  313. package/src/repository/model-sequence.repository.ts +97 -0
  314. package/src/seeders/module-metadata-seeder.service.ts +103 -29
  315. package/src/seeders/seed-data/solid-core-metadata.json +343 -27
  316. package/src/seeders/system-fields-seeder.service.ts +6 -2
  317. package/src/services/action-metadata.service.ts +3 -2
  318. package/src/services/ai-interaction.service.ts +2 -1
  319. package/src/services/authentication.service.ts +46 -14
  320. package/src/services/chatter-message-details.service.ts +2 -1
  321. package/src/services/chatter-message.service.ts +10 -4
  322. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +8 -7
  323. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +86 -0
  324. package/src/services/crud-helper.service.ts +287 -49
  325. package/src/services/crud.service.ts +83 -32
  326. package/src/services/database/database-bootstrap.service.ts +91 -0
  327. package/src/services/email-template.service.ts +11 -13
  328. package/src/services/excel.service.ts +146 -3
  329. package/src/services/field-metadata.service.ts +102 -55
  330. package/src/services/file.service.ts +9 -0
  331. package/src/services/fixtures.service.ts +108 -0
  332. package/src/services/genai/ingest-metadata.service.ts +4 -3
  333. package/src/services/import-transaction-error-log.service.ts +2 -1
  334. package/src/services/import-transaction.service.ts +8 -4
  335. package/src/services/list-of-values.service.ts +4 -4
  336. package/src/services/locale.service.ts +2 -1
  337. package/src/services/mail/smtp-email.service.ts +1 -1
  338. package/src/services/media.service.ts +10 -11
  339. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +22 -7
  340. package/src/services/mediaStorageProviders/file-storage-provider.ts +18 -13
  341. package/src/services/menu-item-metadata.service.ts +6 -2
  342. package/src/services/model-metadata.service.ts +50 -44
  343. package/src/services/model-sequence.service.ts +33 -0
  344. package/src/services/module-metadata.service.ts +49 -2
  345. package/src/services/permission-metadata.service.ts +8 -9
  346. package/src/services/queues/database-subscriber.service.ts +3 -1
  347. package/src/services/queues/rabbitmq-subscriber.service.ts +4 -2
  348. package/src/services/role-metadata.service.ts +1 -0
  349. package/src/services/scheduled-job.service.ts +9 -9
  350. package/src/services/scheduled-jobs/scheduler.service.ts +5 -0
  351. package/src/services/security-rule.service.ts +1 -0
  352. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +5 -2
  353. package/src/services/setting.service.ts +33 -6
  354. package/src/services/sms-template.service.ts +11 -13
  355. package/src/services/solid-introspect.service.ts +6 -19
  356. package/src/services/solid-ts-morph.service.ts +2 -2
  357. package/src/services/user-activity-history.service.ts +3 -2
  358. package/src/services/user-view-metadata.service.ts +4 -3
  359. package/src/services/user.service.ts +2 -1
  360. package/src/services/view-metadata.service.ts +5 -4
  361. package/src/solid-core-cli-db.module.ts +5 -4
  362. package/src/solid-core.module.ts +18 -0
  363. package/src/subscribers/audit.subscriber.ts +3 -2
  364. package/src/subscribers/computed-entity-field.subscriber.ts +60 -17
  365. package/src/transformers/typeorm/local-date-time-transformer.ts +30 -0
  366. /package/sql/{mssql → default/mssql}/proc_CleanupModelMetadata.sql +0 -0
  367. /package/sql/{mssql → default/mssql}/proc_CleanupModuleMetadata.sql +0 -0
  368. /package/sql/{mssql/scratchpad.sql → default/mssql/scratchpad.sql.txt} +0 -0
  369. /package/sql/{postgres → default/postgres}/proc_CleanupModelMetadata.sql +0 -0
  370. /package/sql/{postgres → default/postgres}/proc_CleanupModuleMetadata.sql +0 -0
  371. /package/sql/{postgres/scratchpad.sql → default/postgres/scratchpad.sql.txt} +0 -0
@@ -12,13 +12,15 @@ import { SelectionDynamicQueryDto } from '../dtos/selection-dynamic-query.dto';
12
12
  import { UpdateFieldMetaDataDto } from '../dtos/update-field-metadata.dto';
13
13
  import { FieldMetadata } from '../entities/field-metadata.entity';
14
14
  import { ModelMetadata } from '../entities/model-metadata.entity';
15
- import { ISelectionProviderValues } from '../interfaces';
15
+ import { ISelectionProviderValues, MediaStorageProvider } from '../interfaces';
16
16
  import { CrudHelperService } from './crud-helper.service';
17
17
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
18
18
  import qs from 'qs';
19
19
  import { ResolveS3UrlDto } from 'src/dtos/resolve-s3-url.dto';
20
+ import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
20
21
  import { ConfigService } from '@nestjs/config';
21
22
  import { FileService } from './file.service';
23
+ import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
22
24
 
23
25
 
24
26
  @Injectable()
@@ -27,6 +29,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
27
29
  private readonly fieldMetadataRepo: FieldMetadataRepository,
28
30
  private readonly configService: ConfigService,
29
31
  private readonly fileService: FileService,
32
+ private readonly mediaStorageProviderMetadataRepository: MediaStorageProviderMetadataRepository,
30
33
 
31
34
  @InjectDataSource()
32
35
  private readonly dataSource: DataSource,
@@ -60,6 +63,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
60
63
  computedFieldTriggerConfig: field.computedFieldTriggerConfig ?? [], // Ensure it's an array, default to empty if not provided
61
64
  computedFieldValueProviderName: field.computedFieldValueProvider,
62
65
  computedFieldValueProviderCtxt: field.computedFieldValueProviderCtxt ? JSON.parse(field.computedFieldValueProviderCtxt) : {}, // Parse the context if it exists, default to empty object
66
+ eventContext: {}
63
67
  };
64
68
  });
65
69
 
@@ -776,7 +780,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
776
780
  "encrypt",
777
781
  "encryptionType",
778
782
  "decryptWhen",
779
- "columnName"
783
+ "columnName",
784
+ "enableAuditTracking"
780
785
  ];
781
786
 
782
787
  case SolidFieldType.richText:
@@ -1081,7 +1086,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
1081
1086
  "encryptionType",
1082
1087
  "decryptWhen",
1083
1088
  "columnName",
1084
- "isUserKey"
1089
+ "isUserKey",
1090
+ "enableAuditTracking"
1085
1091
  ];
1086
1092
 
1087
1093
  case SolidFieldType.uuid:
@@ -1280,76 +1286,117 @@ export class FieldMetadataService implements OnApplicationBootstrap {
1280
1286
  return fieldObject;
1281
1287
  }
1282
1288
 
1283
- async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
1289
+ // async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
1284
1290
 
1285
- const { modelName, fieldName, fieldValue, s3KeyFieldName } = resolveS3UrlDto;
1291
+ // const { modelName, fieldName, fieldValue, s3KeyFieldName } = resolveS3UrlDto;
1286
1292
 
1287
- // ------------------------------------------------
1288
- // 1. Load model metadata
1289
- // ------------------------------------------------
1290
- const modelRepo = this.dataSource.getRepository(ModelMetadata);
1291
- const model = await modelRepo.findOne({
1292
- where: { singularName: modelName },
1293
- relations: ['fields']
1294
- });
1293
+ // // ------------------------------------------------
1294
+ // // 1. Load model metadata
1295
+ // // ------------------------------------------------
1296
+ // const modelRepo = this.dataSource.getRepository(ModelMetadata);
1297
+ // const model = await modelRepo.findOne({
1298
+ // where: { singularName: modelName },
1299
+ // relations: ['fields']
1300
+ // });
1295
1301
 
1296
- if (!model) {
1297
- throw new NotFoundException(`Model ${modelName} not found`);
1298
- }
1302
+ // if (!model) {
1303
+ // throw new NotFoundException(`Model ${modelName} not found`);
1304
+ // }
1299
1305
 
1300
- // ------------------------------------------------
1301
- // 2. Validate the field we are filtering by
1302
- // ------------------------------------------------
1303
- const filterFieldMeta = model.fields.find(f => f.name === fieldName);
1304
- if (!filterFieldMeta) {
1305
- throw new NotFoundException(
1306
- `Field ${fieldName} not found in model ${modelName}`
1307
- );
1308
- }
1306
+ // // ------------------------------------------------
1307
+ // // 2. Validate the field we are filtering by
1308
+ // // ------------------------------------------------
1309
+ // const filterFieldMeta = model.fields.find(f => f.name === fieldName);
1310
+ // if (!filterFieldMeta) {
1311
+ // throw new NotFoundException(
1312
+ // `Field ${fieldName} not found in model ${modelName}`
1313
+ // );
1314
+ // }
1309
1315
 
1310
- // ------------------------------------------------
1311
- // 3. Load the actual entity repository
1312
- // ------------------------------------------------
1313
- const entityRepo = this.dataSource.getRepository(model.singularName);
1316
+ // // ------------------------------------------------
1317
+ // // 3. Load the actual entity repository
1318
+ // // ------------------------------------------------
1319
+ // const entityRepo = this.dataSource.getRepository(model.singularName);
1314
1320
 
1315
- // ------------------------------------------------
1316
- // 4. Query using fieldName = fieldValue
1317
- // ------------------------------------------------
1318
- const record = await entityRepo.findOne({
1319
- where: { [fieldName]: fieldValue }
1320
- });
1321
+ // // ------------------------------------------------
1322
+ // // 4. Query using fieldName = fieldValue
1323
+ // // ------------------------------------------------
1324
+ // const record = await entityRepo.findOne({
1325
+ // where: { [fieldName]: fieldValue }
1326
+ // });
1321
1327
 
1322
- if (!record) {
1323
- throw new NotFoundException(
1324
- `${modelName} record not found for ${fieldName}="${fieldValue}"`
1325
- );
1326
- }
1328
+ // if (!record) {
1329
+ // throw new NotFoundException(
1330
+ // `${modelName} record not found for ${fieldName}="${fieldValue}"`
1331
+ // );
1332
+ // }
1327
1333
 
1328
- // ------------------------------------------------
1329
- // 5. Extract S3 key from s3KeyFieldName
1330
- // ------------------------------------------------
1331
- const s3Key = record[s3KeyFieldName];
1334
+ // // ------------------------------------------------
1335
+ // // 5. Extract S3 key from s3KeyFieldName
1336
+ // // ------------------------------------------------
1337
+ // const s3Key = record[s3KeyFieldName];
1332
1338
 
1333
- if (!s3Key) {
1334
- throw new NotFoundException(
1335
- `Field "${s3KeyFieldName}" has no value in ${modelName}.${fieldName}="${fieldValue}"`
1336
- );
1337
- }
1339
+ // if (!s3Key) {
1340
+ // throw new NotFoundException(
1341
+ // `Field "${s3KeyFieldName}" has no value in ${modelName}.${fieldName}="${fieldValue}"`
1342
+ // );
1343
+ // }
1344
+
1345
+ // // ------------------------------------------------
1346
+ // // 6. Generate signed or public URL
1347
+ // // ------------------------------------------------
1348
+ // let url = "";
1349
+
1350
+ // // TODO - get
1351
+ // if (resolveS3UrlDto.isPrivate == "true") {
1352
+ // const expiryInSeconds = 60 * 60;
1353
+ // url = await this.fileService.getSignedUrl(s3Key, expiryInSeconds, resolveS3UrlDto.bucketName);
1354
+ // } else {
1355
+ // url = `https://${resolveS3UrlDto.bucketName}.s3.${this.configService.get('S3_AWS_REGION_NAME')}.amazonaws.com/${s3Key}`;
1356
+ // }
1357
+ // return { url: url }
1358
+ // }
1338
1359
 
1339
- // ------------------------------------------------
1340
- // 6. Generate signed or public URL
1341
- // ------------------------------------------------
1360
+ async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
1342
1361
  let url = "";
1362
+ const normalizedKey = this.normalizeS3Key(resolveS3UrlDto.s3Key);
1343
1363
 
1344
- // TODO - get
1364
+ let resolvedBucketName = resolveS3UrlDto.bucketName;
1365
+ if (resolveS3UrlDto.mediaStorageProviderUserKey) {
1366
+ const mediaStorageProvider = await this.mediaStorageProviderMetadataRepository.findOne({
1367
+ where: {
1368
+ name: resolveS3UrlDto.mediaStorageProviderUserKey
1369
+ }
1370
+ });
1371
+ if (!mediaStorageProvider) {
1372
+ throw new NotFoundException(`MediaStorageProviderMetadata with user key ${resolveS3UrlDto.mediaStorageProviderUserKey} not found`);
1373
+ }
1374
+ resolvedBucketName = mediaStorageProvider.bucketName;
1375
+ }
1376
+ this.logger.debug(`INSIDE::resolveS3Url:: resolvedBucketName: ${resolvedBucketName}`)
1377
+
1345
1378
  if (resolveS3UrlDto.isPrivate == "true") {
1346
1379
  const expiryInSeconds = 60 * 60;
1347
- url = await this.fileService.getSignedUrl(s3Key, expiryInSeconds, resolveS3UrlDto.bucketName);
1380
+ url = await this.fileService.getSignedUrl(normalizedKey, expiryInSeconds, resolvedBucketName);
1348
1381
  } else {
1349
- url = `https://${resolveS3UrlDto.bucketName}.s3.${this.configService.get('S3_AWS_REGION_NAME')}.amazonaws.com/${s3Key}`;
1382
+ url = `https://${resolvedBucketName}.s3.${this.configService.get(
1383
+ 'S3_AWS_REGION_NAME',
1384
+ )}.amazonaws.com/${normalizedKey}`;
1350
1385
  }
1351
1386
  return { url: url }
1352
1387
  }
1388
+
1389
+ private normalizeS3Key(input: string): string {
1390
+ try {
1391
+ const url = new URL(input);
1392
+
1393
+ // remove leading slash from pathname
1394
+ return decodeURIComponent(url.pathname.replace(/^\/+/, ""));
1395
+ } catch {
1396
+ // not a valid URL → treat as raw S3 key
1397
+ return input;
1398
+ }
1399
+ }
1353
1400
  }
1354
1401
 
1355
1402
 
@@ -175,6 +175,15 @@ export class FileService {
175
175
  }
176
176
  }
177
177
 
178
+ public async pathExists(targetPath: string): Promise<boolean> {
179
+ try {
180
+ await fs.promises.access(targetPath, fs.constants.F_OK);
181
+ return true;
182
+ } catch {
183
+ return false;
184
+ }
185
+ }
186
+
178
187
  public async getSignedUrl(key: string, expiresIn: number, bucketName: string): Promise<string> {
179
188
  const command = new GetObjectCommand({
180
189
  Bucket: bucketName,
@@ -0,0 +1,108 @@
1
+ import { Injectable, Logger } from "@nestjs/common";
2
+ import { SolidIntrospectService } from "./solid-introspect.service";
3
+ import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
4
+ import { classify } from "@angular-devkit/core/src/utils/strings";
5
+
6
+ interface ScenarioFixture {
7
+ name: string;
8
+ models: {
9
+ singularName: string;
10
+ data: any;
11
+ }[];
12
+ }
13
+
14
+ // This service can contain common logic for fixtures setup and tear down
15
+ @Injectable()
16
+ export class FixturesService {
17
+ private readonly logger = new Logger(this.constructor.name);
18
+
19
+ constructor(
20
+ private readonly introspectService: SolidIntrospectService,
21
+ private readonly moduleMetadataHelper: ModuleMetadataHelperService,
22
+ ) { }
23
+
24
+ async setupFixtures(moduleName: string, scenarioName: string) {
25
+ const scenarioFixture = await this.loadScenario(moduleName, scenarioName);
26
+ if (!scenarioFixture?.models || scenarioFixture.models.length === 0) {
27
+ this.logger.warn(`No models found to setup for scenario: ${scenarioName} in module: ${moduleName}`);
28
+ return;
29
+ }
30
+
31
+ // For each model in the fixtures, use introspectService to get model service
32
+ for (const modelFixture of scenarioFixture.models) {
33
+ const modelServiceInstance = await this.loadModelService(modelFixture.singularName);
34
+ try {
35
+ // Create the model instance in the database
36
+ const createdInstance = await modelServiceInstance.create(modelFixture.data);
37
+ this.logger.log(`Successfully created fixture for model: ${modelFixture.singularName} with ID: ${createdInstance.id}`);
38
+ } catch (error) {
39
+ this.logger.error(`Error creating fixture for model: ${modelFixture.singularName} - ${error.message}`);
40
+ }
41
+ }
42
+ }
43
+
44
+ async tearDownFixtures(moduleName: string, scenarioName: string) {
45
+ // Call delete on the modelService to remove the created fixtures, in reverse order
46
+ const scenarioFixture = await this.loadScenario(moduleName, scenarioName);
47
+ if (!scenarioFixture?.models || scenarioFixture.models.length === 0) {
48
+ this.logger.warn(`No models found to tear down for scenario: ${scenarioName} in module: ${moduleName}`);
49
+ return;
50
+ }
51
+
52
+ // For each model in reverse order
53
+ for (const modelFixture of scenarioFixture.models.reverse()) {
54
+ const modelServiceInstance = await this.loadModelService(modelFixture.singularName);
55
+
56
+ // Get the user key field for the model to identify the created instances
57
+ try {
58
+ // Assuming we have some way to identify the created instances, e.g., by a unique field in data
59
+ const deleteCriteria = modelFixture.data; // This should be adjusted based on actual criteria
60
+ await modelServiceInstance.delete(deleteCriteria);
61
+ this.logger.log(`Successfully deleted fixture for model: ${modelFixture.singularName}`);
62
+ } catch (error) {
63
+ this.logger.error(`Error deleting fixture for model: ${modelFixture.singularName} - ${error.message}`);
64
+ }
65
+ }
66
+
67
+ }
68
+
69
+ private async loadScenario(moduleName: string, scenarioName: string): Promise<ScenarioFixture | undefined> {
70
+ // Read the module metadata file based on module name
71
+ const moduleMetadataConfiguration = await this.moduleMetadataHelper.getModuleMetadataConfiguration(
72
+ await this.moduleMetadataHelper.getModuleMetadataFilePath(moduleName)
73
+ );
74
+ if (!moduleMetadataConfiguration) {
75
+ this.logger.error(`No module metadata configuration found for module: ${moduleName}`);
76
+ return;
77
+ }
78
+ this.logger.debug(`Module Metadata Configuration loaded for module: ${moduleName}`);
79
+
80
+ // Read the fixtures json from above file
81
+ const allFixtures = moduleMetadataConfiguration?.fixtures;
82
+ this.logger.debug(`All Fixtures: ${JSON.stringify(allFixtures)}`);
83
+ // Check if scenarios exists
84
+ if (!allFixtures?.scenarios.length || allFixtures?.scenarios.length === 0) {
85
+ this.logger.error(`No scenarios defined in the module metadata configuration for module: ${moduleName}`);
86
+ return;
87
+ }
88
+
89
+ // Find the fixtures for the given scenario
90
+ const scenarioFixture = allFixtures.scenarios.find((scenario: ScenarioFixture) => scenario.name === scenarioName);
91
+ if (!scenarioFixture) {
92
+ this.logger.error(`Scenario: ${scenarioName} not found in module metadata configuration for module: ${moduleName}`);
93
+ return;
94
+ }
95
+ this.logger.log(`Scenario: ${scenarioName} found with fixtures to setup.`);
96
+ return scenarioFixture;
97
+ }
98
+
99
+ private async loadModelService(singularName: string): Promise<any> {
100
+ const modelServiceProvider = this.introspectService.getProvider(`${classify(singularName)}Service`);
101
+ if (!modelServiceProvider) {
102
+ this.logger.error(`Model service provider not found for model: ${singularName}`);
103
+ return null;
104
+ }
105
+ this.logger.debug(`Model service provider found for model: ${singularName}`);
106
+ return modelServiceProvider.instance;
107
+ }
108
+ }
@@ -3,10 +3,10 @@ import * as crypto from 'crypto';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
 
6
- import { getDynamicModuleNames } from 'src/helpers/module.helper';
6
+ import { getDynamicModuleNames, getDynamicModuleNamesBasedOnMetadata } from 'src/helpers/module.helper';
7
7
  import { CreateModuleMetadataDto } from 'src/dtos/create-module-metadata.dto';
8
8
  import { R2RHelperService } from './r2r-helper.service';
9
- import { CollectionResponse, r2rClient } from 'r2r-js';
9
+ import { r2rClient } from 'r2r-js';
10
10
  import { CreateModelMetadataDto } from 'src/dtos/create-model-metadata.dto';
11
11
  import { CreateFieldMetadataDto } from 'src/dtos/create-field-metadata.dto';
12
12
 
@@ -90,7 +90,8 @@ export class IngestMetadataService {
90
90
 
91
91
  // const allModuleMetadataJson = [];
92
92
  this.logger.debug(`getting dynamics modules`);
93
- const enabledModules = getDynamicModuleNames();
93
+ // const enabledModules = getDynamicModuleNames();
94
+ const enabledModules = getDynamicModuleNamesBasedOnMetadata();
94
95
  this.logger.log(`ingesting metadata`);
95
96
 
96
97
  for (let i = 0; i < enabledModules.length; i++) {
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
3
3
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
4
4
  import { EntityManager, Repository } from 'typeorm';
@@ -17,6 +17,7 @@ import { ImportTransactionErrorLogRepository } from 'src/repository/import-trans
17
17
  @Injectable()
18
18
  export class ImportTransactionErrorLogService extends CRUDService<ImportTransactionErrorLog>{
19
19
  constructor(
20
+ @Inject(forwardRef(() => ModelMetadataService))
20
21
  readonly modelMetadataService: ModelMetadataService,
21
22
  readonly moduleMetadataService: ModuleMetadataService,
22
23
  readonly configService: ConfigService,
@@ -1,4 +1,4 @@
1
- import { BadRequestException, ForbiddenException, Injectable, Logger } from '@nestjs/common';
1
+ import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
2
2
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
3
  import { InjectEntityManager } from '@nestjs/typeorm';
4
4
  import { EntityManager } from 'typeorm';
@@ -94,6 +94,7 @@ interface ImportRecordsResult {
94
94
  @Injectable()
95
95
  export class ImportTransactionService extends CRUDService<ImportTransaction> {
96
96
  constructor(
97
+ @Inject(forwardRef(() => ModelMetadataService))
97
98
  readonly modelMetadataService: ModelMetadataService,
98
99
  readonly moduleMetadataService: ModuleMetadataService,
99
100
  readonly configService: ConfigService,
@@ -305,9 +306,12 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
305
306
  : userPermissions[permissionKey] === true;
306
307
 
307
308
  if (!hasPermission) {
308
- throw new ForbiddenException(
309
- `Missing permission: ${permissionKey}`
310
- );
309
+ const action = permissionKey.split('.').pop()!;
310
+ const message = ERROR_MESSAGES.PERMISSION_MESSAGES[action]?.(modelName) ?? 'You are not allowed to perform this action.';
311
+ throw new ForbiddenException({
312
+ message,
313
+ errorCode: 'permission-denied',
314
+ });
311
315
  }
312
316
 
313
317
  // Get the import file media object from the import transaction
@@ -1,4 +1,4 @@
1
- import { Injectable } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable } from '@nestjs/common';
2
2
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
3
  import { InjectEntityManager } from '@nestjs/typeorm';
4
4
  import { EntityManager } from 'typeorm';
@@ -12,11 +12,10 @@ import { ModuleMetadataService } from 'src/services/module-metadata.service';
12
12
 
13
13
 
14
14
  import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
15
- import { ListOfValuesRepository } from 'src/repository/list-of-values.repository';
16
- import { ListOfValues } from '../entities/list-of-values.entity';
17
- import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
18
15
  import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
19
16
  import { ListOfValuesMapper } from 'src/mappers/list-of-values-mapper';
17
+ import { ListOfValuesRepository } from 'src/repository/list-of-values.repository';
18
+ import { ListOfValues } from '../entities/list-of-values.entity';
20
19
 
21
20
 
22
21
  @Injectable()
@@ -25,6 +24,7 @@ export class ListOfValuesService extends CRUDService<ListOfValues> {
25
24
  // moduleMetadataHelperService: any;
26
25
  // listOfValuesMapper: any;
27
26
  constructor(
27
+ @Inject(forwardRef(() => ModelMetadataService))
28
28
  readonly modelMetadataService: ModelMetadataService,
29
29
  readonly moduleMetadataService: ModuleMetadataService,
30
30
  readonly configService: ConfigService,
@@ -1,4 +1,4 @@
1
- import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
2
2
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
3
  import { InjectEntityManager } from '@nestjs/typeorm';
4
4
  import { EntityManager } from 'typeorm';
@@ -16,6 +16,7 @@ import { RequestContextService } from './request-context.service';
16
16
  @Injectable()
17
17
  export class LocaleService extends CRUDService<Locale> implements OnApplicationBootstrap{
18
18
  constructor(
19
+ @Inject(forwardRef(() => ModelMetadataService))
19
20
  readonly modelMetadataService: ModelMetadataService,
20
21
  readonly moduleMetadataService: ModuleMetadataService,
21
22
  readonly configService: ConfigService,
@@ -153,7 +153,7 @@ export class SMTPEMailService implements IMail {
153
153
  attachments: attachmentsList,
154
154
  });
155
155
  // this.logger.debug(`Sending email to ${to} with subject ${subject} and body ${body}`);
156
- this.logger.debug(`Sending email to ${to} with subject ${subject}`);
156
+ // this.logger.debug(`Sending email to ${to} with subject ${subject}`);
157
157
 
158
158
  return r;
159
159
  }
@@ -1,7 +1,7 @@
1
- import { Injectable, NotFoundException } from '@nestjs/common';
1
+ import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
2
2
  import { DiscoveryService, ModuleRef } from "@nestjs/core";
3
- import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
4
- import { EntityManager, Repository } from 'typeorm';
3
+ import { InjectEntityManager } from '@nestjs/typeorm';
4
+ import { EntityManager, In } from 'typeorm';
5
5
 
6
6
  import { ConfigService } from '@nestjs/config';
7
7
  import { CrudHelperService } from 'src/services/crud-helper.service';
@@ -11,23 +11,21 @@ import { ModelMetadataService } from 'src/services/model-metadata.service';
11
11
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
12
12
 
13
13
 
14
+ import { ERROR_MESSAGES } from 'src/constants/error-messages';
15
+ import { BasicFilterDto } from 'src/dtos/basic-filters.dto';
14
16
  import { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';
15
- import { FieldMetadata } from 'src/entities/field-metadata.entity';
16
- import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
17
17
  import { Media } from 'src/entities/media.entity';
18
- import { ModelMetadata } from 'src/entities/model-metadata.entity';
19
- import { getMediaStorageProvider } from "./mediaStorageProviders";
20
- import { BasicFilterDto } from 'src/dtos/basic-filters.dto';
21
- import { ERROR_MESSAGES } from 'src/constants/error-messages';
18
+ import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
19
+ import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
22
20
  import { MediaRepository } from 'src/repository/media.repository';
23
21
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
24
- import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
25
- import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
22
+ import { getMediaStorageProvider } from "./mediaStorageProviders";
26
23
 
27
24
 
28
25
  @Injectable()
29
26
  export class MediaService extends CRUDService<Media> {
30
27
  constructor(
28
+ @Inject(forwardRef(() => ModelMetadataService))
31
29
  readonly modelMetadataService: ModelMetadataService,
32
30
  readonly moduleMetadataService: ModuleMetadataService,
33
31
  readonly configService: ConfigService,
@@ -45,6 +43,7 @@ export class MediaService extends CRUDService<Media> {
45
43
  // private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,
46
44
  // @InjectRepository(FieldMetadata)
47
45
  // private readonly fieldMetadataRepo: Repository<FieldMetadata>,
46
+ @Inject(forwardRef(() => ModelMetadataRepository))
48
47
  private readonly modelMetadataRepo: ModelMetadataRepository,
49
48
  private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,
50
49
  private readonly fieldMetadataRepo: FieldMetadataRepository,
@@ -2,6 +2,8 @@ import { Inject, Injectable, Logger } from "@nestjs/common";
2
2
  import { ConfigService, ConfigType } from "@nestjs/config";
3
3
  import { CommonEntity } from "src/entities/common.entity";
4
4
  import { FieldMetadata } from "src/entities/field-metadata.entity";
5
+ import { LegacyCommonEntity } from "src/entities/legacy-common.entity";
6
+ import { LegacyCommonWithIdEntity } from "src/entities/legacy-common-with-id.entity";
5
7
  import { Media } from "src/entities/media.entity";
6
8
  import { MediaStorageProvider } from "src/interfaces";
7
9
  import { FileService } from "src/services/file.service";
@@ -28,9 +30,13 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
28
30
  }
29
31
 
30
32
  async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
31
- if (!(entity instanceof CommonEntity)) {
32
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
33
+ const isSupportedEntity = entity instanceof CommonEntity
34
+ || entity instanceof LegacyCommonEntity
35
+ || entity instanceof LegacyCommonWithIdEntity;
36
+ if (!isSupportedEntity) {
37
+ throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
33
38
  }
39
+ // @ts-ignore
34
40
  const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
35
41
 
36
42
  // TODO: Check if the mediaStorageProvider (s3 in this case) is configured with a public bucket or not.
@@ -56,8 +62,11 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
56
62
  }
57
63
 
58
64
  async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
59
- if (!(entity instanceof CommonEntity)) {
60
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
65
+ const isSupportedEntity = entity instanceof CommonEntity
66
+ || entity instanceof LegacyCommonEntity
67
+ || entity instanceof LegacyCommonWithIdEntity;
68
+ if (!isSupportedEntity) {
69
+ throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
61
70
  }
62
71
  const result: Media[] = [];
63
72
  for (const file of files) {
@@ -73,6 +82,7 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
73
82
 
74
83
  // Create an entry in the media table
75
84
  const mediaEntity = await this.mediaRepository.createMedia({
85
+ // @ts-ignore
76
86
  entityId: entity.id,
77
87
  modelMetadataId: mediaFieldMetadata.model.id,
78
88
  relativeUri: awsFileUrl,
@@ -89,10 +99,15 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
89
99
  }
90
100
 
91
101
  async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {
92
- if (!(entity instanceof CommonEntity)) {
93
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
102
+ const isSupportedEntity = entity instanceof CommonEntity
103
+ || entity instanceof LegacyCommonEntity
104
+ || entity instanceof LegacyCommonWithIdEntity;
105
+ if (!isSupportedEntity) {
106
+ throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
94
107
  }
108
+ // @ts-ignore
95
109
  const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
110
+ // @ts-ignore
96
111
  this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
97
112
  existingMedia.forEach(media => {
98
113
  this.fileService.deleteFromS3(media.relativeUri, mediaFieldMetadata.mediaStorageProvider.bucketName); //TODO
@@ -108,4 +123,4 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
108
123
  private getFileName(file: Express.Multer.File): string {
109
124
  return `${file.filename}-${file.originalname}`;
110
125
  }
111
- }
126
+ }