@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
@@ -70,17 +70,17 @@ export class MqMessageService extends CRUDService<MqMessage> {
70
70
  });
71
71
  }
72
72
 
73
- /**
74
- * Wait until a queue message reaches a terminal status (succeeded/failed).
75
- *
76
- * @param messageId string – the external message id you store in `ss_mq_message.messageId`
77
- * @param opts.timeoutMs total time to wait before giving up (default 60s)
78
- * @param opts.intervalMs initial poll interval (default 500ms)
79
- * @param opts.maxIntervalMs cap for exponential backoff (default 2000ms)
80
- * @param opts.throwOnFailure if true, throws when stage === 'failed' (default false)
81
- * @param opts.parseJson try JSON.parse on `output` and `error` (default true)
82
- * @returns resolves with the final MqMessage row when terminal, rejects on timeout (or failure if throwOnFailure)
83
- */
73
+ /**
74
+ * Wait until a queue message reaches a terminal status (succeeded/failed).
75
+ *
76
+ * @param messageId string – the external message id you store in `ss_mq_message.messageId`
77
+ * @param opts.timeoutMs total time to wait before giving up (default 60s)
78
+ * @param opts.intervalMs initial poll interval (default 500ms)
79
+ * @param opts.maxIntervalMs cap for exponential backoff (default 2000ms)
80
+ * @param opts.throwOnFailure if true, throws when stage === 'failed' (default false)
81
+ * @param opts.parseJson try JSON.parse on `output` and `error` (default true)
82
+ * @returns resolves with the final MqMessage row when terminal, rejects on timeout (or failure if throwOnFailure)
83
+ */
84
84
  async waitForTerminalStatus(
85
85
  messageId: string,
86
86
  opts?: {
@@ -139,14 +139,15 @@ export class MqMessageService extends CRUDService<MqMessage> {
139
139
  } else if (rec.stage === 'succeeded' || rec.stage === 'failed') {
140
140
  // Optionally parse output/error if they contain JSON strings
141
141
  if (parseJson) {
142
- rec.output = this.safeJsonParse(rec.output);
143
- rec.error = this.safeJsonParse(rec.error);
142
+ // rec.output = this.safeJsonParse(rec.output);
143
+ rec.output = rec.output;
144
+ // rec.error = this.safeJsonParse(rec.error);
145
+ rec.error = rec.error;
144
146
  }
145
147
 
146
148
  if (rec.stage === 'failed' && throwOnFailure) {
147
149
  throw new Error(
148
- `Queue message ${messageId} failed` +
149
- (rec.error ? `: ${JSON.stringify(rec.error).slice(0, 500)}` : '')
150
+ `Queue message ${messageId} failed` + (rec.error ? `: ${JSON.stringify(rec.error).slice(0, 500)}` : '')
150
151
  );
151
152
  }
152
153
  return rec;
@@ -1,4 +1,4 @@
1
- import { Logger } from '@nestjs/common';
1
+ import { forwardRef, Inject, Logger } from '@nestjs/common';
2
2
  import { Injectable } from '@nestjs/common';
3
3
 
4
4
  import { QueueMessage, QueuePublisher } from 'src/interfaces/mq';
@@ -11,6 +11,7 @@ export class PublisherFactory<T> {
11
11
  private readonly logger = new Logger(PublisherFactory.name);
12
12
 
13
13
  constructor(
14
+ @Inject(forwardRef(() => SolidIntrospectService))
14
15
  private readonly solidIntrospectionService: SolidIntrospectService
15
16
  ) {
16
17
  }
@@ -1,9 +1,9 @@
1
1
 
2
- import { ListOfValuesService } from "../services/list-of-values.service";
2
+ import { ListOfValuesService } from "../list-of-values.service";
3
3
  import { PaginationQueryDto } from "src/dtos/pagination-query.dto";
4
4
  import { SelectionProvider } from "src/decorators/selection-provider.decorator";
5
5
  import { Injectable } from "@nestjs/common";
6
- import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../interfaces";
6
+ import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
7
7
  import { filter } from "rxjs";
8
8
  import { BasicFilterDto } from "src/dtos/basic-filters.dto";
9
9
 
@@ -0,0 +1,94 @@
1
+ import { ListOfValuesService } from "../list-of-values.service";
2
+ import { SelectionProvider } from "src/decorators/selection-provider.decorator";
3
+ import { BadRequestException, Injectable } from "@nestjs/common";
4
+ import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
5
+ import { BasicFilterDto } from "src/dtos/basic-filters.dto";
6
+ import { SolidIntrospectService } from "../solid-introspect.service";
7
+ import { classify } from "@angular-devkit/core/src/utils/strings";
8
+ import { CRUDService } from "../crud.service";
9
+
10
+ interface PseudoForeignKeySelectionProviderContext extends ISelectionProviderContext {
11
+ modelName: string;
12
+ // ['countryName', 'countryCode'] - IN|INR
13
+ whereClauseFields: string[];
14
+ labelFieldName: string;
15
+ valueFieldName: string;
16
+ }
17
+
18
+ const DEFAULT_LIMIT = 100;
19
+
20
+ @SelectionProvider()
21
+ @Injectable()
22
+ export class PseudoForeignKeySelectionProvider implements ISelectionProvider<PseudoForeignKeySelectionProviderContext> {
23
+ constructor(
24
+ private readonly listOfValuesService: ListOfValuesService,
25
+ readonly introspectService: SolidIntrospectService,
26
+ ) { }
27
+
28
+ name(): string {
29
+ return 'PseudoForeignKeySelectionProvider';
30
+ }
31
+
32
+ help(): string {
33
+ return "# Use this provider to implement pseudo foreign key style relationships.";
34
+ }
35
+
36
+ async value(optionValue: string, ctxt: PseudoForeignKeySelectionProviderContext): Promise<ISelectionProviderValues | any> {
37
+ const basicFilterQuery = new BasicFilterDto(DEFAULT_LIMIT, 0);
38
+ basicFilterQuery.filters = {
39
+ [ctxt.valueFieldName]: {
40
+ $eq: optionValue
41
+ }
42
+ };
43
+
44
+ const modelServiceInstanceWrapper = this.introspectService.getProvider(`${classify(ctxt.modelName)}Service`);
45
+ if (!modelServiceInstanceWrapper) {
46
+ throw new BadRequestException(`Invalid model name (${ctxt.modelName}) specified in PseudoForeignKeySelectionProvider context.`);
47
+ }
48
+
49
+ const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;
50
+ const recs = await modelService.find(basicFilterQuery);
51
+ if (!recs.records || recs.records.length == 0) {
52
+ throw new Error(`Invalid optionValue=${optionValue}, for PseudoForeignKeySelectionProvider with context: ${JSON.stringify(ctxt)}`)
53
+ // return null;
54
+ }
55
+
56
+ return {
57
+ label: recs.records[0][ctxt.labelFieldName],
58
+ value: recs.records[0][ctxt.valueFieldName]
59
+ }
60
+ }
61
+
62
+ async values(query: string, ctxt: PseudoForeignKeySelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {
63
+ const basicFilterQuery = new BasicFilterDto(ctxt.limit, ctxt.offset);
64
+
65
+ // Next we get hold of the userkey field in the parent model.
66
+ if (query) {
67
+ basicFilterQuery.filters = {
68
+ $or: ctxt.whereClauseFields.map((whereClauseField) => {
69
+ return {
70
+ [whereClauseField]: {
71
+ $containsi: `%${query}%`
72
+ }
73
+ }
74
+ })
75
+ };
76
+ }
77
+
78
+ const modelServiceInstanceWrapper = this.introspectService.getProvider(`${classify(ctxt.modelName)}Service`);
79
+ if (!modelServiceInstanceWrapper) {
80
+ throw new BadRequestException(`Invalid model name (${ctxt.modelName}) specified in PseudoForeignKeySelectionProvider context.`);
81
+ }
82
+
83
+ const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;
84
+
85
+ const recs = await modelService.find(basicFilterQuery);
86
+ const selectionValues = recs.records.map(rec => {
87
+ return {
88
+ label: rec[ctxt.labelFieldName],
89
+ value: rec[ctxt.valueFieldName]
90
+ }
91
+ });
92
+ return selectionValues;
93
+ }
94
+ }
@@ -79,10 +79,10 @@ export class SettingService extends CRUDService<Setting> {
79
79
  authenticationPasswordRegexErrorMessage: this.iamConfiguration.PASSWORD_REGEX_ERROR_MESSAGE,
80
80
  authenticationPasswordComplexityDescription: this.iamConfiguration.PASSWORD_COMPLEXITY_DESC,
81
81
  solidXGenAiCodeBuilderConfig: JSON.stringify({
82
- defaultProvider: "",
83
- availableProviders: []
84
- }),
85
- showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration,
82
+ defaultProvider: "",
83
+ availableProviders: []
84
+ }),
85
+ showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration,
86
86
  forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin
87
87
  };
88
88
 
@@ -199,11 +199,11 @@ export class SettingService extends CRUDService<Setting> {
199
199
  authenticationPasswordRegexErrorMessage: this.iamConfiguration.PASSWORD_REGEX_ERROR_MESSAGE,
200
200
  authenticationPasswordComplexityDescription: this.iamConfiguration.PASSWORD_COMPLEXITY_DESC,
201
201
  solidXGenAiCodeBuilderConfig: JSON.stringify({
202
- defaultProvider: "",
203
- availableProviders: []
204
- }),
205
- iamAutoGeneratedPassword:this.iamConfiguration.iamAutoGeneratedPassword,
206
- showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration
202
+ defaultProvider: "",
203
+ availableProviders: []
204
+ }),
205
+ iamAutoGeneratedPassword: this.iamConfiguration.iamAutoGeneratedPassword,
206
+ showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration
207
207
  };
208
208
  }
209
209
 
@@ -297,7 +297,10 @@ export class SettingService extends CRUDService<Setting> {
297
297
  }
298
298
 
299
299
  const key = settingDto.key;
300
- const value = settingDto.value ?? '';
300
+ // const value = settingDto.value ?? '';
301
+ const rawValue = settingDto.value;
302
+ const value = rawValue === null || rawValue === undefined ? null : String(rawValue);
303
+
301
304
  const settingType = settingDto.type ?? 'system';
302
305
 
303
306
  const existingSetting = existingSettings.find(s => s.key === key);
@@ -1,19 +1,36 @@
1
1
  import { classify } from '@angular-devkit/core/src/utils/strings';
2
- import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
3
- import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';
2
+ import { forwardRef, Inject, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
3
+ import { DiscoveryService, MetadataScanner, ModuleRef, Reflector } from '@nestjs/core';
4
4
  import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
5
+ import { getDataSourceToken } from '@nestjs/typeorm';
5
6
  import { IS_COMPUTED_FIELD_PROVIDER } from 'src/decorators/computed-field-provider.decorator';
7
+ import { IS_DASHBOARD_QUESTION_DATA_PROVIDER } from 'src/decorators/dashboard-question-data-provider.decorator';
8
+ import { IS_DASHBOARD_VARIABLE_SELECTION_PROVIDER } from 'src/decorators/dashboard-selection-provider.decorator';
9
+ import { IS_ERROR_CODE_PROVIDER } from 'src/decorators/error-codes-provider.decorator';
10
+ import { IS_MAIL_PROVIDER } from 'src/decorators/mail-provider.decorator';
11
+ import { IS_SCHEDULED_JOB_PROVIDER } from 'src/decorators/scheduled-job-provider.decorator';
12
+ import { IS_SECURITY_RULE_CONFIG_PROVIDER } from 'src/decorators/security-rule-config-provider.decorator';
6
13
  import { IS_SELECTION_PROVIDER } from 'src/decorators/selection-provider.decorator';
7
14
  import { IS_SOLID_DATABASE_MODULE } from 'src/decorators/solid-database-module.decorator';
15
+ import { IS_WA_PROVIDER } from 'src/decorators/whatsapp-provider.decorator';
8
16
  import { SolidRegistry } from 'src/helpers/solid-registry';
17
+ import { DataSource } from 'typeorm';
9
18
  import { CRUDService } from './crud.service';
10
- import { IS_SCHEDULED_JOB_PROVIDER } from 'src/decorators/scheduled-job-provider.decorator';
11
- import { IS_DASHBOARD_VARIABLE_SELECTION_PROVIDER } from 'src/decorators/dashboard-selection-provider.decorator';
12
- import { IS_DASHBOARD_QUESTION_DATA_PROVIDER } from 'src/decorators/dashboard-question-data-provider.decorator';
13
- import { IS_MAIL_PROVIDER } from 'src/decorators/mail-provider.decorator';
14
- import { IS_WA_PROVIDER } from 'src/decorators/whatsapp-provider.decorator';
15
- import { IS_ERROR_CODE_PROVIDER } from 'src/decorators/error-codes-provider.decorator';
16
- import { IS_SECURITY_RULE_CONFIG_PROVIDER } from 'src/decorators/security-rule-config-provider.decorator';
19
+ import { RequestContextService } from './request-context.service';
20
+ import { CreatedByUpdatedBySubscriber } from 'src/subscribers/created-by-updated-by.subscriber';
21
+ import { AuditSubscriber } from 'src/subscribers/audit.subscriber';
22
+ import { ComputedEntityFieldSubscriber, ComputedFieldEvaluationPayload } from 'src/subscribers/computed-entity-field.subscriber';
23
+ import { SoftDeleteAwareEventSubscriber } from 'src/subscribers/soft-delete-aware-event.subscriber';
24
+ import { ChatterMessageService } from './chatter-message.service';
25
+ import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
26
+ import { ModelMetadataHelperService, PublisherFactory } from 'src';
27
+
28
+ export const coreSubscriberClasses = [
29
+ AuditSubscriber,
30
+ ComputedEntityFieldSubscriber,
31
+ CreatedByUpdatedBySubscriber,
32
+ SoftDeleteAwareEventSubscriber
33
+ ];
17
34
 
18
35
  @Injectable()
19
36
  export class SolidIntrospectService implements OnApplicationBootstrap {
@@ -22,10 +39,20 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
22
39
  private readonly reflector: Reflector,
23
40
  private readonly metadataScanner: MetadataScanner,
24
41
  private readonly solidRegistry: SolidRegistry,
42
+ private readonly moduleRef: ModuleRef,
43
+ private readonly requestContextService: RequestContextService,
44
+ // AuditSubscribe related dependencies
45
+ private readonly chatterMessageService: ChatterMessageService,
46
+ private readonly modelMetadataHelperService: ModelMetadataHelperService,
47
+ private readonly modelMetadataRepo: ModelMetadataRepository,
48
+ // ComputedEntityFieldSubscriber related dependencies
49
+ @Inject(forwardRef(() => PublisherFactory))
50
+ private readonly publisherFactory: PublisherFactory<any>,
51
+
25
52
  ) { }
26
53
 
27
54
  private readonly logger = new Logger(SolidIntrospectService.name);
28
- onApplicationBootstrap() {
55
+ async onApplicationBootstrap() {
29
56
  this.logger.log('Introspecting the application for Solid metadata');
30
57
 
31
58
  // Register all seeders
@@ -147,6 +174,79 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
147
174
  securityRuleConfigProviders.forEach((securityRuleConfigProvider) => {
148
175
  this.solidRegistry.registerSecurityRuleConfigProvider(securityRuleConfigProvider);
149
176
  });
177
+
178
+ // Register the core subscribers against all the configured database modules / datasources
179
+ await this.bootstrapCoreTypeOrmSubscribers(solidDatabaseModules)
180
+ }
181
+
182
+ async bootstrapCoreTypeOrmSubscribers(dbModules: Array<InstanceWrapper<any>>): Promise<void> {
183
+ // Register core subscribers for each Solid database module
184
+ for (const wrapper of dbModules) {
185
+ // Get the Database Module instance
186
+ const instance = (wrapper as InstanceWrapper).instance as any;
187
+ if (!instance || typeof instance.name !== 'function') {
188
+ this.logger.warn('Skipping a solid DB module wrapper with no instance or name() method');
189
+ continue;
190
+ }
191
+
192
+ // Get the DataSource for this module
193
+ const dsName: string | undefined = instance.name();
194
+ // getDataSourceToken() without name = default; pass dsName if non-default
195
+ const token = dsName ? getDataSourceToken(dsName) : getDataSourceToken();
196
+ let ds: DataSource | undefined;
197
+ try {
198
+ ds = this.moduleRef.get<DataSource>(token, { strict: false });
199
+ } catch (err) {
200
+ this.logger.warn(`DataSource token for "${dsName ?? 'default'}" not found: ${err?.message ?? err}`);
201
+ }
202
+ if (!ds) {
203
+ this.logger.warn(`No DataSource found for module "${dsName}". Skipping subscriber registration.`);
204
+ continue;
205
+ }
206
+
207
+ // Ensure DataSource is initialized (optional)
208
+ if (!ds.isInitialized) {
209
+ try {
210
+ await ds.initialize(); // only if you need to initialize here; in many apps datasources are created earlier
211
+ } catch (err) {
212
+ this.logger.error(`Failed to initialize DataSource "${dsName}": ${err}`);
213
+ continue;
214
+ }
215
+ }
216
+
217
+ // Register each subscriber class for this DataSource
218
+ // const auditSubscriberInstance = new AuditSubscriber(this.chatterMessageService, this.modelMetadataRepo, this.modelMetadataHelperService);
219
+ // auditSubscriberInstance.bindToDataSource(ds);
220
+
221
+ // const computedEntityFieldSubscriberInstance = new ComputedEntityFieldSubscriber(this.solidRegistry, this.publisherFactory);
222
+ // computedEntityFieldSubscriberInstance.bindToDataSource(ds);
223
+
224
+ // const createdByUpdatedBySubscriberInstance = new CreatedByUpdatedBySubscriber(this.requestContextService);
225
+ // createdByUpdatedBySubscriberInstance.bindToDataSource(ds);
226
+
227
+ // const softDeleteAwareEventSubscriberInstance = new SoftDeleteAwareEventSubscriber();
228
+ // softDeleteAwareEventSubscriberInstance.bindToDataSource(ds);
229
+ for (const SubClass of coreSubscriberClasses) {
230
+ const alreadyRegistered = ds.subscribers.some(
231
+ (s) => (s as any).constructor?.name === SubClass.name,
232
+ );
233
+ if (alreadyRegistered) {
234
+ this.logger.debug(`Subscriber ${SubClass.name} already registered on datasource ${dsName ?? 'default'}`);
235
+ continue;
236
+ }
237
+
238
+ // Resolve subscriber from NestJS moduleRef to ensure dependencies are injected
239
+ const subscriberInstance = await this.moduleRef.resolve(SubClass, undefined, { strict: false });
240
+ subscriberInstance.bindToDataSource(ds);
241
+
242
+ // instantiate subscriber bound to this DataSource
243
+ // NOTE: constructor signature must be (dataSource: DataSource, requestContextService: RequestContextService, ...)
244
+ // const subscriberInstance = new (SubClass as any)(ds, this.requestContextService);
245
+
246
+ // ds.subscribers.push(subscriberInstance);
247
+ // this.logger.log(`Registered subscriber ${SubClass.name} on datasource ${dsName ?? 'default'}`);
248
+ }
249
+ }
150
250
  }
151
251
 
152
252
  isDashboardQuestionDataProvider(providerWrapper: InstanceWrapper<any>) {
@@ -23,6 +23,7 @@ import { ViewMetadata } from '../entities/view-metadata.entity';
23
23
  import { ActionMetadataService } from './action-metadata.service';
24
24
  import { SolidIntrospectService } from './solid-introspect.service';
25
25
  import { UserViewMetadataService } from './user-view-metadata.service';
26
+ import { MenuItemMetadataService } from './menu-item-metadata.service';
26
27
 
27
28
  @Injectable()
28
29
  export class ViewMetadataService extends CRUDService<ViewMetadata> {
@@ -34,6 +35,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
34
35
  readonly discoveryService: DiscoveryService,
35
36
  readonly crudHelperService: CrudHelperService,
36
37
  readonly actionMetadataService: ActionMetadataService,
38
+ readonly menuItemMetadataService: MenuItemMetadataService,
37
39
  readonly introspectService: SolidIntrospectService,
38
40
  readonly userViewMetadataService: UserViewMetadataService,
39
41
  @InjectEntityManager()
@@ -55,13 +57,13 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
55
57
 
56
58
  //for locales
57
59
  private async getEntityRecordsInAllLocales(
58
- modelName: string,
59
- id: string,
60
- defaultEntityLocaleIdFromQuery?: string
61
- ): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {
62
- const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
63
- // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));
64
- const currentEntityRepository = this.entityManager.getRepository(classify(modelName));
60
+ modelName: string,
61
+ id: string,
62
+ defaultEntityLocaleIdFromQuery?: string
63
+ ): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {
64
+ const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
65
+ // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));
66
+ const currentEntityRepository = this.entityManager.getRepository(classify(modelName));
65
67
 
66
68
  // Case 1: Creating a new record with no defaultEntityLocaleId to clone
67
69
  if (id === 'new' && !defaultEntityLocaleIdFromQuery) {
@@ -117,16 +119,35 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
117
119
 
118
120
  // START: Custom Service Methods
119
121
  async getLayout(query, activeUser) {
120
- let { modelName, moduleName, viewType, id, populate } = query;
122
+ let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;
121
123
 
122
- // modelName = camelize(modelName);
123
124
 
124
- // 1. Fetch the view based on module, model & view name.
125
+ // 1. Fetch the action based on actionId.
126
+ const solidRequestContext = {
127
+ activeUser: activeUser
128
+ }
129
+ const actionQuery = {
130
+ populate: ["view"]
131
+ }
132
+ let action = null;
133
+ if (actionId) {
134
+ action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);
135
+ }
136
+
137
+ // 2. Fetch the menu based on menuItemId.
138
+ const menuItemQuery = {
139
+ }
140
+ let menuItem = null;
141
+ if (menuItemId) {
142
+ menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);
143
+ }
144
+ const viewId = action?.view?.id
145
+ // 3. Fetch the view based on module, model & view name.
125
146
  const entity = await this.repo.findOne({
126
147
  where: {
127
148
  model: { singularName: modelName },
128
149
  module: { name: moduleName },
129
- type: viewType,
150
+ ...(actionId && viewId ? { id: action.view.id } : { type: viewType })
130
151
  },
131
152
  relations: {
132
153
  model: {
@@ -143,7 +164,16 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
143
164
  throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);
144
165
  }
145
166
 
146
- // 2. See if we have a user specific layout for this view.
167
+ // 4. add action and menuItem to Entity which is our solid View
168
+ if (actionId) {
169
+ delete action.view;
170
+ entity['action'] = action
171
+ }
172
+ if (menuItemId) {
173
+ entity['menu'] = menuItem
174
+ }
175
+
176
+ // 5. See if we have a user specific layout for this view.
147
177
  const userLayout = await this.userViewMetadataService.repo.findOne({
148
178
  where: {
149
179
  user: { id: activeUser?.sub },
@@ -158,7 +188,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
158
188
  }
159
189
 
160
190
 
161
- // 3. We are resolving the create & edit actions if specified in the layout.
191
+ // 6. We are resolving the create & edit actions if specified in the layout.
162
192
  if (entity?.layout?.attrs?.createAction) {
163
193
  const actionName: string = entity.layout.attrs.createAction;
164
194
  entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)
@@ -168,14 +198,14 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
168
198
  entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)
169
199
  }
170
200
 
171
- // 4. For form views we need to fetch the workflow field metadata if specified.
201
+ // 7. For form views we need to fetch the workflow field metadata if specified.
172
202
  let workflowFieldName = null;
173
203
  let workflowField = null;
174
204
  if (viewType === 'form') {
175
205
  workflowFieldName = entity.layout?.attrs?.workflowField;
176
206
  }
177
207
 
178
- // 5. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.
208
+ // 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.
179
209
  const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);
180
210
  const fieldsMap = new Map<string, FieldMetadata>();
181
211
  for (let i = 0; i < fields.length; i++) {
@@ -207,7 +237,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
207
237
  }
208
238
  }
209
239
 
210
- // 6. Use the resolved workflowField to populate workflow specific metadata.
240
+ // 9. Use the resolved workflowField to populate workflow specific metadata.
211
241
  // Check if we were able to resolve an actual workflowField.
212
242
  let solidFormViewWorkflowData = [];
213
243
  if (viewType === 'form' && workflowField) {
@@ -232,7 +262,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
232
262
  }
233
263
  }
234
264
 
235
- // 7. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.
265
+ // 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.
236
266
  // This is the shape of locales that will be returned
237
267
  /**
238
268
  * [
@@ -335,7 +365,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
335
365
  'solidView': entity,
336
366
  'solidFieldsMetadata': Object.fromEntries(fieldsMap),
337
367
  'solidFormViewWorkflowData': solidFormViewWorkflowData,
338
- 'applicableLocales': applicableLocales
368
+ 'applicableLocales': applicableLocales,
339
369
  }
340
370
 
341
371
  return r;
@@ -25,7 +25,8 @@ import { ModelMetadata } from './entities/model-metadata.entity';
25
25
  import { ModuleMetadata } from './entities/module-metadata.entity';
26
26
  import { CommandService } from './helpers/command.service';
27
27
  import { SchematicService } from './helpers/schematic.service';
28
- import { ListOfValuesSelectionProvider } from './providers/list-of-values-selection-providers.service';
28
+ import { ListOfValuesSelectionProvider } from './services/selection-providers/list-of-values-selection-providers.service';
29
+ import { PseudoForeignKeySelectionProvider } from './services/selection-providers/pseudo-foreign-key-selection-provider.service'
29
30
  import { ModuleMetadataSeederService } from './seeders/module-metadata-seeder.service';
30
31
  import { CrudHelperService } from './services/crud-helper.service';
31
32
  import { FieldMetadataService } from './services/field-metadata.service';
@@ -326,6 +327,7 @@ import { ScheduledJobSubscriber } from './subscribers/scheduled-job.subscriber';
326
327
  import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber';
327
328
  import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
328
329
  import { MediaStorageProviderMetadataRepository } from './repository/media-storage-provider-metadata.repository';
330
+ import { McpCommand } from './commands/mcp.command';
329
331
 
330
332
 
331
333
  @Global()
@@ -486,6 +488,7 @@ import { MediaStorageProviderMetadataRepository } from './repository/media-stora
486
488
  ModuleMetadataSeederService,
487
489
  ListOfValuesService,
488
490
  ListOfValuesSelectionProvider,
491
+ PseudoForeignKeySelectionProvider,
489
492
  ModelMetadataSubscriber,
490
493
  ViewMetadataService,
491
494
  ActionMetadataService,
@@ -497,6 +500,7 @@ import { MediaStorageProviderMetadataRepository } from './repository/media-stora
497
500
  TextractService,
498
501
  SolidRegistry,
499
502
  SeedCommand,
503
+ McpCommand,
500
504
  IngestCommand,
501
505
  IngestMetadataService,
502
506
  SMTPEMailService,
@@ -1,9 +1,8 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { InjectDataSource } from '@nestjs/typeorm';
1
+ import { Injectable, Scope } from '@nestjs/common';
3
2
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
4
3
  import { lowerFirst } from 'src/helpers/string.helper';
5
4
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
6
- import { DataSource, EntityMetadata, EntitySubscriberInterface, EventSubscriber, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
5
+ import { DataSource, EntityMetadata, EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
7
6
  import { ChatterMessageService } from '../services/chatter-message.service';
8
7
 
9
8
 
@@ -12,19 +11,24 @@ type DeferredCall =
12
11
  | { kind: 'update'; args: Parameters<ChatterMessageService['postAuditMessageOnUpdate']> }
13
12
  | { kind: 'delete'; args: Parameters<ChatterMessageService['postAuditMessageOnDelete']> };
14
13
 
15
- @Injectable()
16
- @EventSubscriber()
14
+ @Injectable({scope: Scope.TRANSIENT})
15
+ // @EventSubscriber()
17
16
  export class AuditSubscriber implements EntitySubscriberInterface {
18
-
17
+ private dataSource: DataSource;
19
18
  constructor(
20
- @InjectDataSource()
21
- private readonly dataSource: DataSource,
19
+ // @InjectDataSource()
20
+ // private readonly dataSource: DataSource,
22
21
  private readonly chatterMessageService: ChatterMessageService,
23
22
  // @InjectRepository(ModelMetadata)
24
23
  // private readonly modelMetadataRepo: Repository<ModelMetadata>,
25
24
  private readonly modelMetadataRepo: ModelMetadataRepository,
26
25
  private readonly modelMetadataHelperService: ModelMetadataHelperService,
27
26
  ) {
27
+ // this.dataSource.subscribers.push(this);
28
+ }
29
+
30
+ bindToDataSource(dataSource: DataSource) {
31
+ this.dataSource = dataSource;
28
32
  this.dataSource.subscribers.push(this);
29
33
  }
30
34
 
@@ -1,28 +1,34 @@
1
1
  import { camelize } from "@angular-devkit/core/src/utils/strings";
2
- import { Injectable, InternalServerErrorException, Logger } from "@nestjs/common";
3
- import { InjectDataSource } from "@nestjs/typeorm";
2
+ import { forwardRef, Inject, Injectable, InternalServerErrorException, Logger, Scope } from "@nestjs/common";
4
3
  import { ComputedFieldTriggerOperation } from "src/dtos/create-field-metadata.dto";
5
4
  import { ComputedFieldMetadata, SolidRegistry } from "src/helpers/solid-registry";
6
5
  import { IEntityPreComputeFieldProvider } from "src/interfaces";
7
6
  import { PublisherFactory } from "src/services/queues/publisher-factory.service";
8
- import { DataSource, EntitySubscriberInterface, EventSubscriber, InsertEvent, UpdateEvent } from "typeorm";
7
+ import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
9
8
 
10
9
  // Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity
11
10
  export interface ComputedFieldEvaluationPayload extends ComputedFieldMetadata {
12
11
  databaseEntity: any;
13
12
  }
14
13
 
15
- @Injectable()
16
- @EventSubscriber()
14
+ @Injectable({scope: Scope.TRANSIENT})
15
+ // @EventSubscriber()
17
16
  export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface {
18
17
  private readonly logger = new Logger(this.constructor.name);
18
+ private dataSource: DataSource;
19
19
  constructor(
20
- @InjectDataSource()
21
- private readonly dataSource: DataSource,
20
+ // @InjectDataSource()
21
+ // private readonly dataSource: DataSource,
22
22
  private readonly solidRegistry: SolidRegistry,
23
+ @Inject(forwardRef(() => PublisherFactory))
23
24
  private readonly publisherFactory: PublisherFactory<ComputedFieldEvaluationPayload>
24
25
  // private readonly computedFieldPublisher: ComputedFieldEvaluationPublisherDatabase,
25
26
  ) {
27
+ // this.dataSource.subscribers.push(this);
28
+ }
29
+
30
+ bindToDataSource(dataSource: DataSource) {
31
+ this.dataSource = dataSource;
26
32
  this.dataSource.subscribers.push(this);
27
33
  }
28
34