@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
@@ -35,7 +35,7 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
35
35
 
36
36
  switch (p.eventType) {
37
37
  case 'insert':
38
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
38
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
39
39
  break;
40
40
  case 'update':
41
41
  await this.chatterMessageService.postAuditMessageOnUpdate(
@@ -43,10 +43,12 @@ export class ChatterQueueSubscriberDatabase extends DatabaseSubscriber<AuditQueu
43
43
  p.modelName,
44
44
  p.before,
45
45
  (p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
46
+ false,
47
+ p.userId,
46
48
  );
47
49
  break;
48
50
  case 'delete':
49
- await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
51
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
50
52
  break;
51
53
  }
52
54
  }
@@ -60,7 +60,7 @@ export class TriggerMcpClientSubscriberDatabase extends DatabaseSubscriber<Trigg
60
60
  // Fallback
61
61
  nestedResponse = String(raw);
62
62
  }
63
- } catch (err) {
63
+ } catch (err: any) {
64
64
  this.triggerMcpClientSubscriberLogger.error("Error processing AI response:", err);
65
65
  nestedResponse = `Error handling response: ${err?.message || String(err)}`;
66
66
  }
@@ -33,7 +33,7 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
33
33
 
34
34
  switch (p.eventType) {
35
35
  case 'insert':
36
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName);
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
37
37
  break;
38
38
  case 'update':
39
39
  await this.chatterMessageService.postAuditMessageOnUpdate(
@@ -41,10 +41,12 @@ export class ChatterQueueSubscriberRabbitmq extends RabbitMqSubscriber<AuditQueu
41
41
  p.modelName,
42
42
  p.before,
43
43
  (p.updatedColumnNames ?? []).map(n => ({ propertyName: n })),
44
+ false,
45
+ p.userId,
44
46
  );
45
47
  break;
46
48
  case 'delete':
47
- await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before);
49
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
48
50
  break;
49
51
  }
50
52
  }
@@ -33,13 +33,20 @@ export class ChatterQueueSubscriberRedis extends RedisSubscriber<any> {
33
33
 
34
34
  switch (p.eventType) {
35
35
  case 'insert':
36
- await this.chatterMessageService.postAuditMessageOnInsert(p.after, { name: p.modelName } as any);
36
+ await this.chatterMessageService.postAuditMessageOnInsert(p.after, p.modelName, false, p.userId);
37
37
  break;
38
38
  case 'update':
39
- await this.chatterMessageService.postAuditMessageOnUpdate(p.after, { name: p.modelName } as any, p.before, (p.updatedColumnNames || []).map(n => ({ propertyName: n })));
39
+ await this.chatterMessageService.postAuditMessageOnUpdate(
40
+ p.after,
41
+ p.modelName,
42
+ p.before,
43
+ (p.updatedColumnNames || []).map(n => ({ propertyName: n })),
44
+ false,
45
+ p.userId,
46
+ );
40
47
  break;
41
48
  case 'delete':
42
- await this.chatterMessageService.postAuditMessageOnDelete(p.before, { name: p.modelName } as any, p.before);
49
+ await this.chatterMessageService.postAuditMessageOnDelete(p.modelName, p.before, false, p.userId);
43
50
  break;
44
51
  }
45
52
  }
@@ -1,14 +1,57 @@
1
-
2
1
  import { User } from "../entities/user.entity";
3
2
  import { OnEvent } from "@nestjs/event-emitter";
4
3
  import { Injectable, Logger } from "@nestjs/common";
5
4
  import { EventDetails, EventType } from "../interfaces";
5
+ import { WhatsAppFactory } from "src/factories/whatsapp.factory";
6
6
 
7
7
  @Injectable()
8
8
  export class UserRegistrationListener {
9
- private logger = new Logger(UserRegistrationListener.name);
10
- @OnEvent(EventType.USER_REGISTERED)
11
- handleUserRegistration(event: EventDetails<User>) {
12
- this.logger.log(`User registered with details: ${JSON.stringify(event.payload)}`);
9
+ private readonly logger = new Logger(UserRegistrationListener.name);
10
+
11
+ constructor(private readonly whatsAppFactory: WhatsAppFactory) {}
12
+
13
+ @OnEvent(EventType.USER_REGISTERED)
14
+ async handleUserRegistration(event: EventDetails<User>) {
15
+ this.logger.log(`User registered with details: ${JSON.stringify(event.payload)}`);
16
+
17
+ const notifyTo = process.env.WHATSAPP_EVENT_NOTIFY_TO;
18
+ if (!notifyTo) {
19
+ this.logger.debug("WHATSAPP_EVENT_NOTIFY_TO not set. Skipping registration WhatsApp notification.");
20
+ return;
21
+ }
22
+
23
+ try {
24
+ const whatsappService = this.whatsAppFactory.getWhatsappService();
25
+ const username = event.payload?.username || "User";
26
+ const userId = event.payload?.id || "N/A";
27
+
28
+ await whatsappService.sendWhatsAppMessage(
29
+ notifyTo,
30
+ "registration_event",
31
+ {
32
+ payload: {
33
+ channel: "whatsapp",
34
+ source: process.env.COMMON_GUPSHUP_WHATSAPP_SOURCE,
35
+ destination: notifyTo,
36
+ "src.name": process.env.COMMON_GUPSHUP_APP_NAME || "solidx",
37
+ message: {
38
+ type: "text",
39
+ text: `New user registered: ${username} (id: ${userId})`,
40
+ },
41
+ },
42
+ },
43
+ );
44
+
45
+ this.logger.log(`Sent registration WhatsApp notification to ${notifyTo}`);
46
+ } catch (error: any) {
47
+ const status = error?.response?.status;
48
+ const responseData = error?.response?.data;
49
+ const errorMessage = error?.message;
50
+ const stack = error?.stack;
51
+
52
+ this.logger.error(
53
+ `Failed to send registration WhatsApp notification to ${notifyTo}. status=${status ?? "unknown"}, response=${typeof responseData === "object" ? JSON.stringify(responseData) : responseData}, message=${errorMessage}, stack=${stack}`,
54
+ );
13
55
  }
14
- }
56
+ }
57
+ }
@@ -0,0 +1,17 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { McpAuditLog } from 'src/entities/mcp-audit-log.entity';
3
+ import { RequestContextService } from 'src/services/request-context.service';
4
+ import { DataSource } from 'typeorm';
5
+ import { SecurityRuleRepository } from './security-rule.repository';
6
+ import { SolidBaseRepository } from './solid-base.repository';
7
+
8
+ @Injectable()
9
+ export class McpAuditLogRepository extends SolidBaseRepository<McpAuditLog> {
10
+ constructor(
11
+ readonly dataSource: DataSource,
12
+ readonly requestContextService: RequestContextService,
13
+ readonly securityRuleRepository: SecurityRuleRepository,
14
+ ) {
15
+ super(McpAuditLog, dataSource, requestContextService, securityRuleRepository);
16
+ }
17
+ }
@@ -56,7 +56,7 @@ export class SecurityRuleRepository extends SolidBaseRepository<SecurityRule> {
56
56
 
57
57
  evaluatedRules.push(evaluatedRule);
58
58
 
59
- } catch (error) {
59
+ } catch (error: any) {
60
60
  this.logger.error(`Error parsing security rule: ${rule.securityRuleConfig}`, error);
61
61
  this.logger.error(error.stack);
62
62
  throw error;
@@ -238,7 +238,7 @@ export class ModuleMetadataSeederService {
238
238
 
239
239
  //FIXME: Handle displaying the created users credentials in a better way.
240
240
  // this.logger.log(`Newly created username is: ${usersDetail?.length > 0 ? usersDetail[0]?.username : ''} and password is ${usersDetail?.length > 0 ? usersDetail[0]?.password : ''}`);
241
- } catch (error) {
241
+ } catch (error: any) {
242
242
  this.logSeedFailureForCli(error, {
243
243
  moduleName: currentModule,
244
244
  step: currentStep,
@@ -463,7 +463,7 @@ export class ModuleMetadataSeederService {
463
463
  await this.createPermissionIfNotExists(permissionName);
464
464
  }
465
465
 
466
- } catch (error) {
466
+ } catch (error: any) {
467
467
  this.logger.error(error);
468
468
  }
469
469
  }
@@ -544,7 +544,7 @@ export class ModuleMetadataSeederService {
544
544
  moduleRoot = path.dirname(
545
545
  require.resolve('@solidxai/core/package.json'),
546
546
  );
547
- } catch (err) {
547
+ } catch (err: any) {
548
548
  this.logger.debug(
549
549
  'Could not resolve @solidxai/core from node_modules, assuming local execution',
550
550
  );
@@ -610,7 +610,7 @@ export class ModuleMetadataSeederService {
610
610
  moduleRoot = path.dirname(
611
611
  require.resolve('@solidxai/core/package.json'),
612
612
  );
613
- } catch (err) {
613
+ } catch (err: any) {
614
614
  this.logger.debug(
615
615
  'Could not resolve @solidxai/core from node_modules, assuming local execution',
616
616
  );
@@ -19,11 +19,12 @@ import { ModelMetadataService } from 'src/services/model-metadata.service';
19
19
  import { RoleMetadataService } from 'src/services/role-metadata.service';
20
20
  import { UserService } from 'src/services/user.service';
21
21
  import { getMediaStorageProvider } from 'src/services/mediaStorageProviders';
22
- import { TestingRoleSpec, TestingUserSpec } from 'src/testing/contracts/testing-metadata.types';
22
+ import { TestingDataRecord, TestingRoleSpec, TestingUserSpec } from 'src/testing/contracts/testing-metadata.types';
23
23
 
24
24
  @Injectable()
25
25
  export class ModuleTestDataService {
26
26
  private readonly logger = new Logger(ModuleTestDataService.name);
27
+ private static readonly TEARDOWN_RETRY_ATTEMPTS = 5;
27
28
 
28
29
  constructor(
29
30
  private readonly moduleRef: ModuleRef,
@@ -50,6 +51,25 @@ export class ModuleTestDataService {
50
51
  }
51
52
  }
52
53
 
54
+ async removeTestData(modulesToTest?: string[]): Promise<void> {
55
+ const testDataFiles = this.testDataFiles;
56
+ const filteredFiles = modulesToTest?.length ? testDataFiles.filter((file) => modulesToTest.includes(file.moduleMetadata?.name)) : testDataFiles;
57
+
58
+ if (filteredFiles.length === 0) {
59
+ this.logger.warn('No modules matched the provided modulesToTest list.');
60
+ console.log('No modules matched the provided modulesToTest list.');
61
+ return;
62
+ }
63
+
64
+ for (const overallMetadata of filteredFiles) {
65
+ const moduleName = overallMetadata?.moduleMetadata?.name ?? 'unknown';
66
+ this.logger.log(`Removing test data for module: ${moduleName}`);
67
+ console.log(`Removing test data for module: ${moduleName}`);
68
+ await this.unlinkTestData(overallMetadata);
69
+ console.log(`✔ Test data unlink complete for module: ${moduleName}`);
70
+ }
71
+ }
72
+
53
73
  async createTestDatasources(): Promise<void> {
54
74
  const manifestPath = path.join(process.cwd(), '.solidx-test-manifest');
55
75
  if (fs.existsSync(manifestPath)) {
@@ -198,7 +218,7 @@ export class ModuleTestDataService {
198
218
 
199
219
  const testingRoles: TestingRoleSpec[] = overallMetadata?.testing?.roles ?? [];
200
220
  const testingUsers: TestingUserSpec[] = overallMetadata?.testing?.users ?? [];
201
- const testingData: Array<{ modelUserKey: string; data: Record<string, any> }> = overallMetadata?.testing?.data ?? [];
221
+ const testingData: TestingDataRecord[] = overallMetadata?.testing?.data ?? [];
202
222
 
203
223
  if (testingRoles.length > 0) {
204
224
  await this.seedTestRoles(testingRoles);
@@ -289,16 +309,21 @@ export class ModuleTestDataService {
289
309
  // Upsert entity, capturing the saved result for post-save steps
290
310
  let savedEntity: any;
291
311
  const userKeyField = modelDef.userKeyFieldUserKey;
312
+ const recordUserKeyValue = entry.recUserKeyValue ?? payload[userKeyField];
313
+ const recordLabel = `${modelUserKey}.${userKeyField}=${recordUserKeyValue}`;
292
314
  if (userKeyField && payload[userKeyField] !== undefined) {
293
315
  const existing = await entityRepo.findOne({
294
316
  where: { [userKeyField]: payload[userKeyField] },
295
317
  });
296
318
  if (existing) {
319
+ console.log(`Updating test data record: ${recordLabel}`);
297
320
  savedEntity = await entityRepo.save(entityRepo.merge(existing, payload));
298
321
  } else {
322
+ console.log(`Creating test data record: ${recordLabel}`);
299
323
  savedEntity = await entityRepo.save(entityRepo.create(payload));
300
324
  }
301
325
  } else {
326
+ console.log(`Creating test data record without user key lookup: ${modelUserKey}`);
302
327
  savedEntity = await entityRepo.save(entityRepo.create(payload));
303
328
  }
304
329
 
@@ -312,6 +337,59 @@ export class ModuleTestDataService {
312
337
  }
313
338
  }
314
339
 
340
+ private async unlinkTestData(overallMetadata: any): Promise<void> {
341
+ const moduleMetadata: CreateModuleMetadataDto = overallMetadata.moduleMetadata;
342
+ if (!moduleMetadata) {
343
+ throw new Error('Module metadata missing from test data payload.');
344
+ }
345
+
346
+ const testingData: TestingDataRecord[] = overallMetadata?.testing?.data ?? [];
347
+ if (testingData.length === 0) {
348
+ this.logger.debug(`No test data found for ${moduleMetadata.name}`);
349
+ return;
350
+ }
351
+
352
+ const modelsByName = new Map<string, CreateModelMetadataDto>(
353
+ (moduleMetadata.models ?? []).map((m) => [m.singularName, m]),
354
+ );
355
+
356
+ for (const entry of [...testingData].reverse()) {
357
+ const modelUserKey = entry.modelUserKey;
358
+ const modelDef = modelsByName.get(modelUserKey);
359
+ if (!modelDef) {
360
+ throw new Error(`Test data modelUserKey not found in metadata: ${modelUserKey}`);
361
+ }
362
+
363
+ const userKeyField = modelDef.userKeyFieldUserKey;
364
+ if (!userKeyField) {
365
+ throw new Error(`Cannot unlink test data for model ${modelUserKey} because userKeyFieldUserKey is not configured.`);
366
+ }
367
+
368
+ const userKeyValue = entry.data?.[userKeyField];
369
+ if (userKeyValue === undefined || userKeyValue === null || userKeyValue === '') {
370
+ throw new Error(
371
+ `Cannot unlink test data for model ${modelUserKey} because testing.data entry is missing the actual user key field "${userKeyField}" in data.`,
372
+ );
373
+ }
374
+ const recordLabel = `${modelUserKey}.${userKeyField}=${userKeyValue}`;
375
+
376
+ const entityRepo = this.resolveRepository(modelUserKey);
377
+ const existing = typeof entityRepo.findOneByUserKey === 'function'
378
+ ? await entityRepo.findOneByUserKey(userKeyValue)
379
+ : await entityRepo.findOne({ where: { [userKeyField]: userKeyValue } });
380
+
381
+ if (!existing) {
382
+ console.log(`Skipping unlink; test data record not found: ${recordLabel}`);
383
+ this.logger.debug(`Test data record not found for unlink: ${modelUserKey}.${userKeyField}=${userKeyValue}`);
384
+ continue;
385
+ }
386
+
387
+ console.log(`Deleting test data record: ${recordLabel}`);
388
+ await entityRepo.remove(existing);
389
+ this.logger.debug(`Removed test data record: ${modelUserKey}.${userKeyField}=${userKeyValue}`);
390
+ }
391
+ }
392
+
315
393
  private async seedTestRoles(roles: TestingRoleSpec[]): Promise<void> {
316
394
  const roleService = this.moduleRef.get(RoleMetadataService, { strict: false });
317
395
  if (!roleService) {
@@ -665,31 +743,122 @@ export class ModuleTestDataService {
665
743
  private async dropTestDatabaseObjects(databases: Record<string, string>): Promise<void> {
666
744
  const entries = Object.entries(databases);
667
745
  for (const [dsName, dbName] of entries) {
668
- const dataSource = this.resolveDataSourceByName(dsName);
669
- if (!dataSource.isInitialized) {
670
- await dataSource.initialize();
671
- }
746
+ await this.dropTestDatabaseObjectsWithRetry(dsName, dbName);
747
+ }
748
+ }
672
749
 
673
- console.log(`Dropping test database/schema "${dbName}" on datasource "${dsName}"...`);
750
+ private async dropTestDatabaseObjectsWithRetry(dsName: string, dbName: string): Promise<void> {
751
+ let lastError: unknown;
752
+
753
+ for (let attempt = 1; attempt <= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS; attempt += 1) {
754
+ console.log(`Attempting to tear down "${dbName}" on datasource "${dsName}" (${attempt}/${ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS})...`);
674
755
 
675
- const queryRunner = dataSource.createQueryRunner();
676
756
  try {
677
- const type = dataSource.options.type;
678
- if (type === 'postgres') {
679
- await queryRunner.query(`DROP DATABASE IF EXISTS "${dbName}"`);
680
- } else if (type === 'mssql') {
681
- await this.dropMssqlSchema(queryRunner, dbName);
682
- } else if (type === 'mysql' || type === 'mariadb') {
683
- await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
684
- } else {
685
- throw new Error(`Unsupported database type for test data deletion: ${type}`);
757
+ await this.dropSingleTestDatabaseObject(dsName, dbName);
758
+ return;
759
+ } catch (error) {
760
+ lastError = error;
761
+ if (attempt >= ModuleTestDataService.TEARDOWN_RETRY_ATTEMPTS) {
762
+ throw error;
686
763
  }
764
+
765
+ await this.sleep(this.teardownRetryDelayMs(attempt));
766
+ }
767
+ }
768
+
769
+ throw lastError instanceof Error ? lastError : new Error(String(lastError));
770
+ }
771
+
772
+ private teardownRetryDelayMs(attempt: number): number {
773
+ const baseMs = 500;
774
+ const incrementMs = 350;
775
+ const jitterMs = Math.floor(Math.random() * 250);
776
+ return baseMs + ((attempt - 1) * incrementMs) + jitterMs;
777
+ }
778
+
779
+ private async sleep(ms: number): Promise<void> {
780
+ await new Promise((resolve) => setTimeout(resolve, ms));
781
+ }
782
+
783
+ private async dropSingleTestDatabaseObject(dsName: string, dbName: string): Promise<void> {
784
+ const dataSource = this.resolveDataSourceByName(dsName);
785
+
786
+ if (dataSource.options.type === 'postgres') {
787
+ await this.dropPostgresDatabase(dataSource, dbName);
788
+ return;
789
+ }
790
+
791
+ if (!dataSource.isInitialized) {
792
+ await dataSource.initialize();
793
+ }
794
+
795
+ const queryRunner = dataSource.createQueryRunner();
796
+ try {
797
+ const type = dataSource.options.type;
798
+ if (type === 'mssql') {
799
+ await this.dropMssqlSchema(queryRunner, dbName);
800
+ } else if (type === 'mysql' || type === 'mariadb') {
801
+ await queryRunner.query(`DROP DATABASE IF EXISTS \`${dbName}\``);
802
+ } else {
803
+ throw new Error(`Unsupported database type for test data deletion: ${type}`);
804
+ }
805
+ } finally {
806
+ await queryRunner.release();
807
+ }
808
+ }
809
+
810
+ private async dropPostgresDatabase(dataSource: DataSource, dbName: string): Promise<void> {
811
+ if (dataSource.isInitialized) {
812
+ await dataSource.destroy();
813
+ }
814
+
815
+ const adminDataSource = new DataSource({
816
+ ...(dataSource.options as any),
817
+ database: this.resolvePostgresMaintenanceDatabase(dataSource),
818
+ name: `${String(dataSource.name ?? 'default')}_teardown_admin_${Date.now()}`,
819
+ synchronize: false,
820
+ migrationsRun: false,
821
+ entities: [],
822
+ subscribers: [],
823
+ migrations: [],
824
+ });
825
+
826
+ try {
827
+ await adminDataSource.initialize();
828
+ const queryRunner = adminDataSource.createQueryRunner();
829
+ try {
830
+ await queryRunner.query(
831
+ `SELECT pg_terminate_backend(pid)
832
+ FROM pg_stat_activity
833
+ WHERE datname = $1
834
+ AND pid <> pg_backend_pid()`,
835
+ [dbName],
836
+ );
837
+ await queryRunner.query(`DROP DATABASE IF EXISTS "${dbName}"`);
687
838
  } finally {
688
839
  await queryRunner.release();
689
840
  }
841
+ } finally {
842
+ if (adminDataSource.isInitialized) {
843
+ await adminDataSource.destroy();
844
+ }
690
845
  }
691
846
  }
692
847
 
848
+ private resolvePostgresMaintenanceDatabase(dataSource: DataSource): string {
849
+ const configured = process.env.POSTGRES_MAINTENANCE_DATABASE?.trim();
850
+ if (configured) {
851
+ return configured;
852
+ }
853
+
854
+ const currentDb = String((dataSource.options as any)?.database ?? '').trim();
855
+ if (currentDb && currentDb !== 'postgres') {
856
+ return 'postgres';
857
+ }
858
+
859
+ return 'template1';
860
+ }
861
+
693
862
  private async dropMssqlSchema(queryRunner: ReturnType<DataSource['createQueryRunner']>, schemaName: string): Promise<void> {
694
863
  const foreignKeys: Array<{ fk_name: string; table_name: string }> = await queryRunner.query(
695
864
  `SELECT fk.name AS fk_name, t.name AS table_name
@@ -52,7 +52,7 @@ export class PermissionMetadataSeederService {
52
52
  }
53
53
  }
54
54
 
55
- } catch (error) {
55
+ } catch (error: any) {
56
56
  this.logger.error(error);
57
57
  }
58
58
  }