@solidstarters/solid-core 1.2.193 → 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 (630) 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/mcp.command.d.ts +20 -0
  10. package/dist/commands/mcp.command.d.ts.map +1 -0
  11. package/dist/commands/mcp.command.js +208 -0
  12. package/dist/commands/mcp.command.js.map +1 -0
  13. package/dist/commands/refresh-model.command.d.ts +8 -5
  14. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  15. package/dist/commands/refresh-model.command.js +36 -0
  16. package/dist/commands/refresh-model.command.js.map +1 -1
  17. package/dist/commands/remove-fields.command.js +1 -1
  18. package/dist/commands/remove-fields.command.js.map +1 -1
  19. package/dist/commands/seed.command.d.ts +2 -0
  20. package/dist/commands/seed.command.d.ts.map +1 -1
  21. package/dist/commands/seed.command.js +28 -1
  22. package/dist/commands/seed.command.js.map +1 -1
  23. package/dist/constants/error-messages.d.ts +2 -0
  24. package/dist/constants/error-messages.d.ts.map +1 -1
  25. package/dist/constants/error-messages.js +4 -0
  26. package/dist/constants/error-messages.js.map +1 -1
  27. package/dist/controllers/authentication.controller.js +1 -1
  28. package/dist/controllers/authentication.controller.js.map +1 -1
  29. package/dist/controllers/email-template.controller.js +1 -1
  30. package/dist/controllers/email-template.controller.js.map +1 -1
  31. package/dist/controllers/field-metadata.controller.d.ts +136 -4
  32. package/dist/controllers/field-metadata.controller.d.ts.map +1 -1
  33. package/dist/controllers/field-metadata.controller.js +14 -1
  34. package/dist/controllers/field-metadata.controller.js.map +1 -1
  35. package/dist/controllers/media-storage-provider-metadata.controller.js +1 -1
  36. package/dist/controllers/media-storage-provider-metadata.controller.js.map +1 -1
  37. package/dist/controllers/model-metadata.controller.js +1 -1
  38. package/dist/controllers/model-metadata.controller.js.map +1 -1
  39. package/dist/controllers/model-sequence.controller.d.ts +43 -0
  40. package/dist/controllers/model-sequence.controller.d.ts.map +1 -0
  41. package/dist/controllers/model-sequence.controller.js +179 -0
  42. package/dist/controllers/model-sequence.controller.js.map +1 -0
  43. package/dist/controllers/module-metadata.controller.js +1 -1
  44. package/dist/controllers/module-metadata.controller.js.map +1 -1
  45. package/dist/controllers/otp-authentication.controller.js +1 -1
  46. package/dist/controllers/otp-authentication.controller.js.map +1 -1
  47. package/dist/controllers/service.controller.js +1 -1
  48. package/dist/controllers/service.controller.js.map +1 -1
  49. package/dist/controllers/setting.controller.d.ts +1 -0
  50. package/dist/controllers/setting.controller.d.ts.map +1 -1
  51. package/dist/controllers/setting.controller.js +15 -0
  52. package/dist/controllers/setting.controller.js.map +1 -1
  53. package/dist/controllers/sms-template.controller.js +1 -1
  54. package/dist/controllers/sms-template.controller.js.map +1 -1
  55. package/dist/controllers/test-queue.controller.js +1 -1
  56. package/dist/controllers/test-queue.controller.js.map +1 -1
  57. package/dist/controllers/test.controller.js +1 -1
  58. package/dist/controllers/test.controller.js.map +1 -1
  59. package/dist/dtos/basic-filters.dto.d.ts +3 -1
  60. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  61. package/dist/dtos/basic-filters.dto.js +8 -2
  62. package/dist/dtos/basic-filters.dto.js.map +1 -1
  63. package/dist/dtos/basic-group-filters.dto.d.ts +6 -0
  64. package/dist/dtos/basic-group-filters.dto.d.ts.map +1 -0
  65. package/dist/dtos/basic-group-filters.dto.js +46 -0
  66. package/dist/dtos/basic-group-filters.dto.js.map +1 -0
  67. package/dist/dtos/create-ai-interaction.dto.d.ts +2 -0
  68. package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
  69. package/dist/dtos/create-ai-interaction.dto.js +14 -1
  70. package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
  71. package/dist/dtos/create-field-metadata.dto.d.ts +22 -5
  72. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  73. package/dist/dtos/create-field-metadata.dto.js +34 -8
  74. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  75. package/dist/dtos/create-import-transaction.dto.d.ts +0 -1
  76. package/dist/dtos/create-import-transaction.dto.d.ts.map +1 -1
  77. package/dist/dtos/create-import-transaction.dto.js +1 -7
  78. package/dist/dtos/create-import-transaction.dto.js.map +1 -1
  79. package/dist/dtos/create-model-metadata.dto.d.ts +2 -0
  80. package/dist/dtos/create-model-metadata.dto.d.ts.map +1 -1
  81. package/dist/dtos/create-model-metadata.dto.js +13 -1
  82. package/dist/dtos/create-model-metadata.dto.js.map +1 -1
  83. package/dist/dtos/create-model-sequence.dto.d.ts +14 -0
  84. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -0
  85. package/dist/dtos/create-model-sequence.dto.js +90 -0
  86. package/dist/dtos/create-model-sequence.dto.js.map +1 -0
  87. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  88. package/dist/dtos/create-role-metadata.dto.js +6 -1
  89. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  90. package/dist/dtos/get-mcp-url.dto.d.ts +5 -0
  91. package/dist/dtos/get-mcp-url.dto.d.ts.map +1 -0
  92. package/dist/dtos/get-mcp-url.dto.js +31 -0
  93. package/dist/dtos/get-mcp-url.dto.js.map +1 -0
  94. package/dist/dtos/resolve-s3-url.dto.d.ts +10 -0
  95. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -0
  96. package/dist/dtos/resolve-s3-url.dto.js +49 -0
  97. package/dist/dtos/resolve-s3-url.dto.js.map +1 -0
  98. package/dist/dtos/update-ai-interaction.dto.d.ts +2 -0
  99. package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
  100. package/dist/dtos/update-ai-interaction.dto.js +13 -1
  101. package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
  102. package/dist/dtos/update-field-metadata.dto.d.ts.map +1 -1
  103. package/dist/dtos/update-field-metadata.dto.js.map +1 -1
  104. package/dist/dtos/update-import-transaction.dto.d.ts +0 -1
  105. package/dist/dtos/update-import-transaction.dto.d.ts.map +1 -1
  106. package/dist/dtos/update-import-transaction.dto.js +1 -7
  107. package/dist/dtos/update-import-transaction.dto.js.map +1 -1
  108. package/dist/dtos/update-model-sequence.dto.d.ts +15 -0
  109. package/dist/dtos/update-model-sequence.dto.d.ts.map +1 -0
  110. package/dist/dtos/update-model-sequence.dto.js +94 -0
  111. package/dist/dtos/update-model-sequence.dto.js.map +1 -0
  112. package/dist/entities/action-metadata.entity.js +4 -4
  113. package/dist/entities/action-metadata.entity.js.map +1 -1
  114. package/dist/entities/ai-interaction.entity.d.ts +2 -0
  115. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  116. package/dist/entities/ai-interaction.entity.js +15 -6
  117. package/dist/entities/ai-interaction.entity.js.map +1 -1
  118. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  119. package/dist/entities/chatter-message-details.entity.js +1 -1
  120. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  121. package/dist/entities/chatter-message.entity.js +1 -1
  122. package/dist/entities/chatter-message.entity.js.map +1 -1
  123. package/dist/entities/common.entity.d.ts +2 -3
  124. package/dist/entities/common.entity.d.ts.map +1 -1
  125. package/dist/entities/common.entity.js +10 -11
  126. package/dist/entities/common.entity.js.map +1 -1
  127. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +2 -2
  128. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  129. package/dist/entities/dashboard-question.entity.js +3 -3
  130. package/dist/entities/dashboard-question.entity.js.map +1 -1
  131. package/dist/entities/dashboard-variable.entity.js +3 -3
  132. package/dist/entities/dashboard-variable.entity.js.map +1 -1
  133. package/dist/entities/dashboard.entity.js +1 -1
  134. package/dist/entities/dashboard.entity.js.map +1 -1
  135. package/dist/entities/email-template.entity.d.ts.map +1 -1
  136. package/dist/entities/email-template.entity.js +4 -3
  137. package/dist/entities/email-template.entity.js.map +1 -1
  138. package/dist/entities/export-template.entity.js +2 -2
  139. package/dist/entities/export-template.entity.js.map +1 -1
  140. package/dist/entities/export-transaction.entity.js +2 -2
  141. package/dist/entities/export-transaction.entity.js.map +1 -1
  142. package/dist/entities/field-metadata.entity.d.ts +1 -0
  143. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  144. package/dist/entities/field-metadata.entity.js +8 -4
  145. package/dist/entities/field-metadata.entity.js.map +1 -1
  146. package/dist/entities/import-transaction-error-log.entity.js +1 -1
  147. package/dist/entities/import-transaction-error-log.entity.js.map +1 -1
  148. package/dist/entities/import-transaction.entity.d.ts +0 -1
  149. package/dist/entities/import-transaction.entity.d.ts.map +1 -1
  150. package/dist/entities/import-transaction.entity.js +2 -7
  151. package/dist/entities/import-transaction.entity.js.map +1 -1
  152. package/dist/entities/legacy-common-with-id.entity.d.ts +5 -0
  153. package/dist/entities/legacy-common-with-id.entity.d.ts.map +1 -0
  154. package/dist/entities/legacy-common-with-id.entity.js +32 -0
  155. package/dist/entities/legacy-common-with-id.entity.js.map +1 -0
  156. package/dist/entities/legacy-common.entity.d.ts +13 -0
  157. package/dist/entities/legacy-common.entity.d.ts.map +1 -0
  158. package/dist/entities/legacy-common.entity.js +68 -0
  159. package/dist/entities/legacy-common.entity.js.map +1 -0
  160. package/dist/entities/list-of-values.entity.js +2 -2
  161. package/dist/entities/list-of-values.entity.js.map +1 -1
  162. package/dist/entities/locale.entity.js +1 -1
  163. package/dist/entities/locale.entity.js.map +1 -1
  164. package/dist/entities/media.entity.d.ts.map +1 -1
  165. package/dist/entities/media.entity.js +3 -3
  166. package/dist/entities/media.entity.js.map +1 -1
  167. package/dist/entities/menu-item-metadata.entity.js +4 -4
  168. package/dist/entities/menu-item-metadata.entity.js.map +1 -1
  169. package/dist/entities/model-metadata.entity.d.ts +2 -0
  170. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  171. package/dist/entities/model-metadata.entity.js +11 -3
  172. package/dist/entities/model-metadata.entity.js.map +1 -1
  173. package/dist/entities/model-sequence.entity.d.ts +15 -0
  174. package/dist/entities/model-sequence.entity.d.ts.map +1 -0
  175. package/dist/entities/model-sequence.entity.js +67 -0
  176. package/dist/entities/model-sequence.entity.js.map +1 -0
  177. package/dist/entities/mq-message-queue.entity.js +1 -1
  178. package/dist/entities/mq-message-queue.entity.js.map +1 -1
  179. package/dist/entities/mq-message.entity.d.ts +3 -3
  180. package/dist/entities/mq-message.entity.d.ts.map +1 -1
  181. package/dist/entities/mq-message.entity.js +10 -10
  182. package/dist/entities/mq-message.entity.js.map +1 -1
  183. package/dist/entities/saved-filters.entity.js +4 -4
  184. package/dist/entities/saved-filters.entity.js.map +1 -1
  185. package/dist/entities/scheduled-job.entity.js +4 -4
  186. package/dist/entities/scheduled-job.entity.js.map +1 -1
  187. package/dist/entities/security-rule.entity.js +2 -2
  188. package/dist/entities/security-rule.entity.js.map +1 -1
  189. package/dist/entities/setting.entity.js +2 -2
  190. package/dist/entities/setting.entity.js.map +1 -1
  191. package/dist/entities/sms-template.entity.js +2 -2
  192. package/dist/entities/sms-template.entity.js.map +1 -1
  193. package/dist/entities/user-activity-history.entity.d.ts.map +1 -1
  194. package/dist/entities/user-activity-history.entity.js +1 -1
  195. package/dist/entities/user-activity-history.entity.js.map +1 -1
  196. package/dist/entities/user-view-metadata.entity.js +2 -2
  197. package/dist/entities/user-view-metadata.entity.js.map +1 -1
  198. package/dist/entities/user.entity.js +13 -15
  199. package/dist/entities/user.entity.js.map +1 -1
  200. package/dist/entities/view-metadata.entity.js +3 -3
  201. package/dist/entities/view-metadata.entity.js.map +1 -1
  202. package/dist/helpers/date.helper.d.ts +1 -1
  203. package/dist/helpers/date.helper.d.ts.map +1 -1
  204. package/dist/helpers/date.helper.js +24 -2
  205. package/dist/helpers/date.helper.js.map +1 -1
  206. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts.map +1 -1
  207. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js +13 -2
  208. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  209. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +0 -1
  210. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
  211. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +4 -9
  212. package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
  213. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +0 -1
  214. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts.map +1 -1
  215. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +7 -8
  216. package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
  217. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +0 -1
  218. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
  219. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +4 -9
  220. package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
  221. package/dist/helpers/model-metadata-helper.service.d.ts +4 -1
  222. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  223. package/dist/helpers/model-metadata-helper.service.js +52 -30
  224. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  225. package/dist/helpers/module-metadata-helper.service.d.ts +1 -0
  226. package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
  227. package/dist/helpers/module-metadata-helper.service.js +9 -0
  228. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  229. package/dist/helpers/module.helper.d.ts +1 -0
  230. package/dist/helpers/module.helper.d.ts.map +1 -1
  231. package/dist/helpers/module.helper.js +26 -2
  232. package/dist/helpers/module.helper.js.map +1 -1
  233. package/dist/helpers/schematic.service.d.ts +9 -3
  234. package/dist/helpers/schematic.service.d.ts.map +1 -1
  235. package/dist/helpers/schematic.service.js +49 -32
  236. package/dist/helpers/schematic.service.js.map +1 -1
  237. package/dist/helpers/solid-registry.d.ts +14 -2
  238. package/dist/helpers/solid-registry.d.ts.map +1 -1
  239. package/dist/helpers/solid-registry.js +10 -0
  240. package/dist/helpers/solid-registry.js.map +1 -1
  241. package/dist/helpers/typeorm-db-helper.d.ts +3 -0
  242. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -0
  243. package/dist/helpers/typeorm-db-helper.js +24 -0
  244. package/dist/helpers/typeorm-db-helper.js.map +1 -0
  245. package/dist/index.d.ts +7 -2
  246. package/dist/index.d.ts.map +1 -1
  247. package/dist/index.js +8 -3
  248. package/dist/index.js.map +1 -1
  249. package/dist/interfaces.d.ts +3 -0
  250. package/dist/interfaces.d.ts.map +1 -1
  251. package/dist/interfaces.js.map +1 -1
  252. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts +1 -0
  253. package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
  254. package/dist/jobs/computed-field-evaluation-subscriber.service.js +16 -4
  255. package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -1
  256. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  257. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +6 -1
  258. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  259. package/dist/repository/media.repository.d.ts.map +1 -1
  260. package/dist/repository/media.repository.js +4 -0
  261. package/dist/repository/media.repository.js.map +1 -1
  262. package/dist/repository/model-sequence.repository.d.ts +14 -0
  263. package/dist/repository/model-sequence.repository.d.ts.map +1 -0
  264. package/dist/repository/model-sequence.repository.js +103 -0
  265. package/dist/repository/model-sequence.repository.js.map +1 -0
  266. package/dist/seeders/module-metadata-seeder.service.d.ts +8 -13
  267. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  268. package/dist/seeders/module-metadata-seeder.service.js +103 -43
  269. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  270. package/dist/seeders/seed-data/solid-core-metadata.json +553 -652
  271. package/dist/seeders/system-fields-seeder.service.d.ts +1 -0
  272. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  273. package/dist/seeders/system-fields-seeder.service.js +12 -3
  274. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  275. package/dist/services/action-metadata.service.d.ts.map +1 -1
  276. package/dist/services/action-metadata.service.js +1 -0
  277. package/dist/services/action-metadata.service.js.map +1 -1
  278. package/dist/services/ai-interaction.service.d.ts.map +1 -1
  279. package/dist/services/ai-interaction.service.js +2 -1
  280. package/dist/services/ai-interaction.service.js.map +1 -1
  281. package/dist/services/authentication.service.d.ts.map +1 -1
  282. package/dist/services/authentication.service.js +22 -14
  283. package/dist/services/authentication.service.js.map +1 -1
  284. package/dist/services/chatter-message-details.service.d.ts.map +1 -1
  285. package/dist/services/chatter-message-details.service.js +1 -0
  286. package/dist/services/chatter-message-details.service.js.map +1 -1
  287. package/dist/services/chatter-message.service.d.ts.map +1 -1
  288. package/dist/services/chatter-message.service.js +7 -3
  289. package/dist/services/chatter-message.service.js.map +1 -1
  290. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  291. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +10 -6
  292. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  293. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +15 -0
  294. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -0
  295. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +72 -0
  296. package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -0
  297. package/dist/services/crud-helper.service.d.ts +31 -6
  298. package/dist/services/crud-helper.service.d.ts.map +1 -1
  299. package/dist/services/crud-helper.service.js +285 -50
  300. package/dist/services/crud-helper.service.js.map +1 -1
  301. package/dist/services/crud.service.d.ts +7 -2
  302. package/dist/services/crud.service.d.ts.map +1 -1
  303. package/dist/services/crud.service.js +135 -26
  304. package/dist/services/crud.service.js.map +1 -1
  305. package/dist/services/database/database-bootstrap.service.d.ts +12 -0
  306. package/dist/services/database/database-bootstrap.service.d.ts.map +1 -0
  307. package/dist/services/database/database-bootstrap.service.js +115 -0
  308. package/dist/services/database/database-bootstrap.service.js.map +1 -0
  309. package/dist/services/email-template.service.d.ts +7 -7
  310. package/dist/services/email-template.service.d.ts.map +1 -1
  311. package/dist/services/email-template.service.js +8 -7
  312. package/dist/services/email-template.service.js.map +1 -1
  313. package/dist/services/excel.service.d.ts +10 -0
  314. package/dist/services/excel.service.d.ts.map +1 -1
  315. package/dist/services/excel.service.js +100 -0
  316. package/dist/services/excel.service.js.map +1 -1
  317. package/dist/services/field-metadata.service.d.ts +146 -6
  318. package/dist/services/field-metadata.service.d.ts.map +1 -1
  319. package/dist/services/field-metadata.service.js +218 -58
  320. package/dist/services/field-metadata.service.js.map +1 -1
  321. package/dist/services/file.service.d.ts +1 -0
  322. package/dist/services/file.service.d.ts.map +1 -1
  323. package/dist/services/file.service.js +9 -0
  324. package/dist/services/file.service.js.map +1 -1
  325. package/dist/services/fixtures.service.d.ts +13 -0
  326. package/dist/services/fixtures.service.d.ts.map +1 -0
  327. package/dist/services/fixtures.service.js +95 -0
  328. package/dist/services/fixtures.service.js.map +1 -0
  329. package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
  330. package/dist/services/genai/ingest-metadata.service.js +1 -1
  331. package/dist/services/genai/ingest-metadata.service.js.map +1 -1
  332. package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
  333. package/dist/services/import-transaction-error-log.service.js +1 -0
  334. package/dist/services/import-transaction-error-log.service.js.map +1 -1
  335. package/dist/services/import-transaction.service.d.ts.map +1 -1
  336. package/dist/services/import-transaction.service.js +7 -1
  337. package/dist/services/import-transaction.service.js.map +1 -1
  338. package/dist/services/list-of-values.service.d.ts +2 -2
  339. package/dist/services/list-of-values.service.d.ts.map +1 -1
  340. package/dist/services/list-of-values.service.js +2 -1
  341. package/dist/services/list-of-values.service.js.map +1 -1
  342. package/dist/services/locale.service.d.ts.map +1 -1
  343. package/dist/services/locale.service.js +1 -0
  344. package/dist/services/locale.service.js.map +1 -1
  345. package/dist/services/mail/smtp-email.service.js +0 -1
  346. package/dist/services/mail/smtp-email.service.js.map +1 -1
  347. package/dist/services/media.service.d.ts +3 -3
  348. package/dist/services/media.service.d.ts.map +1 -1
  349. package/dist/services/media.service.js +6 -4
  350. package/dist/services/media.service.js.map +1 -1
  351. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  352. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +17 -6
  353. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  354. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  355. package/dist/services/mediaStorageProviders/file-storage-provider.js +0 -13
  356. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  357. package/dist/services/menu-item-metadata.service.d.ts +3 -1
  358. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  359. package/dist/services/menu-item-metadata.service.js +35 -11
  360. package/dist/services/menu-item-metadata.service.js.map +1 -1
  361. package/dist/services/model-metadata.service.d.ts.map +1 -1
  362. package/dist/services/model-metadata.service.js +16 -45
  363. package/dist/services/model-metadata.service.js.map +1 -1
  364. package/dist/services/model-sequence.service.d.ts +23 -0
  365. package/dist/services/model-sequence.service.d.ts.map +1 -0
  366. package/dist/services/model-sequence.service.js +55 -0
  367. package/dist/services/model-sequence.service.js.map +1 -0
  368. package/dist/services/module-metadata.service.d.ts +1 -0
  369. package/dist/services/module-metadata.service.d.ts.map +1 -1
  370. package/dist/services/module-metadata.service.js +35 -1
  371. package/dist/services/module-metadata.service.js.map +1 -1
  372. package/dist/services/mq-message.service.d.ts.map +1 -1
  373. package/dist/services/mq-message.service.js +3 -4
  374. package/dist/services/mq-message.service.js.map +1 -1
  375. package/dist/services/permission-metadata.service.d.ts +5 -5
  376. package/dist/services/permission-metadata.service.d.ts.map +1 -1
  377. package/dist/services/permission-metadata.service.js +6 -5
  378. package/dist/services/permission-metadata.service.js.map +1 -1
  379. package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
  380. package/dist/services/queues/database-subscriber.service.js +2 -1
  381. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  382. package/dist/services/queues/publisher-factory.service.d.ts.map +1 -1
  383. package/dist/services/queues/publisher-factory.service.js +4 -0
  384. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  385. package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
  386. package/dist/services/queues/rabbitmq-subscriber.service.js +2 -2
  387. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  388. package/dist/services/role-metadata.service.d.ts.map +1 -1
  389. package/dist/services/role-metadata.service.js +1 -0
  390. package/dist/services/role-metadata.service.js.map +1 -1
  391. package/dist/services/scheduled-job.service.d.ts +6 -6
  392. package/dist/services/scheduled-job.service.d.ts.map +1 -1
  393. package/dist/services/scheduled-job.service.js +8 -8
  394. package/dist/services/scheduled-job.service.js.map +1 -1
  395. package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
  396. package/dist/services/scheduled-jobs/scheduler.service.js +4 -0
  397. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  398. package/dist/services/security-rule.service.d.ts.map +1 -1
  399. package/dist/services/security-rule.service.js +1 -0
  400. package/dist/services/security-rule.service.js.map +1 -1
  401. package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts.map +1 -1
  402. package/dist/services/selection-providers/list-of-models-selection-provider.service.js +4 -0
  403. package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
  404. package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.d.ts +2 -2
  405. package/dist/services/selection-providers/list-of-values-selection-providers.service.d.ts.map +1 -0
  406. package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.js +3 -3
  407. package/dist/services/selection-providers/list-of-values-selection-providers.service.js.map +1 -0
  408. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts +20 -0
  409. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts.map +1 -0
  410. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js +87 -0
  411. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js.map +1 -0
  412. package/dist/services/setting.service.d.ts +7 -5
  413. package/dist/services/setting.service.d.ts.map +1 -1
  414. package/dist/services/setting.service.js +28 -5
  415. package/dist/services/setting.service.js.map +1 -1
  416. package/dist/services/sms-template.service.d.ts +7 -7
  417. package/dist/services/sms-template.service.d.ts.map +1 -1
  418. package/dist/services/sms-template.service.js +8 -7
  419. package/dist/services/sms-template.service.js.map +1 -1
  420. package/dist/services/solid-introspect.service.d.ts +10 -3
  421. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  422. package/dist/services/solid-introspect.service.js +66 -12
  423. package/dist/services/solid-introspect.service.js.map +1 -1
  424. package/dist/services/solid-ts-morph.service.js +2 -2
  425. package/dist/services/solid-ts-morph.service.js.map +1 -1
  426. package/dist/services/user-activity-history.service.d.ts.map +1 -1
  427. package/dist/services/user-activity-history.service.js +1 -0
  428. package/dist/services/user-activity-history.service.js.map +1 -1
  429. package/dist/services/user-view-metadata.service.d.ts.map +1 -1
  430. package/dist/services/user-view-metadata.service.js +3 -2
  431. package/dist/services/user-view-metadata.service.js.map +1 -1
  432. package/dist/services/user.service.d.ts.map +1 -1
  433. package/dist/services/user.service.js +1 -0
  434. package/dist/services/user.service.js.map +1 -1
  435. package/dist/services/view-metadata.service.d.ts +3 -1
  436. package/dist/services/view-metadata.service.d.ts.map +1 -1
  437. package/dist/services/view-metadata.service.js +33 -5
  438. package/dist/services/view-metadata.service.js.map +1 -1
  439. package/dist/solid-core-cli-db.module.d.ts.map +1 -1
  440. package/dist/solid-core-cli-db.module.js +5 -2
  441. package/dist/solid-core-cli-db.module.js.map +1 -1
  442. package/dist/solid-core.module.d.ts.map +1 -1
  443. package/dist/solid-core.module.js +23 -1
  444. package/dist/solid-core.module.js.map +1 -1
  445. package/dist/subscribers/audit.subscriber.d.ts +3 -2
  446. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  447. package/dist/subscribers/audit.subscriber.js +8 -10
  448. package/dist/subscribers/audit.subscriber.js.map +1 -1
  449. package/dist/subscribers/computed-entity-field.subscriber.d.ts +7 -4
  450. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  451. package/dist/subscribers/computed-entity-field.subscriber.js +60 -21
  452. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  453. package/dist/subscribers/created-by-updated-by.subscriber.d.ts +4 -2
  454. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  455. package/dist/subscribers/created-by-updated-by.subscriber.js +10 -8
  456. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  457. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  458. package/dist/subscribers/field-metadata.subscriber.js +0 -1
  459. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  460. package/dist/subscribers/model-metadata.subscriber.d.ts.map +1 -1
  461. package/dist/subscribers/model-metadata.subscriber.js +3 -2
  462. package/dist/subscribers/model-metadata.subscriber.js.map +1 -1
  463. package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts +3 -2
  464. package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts.map +1 -1
  465. package/dist/subscribers/soft-delete-aware-event.subscriber.js +6 -11
  466. package/dist/subscribers/soft-delete-aware-event.subscriber.js.map +1 -1
  467. package/dist/transformers/typeorm/local-date-time-transformer.d.ts +5 -0
  468. package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -0
  469. package/dist/transformers/typeorm/local-date-time-transformer.js +26 -0
  470. package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -0
  471. package/dist/tsconfig.tsbuildinfo +1 -1
  472. package/docs/grouping-enhancements.md +89 -0
  473. package/package.json +1 -1
  474. package/sql/default/mssql/proc_CleanupModelMetadata.sql +175 -0
  475. package/sql/default/mssql/proc_CleanupModuleMetadata.sql +78 -0
  476. package/sql/default/mssql/scratchpad.sql.txt +10 -0
  477. package/sql/default/postgres/proc_CleanupModelMetadata.sql +148 -0
  478. package/sql/default/postgres/proc_CleanupModuleMetadata.sql +50 -0
  479. package/sql/default/postgres/scratchpad.sql.txt +12 -0
  480. package/sql-server-changes.txt +88 -0
  481. package/src/commands/fixtures/fixtures-setup.command.ts +44 -0
  482. package/src/commands/fixtures/fixtures-tear-down.command.ts +45 -0
  483. package/src/commands/mcp.command.ts +215 -0
  484. package/src/commands/refresh-model.command.ts +39 -5
  485. package/src/commands/remove-fields.command.ts +1 -1
  486. package/src/commands/seed.command.ts +34 -15
  487. package/src/constants/error-messages.ts +7 -1
  488. package/src/controllers/authentication.controller.ts +1 -1
  489. package/src/controllers/email-template.controller.ts +1 -1
  490. package/src/controllers/field-metadata.controller.ts +7 -1
  491. package/src/controllers/media-storage-provider-metadata.controller.ts +1 -1
  492. package/src/controllers/model-metadata.controller.ts +1 -1
  493. package/src/controllers/model-sequence.controller.ts +93 -0
  494. package/src/controllers/module-metadata.controller.ts +1 -1
  495. package/src/controllers/otp-authentication.controller.ts +1 -1
  496. package/src/controllers/service.controller.ts +1 -1
  497. package/src/controllers/setting.controller.ts +33 -21
  498. package/src/controllers/sms-template.controller.ts +1 -1
  499. package/src/controllers/test-queue.controller.ts +1 -1
  500. package/src/controllers/test.controller.ts +1 -1
  501. package/src/dtos/basic-filters.dto.ts +6 -1
  502. package/src/dtos/basic-group-filters.dto.ts +23 -0
  503. package/src/dtos/create-ai-interaction.dto.ts +16 -9
  504. package/src/dtos/create-field-metadata.dto.ts +43 -13
  505. package/src/dtos/create-import-transaction.dto.ts +0 -4
  506. package/src/dtos/create-model-metadata.dto.ts +10 -0
  507. package/src/dtos/create-model-sequence.dto.ts +51 -0
  508. package/src/dtos/create-role-metadata.dto.ts +23 -4
  509. package/src/dtos/get-mcp-url.dto.ts +13 -0
  510. package/src/dtos/resolve-s3-url.dto.ts +31 -0
  511. package/src/dtos/update-ai-interaction.dto.ts +16 -9
  512. package/src/dtos/update-field-metadata.dto.ts +1 -2
  513. package/src/dtos/update-import-transaction.dto.ts +0 -4
  514. package/src/dtos/update-model-sequence.dto.ts +53 -0
  515. package/src/entities/action-metadata.entity.ts +4 -4
  516. package/src/entities/ai-interaction.entity.ts +16 -12
  517. package/src/entities/chatter-message-details.entity.ts +18 -18
  518. package/src/entities/chatter-message.entity.ts +2 -2
  519. package/src/entities/common.entity.ts +20 -11
  520. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +2 -2
  521. package/src/entities/dashboard-question.entity.ts +3 -3
  522. package/src/entities/dashboard-variable.entity.ts +3 -3
  523. package/src/entities/dashboard.entity.ts +1 -1
  524. package/src/entities/email-template.entity.ts +4 -3
  525. package/src/entities/export-template.entity.ts +2 -2
  526. package/src/entities/export-transaction.entity.ts +2 -2
  527. package/src/entities/field-metadata.entity.ts +6 -3
  528. package/src/entities/import-transaction-error-log.entity.ts +2 -2
  529. package/src/entities/import-transaction.entity.ts +2 -5
  530. package/src/entities/legacy-common-with-id.entity.ts +11 -0
  531. package/src/entities/legacy-common.entity.ts +58 -0
  532. package/src/entities/list-of-values.entity.ts +2 -2
  533. package/src/entities/locale.entity.ts +1 -1
  534. package/src/entities/media.entity.ts +25 -25
  535. package/src/entities/menu-item-metadata.entity.ts +4 -4
  536. package/src/entities/model-metadata.entity.ts +9 -2
  537. package/src/entities/model-sequence.entity.ts +32 -0
  538. package/src/entities/mq-message-queue.entity.ts +1 -1
  539. package/src/entities/mq-message.entity.ts +34 -34
  540. package/src/entities/saved-filters.entity.ts +5 -5
  541. package/src/entities/scheduled-job.entity.ts +4 -4
  542. package/src/entities/security-rule.entity.ts +2 -2
  543. package/src/entities/setting.entity.ts +2 -2
  544. package/src/entities/sms-template.entity.ts +2 -2
  545. package/src/entities/user-activity-history.entity.ts +14 -14
  546. package/src/entities/user-view-metadata.entity.ts +2 -2
  547. package/src/entities/user.entity.ts +15 -15
  548. package/src/entities/view-metadata.entity.ts +3 -3
  549. package/src/helpers/date.helper.ts +31 -10
  550. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +18 -5
  551. package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +9 -9
  552. package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +16 -8
  553. package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +9 -9
  554. package/src/helpers/model-metadata-helper.service.ts +67 -34
  555. package/src/helpers/module-metadata-helper.service.ts +18 -1
  556. package/src/helpers/module.helper.ts +37 -1
  557. package/src/helpers/schematic.service.ts +72 -46
  558. package/src/helpers/solid-registry.ts +28 -2
  559. package/src/helpers/typeorm-db-helper.ts +26 -0
  560. package/src/index.ts +7 -2
  561. package/src/interfaces.ts +3 -0
  562. package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
  563. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +17 -21
  564. package/src/repository/media.repository.ts +3 -2
  565. package/src/repository/model-sequence.repository.ts +97 -0
  566. package/src/seeders/module-metadata-seeder.service.ts +176 -58
  567. package/src/seeders/seed-data/solid-core-metadata.json +555 -654
  568. package/src/seeders/system-fields-seeder.service.ts +39 -36
  569. package/src/services/action-metadata.service.ts +3 -2
  570. package/src/services/ai-interaction.service.ts +3 -2
  571. package/src/services/authentication.service.ts +46 -14
  572. package/src/services/chatter-message-details.service.ts +2 -1
  573. package/src/services/chatter-message.service.ts +10 -4
  574. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +17 -12
  575. package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +86 -0
  576. package/src/services/crud-helper.service.ts +319 -53
  577. package/src/services/crud.service.ts +233 -34
  578. package/src/services/database/database-bootstrap.service.ts +91 -0
  579. package/src/services/email-template.service.ts +11 -13
  580. package/src/services/excel.service.ts +146 -3
  581. package/src/services/field-metadata.service.ts +322 -70
  582. package/src/services/file.service.ts +9 -0
  583. package/src/services/fixtures.service.ts +108 -0
  584. package/src/services/genai/ingest-metadata.service.ts +4 -3
  585. package/src/services/import-transaction-error-log.service.ts +2 -1
  586. package/src/services/import-transaction.service.ts +8 -4
  587. package/src/services/list-of-values.service.ts +4 -4
  588. package/src/services/locale.service.ts +2 -1
  589. package/src/services/mail/smtp-email.service.ts +1 -1
  590. package/src/services/media.service.ts +10 -11
  591. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +22 -7
  592. package/src/services/mediaStorageProviders/file-storage-provider.ts +18 -13
  593. package/src/services/menu-item-metadata.service.ts +87 -52
  594. package/src/services/model-metadata.service.ts +68 -47
  595. package/src/services/model-sequence.service.ts +33 -0
  596. package/src/services/module-metadata.service.ts +49 -2
  597. package/src/services/mq-message.service.ts +16 -15
  598. package/src/services/permission-metadata.service.ts +8 -9
  599. package/src/services/queues/database-subscriber.service.ts +3 -1
  600. package/src/services/queues/publisher-factory.service.ts +2 -1
  601. package/src/services/queues/rabbitmq-subscriber.service.ts +4 -2
  602. package/src/services/role-metadata.service.ts +1 -0
  603. package/src/services/scheduled-job.service.ts +9 -9
  604. package/src/services/scheduled-jobs/scheduler.service.ts +5 -0
  605. package/src/services/security-rule.service.ts +1 -0
  606. package/src/services/selection-providers/list-of-models-selection-provider.service.ts +5 -2
  607. package/src/{providers → services/selection-providers}/list-of-values-selection-providers.service.ts +2 -2
  608. package/src/services/selection-providers/pseudo-foreign-key-selection-provider.service.ts +94 -0
  609. package/src/services/setting.service.ts +46 -16
  610. package/src/services/sms-template.service.ts +11 -13
  611. package/src/services/solid-introspect.service.ts +97 -10
  612. package/src/services/solid-ts-morph.service.ts +2 -2
  613. package/src/services/user-activity-history.service.ts +3 -2
  614. package/src/services/user-view-metadata.service.ts +4 -3
  615. package/src/services/user.service.ts +2 -1
  616. package/src/services/view-metadata.service.ts +52 -21
  617. package/src/solid-core-cli-db.module.ts +5 -4
  618. package/src/solid-core.module.ts +23 -1
  619. package/src/subscribers/audit.subscriber.ts +14 -9
  620. package/src/subscribers/computed-entity-field.subscriber.ts +71 -22
  621. package/src/subscribers/created-by-updated-by.subscriber.ts +14 -8
  622. package/src/subscribers/field-metadata.subscriber.ts +1 -1
  623. package/src/subscribers/model-metadata.subscriber.ts +4 -2
  624. package/src/subscribers/soft-delete-aware-event.subscriber.ts +12 -6
  625. package/src/transformers/typeorm/local-date-time-transformer.ts +30 -0
  626. package/dist/providers/list-of-values-selection-providers.service.d.ts.map +0 -1
  627. package/dist/providers/list-of-values-selection-providers.service.js.map +0 -1
  628. package/src/commands/ingest-rag-chunking-strategy-for.md +0 -224
  629. package/src/entities/user.entity.ts.bkp +0 -144
  630. package/src/services/docker exec -it mssql //" +0 -8
@@ -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
+ }
@@ -22,9 +22,10 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
22
22
  ) { }
23
23
 
24
24
  async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
25
- if (!(entity instanceof CommonEntity)) {
26
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
27
- }
25
+ // if (!(entity instanceof CommonEntity)) {
26
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
27
+ // }
28
+ //@ts-ignore
28
29
  const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
29
30
  // Add the full URL to the media
30
31
  media.forEach(m => {
@@ -34,9 +35,9 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
34
35
  }
35
36
 
36
37
  async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
37
- if (!(entity instanceof CommonEntity)) {
38
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
39
- }
38
+ // if (!(entity instanceof CommonEntity)) {
39
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
40
+ // }
40
41
  const result: Media[] = [];
41
42
  for (const file of files) {
42
43
  // Store the file in the configured file storage directory
@@ -46,7 +47,8 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
46
47
 
47
48
  // Create an entry in the media table
48
49
  const mediaEntity = await this.mediaRepository.createMedia({
49
- entityId: entity.id,
50
+ //@ts-ignore
51
+ entityId: entity.id,
50
52
  modelMetadataId: mediaFieldMetadata.model.id,
51
53
  relativeUri: this.getFileName(file),
52
54
  mimeType: file.mimetype,
@@ -62,15 +64,16 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
62
64
  }
63
65
 
64
66
  async storeStreams(streamPairs: [Readable, string][], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
65
- if (!(entity instanceof CommonEntity)) {
66
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
67
- }
67
+ // if (!(entity instanceof CommonEntity)) {
68
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
69
+ // }
68
70
  const result: Media[] = [];
69
71
  for (const pair of streamPairs) {
70
72
  const stream = pair[0];
71
73
  const fileName = pair[1];
72
74
  this.fileService.writeStreamToFile(stream, this.getFullFilePath(fileName));
73
75
  const mediaEntity = await this.mediaRepository.createMedia({
76
+ //@ts-ignore
74
77
  entityId: entity.id,
75
78
  modelMetadataId: mediaFieldMetadata.model.id,
76
79
  relativeUri: fileName,
@@ -83,10 +86,12 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
83
86
  }
84
87
 
85
88
  async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {
86
- if (!(entity instanceof CommonEntity)) {
87
- throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
88
- }
89
+ // if (!(entity instanceof CommonEntity)) {
90
+ // throw new Error("Entity must be an instance of CommonEntity"); //FIXME This needs to be handled through generics. e.g T extends CommonEntity
91
+ // }
92
+ //@ts-ignore
89
93
  const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
94
+ //@ts-ignore
90
95
  this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
91
96
  existingMedia.forEach(media => {
92
97
  this.fileService.deleteFile(this.getFullFilePath(media.relativeUri));
@@ -1,7 +1,7 @@
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
- import { EntityManager, Repository } from 'typeorm';
4
+ import { EntityManager, In, Repository } from 'typeorm';
5
5
  import { CRUDService } from 'src/services/crud.service';
6
6
  import { ModelMetadataService } from 'src/services/model-metadata.service';
7
7
  import { ModuleMetadataService } from 'src/services/module-metadata.service';
@@ -16,10 +16,12 @@ import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
16
16
  import { ModuleMetadata } from '../entities/module-metadata.entity';
17
17
  import { dasherize } from '@angular-devkit/core/src/utils/strings';
18
18
  import { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';
19
+ import { SavedFiltersRepository } from 'src/repository/saved-filters.repository';
19
20
 
20
21
  @Injectable()
21
22
  export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
22
23
  constructor(
24
+ @Inject(forwardRef(() => ModelMetadataService))
23
25
  readonly modelMetadataService: ModelMetadataService,
24
26
  readonly moduleMetadataService: ModuleMetadataService,
25
27
  readonly configService: ConfigService,
@@ -31,6 +33,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
31
33
  // @InjectRepository(MenuItemMetadata, 'default')
32
34
  // readonly repo: Repository<MenuItemMetadata>,
33
35
  readonly repo: MenuItemMetadataRepository,
36
+ readonly savedFiltersRepo: SavedFiltersRepository,
34
37
  readonly moduleRef: ModuleRef
35
38
 
36
39
  ) {
@@ -92,7 +95,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
92
95
  .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')
93
96
  .leftJoinAndSelect('menuItem.action', 'action')
94
97
  .leftJoinAndSelect('action.model', 'model') // Join the model relation of action
95
- .leftJoinAndSelect('action.view', 'view') // Join the model relation of action
98
+ .leftJoinAndSelect('action.view', 'view') // Join the view relation of action
96
99
  .leftJoinAndSelect('menuItem.roles', 'roles')
97
100
  .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })
98
101
  .addOrderBy('module.menuSequenceNumber', 'ASC')
@@ -120,73 +123,105 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
120
123
  // 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path.
121
124
  const menu: any[] = [];
122
125
 
123
- modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
124
- const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);
126
+ // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
127
+ // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);
128
+ // const moduleMetadata = modulesMap.get(moduleName);
129
+
130
+ // const moduleMenu = {
131
+ // title: moduleMetadata.displayName,
132
+ // // No need for path the module level.
133
+ // // path: ``,
134
+ // key: moduleName.toLowerCase().replace(/\s+/g, '-'),
135
+ // // TODO: We need to add the module icon as part of the metadata so it can be brought here.
136
+ // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\s+/g, '-')}.svg`,
137
+ // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),
138
+ // icon: moduleMetadata.menuIconUrl,
139
+ // };
140
+
141
+ // menu.push(moduleMenu);
142
+ // });
143
+ for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {
144
+ const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);
125
145
  const moduleMetadata = modulesMap.get(moduleName);
126
146
 
127
147
  const moduleMenu = {
128
148
  title: moduleMetadata.displayName,
129
- // No need for path the module level.
130
- // path: ``,
131
149
  key: moduleName.toLowerCase().replace(/\s+/g, '-'),
132
- // TODO: We need to add the module icon as part of the metadata so it can be brought here.
133
- // icon: `/images/menu/${moduleName.toLowerCase().replace(/\s+/g, '-')}.svg`,
134
- children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),
150
+ children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // await here
135
151
  icon: moduleMetadata.menuIconUrl,
136
152
  };
137
153
 
138
154
  menu.push(moduleMenu);
139
- });
155
+ }
156
+
140
157
 
141
158
  return menu.filter(m => m.children.length > 0);
142
159
  }
143
160
 
144
161
  // Recursive function to build the tree
145
- private buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): any[] {
146
- const menuItemsData = rootItems.map(rootItem => {
147
- const allowedMenuItems = allMenuItems.filter(i => {
148
- if (!i.parentMenuItem) {
149
- return true
150
- } else {
151
- return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)
162
+ private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {
163
+ const menuItemsData = await Promise.all(
164
+ rootItems.map(async rootItem => {
165
+ const allowedMenuItems = allMenuItems.filter(i => {
166
+ if (!i.parentMenuItem) {
167
+ return true
168
+ } else {
169
+ if(i.action.type === 'custom'){
170
+ return true;
171
+ }
172
+ return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)
173
+ }
174
+ });
175
+ // Get immediate children of the current loop variable menuItem.
176
+ const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);
177
+ const menuItemId = rootItem?.id ?? "";
178
+ const menuItemName = rootItem?.name ?? "";
179
+ const actionId = rootItem?.action?.id ?? "";
180
+ const actionName = rootItem?.action?.name ?? "";
181
+ // TODO: We should specify path only if there are no more children present.
182
+ // For now adding path everywhere.
183
+ let path = '';
184
+
185
+ const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null
186
+ let savedFilterId = null;
187
+ if (layout && layout?.attrs?.defaultSavedFilter) {
188
+ const savedFilter = await this.savedFiltersRepo.findOne({
189
+ where: {
190
+ name: layout?.attrs?.defaultSavedFilter,
191
+ isPrivate: false
192
+ },
193
+ });
194
+ if (savedFilter) {
195
+ savedFilterId = savedFilter.id
196
+ }
152
197
  }
153
- });
154
- // Get immediate children of the current loop variable menuItem.
155
- const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);
156
-
157
- // TODO: We should specify path only if there are no more children present.
158
- // For now adding path everywhere.
159
- let path = '';
160
-
161
- if (rootItem.action && rootItem.action.type === 'custom') {
162
- path = rootItem.action.customComponent;
163
- }
164
- if (rootItem.action && rootItem.action.type === 'solid') {
165
- if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
166
-
167
-
168
- // TODO: Here we are assuming that we will always take the user to collection view of a model.
169
- // We can make provision to take them other views also in the future.
170
- // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;
171
- path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}`;
172
-
198
+ if (rootItem.action && rootItem.action.type === 'custom') {
199
+ path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;
200
+ }
201
+ if (rootItem.action && rootItem.action.type === 'solid') {
202
+ if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
203
+ // TODO: Here we are assuming that we will always take the user to collection view of a model.
204
+ // We can make provision to take them other views also in the future.
205
+ // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;
206
+ path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;
207
+
208
+ }
173
209
  }
174
- }
175
210
 
176
- // We are not checking for empty path coz, this is required for parent menu items.
177
- const data = {
178
- title: rootItem.displayName || rootItem.name,
179
- path: path,
180
- key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
181
- icon: rootItem.iconName,
182
- // iconVariant : rootItem.iconVariant
183
- }
184
- if (children.length > 0) {
185
- data["children"] = this.buildMenuTree(children, allMenuItems, activeUser);
186
- }
187
- return data;
211
+ // We are not checking for empty path coz, this is required for parent menu items.
212
+ const data = {
213
+ title: rootItem.displayName || rootItem.name,
214
+ path: path,
215
+ key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
216
+ icon: rootItem.iconName,
217
+ // iconVariant : rootItem.iconVariant
218
+ }
219
+ if (children.length > 0) {
220
+ data["children"] = await this.buildMenuTree(children, allMenuItems, activeUser);
221
+ }
222
+ return data;
188
223
 
189
- });
224
+ }));
190
225
  return menuItemsData.filter(mi => mi && mi)
191
226
  }
192
227
 
@@ -1,4 +1,4 @@
1
- import { BadRequestException, Injectable, Logger, NotFoundException } from '@nestjs/common';
1
+ import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
2
2
  import { InjectDataSource } from '@nestjs/typeorm';
3
3
  import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
4
4
  import { DataSource, EntityManager, In, Repository, SelectQueryBuilder } from 'typeorm';
@@ -39,6 +39,7 @@ export class ModelMetadataService {
39
39
  // private readonly modelMetadataRepo: Repository<ModelMetadata>,
40
40
  // @InjectRepository(FieldMetadata)
41
41
  // private readonly fieldMetadataRepo: Repository<FieldMetadata>,
42
+ @Inject(forwardRef(() => ModelMetadataRepository))
42
43
  private readonly modelMetadataRepo: ModelMetadataRepository,
43
44
  private readonly fieldMetadataRepo: FieldMetadataRepository,
44
45
  private readonly schematicService: SchematicService,
@@ -270,6 +271,8 @@ export class ModelMetadataService {
270
271
  tableName: model.tableName,
271
272
  userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,
272
273
  isChild: model?.isChild,
274
+ isLegacyTable: model?.isLegacyTable,
275
+ isLegacyTableWithId: model?.isLegacyTableWithId,
273
276
  parentModelUserKey: model?.parentModel?.singularName,
274
277
  enableAuditTracking: model?.enableAuditTracking,
275
278
  enableSoftDelete: model?.enableSoftDelete,
@@ -608,57 +611,62 @@ export class ModelMetadataService {
608
611
  }
609
612
  }
610
613
 
614
+ await this.dataSource.query(
615
+ `CALL cleanup_model_metadata($1, $2)`,
616
+ [modelEntity.singularName, true],
617
+ );
618
+
611
619
  // Delete the permissions, menu, actions & views related to this model.
612
- const controllerName = `${classify(modelEntity.singularName)}Controller`;
613
- const permissionNames = [
614
- `${controllerName}.delete`,
615
- `${controllerName}.deleteMany`,
616
- `${controllerName}.findOne`,
617
- `${controllerName}.findMany`,
618
- `${controllerName}.recover`,
619
- `${controllerName}.recoverMany`,
620
- `${controllerName}.partialUpdate`,
621
- `${controllerName}.update`,
622
- `${controllerName}.insertMany`,
623
- `${controllerName}.create`,
624
- ];
625
- const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);
626
- const permissionsToDelete = await permissionsRepo.find({
627
- where: { name: In(permissionNames) },
628
- relations: ['roles'],
629
- });
620
+ // const controllerName = `${classify(modelEntity.singularName)}Controller`;
621
+ // const permissionNames = [
622
+ // `${controllerName}.delete`,
623
+ // `${controllerName}.deleteMany`,
624
+ // `${controllerName}.findOne`,
625
+ // `${controllerName}.findMany`,
626
+ // `${controllerName}.recover`,
627
+ // `${controllerName}.recoverMany`,
628
+ // `${controllerName}.partialUpdate`,
629
+ // `${controllerName}.update`,
630
+ // `${controllerName}.insertMany`,
631
+ // `${controllerName}.create`,
632
+ // ];
633
+ // const permissionsRepo = this.dataSource.getRepository(PermissionMetadata);
634
+ // const permissionsToDelete = await permissionsRepo.find({
635
+ // where: { name: In(permissionNames) },
636
+ // relations: ['roles'],
637
+ // });
630
638
 
631
639
  // Remove role associations first
632
- for (const permission of permissionsToDelete) {
633
- if (permission.roles?.length) {
634
- await this.dataSource
635
- .createQueryBuilder()
636
- .relation(PermissionMetadata, 'roles')
637
- .of(permission) // permission instance or its ID
638
- .remove(permission.roles); // remove all linked roles
639
- }
640
- }
640
+ // for (const permission of permissionsToDelete) {
641
+ // if (permission.roles?.length) {
642
+ // await this.dataSource
643
+ // .createQueryBuilder()
644
+ // .relation(PermissionMetadata, 'roles')
645
+ // .of(permission) // permission instance or its ID
646
+ // .remove(permission.roles); // remove all linked roles
647
+ // }
648
+ // }
641
649
 
642
- await permissionsRepo.remove(permissionsToDelete);
650
+ // await permissionsRepo.remove(permissionsToDelete);
643
651
 
644
652
  // Delete actions
645
- const actionRepo = this.dataSource.getRepository(ActionMetadata);
646
- const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });
647
- await actionRepo.delete({ model: { id: modelEntity.id } });
648
-
649
- // Delete menu items
650
- const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);
651
- if (action) {
652
- const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });
653
- for (let i = 0; i < menuItems.length; i++) {
654
- const menuItem = menuItems[i];
655
- await menuItemRepo.remove(menuItem);
656
- }
657
- }
653
+ // const actionRepo = this.dataSource.getRepository(ActionMetadata);
654
+ // const action = await actionRepo.findOne({ where: { model: { id: modelEntity.id } } });
655
+ // await actionRepo.delete({ model: { id: modelEntity.id } });
656
+
657
+ // // Delete menu items
658
+ // const menuItemRepo = this.dataSource.getRepository(MenuItemMetadata);
659
+ // if (action) {
660
+ // const menuItems = await menuItemRepo.find({ where: { action: { id: action.id } } });
661
+ // for (let i = 0; i < menuItems.length; i++) {
662
+ // const menuItem = menuItems[i];
663
+ // await menuItemRepo.remove(menuItem);
664
+ // }
665
+ // }
658
666
 
659
667
  // Delete view
660
- const viewRepo = this.dataSource.getRepository(ViewMetadata);
661
- await viewRepo.delete({ model: { id: modelEntity.id } })
668
+ // const viewRepo = this.dataSource.getRepository(ViewMetadata);
669
+ // await viewRepo.delete({ model: { id: modelEntity.id } })
662
670
 
663
671
  // <moduleName>-metadata.json | Remove references to this model in the model metadata, menu, action & view sections. | Automatic
664
672
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(modelEntity.module?.name);
@@ -1174,14 +1182,24 @@ export class ModelMetadataService {
1174
1182
  };
1175
1183
  const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
1176
1184
 
1185
+ let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1186
+
1187
+ // If a list of field ids or field names is passed for refresh, use these fields only
1188
+ if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
1189
+ fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
1190
+ } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
1191
+ fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
1192
+ }
1193
+ // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1194
+
1177
1195
  //Execute the schematic command to refresh the model
1178
- const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
1196
+ const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);
1179
1197
 
1180
1198
  return `${refreshOuput}`;
1181
1199
  }
1182
1200
 
1183
- private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
1184
- const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1201
+ private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {
1202
+ // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1185
1203
  const output = await this.schematicService.executeSchematicCommand(
1186
1204
  REFRESH_MODEL_COMMAND,
1187
1205
  {
@@ -1195,6 +1213,9 @@ export class ModelMetadataService {
1195
1213
  parentModel: model.parentModel?.singularName,
1196
1214
  parentModule: model.parentModel?.module?.name,
1197
1215
  draftPublishWorkflowEnabled: model.draftPublishWorkflow,
1216
+ isLegacyTable: model.isLegacyTable,
1217
+ isLegacyTableWithId: model.isLegacyTableWithId,
1218
+ dataSourceType: model.dataSourceType,
1198
1219
  },
1199
1220
  dryRun
1200
1221
  );