@solidstarters/solid-core 1.2.192 → 1.2.200

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 (376) hide show
  1. package/dist/commands/mcp.command.d.ts +20 -0
  2. package/dist/commands/mcp.command.d.ts.map +1 -0
  3. package/dist/commands/mcp.command.js +208 -0
  4. package/dist/commands/mcp.command.js.map +1 -0
  5. package/dist/commands/refresh-model.command.d.ts +8 -5
  6. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  7. package/dist/commands/refresh-model.command.js +32 -0
  8. package/dist/commands/refresh-model.command.js.map +1 -1
  9. package/dist/commands/remove-fields.command.js +1 -1
  10. package/dist/commands/remove-fields.command.js.map +1 -1
  11. package/dist/commands/seed.command.d.ts +2 -0
  12. package/dist/commands/seed.command.d.ts.map +1 -1
  13. package/dist/commands/seed.command.js +28 -1
  14. package/dist/commands/seed.command.js.map +1 -1
  15. package/dist/controllers/authentication.controller.js +1 -1
  16. package/dist/controllers/authentication.controller.js.map +1 -1
  17. package/dist/controllers/email-template.controller.js +1 -1
  18. package/dist/controllers/email-template.controller.js.map +1 -1
  19. package/dist/controllers/field-metadata.controller.d.ts +136 -4
  20. package/dist/controllers/field-metadata.controller.d.ts.map +1 -1
  21. package/dist/controllers/field-metadata.controller.js +14 -1
  22. package/dist/controllers/field-metadata.controller.js.map +1 -1
  23. package/dist/controllers/media-storage-provider-metadata.controller.js +1 -1
  24. package/dist/controllers/media-storage-provider-metadata.controller.js.map +1 -1
  25. package/dist/controllers/model-metadata.controller.js +1 -1
  26. package/dist/controllers/model-metadata.controller.js.map +1 -1
  27. package/dist/controllers/module-metadata.controller.js +1 -1
  28. package/dist/controllers/module-metadata.controller.js.map +1 -1
  29. package/dist/controllers/otp-authentication.controller.js +1 -1
  30. package/dist/controllers/otp-authentication.controller.js.map +1 -1
  31. package/dist/controllers/service.controller.js +1 -1
  32. package/dist/controllers/service.controller.js.map +1 -1
  33. package/dist/controllers/sms-template.controller.js +1 -1
  34. package/dist/controllers/sms-template.controller.js.map +1 -1
  35. package/dist/controllers/test-queue.controller.js +1 -1
  36. package/dist/controllers/test-queue.controller.js.map +1 -1
  37. package/dist/controllers/test.controller.js +1 -1
  38. package/dist/controllers/test.controller.js.map +1 -1
  39. package/dist/dtos/create-ai-interaction.dto.d.ts +2 -0
  40. package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
  41. package/dist/dtos/create-ai-interaction.dto.js +14 -1
  42. package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
  43. package/dist/dtos/create-field-metadata.dto.d.ts +22 -5
  44. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  45. package/dist/dtos/create-field-metadata.dto.js +33 -7
  46. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  47. package/dist/dtos/create-import-transaction.dto.d.ts +0 -1
  48. package/dist/dtos/create-import-transaction.dto.d.ts.map +1 -1
  49. package/dist/dtos/create-import-transaction.dto.js +1 -7
  50. package/dist/dtos/create-import-transaction.dto.js.map +1 -1
  51. package/dist/dtos/create-model-metadata.dto.d.ts +2 -0
  52. package/dist/dtos/create-model-metadata.dto.d.ts.map +1 -1
  53. package/dist/dtos/create-model-metadata.dto.js +13 -1
  54. package/dist/dtos/create-model-metadata.dto.js.map +1 -1
  55. package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
  56. package/dist/dtos/create-role-metadata.dto.js +5 -1
  57. package/dist/dtos/create-role-metadata.dto.js.map +1 -1
  58. package/dist/dtos/resolve-s3-url.dto.d.ts +10 -0
  59. package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -0
  60. package/dist/dtos/resolve-s3-url.dto.js +49 -0
  61. package/dist/dtos/resolve-s3-url.dto.js.map +1 -0
  62. package/dist/dtos/update-ai-interaction.dto.d.ts +2 -0
  63. package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
  64. package/dist/dtos/update-ai-interaction.dto.js +13 -1
  65. package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
  66. package/dist/dtos/update-field-metadata.dto.d.ts.map +1 -1
  67. package/dist/dtos/update-field-metadata.dto.js.map +1 -1
  68. package/dist/dtos/update-import-transaction.dto.d.ts +0 -1
  69. package/dist/dtos/update-import-transaction.dto.d.ts.map +1 -1
  70. package/dist/dtos/update-import-transaction.dto.js +1 -7
  71. package/dist/dtos/update-import-transaction.dto.js.map +1 -1
  72. package/dist/entities/action-metadata.entity.js +4 -4
  73. package/dist/entities/action-metadata.entity.js.map +1 -1
  74. package/dist/entities/ai-interaction.entity.d.ts +2 -0
  75. package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
  76. package/dist/entities/ai-interaction.entity.js +15 -6
  77. package/dist/entities/ai-interaction.entity.js.map +1 -1
  78. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  79. package/dist/entities/chatter-message-details.entity.js +1 -1
  80. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  81. package/dist/entities/chatter-message.entity.js +1 -1
  82. package/dist/entities/chatter-message.entity.js.map +1 -1
  83. package/dist/entities/common.entity.d.ts +2 -3
  84. package/dist/entities/common.entity.d.ts.map +1 -1
  85. package/dist/entities/common.entity.js +9 -11
  86. package/dist/entities/common.entity.js.map +1 -1
  87. package/dist/entities/dashboard-question-sql-dataset-config.entity.js +2 -2
  88. package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
  89. package/dist/entities/dashboard-question.entity.js +3 -3
  90. package/dist/entities/dashboard-question.entity.js.map +1 -1
  91. package/dist/entities/dashboard-variable.entity.js +3 -3
  92. package/dist/entities/dashboard-variable.entity.js.map +1 -1
  93. package/dist/entities/dashboard.entity.js +1 -1
  94. package/dist/entities/dashboard.entity.js.map +1 -1
  95. package/dist/entities/email-template.entity.d.ts.map +1 -1
  96. package/dist/entities/email-template.entity.js +4 -3
  97. package/dist/entities/email-template.entity.js.map +1 -1
  98. package/dist/entities/export-template.entity.js +2 -2
  99. package/dist/entities/export-template.entity.js.map +1 -1
  100. package/dist/entities/export-transaction.entity.js +2 -2
  101. package/dist/entities/export-transaction.entity.js.map +1 -1
  102. package/dist/entities/field-metadata.entity.d.ts +1 -0
  103. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  104. package/dist/entities/field-metadata.entity.js +8 -4
  105. package/dist/entities/field-metadata.entity.js.map +1 -1
  106. package/dist/entities/import-transaction-error-log.entity.js +1 -1
  107. package/dist/entities/import-transaction-error-log.entity.js.map +1 -1
  108. package/dist/entities/import-transaction.entity.d.ts +0 -1
  109. package/dist/entities/import-transaction.entity.d.ts.map +1 -1
  110. package/dist/entities/import-transaction.entity.js +2 -7
  111. package/dist/entities/import-transaction.entity.js.map +1 -1
  112. package/dist/entities/legacy-common-with-id.entity.d.ts +5 -0
  113. package/dist/entities/legacy-common-with-id.entity.d.ts.map +1 -0
  114. package/dist/entities/legacy-common-with-id.entity.js +32 -0
  115. package/dist/entities/legacy-common-with-id.entity.js.map +1 -0
  116. package/dist/entities/legacy-common.entity.d.ts +13 -0
  117. package/dist/entities/legacy-common.entity.d.ts.map +1 -0
  118. package/dist/entities/legacy-common.entity.js +67 -0
  119. package/dist/entities/legacy-common.entity.js.map +1 -0
  120. package/dist/entities/list-of-values.entity.js +2 -2
  121. package/dist/entities/list-of-values.entity.js.map +1 -1
  122. package/dist/entities/locale.entity.js +1 -1
  123. package/dist/entities/locale.entity.js.map +1 -1
  124. package/dist/entities/media.entity.d.ts.map +1 -1
  125. package/dist/entities/media.entity.js +3 -3
  126. package/dist/entities/media.entity.js.map +1 -1
  127. package/dist/entities/menu-item-metadata.entity.js +4 -4
  128. package/dist/entities/menu-item-metadata.entity.js.map +1 -1
  129. package/dist/entities/model-metadata.entity.d.ts +2 -0
  130. package/dist/entities/model-metadata.entity.d.ts.map +1 -1
  131. package/dist/entities/model-metadata.entity.js +11 -3
  132. package/dist/entities/model-metadata.entity.js.map +1 -1
  133. package/dist/entities/mq-message-queue.entity.js +1 -1
  134. package/dist/entities/mq-message-queue.entity.js.map +1 -1
  135. package/dist/entities/mq-message.entity.d.ts +3 -3
  136. package/dist/entities/mq-message.entity.d.ts.map +1 -1
  137. package/dist/entities/mq-message.entity.js +10 -10
  138. package/dist/entities/mq-message.entity.js.map +1 -1
  139. package/dist/entities/saved-filters.entity.js +4 -4
  140. package/dist/entities/saved-filters.entity.js.map +1 -1
  141. package/dist/entities/scheduled-job.entity.js +4 -4
  142. package/dist/entities/scheduled-job.entity.js.map +1 -1
  143. package/dist/entities/security-rule.entity.js +2 -2
  144. package/dist/entities/security-rule.entity.js.map +1 -1
  145. package/dist/entities/setting.entity.js +2 -2
  146. package/dist/entities/setting.entity.js.map +1 -1
  147. package/dist/entities/sms-template.entity.js +2 -2
  148. package/dist/entities/sms-template.entity.js.map +1 -1
  149. package/dist/entities/user-activity-history.entity.d.ts.map +1 -1
  150. package/dist/entities/user-activity-history.entity.js +1 -1
  151. package/dist/entities/user-activity-history.entity.js.map +1 -1
  152. package/dist/entities/user-view-metadata.entity.js +2 -2
  153. package/dist/entities/user-view-metadata.entity.js.map +1 -1
  154. package/dist/entities/user.entity.js +13 -15
  155. package/dist/entities/user.entity.js.map +1 -1
  156. package/dist/entities/view-metadata.entity.js +3 -3
  157. package/dist/entities/view-metadata.entity.js.map +1 -1
  158. package/dist/helpers/date.helper.d.ts +1 -1
  159. package/dist/helpers/date.helper.d.ts.map +1 -1
  160. package/dist/helpers/date.helper.js +24 -2
  161. package/dist/helpers/date.helper.js.map +1 -1
  162. package/dist/helpers/model-metadata-helper.service.d.ts +4 -1
  163. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  164. package/dist/helpers/model-metadata-helper.service.js +48 -30
  165. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  166. package/dist/helpers/module.helper.d.ts.map +1 -1
  167. package/dist/helpers/module.helper.js +1 -3
  168. package/dist/helpers/module.helper.js.map +1 -1
  169. package/dist/helpers/schematic.service.d.ts +9 -3
  170. package/dist/helpers/schematic.service.d.ts.map +1 -1
  171. package/dist/helpers/schematic.service.js +49 -32
  172. package/dist/helpers/schematic.service.js.map +1 -1
  173. package/dist/helpers/solid-registry.d.ts +3 -2
  174. package/dist/helpers/solid-registry.d.ts.map +1 -1
  175. package/dist/helpers/solid-registry.js +10 -0
  176. package/dist/helpers/solid-registry.js.map +1 -1
  177. package/dist/helpers/typeorm-db-helper.d.ts +3 -0
  178. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -0
  179. package/dist/helpers/typeorm-db-helper.js +24 -0
  180. package/dist/helpers/typeorm-db-helper.js.map +1 -0
  181. package/dist/index.d.ts +5 -1
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +5 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/interfaces.d.ts +3 -0
  186. package/dist/interfaces.d.ts.map +1 -1
  187. package/dist/interfaces.js.map +1 -1
  188. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
  189. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +6 -1
  190. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  191. package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
  192. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  193. package/dist/seeders/module-metadata-seeder.service.js +39 -17
  194. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  195. package/dist/seeders/seed-data/solid-core-metadata.json +53 -468
  196. package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
  197. package/dist/seeders/system-fields-seeder.service.js +1 -1
  198. package/dist/seeders/system-fields-seeder.service.js.map +1 -1
  199. package/dist/services/ai-interaction.service.js +1 -1
  200. package/dist/services/ai-interaction.service.js.map +1 -1
  201. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
  202. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +6 -4
  203. package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
  204. package/dist/services/crud-helper.service.d.ts +8 -0
  205. package/dist/services/crud-helper.service.d.ts.map +1 -1
  206. package/dist/services/crud-helper.service.js +28 -5
  207. package/dist/services/crud-helper.service.js.map +1 -1
  208. package/dist/services/crud.service.d.ts +4 -1
  209. package/dist/services/crud.service.d.ts.map +1 -1
  210. package/dist/services/crud.service.js +87 -7
  211. package/dist/services/crud.service.js.map +1 -1
  212. package/dist/services/field-metadata.service.d.ts +143 -6
  213. package/dist/services/field-metadata.service.d.ts.map +1 -1
  214. package/dist/services/field-metadata.service.js +211 -56
  215. package/dist/services/field-metadata.service.js.map +1 -1
  216. package/dist/services/menu-item-metadata.service.d.ts +3 -1
  217. package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
  218. package/dist/services/menu-item-metadata.service.js +31 -11
  219. package/dist/services/menu-item-metadata.service.js.map +1 -1
  220. package/dist/services/model-metadata.service.d.ts.map +1 -1
  221. package/dist/services/model-metadata.service.js +14 -3
  222. package/dist/services/model-metadata.service.js.map +1 -1
  223. package/dist/services/mq-message.service.d.ts.map +1 -1
  224. package/dist/services/mq-message.service.js +3 -4
  225. package/dist/services/mq-message.service.js.map +1 -1
  226. package/dist/services/queues/publisher-factory.service.d.ts.map +1 -1
  227. package/dist/services/queues/publisher-factory.service.js +4 -0
  228. package/dist/services/queues/publisher-factory.service.js.map +1 -1
  229. package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.d.ts +2 -2
  230. package/dist/services/selection-providers/list-of-values-selection-providers.service.d.ts.map +1 -0
  231. package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.js +3 -3
  232. package/dist/services/selection-providers/list-of-values-selection-providers.service.js.map +1 -0
  233. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts +20 -0
  234. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts.map +1 -0
  235. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js +87 -0
  236. package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js.map +1 -0
  237. package/dist/services/setting.service.d.ts.map +1 -1
  238. package/dist/services/setting.service.js +2 -1
  239. package/dist/services/setting.service.js.map +1 -1
  240. package/dist/services/solid-introspect.service.d.ts +19 -3
  241. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  242. package/dist/services/solid-introspect.service.js +83 -11
  243. package/dist/services/solid-introspect.service.js.map +1 -1
  244. package/dist/services/view-metadata.service.d.ts +3 -1
  245. package/dist/services/view-metadata.service.d.ts.map +1 -1
  246. package/dist/services/view-metadata.service.js +31 -5
  247. package/dist/services/view-metadata.service.js.map +1 -1
  248. package/dist/solid-core.module.d.ts.map +1 -1
  249. package/dist/solid-core.module.js +5 -1
  250. package/dist/solid-core.module.js.map +1 -1
  251. package/dist/subscribers/audit.subscriber.d.ts +3 -2
  252. package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
  253. package/dist/subscribers/audit.subscriber.js +6 -12
  254. package/dist/subscribers/audit.subscriber.js.map +1 -1
  255. package/dist/subscribers/computed-entity-field.subscriber.d.ts +3 -2
  256. package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
  257. package/dist/subscribers/computed-entity-field.subscriber.js +7 -9
  258. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  259. package/dist/subscribers/created-by-updated-by.subscriber.d.ts +4 -2
  260. package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
  261. package/dist/subscribers/created-by-updated-by.subscriber.js +10 -8
  262. package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
  263. package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
  264. package/dist/subscribers/field-metadata.subscriber.js +0 -1
  265. package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
  266. package/dist/subscribers/model-metadata.subscriber.d.ts.map +1 -1
  267. package/dist/subscribers/model-metadata.subscriber.js +3 -2
  268. package/dist/subscribers/model-metadata.subscriber.js.map +1 -1
  269. package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts +3 -2
  270. package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts.map +1 -1
  271. package/dist/subscribers/soft-delete-aware-event.subscriber.js +6 -11
  272. package/dist/subscribers/soft-delete-aware-event.subscriber.js.map +1 -1
  273. package/dist/tsconfig.tsbuildinfo +1 -1
  274. package/package.json +1 -1
  275. package/sql/mssql/proc_CleanupModelMetadata.sql +175 -0
  276. package/sql/mssql/proc_CleanupModuleMetadata.sql +78 -0
  277. package/sql/mssql/scratchpad.sql +10 -0
  278. package/sql/postgres/proc_CleanupModelMetadata.sql +148 -0
  279. package/sql/postgres/proc_CleanupModuleMetadata.sql +50 -0
  280. package/sql/postgres/scratchpad.sql +12 -0
  281. package/sql-server-changes.txt +88 -0
  282. package/src/commands/mcp.command.ts +215 -0
  283. package/src/commands/refresh-model.command.ts +37 -5
  284. package/src/commands/remove-fields.command.ts +1 -1
  285. package/src/commands/seed.command.ts +34 -15
  286. package/src/controllers/authentication.controller.ts +1 -1
  287. package/src/controllers/email-template.controller.ts +1 -1
  288. package/src/controllers/field-metadata.controller.ts +7 -1
  289. package/src/controllers/media-storage-provider-metadata.controller.ts +1 -1
  290. package/src/controllers/model-metadata.controller.ts +1 -1
  291. package/src/controllers/module-metadata.controller.ts +1 -1
  292. package/src/controllers/otp-authentication.controller.ts +1 -1
  293. package/src/controllers/service.controller.ts +1 -1
  294. package/src/controllers/sms-template.controller.ts +1 -1
  295. package/src/controllers/test-queue.controller.ts +1 -1
  296. package/src/controllers/test.controller.ts +1 -1
  297. package/src/dtos/create-ai-interaction.dto.ts +16 -9
  298. package/src/dtos/create-field-metadata.dto.ts +42 -12
  299. package/src/dtos/create-import-transaction.dto.ts +0 -4
  300. package/src/dtos/create-model-metadata.dto.ts +10 -0
  301. package/src/dtos/create-role-metadata.dto.ts +8 -2
  302. package/src/dtos/resolve-s3-url.dto.ts +33 -0
  303. package/src/dtos/update-ai-interaction.dto.ts +16 -9
  304. package/src/dtos/update-field-metadata.dto.ts +1 -2
  305. package/src/dtos/update-import-transaction.dto.ts +0 -4
  306. package/src/entities/action-metadata.entity.ts +4 -4
  307. package/src/entities/ai-interaction.entity.ts +16 -12
  308. package/src/entities/chatter-message-details.entity.ts +18 -18
  309. package/src/entities/chatter-message.entity.ts +2 -2
  310. package/src/entities/common.entity.ts +19 -10
  311. package/src/entities/dashboard-question-sql-dataset-config.entity.ts +2 -2
  312. package/src/entities/dashboard-question.entity.ts +3 -3
  313. package/src/entities/dashboard-variable.entity.ts +3 -3
  314. package/src/entities/dashboard.entity.ts +1 -1
  315. package/src/entities/email-template.entity.ts +4 -3
  316. package/src/entities/export-template.entity.ts +2 -2
  317. package/src/entities/export-transaction.entity.ts +2 -2
  318. package/src/entities/field-metadata.entity.ts +6 -3
  319. package/src/entities/import-transaction-error-log.entity.ts +2 -2
  320. package/src/entities/import-transaction.entity.ts +2 -5
  321. package/src/entities/legacy-common-with-id.entity.ts +11 -0
  322. package/src/entities/legacy-common.entity.ts +57 -0
  323. package/src/entities/list-of-values.entity.ts +2 -2
  324. package/src/entities/locale.entity.ts +1 -1
  325. package/src/entities/media.entity.ts +25 -25
  326. package/src/entities/menu-item-metadata.entity.ts +4 -4
  327. package/src/entities/model-metadata.entity.ts +9 -2
  328. package/src/entities/mq-message-queue.entity.ts +1 -1
  329. package/src/entities/mq-message.entity.ts +34 -34
  330. package/src/entities/saved-filters.entity.ts +5 -5
  331. package/src/entities/scheduled-job.entity.ts +4 -4
  332. package/src/entities/security-rule.entity.ts +2 -2
  333. package/src/entities/setting.entity.ts +2 -2
  334. package/src/entities/sms-template.entity.ts +2 -2
  335. package/src/entities/user-activity-history.entity.ts +14 -14
  336. package/src/entities/user-view-metadata.entity.ts +2 -2
  337. package/src/entities/user.entity.ts +15 -15
  338. package/src/entities/view-metadata.entity.ts +3 -3
  339. package/src/helpers/date.helper.ts +31 -10
  340. package/src/helpers/model-metadata-helper.service.ts +63 -32
  341. package/src/helpers/module.helper.ts +4 -3
  342. package/src/helpers/schematic.service.ts +72 -46
  343. package/src/helpers/solid-registry.ts +14 -2
  344. package/src/helpers/typeorm-db-helper.ts +26 -0
  345. package/src/index.ts +5 -1
  346. package/src/interfaces.ts +3 -0
  347. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +17 -21
  348. package/src/seeders/module-metadata-seeder.service.ts +73 -29
  349. package/src/seeders/seed-data/solid-core-metadata.json +55 -470
  350. package/src/seeders/system-fields-seeder.service.ts +34 -35
  351. package/src/services/ai-interaction.service.ts +1 -1
  352. package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +13 -9
  353. package/src/services/crud-helper.service.ts +32 -4
  354. package/src/services/crud.service.ts +158 -10
  355. package/src/services/field-metadata.service.ts +272 -67
  356. package/src/services/menu-item-metadata.service.ts +81 -50
  357. package/src/services/model-metadata.service.ts +18 -3
  358. package/src/services/mq-message.service.ts +16 -15
  359. package/src/services/queues/publisher-factory.service.ts +2 -1
  360. package/src/{providers → services/selection-providers}/list-of-values-selection-providers.service.ts +2 -2
  361. package/src/services/selection-providers/pseudo-foreign-key-selection-provider.service.ts +94 -0
  362. package/src/services/setting.service.ts +13 -10
  363. package/src/services/solid-introspect.service.ts +110 -10
  364. package/src/services/view-metadata.service.ts +48 -18
  365. package/src/solid-core.module.ts +5 -1
  366. package/src/subscribers/audit.subscriber.ts +12 -8
  367. package/src/subscribers/computed-entity-field.subscriber.ts +13 -7
  368. package/src/subscribers/created-by-updated-by.subscriber.ts +14 -8
  369. package/src/subscribers/field-metadata.subscriber.ts +1 -1
  370. package/src/subscribers/model-metadata.subscriber.ts +4 -2
  371. package/src/subscribers/soft-delete-aware-event.subscriber.ts +12 -6
  372. package/dist/providers/list-of-values-selection-providers.service.d.ts.map +0 -1
  373. package/dist/providers/list-of-values-selection-providers.service.js.map +0 -1
  374. package/src/commands/ingest-rag-chunking-strategy-for.md +0 -224
  375. package/src/entities/user.entity.ts.bkp +0 -144
  376. package/src/services/docker exec -it mssql //" +0 -8
@@ -7,7 +7,7 @@ import { ComputedFieldMetadata, SolidRegistry } from 'src/helpers/solid-registry
7
7
  import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
8
8
  import { DataSource, Repository, SelectQueryBuilder } from 'typeorm';
9
9
  import { BasicFilterDto } from '../dtos/basic-filters.dto';
10
- import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MediaType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
10
+ import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MediaType, MSSQLType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
11
11
  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';
@@ -16,12 +16,18 @@ import { ISelectionProviderValues } 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
+ import { ResolveS3UrlDto } from 'src/dtos/resolve-s3-url.dto';
20
+ import { ConfigService } from '@nestjs/config';
21
+ import { FileService } from './file.service';
19
22
 
20
23
 
21
24
  @Injectable()
22
25
  export class FieldMetadataService implements OnApplicationBootstrap {
23
26
  constructor(
24
27
  private readonly fieldMetadataRepo: FieldMetadataRepository,
28
+ private readonly configService: ConfigService,
29
+ private readonly fileService: FileService,
30
+
25
31
  @InjectDataSource()
26
32
  private readonly dataSource: DataSource,
27
33
  private readonly solidRegistry: SolidRegistry,
@@ -35,9 +41,9 @@ export class FieldMetadataService implements OnApplicationBootstrap {
35
41
  this.loadAndRegisterComputedFieldsDetails();
36
42
  }
37
43
 
38
- async loadAndRegisterComputedFieldsDetails() {
44
+ async loadAndRegisterComputedFieldsDetails() {
39
45
  // Load all the modules and models and within that load all the computed fields
40
- const computedFieldsWithModelAndModule = await this.fieldMetadataRepo.findComputedFieldsPopulatedWithModelAndModule();
46
+ const computedFieldsWithModelAndModule = await this.fieldMetadataRepo.findComputedFieldsPopulatedWithModelAndModule();
41
47
 
42
48
  // Convert the computed fields object above to the ComputedFieldMetadata type
43
49
  const computedFieldMetadata: ComputedFieldMetadata[] = computedFieldsWithModelAndModule.map((field) => {
@@ -354,7 +360,71 @@ export class FieldMetadataService implements OnApplicationBootstrap {
354
360
  };
355
361
 
356
362
  // Orm Data type and Solid Dat Type Mapping
357
- const ormFieldTypeForSolid = {
363
+ const ormFieldTypeForSolid = this.getOrmFieldTypes();
364
+
365
+ // Fetch Data Source Type
366
+ const dataSourceTypes = Object.keys(ormFieldTypeForSolid); // ["psql"]
367
+
368
+ const fieldTypes = Object.entries(ormFieldTypeForSolid.postgres).map(([key, value]) => ({
369
+ type: key,
370
+ label: key,
371
+ value: key,
372
+ fieldType: key,
373
+ ormTypes: value.ormTypes,
374
+ fields: this.fetchCurrentFields(key)
375
+ }));
376
+
377
+ const dataSource = this.solidRegistry.getSolidDatabaseModules().map((solidDatabaseModule) => {
378
+ return {
379
+ 'name': solidDatabaseModule.instance.name(),
380
+ 'type': solidDatabaseModule.instance.type()
381
+ }
382
+ });
383
+
384
+ // Creating response arrays for each enum
385
+ // Get all selection providers.
386
+ const sps = [];
387
+ const selectionProviders = this.solidRegistry.getSelectionProviders();
388
+ for (let i = 0; i < selectionProviders.length; i++) {
389
+ const selectionProvider = selectionProviders[i];
390
+ sps.push({
391
+ provider: selectionProvider.instance.name(),
392
+ help: selectionProvider.instance.help(),
393
+ });
394
+ }
395
+
396
+ const cps = [];
397
+ const computedProviders = this.solidRegistry.getComputedFieldProviders();
398
+ for (let i = 0; i < computedProviders.length; i++) {
399
+ const computedProvider = computedProviders[i];
400
+ cps.push({
401
+ provider: computedProvider.instance.name(),
402
+ help: computedProvider.instance.help(),
403
+ });
404
+ }
405
+
406
+ const r = {
407
+ // Field Types with ormtypes, available fields
408
+ fieldTypes: fieldTypes,
409
+ encryptionTypes: enumToResponseArray(EncryptionType),
410
+ ormType: ormFieldTypeForSolid,
411
+ decryptWhenTypes: enumToResponseArray(DecryptWhenType),
412
+ mediaTypes: enumToResponseArray(MediaType),
413
+ relationTypes: enumToResponseArray(RelationType),
414
+ selectionDynamicProviders: sps,
415
+ computedProviders: cps,
416
+ cascadeTypes: enumToResponseArray(CascadeType),
417
+ selectionValueTypes: enumToResponseArray(SelectionValueType),
418
+ computedFieldValueTypes: enumToResponseArray(ComputedFieldValueType),
419
+ dataSourceType: dataSourceTypes,
420
+ dataSource: dataSource,
421
+ };
422
+
423
+ return r
424
+ }
425
+
426
+ private getOrmFieldTypes() {
427
+ return {
358
428
  "postgres": {
359
429
  // Numeric types
360
430
  "int": {
@@ -379,6 +449,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
379
449
  },
380
450
  "json": {
381
451
  "ormTypes": [
452
+ // { label: PSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
453
+ { label: MSSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
382
454
  { label: PSQLType.json, description: "Stores JSON data without indexing." },
383
455
  { label: PSQLType.jsonb, description: "Stores JSON data with indexing for faster queries." }
384
456
  ]
@@ -443,69 +515,131 @@ export class FieldMetadataService implements OnApplicationBootstrap {
443
515
  "uuid": {
444
516
  "ormTypes": [{ label: PSQLType.varchar, description: "Stores universally unique identifiers (UUIDs)." }]
445
517
  }
446
- }
447
- };
518
+ },
519
+ "mssql": {
520
+ // Numeric types
521
+ "int": {
522
+ ormTypes: [
523
+ { label: MSSQLType.int, description: "A 4-byte integer for general numeric data." }
524
+ ]
525
+ },
526
+ "bigint": {
527
+ ormTypes: [
528
+ { label: MSSQLType.bigint, description: "An 8-byte integer for large numeric values." }
529
+ ]
530
+ },
531
+ "decimal": {
532
+ ormTypes: [
533
+ { label: MSSQLType.numeric, description: "A high-precision numeric type for financial or exact values." },
534
+ { label: MSSQLType.decimal, description: "A high-precision decimal type for financial or exact values." }
535
+ ]
536
+ },
448
537
 
538
+ // Text types
539
+ "shortText": {
540
+ ormTypes: [
541
+ { label: MSSQLType.varchar, description: "A variable-length string for short text." },
542
+ { label: MSSQLType.nvarchar, description: "A unicode supported variable-length string for short text." }
543
+ ]
544
+ },
545
+ "longText": {
546
+ ormTypes: [
547
+ { label: MSSQLType.nvarchar, description: "A large or unbounded string type." }
548
+ ]
549
+ },
550
+ "richText": {
551
+ ormTypes: [
552
+ { label: MSSQLType.nvarchar, description: "A large text field for formatted or long content." }
553
+ ]
554
+ },
555
+ "json": {
556
+ ormTypes: [
557
+ { label: MSSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
558
+ { label: MSSQLType.nvarchar, description: "Stores JSON data as string (MSSQL doesn't have native JSON type)." }
559
+ ]
560
+ },
449
561
 
450
- // Fetch Data Source Type
451
- const dataSourceTypes = Object.keys(ormFieldTypeForSolid); // ["psql"]
562
+ // Boolean types
563
+ "boolean": {
564
+ ormTypes: [
565
+ { label: MSSQLType.bit, description: "Stores true or false values as 0 or 1." }
566
+ ]
567
+ },
452
568
 
453
- const fieldTypes = Object.entries(ormFieldTypeForSolid.postgres).map(([key, value]) => ({
454
- type: key,
455
- label: key,
456
- value: key,
457
- fieldType: key,
458
- ormTypes: value.ormTypes,
459
- fields: this.fetchCurrentFields(key)
460
- }));
569
+ // Date and time types
570
+ "date": {
571
+ ormTypes: [
572
+ { label: MSSQLType.date, description: "Stores calendar dates (YYYY-MM-DD)." }
573
+ ]
574
+ },
575
+ "datetime": {
576
+ ormTypes: [
577
+ { label: MSSQLType.datetime, description: "Stores date and time without timezone." },
578
+ { label: MSSQLType.datetime2, description: "High-precision date and time type." }
579
+ ]
580
+ },
581
+ "time": {
582
+ ormTypes: [
583
+ { label: MSSQLType.time, description: "Stores time values (HH:MM:SS)." }
584
+ ]
585
+ },
461
586
 
462
- const dataSource = this.solidRegistry.getSolidDatabaseModules().map((solidDatabaseModule) => {
463
- return {
464
- 'name': solidDatabaseModule.instance.name(),
465
- 'type': solidDatabaseModule.instance.type()
466
- }
467
- });
587
+ // Relation
588
+ "relation": {
589
+ ormTypes: [
590
+ { label: MSSQLType.int, description: "Used for foreign keys referencing other entities." }
591
+ ]
592
+ },
468
593
 
469
- // Creating response arrays for each enum
470
- // Get all selection providers.
471
- const sps = [];
472
- const selectionProviders = this.solidRegistry.getSelectionProviders();
473
- for (let i = 0; i < selectionProviders.length; i++) {
474
- const selectionProvider = selectionProviders[i];
475
- sps.push({
476
- provider: selectionProvider.instance.name(),
477
- help: selectionProvider.instance.help(),
478
- });
479
- }
594
+ // Media types
595
+ "mediaSingle": {
596
+ ormTypes: [
597
+ { label: MSSQLType.varchar, description: "Stores file paths or URLs for single media files." }
598
+ ]
599
+ },
600
+ "mediaMultiple": {
601
+ ormTypes: [
602
+ { label: MSSQLType.varchar, description: "Stores file paths or URLs for multiple media files." }
603
+ ]
604
+ },
480
605
 
481
- const cps = [];
482
- const computedProviders = this.solidRegistry.getComputedFieldProviders();
483
- for (let i = 0; i < computedProviders.length; i++) {
484
- const computedProvider = computedProviders[i];
485
- cps.push({
486
- provider: computedProvider.instance.name(),
487
- help: computedProvider.instance.help(),
488
- });
489
- }
606
+ // Email and password
607
+ "email": {
608
+ ormTypes: [
609
+ { label: MSSQLType.nvarchar, description: "Stores email addresses." }
610
+ ]
611
+ },
612
+ "password": {
613
+ ormTypes: [
614
+ { label: MSSQLType.nvarchar, description: "Stores hashed or plain-text passwords." }
615
+ ]
616
+ },
490
617
 
491
- const r = {
492
- // Field Types with ormtypes, available fields
493
- fieldTypes: fieldTypes,
494
- encryptionTypes: enumToResponseArray(EncryptionType),
495
- ormType: ormFieldTypeForSolid,
496
- decryptWhenTypes: enumToResponseArray(DecryptWhenType),
497
- mediaTypes: enumToResponseArray(MediaType),
498
- relationTypes: enumToResponseArray(RelationType),
499
- selectionDynamicProviders: sps,
500
- computedProviders: cps,
501
- cascadeTypes: enumToResponseArray(CascadeType),
502
- selectionValueTypes: enumToResponseArray(SelectionValueType),
503
- computedFieldValueTypes: enumToResponseArray(ComputedFieldValueType),
504
- dataSourceType: dataSourceTypes,
505
- dataSource: dataSource,
506
- };
618
+ // Selection types
619
+ "selectionStatic": {
620
+ ormTypes: [
621
+ { label: MSSQLType.nvarchar, description: "Used for predefined selection options." }
622
+ ]
623
+ },
624
+ "selectionDynamic": {
625
+ ormTypes: [
626
+ { label: MSSQLType.nvarchar, description: "Used for dynamic selection options." }
627
+ ]
628
+ },
507
629
 
508
- return r
630
+ // Computed and external ID
631
+ "computed": {
632
+ ormTypes: [
633
+ { label: MSSQLType.nvarchar, description: "Represents computed or derived fields." }
634
+ ]
635
+ },
636
+ "uuid": {
637
+ ormTypes: [
638
+ { label: MSSQLType.uniqueidentifier, description: "Stores universally unique identifiers (UUIDs)." }
639
+ ]
640
+ }
641
+ }
642
+ };
509
643
  }
510
644
 
511
645
  async fetchCurrentFieldsBasedOnType(type: string) {
@@ -533,7 +667,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
533
667
  "encryptionType",
534
668
  "decryptWhen",
535
669
  "columnName",
536
- "enableAuditTracking"
670
+ "enableAuditTracking",
671
+ "isPrimaryKey"
537
672
  ];
538
673
 
539
674
  case SolidFieldType.bigint:
@@ -553,7 +688,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
553
688
  "encryptionType",
554
689
  "decryptWhen",
555
690
  "columnName",
556
- "enableAuditTracking"
691
+ "enableAuditTracking",
692
+ "isPrimaryKey"
557
693
  ];
558
694
 
559
695
  // case SolidFieldType.float:
@@ -616,7 +752,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
616
752
  "decryptWhen",
617
753
  "columnName",
618
754
  "isUserKey",
619
- "enableAuditTracking"
755
+ "enableAuditTracking",
756
+ "isPrimaryKey"
620
757
  ];
621
758
 
622
759
  case SolidFieldType.longtext:
@@ -852,7 +989,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
852
989
  "encryptionType",
853
990
  "decryptWhen",
854
991
  "columnName",
855
- "enableAuditTracking"
992
+ "enableAuditTracking",
993
+ "isPrimaryKey"
856
994
  ];
857
995
 
858
996
  case SolidFieldType.password:
@@ -964,10 +1102,6 @@ export class FieldMetadataService implements OnApplicationBootstrap {
964
1102
  "decryptWhen",
965
1103
  "columnName"
966
1104
  ];
967
-
968
-
969
-
970
-
971
1105
  default:
972
1106
  return [
973
1107
  "name",
@@ -1145,6 +1279,77 @@ export class FieldMetadataService implements OnApplicationBootstrap {
1145
1279
 
1146
1280
  return fieldObject;
1147
1281
  }
1282
+
1283
+ async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
1284
+
1285
+ const { modelName, fieldName, fieldValue, s3KeyFieldName } = resolveS3UrlDto;
1286
+
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
+ });
1295
+
1296
+ if (!model) {
1297
+ throw new NotFoundException(`Model ${modelName} not found`);
1298
+ }
1299
+
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
+ }
1309
+
1310
+ // ------------------------------------------------
1311
+ // 3. Load the actual entity repository
1312
+ // ------------------------------------------------
1313
+ const entityRepo = this.dataSource.getRepository(model.singularName);
1314
+
1315
+ // ------------------------------------------------
1316
+ // 4. Query using fieldName = fieldValue
1317
+ // ------------------------------------------------
1318
+ const record = await entityRepo.findOne({
1319
+ where: { [fieldName]: fieldValue }
1320
+ });
1321
+
1322
+ if (!record) {
1323
+ throw new NotFoundException(
1324
+ `${modelName} record not found for ${fieldName}="${fieldValue}"`
1325
+ );
1326
+ }
1327
+
1328
+ // ------------------------------------------------
1329
+ // 5. Extract S3 key from s3KeyFieldName
1330
+ // ------------------------------------------------
1331
+ const s3Key = record[s3KeyFieldName];
1332
+
1333
+ if (!s3Key) {
1334
+ throw new NotFoundException(
1335
+ `Field "${s3KeyFieldName}" has no value in ${modelName}.${fieldName}="${fieldValue}"`
1336
+ );
1337
+ }
1338
+
1339
+ // ------------------------------------------------
1340
+ // 6. Generate signed or public URL
1341
+ // ------------------------------------------------
1342
+ let url = "";
1343
+
1344
+ // TODO - get
1345
+ if (resolveS3UrlDto.isPrivate == "true") {
1346
+ const expiryInSeconds = 60 * 60;
1347
+ url = await this.fileService.getSignedUrl(s3Key, expiryInSeconds, resolveS3UrlDto.bucketName);
1348
+ } else {
1349
+ url = `https://${resolveS3UrlDto.bucketName}.s3.${this.configService.get('S3_AWS_REGION_NAME')}.amazonaws.com/${s3Key}`;
1350
+ }
1351
+ return { url: url }
1352
+ }
1148
1353
  }
1149
1354
 
1150
1355
 
@@ -16,6 +16,7 @@ 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> {
@@ -31,6 +32,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
31
32
  // @InjectRepository(MenuItemMetadata, 'default')
32
33
  // readonly repo: Repository<MenuItemMetadata>,
33
34
  readonly repo: MenuItemMetadataRepository,
35
+ readonly savedFiltersRepo: SavedFiltersRepository,
34
36
  readonly moduleRef: ModuleRef
35
37
 
36
38
  ) {
@@ -92,7 +94,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
92
94
  .leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')
93
95
  .leftJoinAndSelect('menuItem.action', 'action')
94
96
  .leftJoinAndSelect('action.model', 'model') // Join the model relation of action
95
- .leftJoinAndSelect('action.view', 'view') // Join the model relation of action
97
+ .leftJoinAndSelect('action.view', 'view') // Join the view relation of action
96
98
  .leftJoinAndSelect('menuItem.roles', 'roles')
97
99
  .where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })
98
100
  .addOrderBy('module.menuSequenceNumber', 'ASC')
@@ -120,73 +122,102 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
120
122
  // 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
123
  const menu: any[] = [];
122
124
 
123
- modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
124
- const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);
125
+ // modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
126
+ // const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);
127
+ // const moduleMetadata = modulesMap.get(moduleName);
128
+
129
+ // const moduleMenu = {
130
+ // title: moduleMetadata.displayName,
131
+ // // No need for path the module level.
132
+ // // path: ``,
133
+ // key: moduleName.toLowerCase().replace(/\s+/g, '-'),
134
+ // // TODO: We need to add the module icon as part of the metadata so it can be brought here.
135
+ // // icon: `/images/menu/${moduleName.toLowerCase().replace(/\s+/g, '-')}.svg`,
136
+ // children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),
137
+ // icon: moduleMetadata.menuIconUrl,
138
+ // };
139
+
140
+ // menu.push(moduleMenu);
141
+ // });
142
+ for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {
143
+ const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);
125
144
  const moduleMetadata = modulesMap.get(moduleName);
126
145
 
127
146
  const moduleMenu = {
128
147
  title: moduleMetadata.displayName,
129
- // No need for path the module level.
130
- // path: ``,
131
148
  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),
149
+ children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // await here
135
150
  icon: moduleMetadata.menuIconUrl,
136
151
  };
137
152
 
138
153
  menu.push(moduleMenu);
139
- });
154
+ }
155
+
140
156
 
141
157
  return menu.filter(m => m.children.length > 0);
142
158
  }
143
159
 
144
160
  // 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)
161
+ private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {
162
+ const menuItemsData = await Promise.all(
163
+ rootItems.map(async rootItem => {
164
+ const allowedMenuItems = allMenuItems.filter(i => {
165
+ if (!i.parentMenuItem) {
166
+ return true
167
+ } else {
168
+ return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)
169
+ }
170
+ });
171
+ // Get immediate children of the current loop variable menuItem.
172
+ const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);
173
+ const menuItemId = rootItem?.id ?? "";
174
+ const menuItemName = rootItem?.name ?? "";
175
+ const actionId = rootItem?.action?.id ?? "";
176
+ const actionName = rootItem?.action?.name ?? "";
177
+ // TODO: We should specify path only if there are no more children present.
178
+ // For now adding path everywhere.
179
+ let path = '';
180
+
181
+ const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null
182
+ let savedFilterId = null;
183
+ if (layout && layout?.attrs?.defaultSavedFilter) {
184
+ const savedFilter = await this.savedFiltersRepo.findOne({
185
+ where: {
186
+ name: layout?.attrs?.defaultSavedFilter,
187
+ isPrivate: false
188
+ },
189
+ });
190
+ if (savedFilter) {
191
+ savedFilterId = savedFilter.id
192
+ }
152
193
  }
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
-
194
+ if (rootItem.action && rootItem.action.type === 'custom') {
195
+ path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;
196
+ }
197
+ if (rootItem.action && rootItem.action.type === 'solid') {
198
+ if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
199
+ // TODO: Here we are assuming that we will always take the user to collection view of a model.
200
+ // We can make provision to take them other views also in the future.
201
+ // path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;
202
+ 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}` : ''}`;
203
+
204
+ }
173
205
  }
174
- }
175
206
 
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;
207
+ // We are not checking for empty path coz, this is required for parent menu items.
208
+ const data = {
209
+ title: rootItem.displayName || rootItem.name,
210
+ path: path,
211
+ key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
212
+ icon: rootItem.iconName,
213
+ // iconVariant : rootItem.iconVariant
214
+ }
215
+ if (children.length > 0) {
216
+ data["children"] = await this.buildMenuTree(children, allMenuItems, activeUser);
217
+ }
218
+ return data;
188
219
 
189
- });
220
+ }));
190
221
  return menuItemsData.filter(mi => mi && mi)
191
222
  }
192
223
 
@@ -270,6 +270,8 @@ export class ModelMetadataService {
270
270
  tableName: model.tableName,
271
271
  userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,
272
272
  isChild: model?.isChild,
273
+ isLegacyTable: model?.isLegacyTable,
274
+ isLegacyTableWithId: model?.isLegacyTableWithId,
273
275
  parentModelUserKey: model?.parentModel?.singularName,
274
276
  enableAuditTracking: model?.enableAuditTracking,
275
277
  enableSoftDelete: model?.enableSoftDelete,
@@ -1174,14 +1176,24 @@ export class ModelMetadataService {
1174
1176
  };
1175
1177
  const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
1176
1178
 
1179
+ let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1180
+
1181
+ // If a list of field ids or field names is passed for refresh, use these fields only
1182
+ if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
1183
+ fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
1184
+ } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
1185
+ fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
1186
+ }
1187
+ // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1188
+
1177
1189
  //Execute the schematic command to refresh the model
1178
- const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
1190
+ const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);
1179
1191
 
1180
1192
  return `${refreshOuput}`;
1181
1193
  }
1182
1194
 
1183
- private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
1184
- const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1195
+ private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {
1196
+ // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1185
1197
  const output = await this.schematicService.executeSchematicCommand(
1186
1198
  REFRESH_MODEL_COMMAND,
1187
1199
  {
@@ -1195,6 +1207,9 @@ export class ModelMetadataService {
1195
1207
  parentModel: model.parentModel?.singularName,
1196
1208
  parentModule: model.parentModel?.module?.name,
1197
1209
  draftPublishWorkflowEnabled: model.draftPublishWorkflow,
1210
+ isLegacyTable: model.isLegacyTable,
1211
+ isLegacyTableWithId: model.isLegacyTableWithId,
1212
+ dataSourceType: model.dataSourceType,
1198
1213
  },
1199
1214
  dryRun
1200
1215
  );