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

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 (322) hide show
  1. package/dist/commands/refresh-model.command.d.ts +1 -7
  2. package/dist/commands/refresh-model.command.d.ts.map +1 -1
  3. package/dist/commands/refresh-model.command.js +4 -49
  4. package/dist/commands/refresh-model.command.js.map +1 -1
  5. package/dist/commands/refresh-module.command.d.ts +0 -2
  6. package/dist/commands/refresh-module.command.d.ts.map +1 -1
  7. package/dist/commands/refresh-module.command.js +3 -16
  8. package/dist/commands/refresh-module.command.js.map +1 -1
  9. package/dist/commands/test-data.command.d.ts +2 -0
  10. package/dist/commands/test-data.command.d.ts.map +1 -1
  11. package/dist/commands/test-data.command.js +32 -6
  12. package/dist/commands/test-data.command.js.map +1 -1
  13. package/dist/controllers/action-metadata.controller.js +1 -1
  14. package/dist/controllers/action-metadata.controller.js.map +1 -1
  15. package/dist/controllers/chatter-message.controller.d.ts +2 -0
  16. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  17. package/dist/controllers/chatter-message.controller.js +17 -0
  18. package/dist/controllers/chatter-message.controller.js.map +1 -1
  19. package/dist/controllers/facebook-authentication.controller.js +1 -1
  20. package/dist/controllers/facebook-authentication.controller.js.map +1 -1
  21. package/dist/controllers/google-authentication.controller.js +1 -1
  22. package/dist/controllers/google-authentication.controller.js.map +1 -1
  23. package/dist/controllers/gupshup-webhook.controller.d.ts +11 -0
  24. package/dist/controllers/gupshup-webhook.controller.d.ts.map +1 -0
  25. package/dist/controllers/gupshup-webhook.controller.js +87 -0
  26. package/dist/controllers/gupshup-webhook.controller.js.map +1 -0
  27. package/dist/controllers/mcp-audit-log.controller.d.ts +35 -0
  28. package/dist/controllers/mcp-audit-log.controller.d.ts.map +1 -0
  29. package/dist/controllers/mcp-audit-log.controller.js +147 -0
  30. package/dist/controllers/mcp-audit-log.controller.js.map +1 -0
  31. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  32. package/dist/controllers/menu-item-metadata.controller.js.map +1 -1
  33. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts +16 -0
  34. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.d.ts.map +1 -0
  35. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js +133 -0
  36. package/dist/controllers/meta-cloud-whatsapp-webhook.controller.js.map +1 -0
  37. package/dist/controllers/microsoft-authentication.controller.js +1 -1
  38. package/dist/controllers/microsoft-authentication.controller.js.map +1 -1
  39. package/dist/controllers/model-metadata.controller.d.ts +1 -1
  40. package/dist/controllers/model-metadata.controller.js +2 -2
  41. package/dist/controllers/model-metadata.controller.js.map +1 -1
  42. package/dist/controllers/module-metadata.controller.js +1 -1
  43. package/dist/controllers/module-metadata.controller.js.map +1 -1
  44. package/dist/controllers/mq-message-queue.controller.js +1 -1
  45. package/dist/controllers/mq-message-queue.controller.js.map +1 -1
  46. package/dist/controllers/mq-message.controller.js +1 -1
  47. package/dist/controllers/mq-message.controller.js.map +1 -1
  48. package/dist/controllers/view-metadata.controller.js +1 -1
  49. package/dist/controllers/view-metadata.controller.js.map +1 -1
  50. package/dist/dtos/create-mcp-audit-log.dto.d.ts +19 -0
  51. package/dist/dtos/create-mcp-audit-log.dto.d.ts.map +1 -0
  52. package/dist/dtos/create-mcp-audit-log.dto.js +118 -0
  53. package/dist/dtos/create-mcp-audit-log.dto.js.map +1 -0
  54. package/dist/dtos/update-chatter-note-message.dto.d.ts +5 -0
  55. package/dist/dtos/update-chatter-note-message.dto.d.ts.map +1 -0
  56. package/dist/dtos/update-chatter-note-message.dto.js +34 -0
  57. package/dist/dtos/update-chatter-note-message.dto.js.map +1 -0
  58. package/dist/dtos/update-mcp-audit-log.dto.d.ts +19 -0
  59. package/dist/dtos/update-mcp-audit-log.dto.d.ts.map +1 -0
  60. package/dist/dtos/update-mcp-audit-log.dto.js +117 -0
  61. package/dist/dtos/update-mcp-audit-log.dto.js.map +1 -0
  62. package/dist/dtos/update-user.dto.d.ts +1 -0
  63. package/dist/dtos/update-user.dto.d.ts.map +1 -1
  64. package/dist/dtos/update-user.dto.js +7 -1
  65. package/dist/dtos/update-user.dto.js.map +1 -1
  66. package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
  67. package/dist/entities/chatter-message-details.entity.js +0 -1
  68. package/dist/entities/chatter-message-details.entity.js.map +1 -1
  69. package/dist/entities/mcp-audit-log.entity.d.ts +19 -0
  70. package/dist/entities/mcp-audit-log.entity.d.ts.map +1 -0
  71. package/dist/entities/mcp-audit-log.entity.js +90 -0
  72. package/dist/entities/mcp-audit-log.entity.js.map +1 -0
  73. package/dist/entities/user.entity.js +1 -0
  74. package/dist/entities/user.entity.js.map +1 -1
  75. package/dist/factories/whatsapp.factory.d.ts.map +1 -1
  76. package/dist/factories/whatsapp.factory.js +13 -11
  77. package/dist/factories/whatsapp.factory.js.map +1 -1
  78. package/dist/helpers/bootstrap.helper.d.ts +1 -0
  79. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  80. package/dist/helpers/bootstrap.helper.js +8 -3
  81. package/dist/helpers/bootstrap.helper.js.map +1 -1
  82. package/dist/helpers/command.service.d.ts +1 -0
  83. package/dist/helpers/command.service.d.ts.map +1 -1
  84. package/dist/helpers/command.service.js +1 -0
  85. package/dist/helpers/command.service.js.map +1 -1
  86. package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
  87. package/dist/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.js.map +1 -1
  88. package/dist/helpers/module-metadata-helper.service.js.map +1 -1
  89. package/dist/index.d.ts +6 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +6 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/interfaces.d.ts +1 -2
  94. package/dist/interfaces.d.ts.map +1 -1
  95. package/dist/interfaces.js.map +1 -1
  96. package/dist/jobs/database/chatter-queue-subscriber-database.service.d.ts.map +1 -1
  97. package/dist/jobs/database/chatter-queue-subscriber-database.service.js +3 -3
  98. package/dist/jobs/database/chatter-queue-subscriber-database.service.js.map +1 -1
  99. package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
  100. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.d.ts.map +1 -1
  101. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js +3 -3
  102. package/dist/jobs/rabbitmq/chatter-queue-subscriber.service.js.map +1 -1
  103. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.d.ts.map +1 -1
  104. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js +3 -3
  105. package/dist/jobs/redis/chatter-queue-subscriber-redis.service.js.map +1 -1
  106. package/dist/listeners/user-registration.listener.d.ts +5 -2
  107. package/dist/listeners/user-registration.listener.d.ts.map +1 -1
  108. package/dist/listeners/user-registration.listener.js +37 -4
  109. package/dist/listeners/user-registration.listener.js.map +1 -1
  110. package/dist/repository/mcp-audit-log.repository.d.ts +12 -0
  111. package/dist/repository/mcp-audit-log.repository.d.ts.map +1 -0
  112. package/dist/repository/mcp-audit-log.repository.js +34 -0
  113. package/dist/repository/mcp-audit-log.repository.js.map +1 -0
  114. package/dist/repository/security-rule.repository.js.map +1 -1
  115. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  116. package/dist/seeders/module-test-data.service.d.ts +9 -0
  117. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  118. package/dist/seeders/module-test-data.service.js +155 -18
  119. package/dist/seeders/module-test-data.service.js.map +1 -1
  120. package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
  121. package/dist/seeders/seed-data/solid-core-metadata.json +381 -2
  122. package/dist/services/authentication.service.d.ts +6 -1
  123. package/dist/services/authentication.service.d.ts.map +1 -1
  124. package/dist/services/authentication.service.js +145 -15
  125. package/dist/services/authentication.service.js.map +1 -1
  126. package/dist/services/chatter-message.service.d.ts +13 -4
  127. package/dist/services/chatter-message.service.d.ts.map +1 -1
  128. package/dist/services/chatter-message.service.js +117 -37
  129. package/dist/services/chatter-message.service.js.map +1 -1
  130. package/dist/services/crud.service.js.map +1 -1
  131. package/dist/services/csv.service.js.map +1 -1
  132. package/dist/services/dashboard.service.js.map +1 -1
  133. package/dist/services/database/database-bootstrap.service.js.map +1 -1
  134. package/dist/services/excel.service.js.map +1 -1
  135. package/dist/services/export-transaction.service.js.map +1 -1
  136. package/dist/services/field-metadata.service.js.map +1 -1
  137. package/dist/services/fixtures.service.js.map +1 -1
  138. package/dist/services/import-transaction.service.js.map +1 -1
  139. package/dist/services/list-of-values.service.js.map +1 -1
  140. package/dist/services/mcp-audit-log.service.d.ts +12 -0
  141. package/dist/services/mcp-audit-log.service.d.ts.map +1 -0
  142. package/dist/services/mcp-audit-log.service.js +38 -0
  143. package/dist/services/mcp-audit-log.service.js.map +1 -0
  144. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts +1 -0
  145. package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
  146. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +11 -0
  147. package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
  148. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts +1 -0
  149. package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
  150. package/dist/services/mediaStorageProviders/file-storage-provider.js +6 -0
  151. package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
  152. package/dist/services/model-metadata.service.d.ts +4 -1
  153. package/dist/services/model-metadata.service.d.ts.map +1 -1
  154. package/dist/services/model-metadata.service.js +24 -24
  155. package/dist/services/model-metadata.service.js.map +1 -1
  156. package/dist/services/module-metadata.service.d.ts +4 -1
  157. package/dist/services/module-metadata.service.d.ts.map +1 -1
  158. package/dist/services/module-metadata.service.js +19 -2
  159. package/dist/services/module-metadata.service.js.map +1 -1
  160. package/dist/services/queues/database-publisher.service.js +3 -3
  161. package/dist/services/queues/database-publisher.service.js.map +1 -1
  162. package/dist/services/queues/database-subscriber.service.js.map +1 -1
  163. package/dist/services/queues/rabbitmq-publisher.service.js +3 -3
  164. package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
  165. package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
  166. package/dist/services/queues/redis-publisher.service.d.ts.map +1 -1
  167. package/dist/services/queues/redis-publisher.service.js +4 -1
  168. package/dist/services/queues/redis-publisher.service.js.map +1 -1
  169. package/dist/services/queues/redis-subscriber.service.js.map +1 -1
  170. package/dist/services/role-metadata.service.js.map +1 -1
  171. package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
  172. package/dist/services/settings/default-settings-provider.service.d.ts +232 -8
  173. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  174. package/dist/services/settings/default-settings-provider.service.js +119 -4
  175. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  176. package/dist/services/sms/TwilioSMSService.js.map +1 -1
  177. package/dist/services/solid-introspect.service.js.map +1 -1
  178. package/dist/services/user-activity-history.service.js.map +1 -1
  179. package/dist/services/user.service.js +1 -1
  180. package/dist/services/user.service.js.map +1 -1
  181. package/dist/services/view-metadata.service.d.ts.map +1 -1
  182. package/dist/services/view-metadata.service.js +17 -2
  183. package/dist/services/view-metadata.service.js.map +1 -1
  184. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts +11 -0
  185. package/dist/services/whatsapp/GupshupOtpWhatsappService.d.ts.map +1 -0
  186. package/dist/services/whatsapp/GupshupOtpWhatsappService.js +127 -0
  187. package/dist/services/whatsapp/GupshupOtpWhatsappService.js.map +1 -0
  188. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts +17 -0
  189. package/dist/services/whatsapp/MetaCloudWhatsappService.d.ts.map +1 -0
  190. package/dist/services/whatsapp/MetaCloudWhatsappService.js +209 -0
  191. package/dist/services/whatsapp/MetaCloudWhatsappService.js.map +1 -0
  192. package/dist/solid-core.module.d.ts +2 -2
  193. package/dist/solid-core.module.d.ts.map +1 -1
  194. package/dist/solid-core.module.js +22 -6
  195. package/dist/solid-core.module.js.map +1 -1
  196. package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
  197. package/dist/subscribers/security-rule.subscriber.d.ts.map +1 -1
  198. package/dist/subscribers/security-rule.subscriber.js.map +1 -1
  199. package/dist/subscribers/view-metadata.subscriber.js.map +1 -1
  200. package/dist/testing/core/testing-engine.js.map +1 -1
  201. package/dist/testing/reporter/console-reporter.d.ts +10 -0
  202. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  203. package/dist/testing/reporter/console-reporter.js +21 -0
  204. package/dist/testing/reporter/console-reporter.js.map +1 -1
  205. package/dist/testing/reporter/reporter.types.d.ts +7 -0
  206. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  207. package/dist/testing/reporter/reporter.types.js.map +1 -1
  208. package/dist/testing/reporter/webhook-reporter.js.map +1 -1
  209. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  210. package/dist/testing/runner/run-from-metadata.js +20 -1
  211. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  212. package/dist/winston.logger.d.ts +5 -0
  213. package/dist/winston.logger.d.ts.map +1 -1
  214. package/dist/winston.logger.js +6 -4
  215. package/dist/winston.logger.js.map +1 -1
  216. package/dist-tests/api/authenticate.spec.js +119 -0
  217. package/dist-tests/api/authenticate.spec.js.map +1 -0
  218. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js +97 -0
  219. package/dist-tests/api/crud-service.findOne.cityMaster.spec.js.map +1 -0
  220. package/dist-tests/api/ping.spec.js +21 -0
  221. package/dist-tests/api/ping.spec.js.map +1 -0
  222. package/dist-tests/helpers/auth.js +41 -0
  223. package/dist-tests/helpers/auth.js.map +1 -0
  224. package/dist-tests/helpers/env.js +11 -0
  225. package/dist-tests/helpers/env.js.map +1 -0
  226. package/docs/grouping-enhancements.md +89 -0
  227. package/docs/java-spring/README.md +3 -0
  228. package/docs/java-spring/solid-core-module-deep-dive-report.md +1317 -0
  229. package/docs/seed-changes.md +65 -0
  230. package/docs/test-data-workflow.md +200 -0
  231. package/docs/type-declaration-import-issue.md +24 -0
  232. package/package.json +8 -8
  233. package/src/commands/refresh-model.command.ts +6 -51
  234. package/src/commands/refresh-module.command.ts +3 -16
  235. package/src/commands/test-data.command.ts +29 -6
  236. package/src/controllers/action-metadata.controller.ts +1 -1
  237. package/src/controllers/chatter-message.controller.ts +12 -0
  238. package/src/controllers/facebook-authentication.controller.ts +1 -1
  239. package/src/controllers/google-authentication.controller.ts +1 -1
  240. package/src/controllers/gupshup-webhook.controller.ts +91 -0
  241. package/src/controllers/mcp-audit-log.controller.ts +70 -0
  242. package/src/controllers/menu-item-metadata.controller.ts +1 -1
  243. package/src/controllers/meta-cloud-whatsapp-webhook.controller.ts +155 -0
  244. package/src/controllers/microsoft-authentication.controller.ts +1 -1
  245. package/src/controllers/model-metadata.controller.ts +1 -1
  246. package/src/controllers/module-metadata.controller.ts +1 -1
  247. package/src/controllers/mq-message-queue.controller.ts +1 -1
  248. package/src/controllers/mq-message.controller.ts +1 -1
  249. package/src/controllers/view-metadata.controller.ts +1 -1
  250. package/src/dtos/create-mcp-audit-log.dto.ts +84 -0
  251. package/src/dtos/update-chatter-note-message.dto.ts +14 -0
  252. package/src/dtos/update-mcp-audit-log.dto.ts +83 -0
  253. package/src/dtos/update-user.dto.ts +4 -0
  254. package/src/entities/chatter-message-details.entity.ts +1 -2
  255. package/src/entities/mcp-audit-log.entity.ts +55 -0
  256. package/src/entities/user.entity.ts +1 -1
  257. package/src/factories/whatsapp.factory.ts +33 -32
  258. package/src/helpers/bootstrap.helper.ts +16 -6
  259. package/src/helpers/command.service.ts +2 -0
  260. package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +1 -1
  261. package/src/helpers/field-crud-managers/SelectionDynamicFieldCrudManager.ts +1 -1
  262. package/src/helpers/field-crud-managers/field-quality-check-fixes.md +178 -0
  263. package/src/helpers/module-metadata-helper.service.ts +1 -1
  264. package/src/index.ts +6 -0
  265. package/src/interfaces.ts +1 -3
  266. package/src/jobs/database/chatter-queue-subscriber-database.service.ts +4 -2
  267. package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +1 -1
  268. package/src/jobs/rabbitmq/chatter-queue-subscriber.service.ts +4 -2
  269. package/src/jobs/redis/chatter-queue-subscriber-redis.service.ts +10 -3
  270. package/src/listeners/user-registration.listener.ts +49 -6
  271. package/src/repository/mcp-audit-log.repository.ts +17 -0
  272. package/src/repository/security-rule.repository.ts +1 -1
  273. package/src/seeders/module-metadata-seeder.service.ts +4 -4
  274. package/src/seeders/module-test-data.service.ts +186 -17
  275. package/src/seeders/permission-metadata-seeder.service.ts +1 -1
  276. package/src/seeders/seed-data/solid-core-metadata.json +381 -2
  277. package/src/services/authentication.service.ts +267 -44
  278. package/src/services/chatter-message.service.ts +140 -40
  279. package/src/services/crud.service.ts +1 -1
  280. package/src/services/csv.service.ts +1 -1
  281. package/src/services/dashboard.service.ts +1 -1
  282. package/src/services/database/database-bootstrap.service.ts +1 -1
  283. package/src/services/excel.service.ts +1 -1
  284. package/src/services/export-transaction.service.ts +2 -2
  285. package/src/services/field-metadata.service.ts +1 -1
  286. package/src/services/fixtures.service.ts +2 -2
  287. package/src/services/import-transaction.service.ts +2 -2
  288. package/src/services/list-of-values.service.ts +1 -1
  289. package/src/services/mcp-audit-log.service.ts +19 -0
  290. package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +12 -0
  291. package/src/services/mediaStorageProviders/file-storage-provider.ts +8 -1
  292. package/src/services/model-metadata.service.ts +36 -34
  293. package/src/services/module-metadata.service.ts +19 -7
  294. package/src/services/queues/database-publisher.service.ts +4 -4
  295. package/src/services/queues/database-subscriber.service.ts +1 -1
  296. package/src/services/queues/rabbitmq-publisher.service.ts +7 -7
  297. package/src/services/queues/rabbitmq-subscriber.service.ts +8 -8
  298. package/src/services/queues/redis-publisher.service.ts +7 -4
  299. package/src/services/queues/redis-subscriber.service.ts +4 -4
  300. package/src/services/role-metadata.service.ts +1 -1
  301. package/src/services/scheduled-jobs/scheduler.service.ts +5 -5
  302. package/src/services/settings/default-settings-provider.service.ts +119 -4
  303. package/src/services/sms/TwilioSMSService.ts +2 -2
  304. package/src/services/solid-introspect.service.ts +2 -2
  305. package/src/services/user-activity-history.service.ts +1 -1
  306. package/src/services/user.service.ts +1 -1
  307. package/src/services/view-metadata.service.ts +25 -8
  308. package/src/services/whatsapp/GupshupOtpWhatsappService.ts +174 -0
  309. package/src/services/whatsapp/MetaCloudWhatsappService.ts +253 -0
  310. package/src/solid-core.module.ts +213 -196
  311. package/src/subscribers/computed-entity-field.subscriber.ts +1 -1
  312. package/src/subscribers/security-rule.subscriber.ts +8 -8
  313. package/src/subscribers/view-metadata.subscriber.ts +1 -1
  314. package/src/testing/README.md +15 -0
  315. package/src/testing/core/testing-engine.ts +2 -2
  316. package/src/testing/reporter/console-reporter.ts +27 -0
  317. package/src/testing/reporter/reporter.types.ts +7 -0
  318. package/src/testing/reporter/webhook-reporter.ts +1 -1
  319. package/src/testing/runner/run-from-metadata.ts +19 -1
  320. package/src/winston.logger.ts +5 -7
  321. package/.claude/settings.local.json +0 -15
  322. package/src/services/1.js +0 -6
@@ -1,10 +1,12 @@
1
1
  import { ModuleRef } from "@nestjs/core";
2
2
  import { EntityManager } from 'typeorm';
3
3
  import { PostChatterMessageDto } from '../dtos/post-chatter-message.dto';
4
+ import { UpdateChatterNoteMessageDto } from '../dtos/update-chatter-note-message.dto';
4
5
  import { ModelMetadataHelperService } from '../helpers/model-metadata-helper.service';
5
6
  import { ChatterMessageDetailsRepository } from '../repository/chatter-message-details.repository';
6
7
  import { ChatterMessageRepository } from '../repository/chatter-message.repository';
7
8
  import { FieldMetadataRepository } from '../repository/field-metadata.repository';
9
+ import { MediaRepository } from '../repository/media.repository';
8
10
  import { ModelMetadataRepository } from '../repository/model-metadata.repository';
9
11
  import { CRUDService } from '../services/crud.service';
10
12
  import { ChatterMessage } from '../entities/chatter-message.entity';
@@ -13,18 +15,25 @@ export declare class ChatterMessageService extends CRUDService<ChatterMessage> {
13
15
  readonly entityManager: EntityManager;
14
16
  readonly repo: ChatterMessageRepository;
15
17
  readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository;
18
+ readonly mediaRepository: MediaRepository;
16
19
  readonly fieldMetadataRepo: FieldMetadataRepository;
17
20
  readonly moduleRef: ModuleRef;
18
21
  private readonly modelMetadataRepo;
19
22
  readonly requestContextService: RequestContextService;
20
23
  private readonly modelMetadataHelperService;
21
24
  private readonly _logger;
22
- constructor(entityManager: EntityManager, repo: ChatterMessageRepository, chatterMessageDetailsRepo: ChatterMessageDetailsRepository, fieldMetadataRepo: FieldMetadataRepository, moduleRef: ModuleRef, modelMetadataRepo: ModelMetadataRepository, requestContextService: RequestContextService, modelMetadataHelperService: ModelMetadataHelperService);
25
+ constructor(entityManager: EntityManager, repo: ChatterMessageRepository, chatterMessageDetailsRepo: ChatterMessageDetailsRepository, mediaRepository: MediaRepository, fieldMetadataRepo: FieldMetadataRepository, moduleRef: ModuleRef, modelMetadataRepo: ModelMetadataRepository, requestContextService: RequestContextService, modelMetadataHelperService: ModelMetadataHelperService);
26
+ private resolveMessageUserId;
27
+ private resolveMessageUser;
28
+ private stampMessageAuditFields;
29
+ private isEditableCustomNoteMessage;
30
+ private parseAttachmentIds;
23
31
  markCompleted(id: number): Promise<ChatterMessage>;
32
+ updateCustomNoteMessage(id: number, updateDto: UpdateChatterNoteMessageDto, files?: Express.Multer.File[]): Promise<ChatterMessage>;
24
33
  postMessage(postDto: PostChatterMessageDto, files?: Express.Multer.File[]): Promise<ChatterMessage>;
25
- postAuditMessageOnInsert(entity: any, modelName: string, messageQueue?: boolean): Promise<void>;
26
- postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns?: any[], messageQueue?: boolean): Promise<void>;
27
- postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue?: boolean): Promise<void>;
34
+ postAuditMessageOnInsert(entity: any, modelName: string, messageQueue?: boolean, userId?: number | null): Promise<void>;
35
+ postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns?: any[], messageQueue?: boolean, userId?: number | null): Promise<void>;
36
+ postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue?: boolean, userId?: number | null): Promise<void>;
28
37
  private formatFieldValue;
29
38
  private formatFieldValueDisplay;
30
39
  private hasValueChanged;
@@ -1 +1 @@
1
- {"version":3,"file":"chatter-message.service.d.ts","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAY,aAAa,EAAkB,MAAM,SAAS,CAAC;AAKlE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAC;AAEvF,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,qBACa,qBAAsB,SAAQ,WAAW,CAAC,cAAc,CAAC;IAK9D,QAAQ,CAAC,aAAa,EAAE,aAAa;IAErC,QAAQ,CAAC,IAAI,EAAE,wBAAwB;IAEvC,QAAQ,CAAC,yBAAyB,EAAE,+BAA+B;IAGnE,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB;IACnD,QAAQ,CAAC,SAAS,EAAE,SAAS;IAI7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB;IACrD,OAAO,CAAC,QAAQ,CAAC,0BAA0B;IAlB/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;gBAIrD,aAAa,EAAE,aAAa,EAE5B,IAAI,EAAE,wBAAwB,EAE9B,yBAAyB,EAAE,+BAA+B,EAG1D,iBAAiB,EAAE,uBAAuB,EAC1C,SAAS,EAAE,SAAS,EAIZ,iBAAiB,EAAE,uBAAuB,EAClD,qBAAqB,EAAE,qBAAqB,EACpC,0BAA0B,EAAE,0BAA0B;IAKrE,aAAa,CAAC,EAAE,EAAE,MAAM;IAexB,WAAW,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,GAAE,OAAO,CAAC,MAAM,CAAC,IAAI,EAAO;IAoD7E,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe;IA+DtF,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,cAAc,GAAE,GAAG,EAAO,EAAE,YAAY,GAAE,OAAe;IAqHvI,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,GAAE,OAAe;IAqEpG,OAAO,CAAC,gBAAgB;YAyBV,uBAAuB;IA+CrC,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,uBAAuB;IAgC/B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,kBAAkB;YASZ,sBAAsB;IA6CpC,OAAO,CAAC,WAAW;IAOb,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;;;;;;;;;;;CAkJ5E"}
1
+ {"version":3,"file":"chatter-message.service.d.ts","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ const string_helper_1 = require("../helpers/string.helper");
27
27
  const chatter_message_details_repository_1 = require("../repository/chatter-message-details.repository");
28
28
  const chatter_message_repository_1 = require("../repository/chatter-message.repository");
29
29
  const field_metadata_repository_1 = require("../repository/field-metadata.repository");
30
+ const media_repository_1 = require("../repository/media.repository");
30
31
  const model_metadata_repository_1 = require("../repository/model-metadata.repository");
31
32
  const crud_service_1 = require("./crud.service");
32
33
  const chatter_message_details_entity_1 = require("../entities/chatter-message-details.entity");
@@ -35,11 +36,12 @@ const mediaStorageProviders_1 = require("./mediaStorageProviders");
35
36
  const request_context_service_1 = require("./request-context.service");
36
37
  const common_2 = require("@nestjs/common");
37
38
  let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageService extends crud_service_1.CRUDService {
38
- constructor(entityManager, repo, chatterMessageDetailsRepo, fieldMetadataRepo, moduleRef, modelMetadataRepo, requestContextService, modelMetadataHelperService) {
39
+ constructor(entityManager, repo, chatterMessageDetailsRepo, mediaRepository, fieldMetadataRepo, moduleRef, modelMetadataRepo, requestContextService, modelMetadataHelperService) {
39
40
  super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);
40
41
  this.entityManager = entityManager;
41
42
  this.repo = repo;
42
43
  this.chatterMessageDetailsRepo = chatterMessageDetailsRepo;
44
+ this.mediaRepository = mediaRepository;
43
45
  this.fieldMetadataRepo = fieldMetadataRepo;
44
46
  this.moduleRef = moduleRef;
45
47
  this.modelMetadataRepo = modelMetadataRepo;
@@ -47,6 +49,36 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
47
49
  this.modelMetadataHelperService = modelMetadataHelperService;
48
50
  this._logger = new common_2.Logger(ChatterMessageService_1.name);
49
51
  }
52
+ resolveMessageUserId(userId) {
53
+ if (userId) {
54
+ return userId;
55
+ }
56
+ return this.requestContextService.getActiveUser()?.sub ?? null;
57
+ }
58
+ resolveMessageUser(userId) {
59
+ const resolvedUserId = this.resolveMessageUserId(userId);
60
+ return resolvedUserId ? { id: resolvedUserId } : null;
61
+ }
62
+ stampMessageAuditFields(chatterMessage, userId) {
63
+ const resolvedUserId = this.resolveMessageUserId(userId);
64
+ chatterMessage.user = resolvedUserId ? { id: resolvedUserId } : null;
65
+ chatterMessage.createdBy = resolvedUserId;
66
+ chatterMessage.updatedBy = resolvedUserId;
67
+ }
68
+ isEditableCustomNoteMessage(message) {
69
+ if (message.messageType !== chatter_message_constants_1.CHATTER_MESSAGE_TYPE.CUSTOM) {
70
+ return false;
71
+ }
72
+ return [chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.CUSTOM, chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.NOTE].includes(message.messageSubType);
73
+ }
74
+ parseAttachmentIds(value) {
75
+ if (!value || typeof value !== 'string')
76
+ return [];
77
+ return value
78
+ .split(',')
79
+ .map(v => Number(v.trim()))
80
+ .filter(v => Number.isInteger(v) && v > 0);
81
+ }
50
82
  async markCompleted(id) {
51
83
  const activeUser = this.requestContextService.getActiveUser();
52
84
  if (!activeUser) {
@@ -59,6 +91,81 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
59
91
  message.status = chatter_message_constants_1.CHATTER_MESSAGE_STATUS.COMPLETED;
60
92
  return this.repo.save(message);
61
93
  }
94
+ async updateCustomNoteMessage(id, updateDto, files = []) {
95
+ const activeUser = this.requestContextService.getActiveUser();
96
+ if (!activeUser) {
97
+ throw new common_1.ForbiddenException(error_messages_1.ERROR_MESSAGES.FORBIDDEN);
98
+ }
99
+ const message = await this.repo.findOne({ where: { id }, relations: { user: true } });
100
+ if (!message) {
101
+ throw new common_1.NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);
102
+ }
103
+ if (!this.isEditableCustomNoteMessage(message)) {
104
+ throw new common_1.BadRequestException('Only custom note messages can be edited.');
105
+ }
106
+ if (!message.user?.id || message.user.id !== activeUser.sub) {
107
+ throw new common_1.ForbiddenException('You can only edit your own custom note messages.');
108
+ }
109
+ const removeAttachmentIds = this.parseAttachmentIds(updateDto?.removeAttachmentIds);
110
+ const hasMessageBody = typeof updateDto?.messageBody === 'string';
111
+ const trimmedMessageBody = (updateDto?.messageBody ?? '').trim();
112
+ const hasNewFiles = Array.isArray(files) && files.length > 0;
113
+ if (!hasMessageBody && removeAttachmentIds.length === 0 && !hasNewFiles) {
114
+ throw new common_1.BadRequestException('No note changes submitted.');
115
+ }
116
+ if (hasMessageBody && trimmedMessageBody.length === 0) {
117
+ throw new common_1.BadRequestException('Message body cannot be empty.');
118
+ }
119
+ if (hasMessageBody) {
120
+ message.messageBody = trimmedMessageBody;
121
+ }
122
+ message.updatedBy = activeUser.sub;
123
+ message.updatedAt = new Date();
124
+ const savedMessage = await this.repo.save(message);
125
+ if (removeAttachmentIds.length > 0 || hasNewFiles) {
126
+ const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {
127
+ fields: {
128
+ model: true,
129
+ mediaStorageProvider: true,
130
+ },
131
+ module: true,
132
+ });
133
+ const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');
134
+ const attachmentFieldIds = mediaFields.map(field => field.id);
135
+ if (removeAttachmentIds.length > 0 && attachmentFieldIds.length > 0) {
136
+ const mediaToRemove = await this.mediaRepository.find({
137
+ where: {
138
+ id: (0, typeorm_2.In)(removeAttachmentIds),
139
+ entityId: savedMessage.id,
140
+ modelMetadata: { id: model.id },
141
+ fieldMetadata: { id: (0, typeorm_2.In)(attachmentFieldIds) },
142
+ },
143
+ relations: {
144
+ mediaStorageProviderMetadata: true,
145
+ fieldMetadata: true,
146
+ },
147
+ });
148
+ for (const media of mediaToRemove) {
149
+ const storageType = media.mediaStorageProviderMetadata?.type;
150
+ const storageProvider = await (0, mediaStorageProviders_1.getMediaStorageProvider)(this.moduleRef, storageType);
151
+ await storageProvider.deleteByMediaRecord(media);
152
+ }
153
+ if (mediaToRemove.length > 0) {
154
+ await this.mediaRepository.remove(mediaToRemove);
155
+ }
156
+ }
157
+ for (const mediaField of mediaFields) {
158
+ const storageProviderMetadata = mediaField.mediaStorageProvider;
159
+ const storageProviderType = storageProviderMetadata.type;
160
+ const storageProvider = await (0, mediaStorageProviders_1.getMediaStorageProvider)(this.moduleRef, storageProviderType);
161
+ const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);
162
+ if (media.length > 0) {
163
+ await storageProvider.store(media, savedMessage, mediaField);
164
+ }
165
+ }
166
+ }
167
+ return savedMessage;
168
+ }
62
169
  async postMessage(postDto, files = []) {
63
170
  const chatterMessage = new chatter_message_entity_1.ChatterMessage();
64
171
  chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.CUSTOM;
@@ -73,14 +180,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
73
180
  relations: { userKeyField: true }
74
181
  });
75
182
  chatterMessage.modelDisplayName = model?.displayName ?? null;
76
- const activeUser = this.requestContextService.getActiveUser();
77
- if (activeUser) {
78
- const userId = activeUser?.sub;
79
- chatterMessage.user = { id: userId };
80
- }
81
- else {
82
- chatterMessage.user = null;
83
- }
183
+ this.stampMessageAuditFields(chatterMessage);
84
184
  const savedMessage = await this.repo.save(chatterMessage);
85
185
  if (files && files.length > 0) {
86
186
  const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {
@@ -103,7 +203,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
103
203
  }
104
204
  return savedMessage;
105
205
  }
106
- async postAuditMessageOnInsert(entity, modelName, messageQueue = false) {
206
+ async postAuditMessageOnInsert(entity, modelName, messageQueue = false, userId) {
107
207
  if (!entity) {
108
208
  return;
109
209
  }
@@ -123,7 +223,6 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
123
223
  const auditFields = model.fields.filter(field => field.enableAuditTracking &&
124
224
  !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&
125
225
  !(field.type === 'relation' && field.relationType === 'one-to-many'));
126
- const activeUser = this.requestContextService.getActiveUser();
127
226
  const chatterMessage = new chatter_message_entity_1.ChatterMessage();
128
227
  chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.AUDIT;
129
228
  chatterMessage.messageSubType = chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;
@@ -133,13 +232,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
133
232
  chatterMessage.modelDisplayName = model?.displayName;
134
233
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
135
234
  chatterMessage.messageBody = `New ${model?.displayName} created`;
136
- if (activeUser) {
137
- const userId = activeUser?.sub;
138
- chatterMessage.user = { id: userId };
139
- }
140
- else {
141
- chatterMessage.user = null;
142
- }
235
+ this.stampMessageAuditFields(chatterMessage, userId);
143
236
  const savedMessage = await this.repo.save(chatterMessage);
144
237
  for (const field of auditFields) {
145
238
  const fieldValue = entity[field.name];
@@ -157,7 +250,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
157
250
  }
158
251
  }
159
252
  }
160
- async postAuditMessageOnUpdate(entity, modelName, databaseEntity, updatedColumns = [], messageQueue = false) {
253
+ async postAuditMessageOnUpdate(entity, modelName, databaseEntity, updatedColumns = [], messageQueue = false, userId) {
161
254
  if (!databaseEntity || !entity) {
162
255
  return;
163
256
  }
@@ -221,7 +314,6 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
221
314
  if (allChangedFields.length === 0) {
222
315
  return;
223
316
  }
224
- const activeUser = this.requestContextService.getActiveUser();
225
317
  const chatterMessage = new chatter_message_entity_1.ChatterMessage();
226
318
  chatterMessage.messageType = chatter_message_constants_1.CHATTER_MESSAGE_TYPE.AUDIT;
227
319
  chatterMessage.messageSubType = chatter_message_constants_1.CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;
@@ -231,13 +323,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
231
323
  chatterMessage.modelDisplayName = model.displayName;
232
324
  chatterMessage.modelUserKey = entity[model?.userKeyField?.name];
233
325
  chatterMessage.messageBody = `${model?.displayName} updated`;
234
- if (activeUser) {
235
- const userId = activeUser?.sub;
236
- chatterMessage.user = { id: userId };
237
- }
238
- else {
239
- chatterMessage.user = null;
240
- }
326
+ this.stampMessageAuditFields(chatterMessage, userId);
241
327
  const savedMessage = await this.repo.save(chatterMessage);
242
328
  for (const { field, newValue, oldValue } of allChangedFields) {
243
329
  const messageDetail = new chatter_message_details_entity_1.ChatterMessageDetails();
@@ -252,7 +338,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
252
338
  await this.chatterMessageDetailsRepo.save(messageDetail);
253
339
  }
254
340
  }
255
- async postAuditMessageOnDelete(modelName, databaseEntity, messageQueue = false) {
341
+ async postAuditMessageOnDelete(modelName, databaseEntity, messageQueue = false, userId) {
256
342
  const model = await this.modelMetadataRepo.findOne({
257
343
  where: {
258
344
  singularName: (0, string_helper_1.lowerFirst)(modelName)
@@ -283,14 +369,7 @@ let ChatterMessageService = ChatterMessageService_1 = class ChatterMessageServic
283
369
  chatterMessage.modelDisplayName = model?.displayName;
284
370
  chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];
285
371
  chatterMessage.messageBody = `${model?.displayName} deleted`;
286
- const activeUser = this.requestContextService.getActiveUser();
287
- if (activeUser) {
288
- const userId = activeUser?.sub;
289
- chatterMessage.user = { id: userId };
290
- }
291
- else {
292
- chatterMessage.user = null;
293
- }
372
+ this.stampMessageAuditFields(chatterMessage, userId);
294
373
  const savedMessage = await this.repo.save(chatterMessage);
295
374
  for (const field of auditFields) {
296
375
  const fieldValue = populatedEntity[field.name];
@@ -613,10 +692,11 @@ exports.ChatterMessageService = ChatterMessageService;
613
692
  exports.ChatterMessageService = ChatterMessageService = ChatterMessageService_1 = __decorate([
614
693
  (0, common_1.Injectable)(),
615
694
  __param(0, (0, typeorm_1.InjectEntityManager)()),
616
- __param(5, (0, common_1.Inject)((0, common_1.forwardRef)(() => model_metadata_repository_1.ModelMetadataRepository))),
695
+ __param(6, (0, common_1.Inject)((0, common_1.forwardRef)(() => model_metadata_repository_1.ModelMetadataRepository))),
617
696
  __metadata("design:paramtypes", [typeorm_2.EntityManager,
618
697
  chatter_message_repository_1.ChatterMessageRepository,
619
698
  chatter_message_details_repository_1.ChatterMessageDetailsRepository,
699
+ media_repository_1.MediaRepository,
620
700
  field_metadata_repository_1.FieldMetadataRepository,
621
701
  core_1.ModuleRef,
622
702
  model_metadata_repository_1.ModelMetadataRepository,
@@ -1 +1 @@
1
- {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { LocalDateTimeTransformer, serializeDate } from 'src/transformers/typeorm/local-date-time-transformer';\nimport { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { Brackets, EntityManager, EntityMetadata } from 'typeorm';\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { CHATTER_MESSAGE_STATUS, CHATTER_MESSAGE_SUBTYPE, CHATTER_MESSAGE_TYPE } from 'src/constants/chatter-message.constants';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { CRUDService } from 'src/services/crud.service';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { RequestContextService } from './request-context.service';\nimport { Logger } from '@nestjs/common';\n\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n private readonly _logger = new Logger(ChatterMessageService.name);\n\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n // @InjectRepository(ChatterMessageDetailsRepository, 'default')\n readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,\n // @InjectRepository(FieldMetadata, 'default')\n // readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n async markCompleted(id: number) {\n const activeUser = this.requestContextService.getActiveUser();\n if (!activeUser) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n\n const message = await this.repo.findOne({ where: { id } });\n if (!message) {\n throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);\n }\n\n message.status = CHATTER_MESSAGE_STATUS.COMPLETED;\n return this.repo.save(message);\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;\n chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;\n chatterMessage.status = postDto.status ?? CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n chatterMessage.modelUserKey = postDto.modelUserKey ?? null;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: lowerFirst(postDto.coModelName) },\n relations: { userKeyField: true }\n });\n chatterMessage.modelDisplayName = model?.displayName ?? null;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `New ${model?.displayName} created`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const metadata = this.entityManager.connection.entityMetadatas.find(m => m.name === modelName);\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const activeUser = this.requestContextService.getActiveUser();\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = entity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} updated`;\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName);\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n // Populate relation fields so display values (e.g. names) are resolvable.\n // The related entities themselves still exist in the DB after a delete.\n const relationFields = auditFields.filter(field => field.type === 'relation');\n const entityMetadata = this.entityManager.connection.entityMetadatas.find(m => m.name === modelName);\n const populatedEntity = relationFields.length > 0 && entityMetadata\n ? await this.populateRelationFields(databaseEntity, relationFields, entityMetadata)\n : { ...databaseEntity };\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = databaseEntity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} deleted`;\n\n const activeUser = this.requestContextService.getActiveUser();\n\n if (activeUser) {\n const userId = activeUser?.sub;\n chatterMessage.user = { id: userId } as any;\n } else {\n chatterMessage.user = null;\n }\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = populatedEntity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = this.formatFieldValue(field, fieldValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n messageDetail.newValue = null;\n messageDetail.newValueDisplay = null;\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n if (value instanceof Date) {\n return serializeDate(value);\n }\n\n return value.toString();\n }\n\n private async formatFieldValueDisplay(field: any, value: any): Promise<string> {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (['date', 'datetime', 'time'].includes(field.type)) {\n return null;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n if (value.name) {\n return value.name;\n }\n\n try {\n const relatedModel = await this.modelMetadataRepo.findOne({\n where: { singularName: field.relationCoModelSingularName || field.relation },\n relations: { userKeyField: true }\n });\n\n if (relatedModel && relatedModel.userKeyField) {\n const userKeyFieldName = relatedModel.userKeyField.name;\n return value[userKeyFieldName] ? value[userKeyFieldName].toString() : '';\n }\n\n if (value.id) {\n return value.id.toString();\n }\n } catch (error) {\n console.error('Error fetching related model metadata:', error);\n return value.id ? value.id.toString() : '';\n }\n }\n\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n\n private logHeapUsed(label: string) {\n const mb = () => Math.round(process.memoryUsage().heapUsed / 1024 / 1024);\n this._logger.log(`heapUsedMB(${label}): ${mb()}`);\n }\n\n // [2026-02-05T23:31:21.025Z] INFO: [200 OK] \n // GET /api/chatter-message/getChatterMessages/216/mswipeBoomboxBulkUpload?populateMedia[0]=messageAttachments&populate[0]=user&populate[1]=chatterMessageDetails&limit=25 22747ms\n async getChatterMessages(entityId: number, entityName: string, query: any) {\n const { limit = 25, offset = 0, populate = [], populateMedia = [], filters } = query;\n this.logHeapUsed('getChatterMessages-start');\n\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: entityName\n },\n });\n this.logHeapUsed('getChatterMessages-modelLoaded');\n const oneToManyFields = await this.fieldMetadataRepo.find({\n where: {\n model: { id: model.id },\n type: 'relation',\n relationType: 'one-to-many'\n }\n });\n this.logHeapUsed('getChatterMessages-oneToManyFieldsLoaded');\n\n const relatedEntitiesMap = new Map<string, number[]>();\n\n for (const field of oneToManyFields) {\n if (field.enableAuditTracking === false) {\n this._logger.log(`Skipping field ${field.name} for chatter message retrieval because audit tracking is disabled`);\n continue\n }\n const coModelName = field.relationCoModelSingularName;\n const coModelFieldName = field.relationCoModelFieldName;\n\n const coModel = await this.modelMetadataRepo.findOne({\n where: { singularName: coModelName }\n });\n\n if (coModel) {\n //const relatedEntityRepository = this.entityManager.getRepository(classify(coModelName));\n const dsName = coModel.dataSource || 'default';\n const em = dsName === 'default' ? this.entityManager : this.moduleRef.get(`${dsName}EntityManager`, { strict: false });\n\n const relatedEntityRepository = em.getRepository(classify(coModelName));\n\n const relatedEntities = await relatedEntityRepository.find({\n select: {\n id: true,\n },\n where: { [coModelFieldName]: { id: entityId } },\n take: 5,\n });\n\n const relatedIds = relatedEntities.map((entity: any) => entity.id);\n relatedEntitiesMap.set(field.name, relatedIds);\n }\n }\n this.logHeapUsed('getChatterMessages-relatedEntitiesLoaded');\n\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('entity');\n this.logHeapUsed('getChatterMessages-queryBuilderReady');\n\n const orConditions: string[] = [];\n const parameters: any = {};\n\n orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');\n parameters.entityName = entityName;\n parameters.entityId = entityId;\n\n let paramIndex = 0;\n for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {\n if (relatedIds.length > 0) {\n const field = oneToManyFields.find(f => f.name === fieldName);\n if (field) {\n const coModelName = field.relationCoModelSingularName;\n const idsParamName = `relatedIds${paramIndex}`;\n orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);\n parameters[`coModelName${paramIndex}`] = coModelName;\n parameters[idsParamName] = relatedIds;\n paramIndex++;\n }\n }\n }\n\n qb.where(new Brackets(qb => {\n qb.where(orConditions.join(' OR '), parameters);\n }));\n\n const relations = ['chatterMessageDetails', 'user'];\n if (populate && populate.length > 0) {\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));\n }\n\n relations.forEach(relation => {\n qb.leftJoinAndSelect(`entity.${relation}`, relation);\n });\n\n if (filters) {\n qb.andWhere(new Brackets(whereQb => {\n this.crudHelperService.applyFilters(whereQb, filters, 'entity', qb);\n }));\n }\n\n qb.orderBy('entity.createdAt', 'DESC');\n\n qb.skip(offset).take(limit);\n\n const [entities, count] = await qb.getManyAndCount();\n this.logHeapUsed('getChatterMessages-entitiesLoaded');\n\n // Convert date strings in message details to ISO format for consistent handling on the frontend\n const DATE_FIELD_TYPES = ['date', 'datetime', 'time'];\n for (const entity of entities) {\n for (const detail of entity.chatterMessageDetails ?? []) {\n if (!detail.fieldType || !DATE_FIELD_TYPES.includes(detail.fieldType)) continue;\n if (detail.oldValue) {\n const d = LocalDateTimeTransformer.from(detail.oldValue);\n if (d) detail.oldValue = d.toISOString();\n }\n if (detail.newValue) {\n const d = LocalDateTimeTransformer.from(detail.newValue);\n if (d) detail.newValue = d.toISOString();\n }\n }\n }\n\n if (populateMedia && populateMedia.length > 0) {\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n this.logHeapUsed('getChatterMessages-beforePopulateMedia');\n await this['handlePopulateMedia'](normalizedPopulateMedia, entities);\n this.logHeapUsed('getChatterMessages-afterPopulateMedia');\n }\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n return {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n }\n}\n"]}
1
+ {"version":3,"file":"chatter-message.service.js","sourceRoot":"","sources":["../../src/services/chatter-message.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { LocalDateTimeTransformer, serializeDate } from 'src/transformers/typeorm/local-date-time-transformer';\nimport { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';\nimport { ModuleRef } from \"@nestjs/core\";\nimport { InjectEntityManager } from '@nestjs/typeorm';\nimport { Brackets, EntityManager, EntityMetadata, In } from 'typeorm';\n\nimport { classify } from '@angular-devkit/core/src/utils/strings';\nimport { CHATTER_MESSAGE_STATUS, CHATTER_MESSAGE_SUBTYPE, CHATTER_MESSAGE_TYPE } from 'src/constants/chatter-message.constants';\nimport { ERROR_MESSAGES } from 'src/constants/error-messages';\nimport { PostChatterMessageDto } from 'src/dtos/post-chatter-message.dto';\nimport { UpdateChatterNoteMessageDto } from 'src/dtos/update-chatter-note-message.dto';\nimport { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';\nimport { lowerFirst } from 'src/helpers/string.helper';\nimport { ChatterMessageDetailsRepository } from 'src/repository/chatter-message-details.repository';\nimport { ChatterMessageRepository } from 'src/repository/chatter-message.repository';\nimport { FieldMetadataRepository } from 'src/repository/field-metadata.repository';\nimport { MediaRepository } from 'src/repository/media.repository';\nimport { ModelMetadataRepository } from 'src/repository/model-metadata.repository';\nimport { CRUDService } from 'src/services/crud.service';\nimport { MediaStorageProviderType } from '../dtos/create-media-storage-provider-metadata.dto';\nimport { ChatterMessageDetails } from '../entities/chatter-message-details.entity';\nimport { ChatterMessage } from '../entities/chatter-message.entity';\nimport { getMediaStorageProvider } from './mediaStorageProviders';\nimport { RequestContextService } from './request-context.service';\nimport { Logger } from '@nestjs/common';\n\n@Injectable()\nexport class ChatterMessageService extends CRUDService<ChatterMessage> {\n private readonly _logger = new Logger(ChatterMessageService.name);\n\n constructor(\n @InjectEntityManager()\n readonly entityManager: EntityManager,\n // @InjectRepository(ChatterMessage, 'default')\n readonly repo: ChatterMessageRepository,\n // @InjectRepository(ChatterMessageDetailsRepository, 'default')\n readonly chatterMessageDetailsRepo: ChatterMessageDetailsRepository,\n readonly mediaRepository: MediaRepository,\n // @InjectRepository(FieldMetadata, 'default')\n // readonly fieldMetadataRepo: Repository<FieldMetadata>,\n readonly fieldMetadataRepo: FieldMetadataRepository,\n readonly moduleRef: ModuleRef,\n // @InjectRepository(ModelMetadata)\n // private readonly modelMetadataRepo: Repository<ModelMetadata>,\n @Inject(forwardRef(() => ModelMetadataRepository))\n private readonly modelMetadataRepo: ModelMetadataRepository,\n readonly requestContextService: RequestContextService,\n private readonly modelMetadataHelperService: ModelMetadataHelperService,\n ) {\n super(entityManager, repo, 'chatterMessage', 'solid-core', moduleRef);\n }\n\n private resolveMessageUserId(userId?: number | null): number | null {\n if (userId) {\n return userId;\n }\n\n return this.requestContextService.getActiveUser()?.sub ?? null;\n }\n\n private resolveMessageUser(userId?: number | null) {\n const resolvedUserId = this.resolveMessageUserId(userId);\n return resolvedUserId ? ({ id: resolvedUserId } as any) : null;\n }\n\n private stampMessageAuditFields(chatterMessage: ChatterMessage, userId?: number | null) {\n const resolvedUserId = this.resolveMessageUserId(userId);\n chatterMessage.user = resolvedUserId ? ({ id: resolvedUserId } as any) : null;\n chatterMessage.createdBy = resolvedUserId;\n chatterMessage.updatedBy = resolvedUserId;\n }\n\n private isEditableCustomNoteMessage(message: ChatterMessage): boolean {\n if (message.messageType !== CHATTER_MESSAGE_TYPE.CUSTOM) {\n return false;\n }\n return [CHATTER_MESSAGE_SUBTYPE.CUSTOM, CHATTER_MESSAGE_SUBTYPE.NOTE].includes(message.messageSubType as any);\n }\n\n private parseAttachmentIds(value?: string): number[] {\n if (!value || typeof value !== 'string') return [];\n return value\n .split(',')\n .map(v => Number(v.trim()))\n .filter(v => Number.isInteger(v) && v > 0);\n }\n\n async markCompleted(id: number) {\n const activeUser = this.requestContextService.getActiveUser();\n if (!activeUser) {\n throw new BadRequestException(ERROR_MESSAGES.FORBIDDEN);\n }\n\n const message = await this.repo.findOne({ where: { id } });\n if (!message) {\n throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);\n }\n\n message.status = CHATTER_MESSAGE_STATUS.COMPLETED;\n return this.repo.save(message);\n }\n\n async updateCustomNoteMessage(id: number, updateDto: UpdateChatterNoteMessageDto, files: Express.Multer.File[] = []) {\n const activeUser = this.requestContextService.getActiveUser();\n if (!activeUser) {\n throw new ForbiddenException(ERROR_MESSAGES.FORBIDDEN);\n }\n\n const message = await this.repo.findOne({ where: { id }, relations: { user: true } });\n if (!message) {\n throw new NotFoundException(`Entity [solid-core.chatterMessage] with id ${id} not found`);\n }\n\n if (!this.isEditableCustomNoteMessage(message)) {\n throw new BadRequestException('Only custom note messages can be edited.');\n }\n\n if (!message.user?.id || message.user.id !== activeUser.sub) {\n throw new ForbiddenException('You can only edit your own custom note messages.');\n }\n\n const removeAttachmentIds = this.parseAttachmentIds(updateDto?.removeAttachmentIds);\n const hasMessageBody = typeof updateDto?.messageBody === 'string';\n const trimmedMessageBody = (updateDto?.messageBody ?? '').trim();\n const hasNewFiles = Array.isArray(files) && files.length > 0;\n\n if (!hasMessageBody && removeAttachmentIds.length === 0 && !hasNewFiles) {\n throw new BadRequestException('No note changes submitted.');\n }\n\n if (hasMessageBody && trimmedMessageBody.length === 0) {\n throw new BadRequestException('Message body cannot be empty.');\n }\n\n if (hasMessageBody) {\n message.messageBody = trimmedMessageBody;\n }\n message.updatedBy = activeUser.sub;\n // Ensure updatedAt changes even for attachment-only edits.\n message.updatedAt = new Date();\n const savedMessage = await this.repo.save(message);\n\n if (removeAttachmentIds.length > 0 || hasNewFiles) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n const attachmentFieldIds = mediaFields.map(field => field.id);\n\n if (removeAttachmentIds.length > 0 && attachmentFieldIds.length > 0) {\n const mediaToRemove = await this.mediaRepository.find({\n where: {\n id: In(removeAttachmentIds),\n entityId: savedMessage.id,\n modelMetadata: { id: model.id },\n fieldMetadata: { id: In(attachmentFieldIds) },\n },\n relations: {\n mediaStorageProviderMetadata: true,\n fieldMetadata: true,\n },\n });\n\n for (const media of mediaToRemove) {\n const storageType = media.mediaStorageProviderMetadata?.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageType);\n await storageProvider.deleteByMediaRecord(media);\n }\n\n if (mediaToRemove.length > 0) {\n await this.mediaRepository.remove(mediaToRemove);\n }\n }\n\n for (const mediaField of mediaFields) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postMessage(postDto: PostChatterMessageDto, files: Express.Multer.File[] = []) {\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.CUSTOM;\n chatterMessage.messageSubType = postDto.messageSubType || CHATTER_MESSAGE_SUBTYPE.CUSTOM;\n chatterMessage.status = postDto.status ?? CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.messageBody = postDto.messageBody;\n chatterMessage.coModelEntityId = postDto.coModelEntityId;\n chatterMessage.coModelName = postDto.coModelName;\n chatterMessage.modelUserKey = postDto.modelUserKey ?? null;\n\n const model = await this.modelMetadataRepo.findOne({\n where: { singularName: lowerFirst(postDto.coModelName) },\n relations: { userKeyField: true }\n });\n chatterMessage.modelDisplayName = model?.displayName ?? null;\n\n this.stampMessageAuditFields(chatterMessage);\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n if (files && files.length > 0) {\n const model = await this.modelMetadataService.findOneBySingularName('chatterMessage', {\n fields: {\n model: true,\n mediaStorageProvider: true,\n },\n module: true,\n });\n\n const mediaFields = model.fields.filter(field => field.type === 'mediaSingle' || field.type === 'mediaMultiple');\n\n for (const mediaField of mediaFields) {\n const media = files.filter(multerFile => multerFile.fieldname === mediaField.name);\n if (media.length > 0) {\n const storageProviderMetadata = mediaField.mediaStorageProvider;\n const storageProviderType = storageProviderMetadata.type as MediaStorageProviderType;\n const storageProvider = await getMediaStorageProvider(this.moduleRef, storageProviderType);\n await storageProvider.store(media, savedMessage, mediaField);\n }\n }\n }\n\n return savedMessage;\n }\n\n async postAuditMessageOnInsert(entity: any, modelName: string, messageQueue: boolean = false, userId?: number | null) {\n if (!entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const auditFields = model.fields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_INSERT;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = entity.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `New ${model?.displayName} created`;\n this.stampMessageAuditFields(chatterMessage, userId);\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = entity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = null;\n messageDetail.oldValueDisplay = null;\n messageDetail.newValue = this.formatFieldValue(field, fieldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n async postAuditMessageOnUpdate(entity: any, modelName: string, databaseEntity: any, updatedColumns: any[] = [], messageQueue: boolean = false, userId?: number | null) {\n if (!databaseEntity || !entity) {\n return;\n }\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n fields: true,\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName)\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n const updatedFieldNames = new Set(updatedColumns.map(col => col.propertyName));\n\n const allNonRelationFields = auditFields.filter(field => field.type !== 'relation');\n const allRelationFields = auditFields.filter(field => field.type === 'relation');\n\n let potentialNonRelationFields = [];\n\n if (updatedColumns.length > 0) {\n potentialNonRelationFields = allNonRelationFields.filter(field =>\n updatedFieldNames.has(field.name)\n );\n } else {\n potentialNonRelationFields = allNonRelationFields;\n }\n\n const potentialRelationFields = allRelationFields;\n\n const changedNonRelationFields = potentialNonRelationFields.filter(field => {\n const newValue = entity[field.name];\n const oldValue = databaseEntity[field.name];\n return this.hasValueChanged(newValue, oldValue);\n });\n\n const changedRelationFields = [];\n if (potentialRelationFields.length > 0) {\n const metadata = this.entityManager.connection.entityMetadatas.find(m => m.name === modelName);\n const populatedOldEntity = await this.populateRelationFields(databaseEntity, potentialRelationFields, metadata);\n\n for (const field of potentialRelationFields) {\n const newValue = entity[field.name];\n const oldValue = populatedOldEntity[field.name];\n\n if (this.hasRelationValueChanged(field, newValue, oldValue)) {\n changedRelationFields.push({\n field,\n newValue,\n oldValue\n });\n }\n }\n }\n\n const allChangedFields = [\n ...changedNonRelationFields.map(field => ({\n field,\n newValue: entity[field.name],\n oldValue: databaseEntity[field.name]\n })),\n ...changedRelationFields\n ];\n\n if (allChangedFields.length === 0) {\n return;\n }\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_UPDATE;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = entity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model.displayName;\n chatterMessage.modelUserKey = entity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} updated`;\n this.stampMessageAuditFields(chatterMessage, userId);\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const { field, newValue, oldValue } of allChangedFields) {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = this.formatFieldValue(field, oldValue);\n messageDetail.newValue = this.formatFieldValue(field, newValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, oldValue);\n messageDetail.newValueDisplay = await this.formatFieldValueDisplay(field, newValue);\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n\n async postAuditMessageOnDelete(modelName: string, databaseEntity: any, messageQueue: boolean = false, userId?: number | null) {\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: lowerFirst(modelName)\n },\n relations: {\n module: true,\n userKeyField: true\n }\n });\n\n if (!model || !model.enableAuditTracking) {\n return;\n }\n\n const modelFields = await this.modelMetadataHelperService.loadFieldHierarchy(model.singularName);\n\n const auditFields = modelFields.filter(field =>\n field.enableAuditTracking &&\n !['mediaSingle', 'mediaMultiple', 'richText', 'json'].includes(field.type) &&\n !(field.type === 'relation' && field.relationType === 'one-to-many')\n );\n\n // Populate relation fields so display values (e.g. names) are resolvable.\n // The related entities themselves still exist in the DB after a delete.\n const relationFields = auditFields.filter(field => field.type === 'relation');\n const entityMetadata = this.entityManager.connection.entityMetadatas.find(m => m.name === modelName);\n const populatedEntity = relationFields.length > 0 && entityMetadata\n ? await this.populateRelationFields(databaseEntity, relationFields, entityMetadata)\n : { ...databaseEntity };\n\n const chatterMessage = new ChatterMessage();\n chatterMessage.messageType = CHATTER_MESSAGE_TYPE.AUDIT;\n chatterMessage.messageSubType = CHATTER_MESSAGE_SUBTYPE.AUDIT_DELETE;\n chatterMessage.status = CHATTER_MESSAGE_STATUS.PENDING;\n chatterMessage.coModelEntityId = databaseEntity?.id;\n chatterMessage.coModelName = model?.singularName;\n chatterMessage.modelDisplayName = model?.displayName;\n chatterMessage.modelUserKey = databaseEntity[model?.userKeyField?.name];\n chatterMessage.messageBody = `${model?.displayName} deleted`;\n\n this.stampMessageAuditFields(chatterMessage, userId);\n\n const savedMessage = await this.repo.save(chatterMessage);\n\n for (const field of auditFields) {\n const fieldValue = populatedEntity[field.name];\n if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {\n const messageDetail = new ChatterMessageDetails();\n messageDetail.chatterMessage = savedMessage;\n messageDetail.fieldName = field.name;\n messageDetail.fieldDisplayName = field.displayName;\n messageDetail.fieldType = field.type;\n messageDetail.oldValue = this.formatFieldValue(field, fieldValue);\n messageDetail.oldValueDisplay = await this.formatFieldValueDisplay(field, fieldValue);\n messageDetail.newValue = null;\n messageDetail.newValueDisplay = null;\n await this.chatterMessageDetailsRepo.save(messageDetail);\n }\n }\n }\n\n private formatFieldValue(field: any, value: any): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n return value.id;\n }\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.id).join(', ');\n }\n }\n\n if (value instanceof Date) {\n return serializeDate(value);\n }\n\n return value.toString();\n }\n\n private async formatFieldValueDisplay(field: any, value: any): Promise<string> {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (field.type === 'selectionStatic' || field.type === 'selectionDynamic') {\n return `${value}`;\n }\n\n if (['date', 'datetime', 'time'].includes(field.type)) {\n return null;\n }\n\n if (field.type === 'relation') {\n if (field.relationType === \"many-to-one\") {\n if (value.name) {\n return value.name;\n }\n\n try {\n const relatedModel = await this.modelMetadataRepo.findOne({\n where: { singularName: field.relationCoModelSingularName || field.relation },\n relations: { userKeyField: true }\n });\n\n if (relatedModel && relatedModel.userKeyField) {\n const userKeyFieldName = relatedModel.userKeyField.name;\n return value[userKeyFieldName] ? value[userKeyFieldName].toString() : '';\n }\n\n if (value.id) {\n return value.id.toString();\n }\n } catch (error: any) {\n console.error('Error fetching related model metadata:', error);\n return value.id ? value.id.toString() : '';\n }\n }\n\n if (field.relationType === 'many-to-many') {\n return value.map(item => item.name).join(', ');\n }\n }\n\n return value.toString();\n }\n\n private hasValueChanged(newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if (newValue === null && oldValue === null) {\n return false;\n }\n\n if (newValue === undefined && oldValue === undefined) {\n return false;\n }\n\n if (newValue && oldValue && typeof newValue === 'object' && typeof oldValue === 'object') {\n if (newValue.id !== undefined && oldValue.id !== undefined) {\n return newValue.id !== oldValue.id;\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n if (newValue.length !== oldValue.length) {\n return true;\n }\n const newIds = newValue.map(item => item.id || item).sort();\n const oldIds = oldValue.map(item => item.id || item).sort();\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n }\n\n if (Array.isArray(newValue) && Array.isArray(oldValue)) {\n return JSON.stringify(newValue) !== JSON.stringify(oldValue);\n }\n\n return true;\n }\n\n private hasRelationValueChanged(field: any, newValue: any, oldValue: any): boolean {\n if (newValue === oldValue) {\n return false;\n }\n\n if ((newValue === null || newValue === undefined) && (oldValue === null || oldValue === undefined)) {\n return false;\n }\n\n if (field.relationType === 'many-to-one') {\n const newId = this.extractRelationId(newValue);\n const oldId = this.extractRelationId(oldValue);\n return newId !== oldId;\n }\n\n if (field.relationType === 'many-to-many') {\n const newIds = this.extractRelationIds(newValue);\n const oldIds = this.extractRelationIds(oldValue);\n\n if (newIds.length !== oldIds.length) {\n return true;\n }\n\n newIds.sort();\n oldIds.sort();\n\n return JSON.stringify(newIds) !== JSON.stringify(oldIds);\n }\n\n return this.hasValueChanged(newValue, oldValue);\n }\n\n private extractRelationId(value: any): any {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value;\n }\n\n if (typeof value === 'object' && value.id !== undefined) {\n return value.id;\n }\n\n return null;\n }\n\n private extractRelationIds(value: any): any[] {\n if (!Array.isArray(value)) {\n const id = this.extractRelationId(value);\n return id !== null ? [id] : [];\n }\n\n return value.map(item => this.extractRelationId(item)).filter(id => id !== null);\n }\n\n private async populateRelationFields(databaseEntity: any, relationFields: any[], metadata: EntityMetadata): Promise<any> {\n const populatedEntity = { ...databaseEntity };\n\n for (const field of relationFields) {\n const relationValue = databaseEntity[field.name];\n\n if (relationValue === null || relationValue === undefined) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const relationMetadata = metadata.relations.find(rel => rel.propertyName === field.name);\n if (!relationMetadata) {\n populatedEntity[field.name] = relationValue;\n continue;\n }\n\n const targetEntity = relationMetadata.inverseEntityMetadata || relationMetadata.type;\n\n if (field.relationType === 'many-to-one') {\n const relationId = this.extractRelationId(relationValue);\n if (relationId) {\n const relatedEntity = await this.entityManager.findOne(targetEntity as any, {\n where: { id: relationId }\n });\n populatedEntity[field.name] = relatedEntity;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else if (field.relationType === 'many-to-many' || field.relationType === 'manyToMany') {\n const relationIds = this.extractRelationIds(relationValue);\n if (relationIds.length > 0) {\n const relatedEntities = await this.entityManager.findByIds(targetEntity as any, relationIds);\n populatedEntity[field.name] = relatedEntities;\n } else {\n populatedEntity[field.name] = relationValue;\n }\n } else {\n populatedEntity[field.name] = relationValue;\n }\n }\n\n return populatedEntity;\n }\n\n private logHeapUsed(label: string) {\n const mb = () => Math.round(process.memoryUsage().heapUsed / 1024 / 1024);\n this._logger.log(`heapUsedMB(${label}): ${mb()}`);\n }\n\n // [2026-02-05T23:31:21.025Z] INFO: [200 OK] \n // GET /api/chatter-message/getChatterMessages/216/mswipeBoomboxBulkUpload?populateMedia[0]=messageAttachments&populate[0]=user&populate[1]=chatterMessageDetails&limit=25 22747ms\n async getChatterMessages(entityId: number, entityName: string, query: any) {\n const { limit = 25, offset = 0, populate = [], populateMedia = [], filters } = query;\n this.logHeapUsed('getChatterMessages-start');\n\n const model = await this.modelMetadataRepo.findOne({\n where: {\n singularName: entityName\n },\n });\n this.logHeapUsed('getChatterMessages-modelLoaded');\n const oneToManyFields = await this.fieldMetadataRepo.find({\n where: {\n model: { id: model.id },\n type: 'relation',\n relationType: 'one-to-many'\n }\n });\n this.logHeapUsed('getChatterMessages-oneToManyFieldsLoaded');\n\n const relatedEntitiesMap = new Map<string, number[]>();\n\n for (const field of oneToManyFields) {\n if (field.enableAuditTracking === false) {\n this._logger.log(`Skipping field ${field.name} for chatter message retrieval because audit tracking is disabled`);\n continue\n }\n const coModelName = field.relationCoModelSingularName;\n const coModelFieldName = field.relationCoModelFieldName;\n\n const coModel = await this.modelMetadataRepo.findOne({\n where: { singularName: coModelName }\n });\n\n if (coModel) {\n //const relatedEntityRepository = this.entityManager.getRepository(classify(coModelName));\n const dsName = coModel.dataSource || 'default';\n const em = dsName === 'default' ? this.entityManager : this.moduleRef.get(`${dsName}EntityManager`, { strict: false });\n\n const relatedEntityRepository = em.getRepository(classify(coModelName));\n\n const relatedEntities = await relatedEntityRepository.find({\n select: {\n id: true,\n },\n where: { [coModelFieldName]: { id: entityId } },\n take: 5,\n });\n\n const relatedIds = relatedEntities.map((entity: any) => entity.id);\n relatedEntitiesMap.set(field.name, relatedIds);\n }\n }\n this.logHeapUsed('getChatterMessages-relatedEntitiesLoaded');\n\n const qb = await this.repo.createSecurityRuleAwareQueryBuilder('entity');\n this.logHeapUsed('getChatterMessages-queryBuilderReady');\n\n const orConditions: string[] = [];\n const parameters: any = {};\n\n orConditions.push('(entity.coModelName = :entityName AND entity.coModelEntityId = :entityId)');\n parameters.entityName = entityName;\n parameters.entityId = entityId;\n\n let paramIndex = 0;\n for (const [fieldName, relatedIds] of relatedEntitiesMap.entries()) {\n if (relatedIds.length > 0) {\n const field = oneToManyFields.find(f => f.name === fieldName);\n if (field) {\n const coModelName = field.relationCoModelSingularName;\n const idsParamName = `relatedIds${paramIndex}`;\n orConditions.push(`(entity.coModelName = :coModelName${paramIndex} AND entity.coModelEntityId IN (:...${idsParamName}))`);\n parameters[`coModelName${paramIndex}`] = coModelName;\n parameters[idsParamName] = relatedIds;\n paramIndex++;\n }\n }\n }\n\n qb.where(new Brackets(qb => {\n qb.where(orConditions.join(' OR '), parameters);\n }));\n\n const relations = ['chatterMessageDetails', 'user'];\n if (populate && populate.length > 0) {\n const normalizedPopulate = this.crudHelperService.normalize(populate);\n relations.push(...normalizedPopulate.filter(rel => !relations.includes(rel)));\n }\n\n relations.forEach(relation => {\n qb.leftJoinAndSelect(`entity.${relation}`, relation);\n });\n\n if (filters) {\n qb.andWhere(new Brackets(whereQb => {\n this.crudHelperService.applyFilters(whereQb, filters, 'entity', qb);\n }));\n }\n\n qb.orderBy('entity.createdAt', 'DESC');\n\n qb.skip(offset).take(limit);\n\n const [entities, count] = await qb.getManyAndCount();\n this.logHeapUsed('getChatterMessages-entitiesLoaded');\n\n // Convert date strings in message details to ISO format for consistent handling on the frontend\n const DATE_FIELD_TYPES = ['date', 'datetime', 'time'];\n for (const entity of entities) {\n for (const detail of entity.chatterMessageDetails ?? []) {\n if (!detail.fieldType || !DATE_FIELD_TYPES.includes(detail.fieldType)) continue;\n if (detail.oldValue) {\n const d = LocalDateTimeTransformer.from(detail.oldValue);\n if (d) detail.oldValue = d.toISOString();\n }\n if (detail.newValue) {\n const d = LocalDateTimeTransformer.from(detail.newValue);\n if (d) detail.newValue = d.toISOString();\n }\n }\n }\n\n if (populateMedia && populateMedia.length > 0) {\n const normalizedPopulateMedia = this.crudHelperService.normalize(populateMedia);\n this.logHeapUsed('getChatterMessages-beforePopulateMedia');\n await this['handlePopulateMedia'](normalizedPopulateMedia, entities);\n this.logHeapUsed('getChatterMessages-afterPopulateMedia');\n }\n\n const currentPage = Math.floor(offset / limit) + 1;\n const totalPages = Math.ceil(count / limit);\n const nextPage = currentPage < totalPages ? currentPage + 1 : null;\n const prevPage = currentPage > 1 ? currentPage - 1 : null;\n\n return {\n meta: {\n totalRecords: count,\n currentPage: currentPage,\n nextPage: nextPage,\n prevPage: prevPage,\n totalPages: totalPages,\n perPage: +limit,\n },\n records: entities\n };\n }\n}\n"]}