@solidxai/core 0.1.10-beta.2 → 0.1.10-beta.22

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 (320) hide show
  1. package/CLAUDE.md +18 -0
  2. package/CURRENT_PROMPT +6 -0
  3. package/dist/commands/refresh-model.command.d.ts +1 -7
  4. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  5. package/dist/commands/refresh-model.command.js +4 -49
  6. package/dist/commands/refresh-model.command.js.map +1 -1
  7. package/dist/commands/refresh-module.command.d.ts +0 -2
  8. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  9. package/dist/commands/refresh-module.command.js +3 -16
  10. package/dist/commands/refresh-module.command.js.map +1 -1
  11. package/dist/commands/test-data.command.d.ts +2 -0
  12. package/dist/commands/test-data.command.d.ts.map +1 -1
  13. package/dist/commands/test-data.command.js +32 -6
  14. package/dist/commands/test-data.command.js.map +1 -1
  15. package/dist/controllers/action-metadata.controller.js +1 -1
  16. package/dist/controllers/action-metadata.controller.js.map +1 -1
  17. package/dist/controllers/chatter-message.controller.d.ts +2 -0
  18. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  19. package/dist/controllers/chatter-message.controller.js +17 -0
  20. package/dist/controllers/chatter-message.controller.js.map +1 -1
  21. package/dist/controllers/facebook-authentication.controller.js +1 -1
  22. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  23. package/dist/controllers/google-authentication.controller.js +1 -1
  24. package/dist/controllers/google-authentication.controller.js.map +1 -1
  25. package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
  26. package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
  27. package/dist/controllers/gupshup-webhook.controller.js +87 -0
  28. package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
  29. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  30. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  31. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  32. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  33. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  34. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  35. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
  36. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
  37. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
  38. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
  39. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  40. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  41. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  42. package/dist/controllers/model-metadata.controller.js +2 -2
  43. package/dist/controllers/model-metadata.controller.js.map +1 -1
  44. package/dist/controllers/module-metadata.controller.js +1 -1
  45. package/dist/controllers/module-metadata.controller.js.map +1 -1
  46. package/dist/controllers/mq-message-queue.controller.js +1 -1
  47. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  48. package/dist/controllers/mq-message.controller.js +1 -1
  49. package/dist/controllers/mq-message.controller.js.map +1 -1
  50. package/dist/controllers/view-metadata.controller.js +1 -1
  51. package/dist/controllers/view-metadata.controller.js.map +1 -1
  52. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  53. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  54. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  55. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  56. package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
  57. package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
  58. package/dist/dtos/update-chatter-note-message.dto.js +34 -0
  59. package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
  60. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  61. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  62. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  63. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  64. package/dist/dtos/update-user.dto.d.ts +1 -0
  65. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  66. package/dist/dtos/update-user.dto.js +7 -1
  67. package/dist/dtos/update-user.dto.js.map +1 -1
  68. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  69. package/dist/entities/chatter-message-details.entity.js +0 -1
  70. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  71. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  72. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  73. package/dist/entities/mcp-audit-log.entity.js +90 -0
  74. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  75. package/dist/entities/user.entity.js +1 -0
  76. package/dist/entities/user.entity.js.map +1 -1
  77. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  78. package/dist/factories/whatsapp.factory.js +13 -11
  79. package/dist/factories/whatsapp.factory.js.map +1 -1
  80. package/dist/helpers/bootstrap.helper.d.ts +1 -0
  81. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  82. package/dist/helpers/bootstrap.helper.js +8 -3
  83. package/dist/helpers/bootstrap.helper.js.map +1 -1
  84. package/dist/helpers/command.service.d.ts +1 -0
  85. package/dist/helpers/command.service.d.ts.map +1 -1
  86. package/dist/helpers/command.service.js +1 -0
  87. package/dist/helpers/command.service.js.map +1 -1
  88. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  89. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  90. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  91. package/dist/index.d.ts +6 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/interfaces.d.ts +1 -2
  96. package/dist/interfaces.d.ts.map +1 -1
  97. package/dist/interfaces.js.map +1 -1
  98. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  99. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  100. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  101. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  102. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  103. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  104. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  105. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  106. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  107. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  108. package/dist/listeners/user-registration.listener.d.ts +5 -2
  109. package/dist/listeners/user-registration.listener.d.ts.map +1 -1
  110. package/dist/listeners/user-registration.listener.js +37 -4
  111. package/dist/listeners/user-registration.listener.js.map +1 -1
  112. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  113. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  114. package/dist/repository/mcp-audit-log.repository.js +34 -0
  115. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  116. package/dist/repository/security-rule.repository.js.map +1 -1
  117. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  118. package/dist/seeders/module-test-data.service.d.ts +9 -0
  119. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  120. package/dist/seeders/module-test-data.service.js +155 -18
  121. package/dist/seeders/module-test-data.service.js.map +1 -1
  122. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  123. package/dist/seeders/seed-data/solid-core-metadata.json +506 -49
  124. package/dist/services/authentication.service.d.ts +6 -1
  125. package/dist/services/authentication.service.d.ts.map +1 -1
  126. package/dist/services/authentication.service.js +145 -15
  127. package/dist/services/authentication.service.js.map +1 -1
  128. package/dist/services/chatter-message.service.d.ts +13 -4
  129. package/dist/services/chatter-message.service.d.ts.map +1 -1
  130. package/dist/services/chatter-message.service.js +117 -37
  131. package/dist/services/chatter-message.service.js.map +1 -1
  132. package/dist/services/crud.service.js.map +1 -1
  133. package/dist/services/csv.service.js.map +1 -1
  134. package/dist/services/dashboard.service.js.map +1 -1
  135. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  136. package/dist/services/excel.service.js.map +1 -1
  137. package/dist/services/export-transaction.service.js.map +1 -1
  138. package/dist/services/field-metadata.service.js.map +1 -1
  139. package/dist/services/fixtures.service.js.map +1 -1
  140. package/dist/services/import-transaction.service.js.map +1 -1
  141. package/dist/services/list-of-values.service.js.map +1 -1
  142. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  143. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  144. package/dist/services/mcp-audit-log.service.js +38 -0
  145. package/dist/services/mcp-audit-log.service.js.map +1 -0
  146. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
  147. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  148. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
  149. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
  151. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  152. package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
  153. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  154. package/dist/services/model-metadata.service.d.ts +4 -1
  155. package/dist/services/model-metadata.service.d.ts.map +1 -1
  156. package/dist/services/model-metadata.service.js +24 -24
  157. package/dist/services/model-metadata.service.js.map +1 -1
  158. package/dist/services/module-metadata.service.d.ts +4 -1
  159. package/dist/services/module-metadata.service.d.ts.map +1 -1
  160. package/dist/services/module-metadata.service.js +19 -2
  161. package/dist/services/module-metadata.service.js.map +1 -1
  162. package/dist/services/queues/database-publisher.service.js +3 -3
  163. package/dist/services/queues/database-publisher.service.js.map +1 -1
  164. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  165. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  166. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  167. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  168. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  169. package/dist/services/queues/redis-publisher.service.js +4 -1
  170. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  171. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  172. package/dist/services/role-metadata.service.js.map +1 -1
  173. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  174. package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
  175. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  176. package/dist/services/settings/default-settings-provider.service.js +119 -4
  177. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  178. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  179. package/dist/services/solid-introspect.service.js.map +1 -1
  180. package/dist/services/user-activity-history.service.js.map +1 -1
  181. package/dist/services/user.service.js +1 -1
  182. package/dist/services/user.service.js.map +1 -1
  183. package/dist/services/view-metadata.service.d.ts.map +1 -1
  184. package/dist/services/view-metadata.service.js +17 -2
  185. package/dist/services/view-metadata.service.js.map +1 -1
  186. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
  187. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
  188. package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
  189. package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
  190. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
  191. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
  192. package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
  193. package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
  194. package/dist/solid-core.module.d.ts +2 -2
  195. package/dist/solid-core.module.d.ts.map +1 -1
  196. package/dist/solid-core.module.js +22 -6
  197. package/dist/solid-core.module.js.map +1 -1
  198. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  199. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  200. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  201. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  202. package/dist/testing/adapters/ui/playwright-adapter.d.ts +1 -0
  203. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  204. package/dist/testing/adapters/ui/playwright-adapter.js +3 -0
  205. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  206. package/dist/testing/core/testing-engine.js.map +1 -1
  207. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  208. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  209. package/dist/testing/reporter/console-reporter.js +21 -0
  210. package/dist/testing/reporter/console-reporter.js.map +1 -1
  211. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  212. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  213. package/dist/testing/reporter/reporter.types.js.map +1 -1
  214. package/dist/testing/reporter/webhook-reporter.js.map +1 -1
  215. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  216. package/dist/testing/runner/run-from-metadata.js +20 -1
  217. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  218. package/dist/testing/steps/ui/index.d.ts.map +1 -1
  219. package/dist/testing/steps/ui/index.js +2 -0
  220. package/dist/testing/steps/ui/index.js.map +1 -1
  221. package/dist/testing/steps/ui/manual.step.d.ts +3 -0
  222. package/dist/testing/steps/ui/manual.step.d.ts.map +1 -0
  223. package/dist/testing/steps/ui/manual.step.js +56 -0
  224. package/dist/testing/steps/ui/manual.step.js.map +1 -0
  225. package/dist/winston.logger.d.ts +5 -0
  226. package/dist/winston.logger.d.ts.map +1 -1
  227. package/dist/winston.logger.js +6 -4
  228. package/dist/winston.logger.js.map +1 -1
  229. package/package.json +8 -8
  230. package/src/commands/refresh-model.command.ts +6 -51
  231. package/src/commands/refresh-module.command.ts +3 -16
  232. package/src/commands/test-data.command.ts +29 -6
  233. package/src/controllers/action-metadata.controller.ts +1 -1
  234. package/src/controllers/chatter-message.controller.ts +12 -0
  235. package/src/controllers/facebook-authentication.controller.ts +1 -1
  236. package/src/controllers/google-authentication.controller.ts +1 -1
  237. package/src/controllers/gupshup-webhook.controller.ts +91 -0
  238. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  239. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  240. package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
  241. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  242. package/src/controllers/model-metadata.controller.ts +1 -1
  243. package/src/controllers/module-metadata.controller.ts +1 -1
  244. package/src/controllers/mq-message-queue.controller.ts +1 -1
  245. package/src/controllers/mq-message.controller.ts +1 -1
  246. package/src/controllers/view-metadata.controller.ts +1 -1
  247. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  248. package/src/dtos/update-chatter-note-message.dto.ts +14 -0
  249. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  250. package/src/dtos/update-user.dto.ts +4 -0
  251. package/src/entities/chatter-message-details.entity.ts +1 -2
  252. package/src/entities/mcp-audit-log.entity.ts +55 -0
  253. package/src/entities/user.entity.ts +1 -1
  254. package/src/factories/whatsapp.factory.ts +33 -32
  255. package/src/helpers/bootstrap.helper.ts +16 -6
  256. package/src/helpers/command.service.ts +2 -0
  257. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  258. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  259. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +208 -0
  260. package/src/helpers/module-metadata-helper.service.ts +1 -1
  261. package/src/index.ts +6 -0
  262. package/src/interfaces.ts +1 -3
  263. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  264. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  265. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  266. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  267. package/src/listeners/user-registration.listener.ts +49 -6
  268. package/src/repository/mcp-audit-log.repository.ts +17 -0
  269. package/src/repository/security-rule.repository.ts +1 -1
  270. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  271. package/src/seeders/module-test-data.service.ts +186 -17
  272. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  273. package/src/seeders/seed-data/solid-core-metadata.json +506 -49
  274. package/src/services/authentication.service.ts +267 -44
  275. package/src/services/chatter-message.service.ts +140 -40
  276. package/src/services/crud.service.ts +1 -1
  277. package/src/services/csv.service.ts +1 -1
  278. package/src/services/dashboard.service.ts +1 -1
  279. package/src/services/database/database-bootstrap.service.ts +1 -1
  280. package/src/services/excel.service.ts +1 -1
  281. package/src/services/export-transaction.service.ts +2 -2
  282. package/src/services/field-metadata.service.ts +1 -1
  283. package/src/services/fixtures.service.ts +2 -2
  284. package/src/services/import-transaction.service.ts +2 -2
  285. package/src/services/list-of-values.service.ts +1 -1
  286. package/src/services/mcp-audit-log.service.ts +19 -0
  287. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
  288. package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
  289. package/src/services/model-metadata.service.ts +36 -34
  290. package/src/services/module-metadata.service.ts +19 -7
  291. package/src/services/queues/database-publisher.service.ts +4 -4
  292. package/src/services/queues/database-subscriber.service.ts +1 -1
  293. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  294. package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
  295. package/src/services/queues/redis-publisher.service.ts +7 -4
  296. package/src/services/queues/redis-subscriber.service.ts +4 -4
  297. package/src/services/role-metadata.service.ts +1 -1
  298. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  299. package/src/services/settings/default-settings-provider.service.ts +119 -4
  300. package/src/services/sms/TwilioSMSService.ts +2 -2
  301. package/src/services/solid-introspect.service.ts +2 -2
  302. package/src/services/user-activity-history.service.ts +1 -1
  303. package/src/services/user.service.ts +1 -1
  304. package/src/services/view-metadata.service.ts +25 -8
  305. package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
  306. package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
  307. package/src/solid-core.module.ts +213 -196
  308. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  309. package/src/subscribers/security-rule.subscriber.ts +8 -8
  310. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  311. package/src/testing/README.md +55 -2
  312. package/src/testing/adapters/ui/playwright-adapter.ts +4 -0
  313. package/src/testing/core/testing-engine.ts +2 -2
  314. package/src/testing/reporter/console-reporter.ts +27 -0
  315. package/src/testing/reporter/reporter.types.ts +7 -0
  316. package/src/testing/reporter/webhook-reporter.ts +1 -1
  317. package/src/testing/runner/run-from-metadata.ts +19 -1
  318. package/src/testing/steps/ui/index.ts +2 -0
  319. package/src/testing/steps/ui/manual.step.ts +80 -0
  320. package/src/winston.logger.ts +5 -7
@@ -1,18 +1,20 @@
1
1
  import { LocalDateTimeTransformer, serializeDate } from 'src/transformers/typeorm/local-date-time-transformer';
2
- import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
2
+ import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
3
3
  import { ModuleRef } from "@nestjs/core";
4
4
  import { InjectEntityManager } from '@nestjs/typeorm';
5
- import { Brackets, EntityManager, EntityMetadata } from 'typeorm';
5
+ import { Brackets, EntityManager, EntityMetadata, In } from 'typeorm';
6
6
 
7
7
  import { classify } from '@angular-devkit/core/src/utils/strings';
8
8
  import { CHATTER_MESSAGE_STATUS, CHATTER_MESSAGE_SUBTYPE, CHATTER_MESSAGE_TYPE } from 'src/constants/chatter-message.constants';
9
9
  import { ERROR_MESSAGES } from 'src/constants/error-messages';
10
10
  import { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';
11
+ import { UpdateChatterNoteMessageDto } from 'src/dtos/update-chatter-note-message.dto';
11
12
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
12
13
  import { lowerFirst } from 'src/helpers/string.helper';
13
14
  import { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';
14
15
  import { ChatterMessageRepository } from 'src/repository/chatter-message.repository';
15
16
  import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
17
+ import { MediaRepository } from 'src/repository/media.repository';
16
18
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
17
19
  import { CRUDService } from 'src/services/crud.service';
18
20
  import { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';
@@ -33,6 +35,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
33
35
  readonly repo: ChatterMessageRepository,
34
36
  // @InjectRepository(ChatterMessageDetailsRepository, 'default')
35
37
  readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,
38
+ readonly mediaRepository: MediaRepository,
36
39
  // @InjectRepository(FieldMetadata, 'default')
37
40
  // readonly fieldMetadataRepo: Repository<FieldMetadata>,
38
41
  readonly fieldMetadataRepo: FieldMetadataRepository,
@@ -47,6 +50,41 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
47
50
  super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
48
51
  }
49
52
 
53
+ private resolveMessageUserId(userId?: number | null): number | null {
54
+ if (userId) {
55
+ return userId;
56
+ }
57
+
58
+ return this.requestContextService.getActiveUser()?.sub ?? null;
59
+ }
60
+
61
+ private resolveMessageUser(userId?: number | null) {
62
+ const resolvedUserId = this.resolveMessageUserId(userId);
63
+ return resolvedUserId ? ({ id: resolvedUserId } as any) : null;
64
+ }
65
+
66
+ private stampMessageAuditFields(chatterMessage: ChatterMessage, userId?: number | null) {
67
+ const resolvedUserId = this.resolveMessageUserId(userId);
68
+ chatterMessage.user = resolvedUserId ? ({ id: resolvedUserId } as any) : null;
69
+ chatterMessage.createdBy = resolvedUserId;
70
+ chatterMessage.updatedBy = resolvedUserId;
71
+ }
72
+
73
+ private isEditableCustomNoteMessage(message: ChatterMessage): boolean {
74
+ if (message.messageType !== CHATTER_MESSAGE_TYPE.CUSTOM) {
75
+ return false;
76
+ }
77
+ return [CHATTER_MESSAGE_SUBTYPE.CUSTOM, CHATTER_MESSAGE_SUBTYPE.NOTE].includes(message.messageSubType as any);
78
+ }
79
+
80
+ private parseAttachmentIds(value?: string): number[] {
81
+ if (!value || typeof value !== 'string') return [];
82
+ return value
83
+ .split(',')
84
+ .map(v => Number(v.trim()))
85
+ .filter(v => Number.isInteger(v) && v > 0);
86
+ }
87
+
50
88
  async markCompleted(id: number) {
51
89
  const activeUser = this.requestContextService.getActiveUser();
52
90
  if (!activeUser) {
@@ -62,6 +100,98 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
62
100
  return this.repo.save(message);
63
101
  }
64
102
 
103
+ async updateCustomNoteMessage(id: number, updateDto: UpdateChatterNoteMessageDto, files: Express.Multer.File[] = []) {
104
+ const activeUser = this.requestContextService.getActiveUser();
105
+ if (!activeUser) {
106
+ throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);
107
+ }
108
+
109
+ const message = await this.repo.findOne({ where: { id }, relations: { user: true } });
110
+ if (!message) {
111
+ throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);
112
+ }
113
+
114
+ if (!this.isEditableCustomNoteMessage(message)) {
115
+ throw new BadRequestException('Only custom note messages can be edited.');
116
+ }
117
+
118
+ if (!message.user?.id || message.user.id !== activeUser.sub) {
119
+ throw new ForbiddenException('You can only edit your own custom note messages.');
120
+ }
121
+
122
+ const removeAttachmentIds = this.parseAttachmentIds(updateDto?.removeAttachmentIds);
123
+ const hasMessageBody = typeof updateDto?.messageBody === 'string';
124
+ const trimmedMessageBody = (updateDto?.messageBody ?? '').trim();
125
+ const hasNewFiles = Array.isArray(files) && files.length > 0;
126
+
127
+ if (!hasMessageBody && removeAttachmentIds.length === 0 && !hasNewFiles) {
128
+ throw new BadRequestException('No note changes submitted.');
129
+ }
130
+
131
+ if (hasMessageBody && trimmedMessageBody.length === 0) {
132
+ throw new BadRequestException('Message body cannot be empty.');
133
+ }
134
+
135
+ if (hasMessageBody) {
136
+ message.messageBody = trimmedMessageBody;
137
+ }
138
+ message.updatedBy = activeUser.sub;
139
+ // Ensure updatedAt changes even for attachment-only edits.
140
+ message.updatedAt = new Date();
141
+ const savedMessage = await this.repo.save(message);
142
+
143
+ if (removeAttachmentIds.length > 0 || hasNewFiles) {
144
+ const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {
145
+ fields: {
146
+ model: true,
147
+ mediaStorageProvider: true,
148
+ },
149
+ module: true,
150
+ });
151
+
152
+ const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');
153
+ const attachmentFieldIds = mediaFields.map(field => field.id);
154
+
155
+ if (removeAttachmentIds.length > 0 && attachmentFieldIds.length > 0) {
156
+ const mediaToRemove = await this.mediaRepository.find({
157
+ where: {
158
+ id: In(removeAttachmentIds),
159
+ entityId: savedMessage.id,
160
+ modelMetadata: { id: model.id },
161
+ fieldMetadata: { id: In(attachmentFieldIds) },
162
+ },
163
+ relations: {
164
+ mediaStorageProviderMetadata: true,
165
+ fieldMetadata: true,
166
+ },
167
+ });
168
+
169
+ for (const media of mediaToRemove) {
170
+ const storageType = media.mediaStorageProviderMetadata?.type as MediaStorageProviderType;
171
+ const storageProvider = await getMediaStorageProvider(this.moduleRef, storageType);
172
+ await storageProvider.deleteByMediaRecord(media);
173
+ }
174
+
175
+ if (mediaToRemove.length > 0) {
176
+ await this.mediaRepository.remove(mediaToRemove);
177
+ }
178
+ }
179
+
180
+ for (const mediaField of mediaFields) {
181
+ const storageProviderMetadata = mediaField.mediaStorageProvider;
182
+ const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;
183
+ const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);
184
+
185
+ const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);
186
+ if (media.length > 0) {
187
+ await storageProvider.store(media, savedMessage, mediaField);
188
+ }
189
+ }
190
+ }
191
+
192
+ return savedMessage;
193
+ }
194
+
65
195
  async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {
66
196
  const chatterMessage = new ChatterMessage();
67
197
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;
@@ -78,14 +208,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
78
208
  });
79
209
  chatterMessage.modelDisplayName = model?.displayName ?? null;
80
210
 
81
- const activeUser = this.requestContextService.getActiveUser();
82
-
83
- if (activeUser) {
84
- const userId = activeUser?.sub;
85
- chatterMessage.user = { id: userId } as any;
86
- } else {
87
- chatterMessage.user = null;
88
- }
211
+ this.stampMessageAuditFields(chatterMessage);
89
212
 
90
213
  const savedMessage = await this.repo.save(chatterMessage);
91
214
 
@@ -114,7 +237,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
114
237
  return savedMessage;
115
238
  }
116
239
 
117
- async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false) {
240
+ async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false, userId?: number | null) {
118
241
  if (!entity) {
119
242
  return;
120
243
  }
@@ -139,8 +262,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
139
262
  !(field.type === 'relation' && field.relationType === 'one-to-many')
140
263
  );
141
264
 
142
- const activeUser = this.requestContextService.getActiveUser();
143
-
144
265
  const chatterMessage = new ChatterMessage();
145
266
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
146
267
  chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;
@@ -150,13 +271,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
150
271
  chatterMessage.modelDisplayName = model?.displayName;
151
272
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
152
273
  chatterMessage.messageBody = `New ${model?.displayName} created`;
153
-
154
- if (activeUser) {
155
- const userId = activeUser?.sub;
156
- chatterMessage.user = { id: userId } as any;
157
- } else {
158
- chatterMessage.user = null;
159
- }
274
+ this.stampMessageAuditFields(chatterMessage, userId);
160
275
 
161
276
  const savedMessage = await this.repo.save(chatterMessage);
162
277
 
@@ -177,7 +292,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
177
292
  }
178
293
  }
179
294
 
180
- async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {
295
+ async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false, userId?: number | null) {
181
296
  if (!databaseEntity || !entity) {
182
297
  return;
183
298
  }
@@ -259,8 +374,6 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
259
374
  return;
260
375
  }
261
376
 
262
- const activeUser = this.requestContextService.getActiveUser();
263
-
264
377
  const chatterMessage = new ChatterMessage();
265
378
  chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;
266
379
  chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;
@@ -270,13 +383,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
270
383
  chatterMessage.modelDisplayName = model.displayName;
271
384
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
272
385
  chatterMessage.messageBody = `${model?.displayName} updated`;
273
-
274
- if (activeUser) {
275
- const userId = activeUser?.sub;
276
- chatterMessage.user = { id: userId } as any;
277
- } else {
278
- chatterMessage.user = null;
279
- }
386
+ this.stampMessageAuditFields(chatterMessage, userId);
280
387
 
281
388
  const savedMessage = await this.repo.save(chatterMessage);
282
389
 
@@ -294,7 +401,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
294
401
  }
295
402
  }
296
403
 
297
- async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false) {
404
+ async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false, userId?: number | null) {
298
405
  const model = await this.modelMetadataRepo.findOne({
299
406
  where: {
300
407
  singularName: lowerFirst(modelName)
@@ -335,14 +442,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
335
442
  chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];
336
443
  chatterMessage.messageBody = `${model?.displayName} deleted`;
337
444
 
338
- const activeUser = this.requestContextService.getActiveUser();
339
-
340
- if (activeUser) {
341
- const userId = activeUser?.sub;
342
- chatterMessage.user = { id: userId } as any;
343
- } else {
344
- chatterMessage.user = null;
345
- }
445
+ this.stampMessageAuditFields(chatterMessage, userId);
346
446
 
347
447
  const savedMessage = await this.repo.save(chatterMessage);
348
448
 
@@ -421,7 +521,7 @@ export class ChatterMessageService extends CRUDService<ChatterMessage> {
421
521
  if (value.id) {
422
522
  return value.id.toString();
423
523
  }
424
- } catch (error) {
524
+ } catch (error: any) {
425
525
  console.error('Error fetching related model metadata:', error);
426
526
  return value.id ? value.id.toString() : '';
427
527
  }
@@ -129,7 +129,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
129
129
  await this.saveMedia(model, files, savedEntity);
130
130
  }
131
131
  return savedEntity;
132
- } catch (error) {
132
+ } catch (error: any) {
133
133
  if (error instanceof QueryFailedError && error.message.includes('duplicate key value violates unique constraint')) {
134
134
  throw new BadRequestException(ERROR_MESSAGES.DUPLICATE_ENTRY);
135
135
  }
@@ -68,7 +68,7 @@ export class CsvService {
68
68
  }
69
69
 
70
70
  csvStream.end(); // ✅ Ensure CSV stream is finalized
71
- } catch (error) {
71
+ } catch (error: any) {
72
72
  this.logger.error(`❌ Error writing CSV: ${error.message}`);
73
73
  passThrough.destroy(error); // ✅ Properly destroy stream on error
74
74
  throw error;
@@ -117,7 +117,7 @@ export class DashboardService extends CRUDService<Dashboard> {
117
117
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
118
118
  try {
119
119
  await fs.access(filePath);
120
- } catch (error) {
120
+ } catch (error: any) {
121
121
  throw new Error(`Configuration file not found for module: ${moduleName}`);
122
122
  }
123
123
  const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
@@ -80,7 +80,7 @@ export class DatabaseBootstrapService implements OnModuleInit {
80
80
  await this.dataSource.query(sql);
81
81
 
82
82
  this.logger.debug(`[${this.dataSource.name}] Applied ${fileName}`);
83
- } catch (error) {
83
+ } catch (error: any) {
84
84
  // DO NOT THROW — continue with next file
85
85
  this.logger.error(
86
86
  `[${this.dataSource.name}] Failed ${fileName}`,
@@ -93,7 +93,7 @@ export class ExcelService {
93
93
 
94
94
  workbook.commit();
95
95
  // passThrough.end(); // ✅ Properly close the stream
96
- } catch (error) {
96
+ } catch (error: any) {
97
97
  this.logger.error(`❌ Error writing Excel: ${error.message}`);
98
98
  passThrough.destroy(error); // Destroy stream
99
99
  throw error;
@@ -90,7 +90,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
90
90
  const fileName = this.getFileName(templateName, uuid, templateFormat);
91
91
  const mimeType = this.getMimeType(templateFormat);
92
92
  return { exportStream, fileName, mimeType, exportTransaction };
93
- } catch (error) {
93
+ } catch (error: any) {
94
94
  this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
95
95
  throw error;
96
96
  }
@@ -114,7 +114,7 @@ export class ExportTransactionService extends CRUDService<ExportTransaction> {
114
114
  // Store the file using the appropriate storage provider
115
115
  await this.storeExportStream(exportStream, exportTransaction, this.getFileName(templateName, uuid, templateFormat));
116
116
  this.updateExportTransaction(id, ExportStatus.COMPLETED);
117
- } catch (error) {
117
+ } catch (error: any) {
118
118
  this.updateExportTransaction(id, ExportStatus.FAILED, error.message);
119
119
  throw error;
120
120
 
@@ -1256,7 +1256,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
1256
1256
  // Write the updated object back to the file
1257
1257
  const updatedContent = JSON.stringify(metaData, null, 2);
1258
1258
  await fs.writeFile(filePath, updatedContent);
1259
- } catch (error) {
1259
+ } catch (error: any) {
1260
1260
  this.logger.error('File creation failed:', error);
1261
1261
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
1262
1262
  }
@@ -35,7 +35,7 @@ export class FixturesService {
35
35
  // Create the model instance in the database
36
36
  const createdInstance = await modelServiceInstance.create(modelFixture.data);
37
37
  this.logger.log(`Successfully created fixture for model: ${modelFixture.singularName} with ID: ${createdInstance.id}`);
38
- } catch (error) {
38
+ } catch (error: any) {
39
39
  this.logger.error(`Error creating fixture for model: ${modelFixture.singularName} - ${error.message}`);
40
40
  }
41
41
  }
@@ -59,7 +59,7 @@ export class FixturesService {
59
59
  const deleteCriteria = modelFixture.data; // This should be adjusted based on actual criteria
60
60
  await modelServiceInstance.delete(deleteCriteria);
61
61
  this.logger.log(`Successfully deleted fixture for model: ${modelFixture.singularName}`);
62
- } catch (error) {
62
+ } catch (error: any) {
63
63
  this.logger.error(`Error deleting fixture for model: ${modelFixture.singularName} - ${error.message}`);
64
64
  }
65
65
  }
@@ -25,7 +25,7 @@ import { SolidIntrospectService } from './solid-introspect.service';
25
25
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
26
26
  import { getUserExcludedFields } from 'src/helpers/user-helper';
27
27
  import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
28
- import {upperFirst, camelCase} from 'lodash';
28
+ import { upperFirst, camelCase } from 'lodash';
29
29
  import { classify } from '../helpers/string.helper';
30
30
 
31
31
  interface ImportTemplateFileInfo {
@@ -557,7 +557,7 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
557
557
  const createdRecord = await this.insertRecord(record, JSON.parse(importTransaction.mapping) as ImportMapping[], importTransaction.modelMetadata, modelService);
558
558
  ids.push(createdRecord.id); // Add the ID of the created record to the ids array
559
559
  }
560
- catch (error) {
560
+ catch (error: any) {
561
561
  this.logger.debug(`Error inserting record: ${JSON.stringify(record)}. Error: ${error.message}`);
562
562
  // Get the Import transaction error log repo
563
563
  const errorLog = await this.createErrorLogEntry(importTransaction, record, error);
@@ -140,7 +140,7 @@ export class ListOfValuesService extends CRUDService<ListOfValues> {
140
140
  const filePath = await this.moduleMetadataHelperService.getModuleMetadataFilePath(moduleName);
141
141
  try {
142
142
  await fs.access(filePath);
143
- } catch (error) {
143
+ } catch (error: any) {
144
144
  throw new Error(`Configuration file not found for module: ${moduleName}`);
145
145
  }
146
146
  const metaData = await this.moduleMetadataHelperService.getModuleMetadataConfiguration(filePath);
@@ -0,0 +1,19 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { InjectEntityManager } from '@nestjs/typeorm';
4
+ import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
5
+ import { McpAuditLogRepository } from 'src/repository/mcp-audit-log.repository';
6
+ import { EntityManager } from 'typeorm';
7
+ import { CRUDService } from './crud.service';
8
+
9
+ @Injectable()
10
+ export class McpAuditLogService extends CRUDService<McpAuditLog> {
11
+ constructor(
12
+ @InjectEntityManager()
13
+ readonly entityManager: EntityManager,
14
+ readonly repo: McpAuditLogRepository,
15
+ readonly moduleRef: ModuleRef,
16
+ ) {
17
+ super(entityManager, repo, 'mcpAuditLog', 'solid-core', moduleRef);
18
+ }
19
+ }
@@ -120,6 +120,18 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
120
120
  }
121
121
  }
122
122
 
123
+ async deleteByMediaRecord(media: Media): Promise<void> {
124
+ const storageProvider = media?.mediaStorageProviderMetadata;
125
+ if (!storageProvider) {
126
+ throw new Error(`mediaStorageProviderMetadata is not populated for media id ${media?.id ?? 'unknown'}`);
127
+ }
128
+ if (!storageProvider?.bucketName || !media?.relativeUri) {
129
+ return;
130
+ }
131
+ const region = this.getEffectiveRegion(storageProvider.region);
132
+ await this.s3FileService.delete(`${storageProvider.bucketName}:${media.relativeUri}`, { region });
133
+ }
134
+
123
135
  /**
124
136
  * Get the effective region to use for S3 operations.
125
137
  * Uses the provider-specific region if configured, otherwise falls back to env variable.
@@ -110,6 +110,13 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
110
110
  // });
111
111
  }
112
112
 
113
+ async deleteByMediaRecord(media: Media): Promise<void> {
114
+ if (!media?.relativeUri) {
115
+ return;
116
+ }
117
+ await this.fileService.delete(this.getFullFilePath(media.relativeUri));
118
+ }
119
+
113
120
  private getFullFilePath(fileName: string): string {
114
121
  const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
115
122
  || DEFAULT_MEDIA_FILE_STORAGE_DIR;
@@ -122,4 +129,4 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
122
129
  private getFileName(file: Express.Multer.File): string {
123
130
  return `${file.filename}-${file.originalname}`;
124
131
  }
125
- }
132
+ }
@@ -27,6 +27,7 @@ import {
27
27
  REMOVE_FIELDS_COMMAND,
28
28
  SchematicService
29
29
  } from '../helpers/schematic.service';
30
+ import { CommandService } from '../helpers/command.service';
30
31
  import { CodeGenerationOptions } from '../interfaces';
31
32
  import { CrudHelperService } from './crud-helper.service';
32
33
  import { FieldMetadataService } from './field-metadata.service';
@@ -49,6 +50,7 @@ export class ModelMetadataService {
49
50
  private readonly modelMetadataRepo: ModelMetadataRepository,
50
51
  private readonly fieldMetadataRepo: FieldMetadataRepository,
51
52
  private readonly schematicService: SchematicService,
53
+ private readonly commandService: CommandService,
52
54
  @InjectDataSource()
53
55
  private readonly dataSource: DataSource,
54
56
  private readonly crudHelperService: CrudHelperService,
@@ -154,7 +156,7 @@ export class ModelMetadataService {
154
156
 
155
157
  return model
156
158
  });
157
- } catch (error) {
159
+ } catch (error: any) {
158
160
  // console.error('Transaction failed:', error);
159
161
  this.logger.error('Transaction failed:', error);
160
162
  throw error;
@@ -189,7 +191,7 @@ export class ModelMetadataService {
189
191
 
190
192
  // return model
191
193
  });
192
- } catch (error) {
194
+ } catch (error: any) {
193
195
  // console.error('Transaction failed:', error);
194
196
  this.logger.error('Transaction failed:', error);
195
197
  throw error;
@@ -309,7 +311,7 @@ export class ModelMetadataService {
309
311
  const updatedContent = JSON.stringify(metaData, null, 2);
310
312
  await fs.writeFile(filePath, updatedContent);
311
313
 
312
- } catch (error) {
314
+ } catch (error: any) {
313
315
  // console.error('File creation failed:', error);
314
316
  this.logger.error('File creation failed:', error);
315
317
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -490,7 +492,7 @@ export class ModelMetadataService {
490
492
  const updatedContent = JSON.stringify(metaData, null, 2);
491
493
  await fs.writeFile(filePath, updatedContent);
492
494
 
493
- } catch (error) {
495
+ } catch (error: any) {
494
496
  // console.error('File creation failed:', error);
495
497
  this.logger.error('File creation failed:', error);
496
498
  throw new Error(ERROR_MESSAGES.FILE_WRITE_FAILED); // Trigger rollback
@@ -524,7 +526,7 @@ export class ModelMetadataService {
524
526
  await this.cleanupOnDelete(entity.id);
525
527
  const r = await this.modelMetadataRepo.remove(entity);
526
528
  return r;
527
- } catch (error) {
529
+ } catch (error: any) {
528
530
  }
529
531
  }
530
532
 
@@ -621,7 +623,7 @@ export class ModelMetadataService {
621
623
  try {
622
624
  await fs.unlink(fileToDelete);
623
625
  this.logger.log(`Deleted file: ${fileToDelete}`);
624
- } catch (error) {
626
+ } catch (error: any) {
625
627
  this.logger.error(`Error deleting file: ${fileToDelete}`, error);
626
628
  }
627
629
  }
@@ -725,7 +727,7 @@ export class ModelMetadataService {
725
727
  );
726
728
  this.solidTsMorphService.removeModuleMembers(moduleFilePath, removedIdentifiers);
727
729
  await this.solidTsMorphService.commit();
728
- } catch (error) {
730
+ } catch (error: any) {
729
731
  this.solidTsMorphService.rollback();
730
732
  this.logger.error(`Failed to clean up module file for model '${modelEntity.singularName}':`, error);
731
733
  }
@@ -735,6 +737,16 @@ export class ModelMetadataService {
735
737
 
736
738
  }
737
739
 
740
+ @DisallowInProduction()
741
+ async generateCodeViaCtl(modelId: number): Promise<string> {
742
+ const model = await this.findOne(modelId);
743
+ return this.commandService.executeCommandWithArgs({
744
+ command: 'npx',
745
+ args: ['@solixai/solidctl@latest', 'generate', 'model', `--name=${model.singularName}`],
746
+ cwd: path.join(process.cwd(), '..'),
747
+ });
748
+ }
749
+
738
750
  @DisallowInProduction()
739
751
  async handleGenerateCode(options: CodeGenerationOptions): Promise<any> {
740
752
  const affectedModelIds = [], refreshModelCodeOutputLines = [], removeFieldCodeOutputLines = [];
@@ -789,7 +801,7 @@ export class ModelMetadataService {
789
801
  await this.populateVAMConfigInDb(model);
790
802
  await this.populateVAMConfigInFile(model);
791
803
  });
792
- } catch (error) {
804
+ } catch (error: any) {
793
805
  this.logger.error('generateVAMConfig Transaction failed:', error);
794
806
  throw error;
795
807
  }
@@ -816,7 +828,7 @@ export class ModelMetadataService {
816
828
  const updatedContent = JSON.stringify(metaData, null, 2);
817
829
  await fs.writeFile(filePath, updatedContent);
818
830
 
819
- } catch (error) {
831
+ } catch (error: any) {
820
832
  // console.error('File creation failed:', error);
821
833
  this.logger.error('File updation failed for View, action, menus config:', error);
822
834
  throw new Error('File updation failed for View, action, menus config'); // Trigger rollback
@@ -826,15 +838,15 @@ export class ModelMetadataService {
826
838
  // Populate the View, Actions and Menus in the config file
827
839
  private populateVAMConfigInFileInternal(formViewLayoutFields: any[], model: ModelMetadata, listViewLayoutFields: { type: string; attrs: { name: string; }; }[], treeViewLayoutFields: { type: string; attrs: { name: string; }; }[], metaData: any) {
828
840
  const column1Fields = [];
829
- const column2Fields = [];
841
+ // const column2Fields = [];
830
842
 
831
843
  // Distribute fields between two columns
832
844
  for (let i = 0; i < formViewLayoutFields.length; i++) {
833
- if (i % 2 === 0) {
834
- column1Fields.push(formViewLayoutFields[i]);
835
- } else {
836
- column2Fields.push(formViewLayoutFields[i]);
837
- }
845
+ // if (i % 2 === 0) {
846
+ column1Fields.push(formViewLayoutFields[i]);
847
+ // } else {
848
+ // column2Fields.push(formViewLayoutFields[i]);
849
+ // }
838
850
  }
839
851
  const actionName = `${model.singularName}-list-action`;
840
852
  const treeViewActionName = `${model.singularName}-tree-action`;
@@ -842,6 +854,7 @@ export class ModelMetadataService {
842
854
  const treeViewName = `${model.singularName}-tree-view`;
843
855
  const formViewName = `${model.singularName}-form-view`;
844
856
  const menuName = `${model.singularName}-menu-item`;
857
+ const nextMenuSequenceNumber = (metaData.menus?.length ?? 0) + 1;
845
858
 
846
859
  const action = {
847
860
  displayName: `${model.displayName} List Action`,
@@ -874,7 +887,7 @@ export class ModelMetadataService {
874
887
  const menu = {
875
888
  displayName: `${model.displayName}`,
876
889
  name: menuName,
877
- sequenceNumber: 1,
890
+ sequenceNumber: nextMenuSequenceNumber,
878
891
  actionUserKey: actionName,
879
892
  moduleUserKey: `${model.module.name}`,
880
893
  parentMenuItemUserKey: "",
@@ -955,11 +968,11 @@ export class ModelMetadataService {
955
968
  attrs: { name: "group-1", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
956
969
  children: column1Fields
957
970
  },
958
- {
959
- type: "column",
960
- attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
961
- children: column2Fields
962
- }
971
+ // {
972
+ // type: "column",
973
+ // attrs: { name: "group-2", label: "", className: "col-12 sm:col-12 md:col-6 lg:col-6" },
974
+ // children: column2Fields
975
+ // }
963
976
  ]
964
977
  },
965
978
  ]
@@ -1274,24 +1287,13 @@ export class ModelMetadataService {
1274
1287
  };
1275
1288
  const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
1276
1289
 
1277
- let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1278
-
1279
- // If a list of field ids or field names is passed for refresh, use these fields only
1280
- if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
1281
- fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
1282
- } else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
1283
- fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
1284
- }
1285
- // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1286
-
1287
1290
  //Execute the schematic command to refresh the model
1288
- const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);
1291
+ const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
1289
1292
 
1290
1293
  return `${refreshOuput}`;
1291
1294
  }
1292
1295
 
1293
- private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {
1294
- // const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
1296
+ private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
1295
1297
  const output = await this.schematicService.executeSchematicCommand(
1296
1298
  REFRESH_MODEL_COMMAND,
1297
1299
  {