@open-mercato/core 0.4.5-develop-5191db4ef3 → 0.4.5-develop-033a719bf2

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 (385) hide show
  1. package/dist/generated/entities/message/index.js +65 -0
  2. package/dist/generated/entities/message/index.js.map +7 -0
  3. package/dist/generated/entities/message_access_token/index.js +19 -0
  4. package/dist/generated/entities/message_access_token/index.js.map +7 -0
  5. package/dist/generated/entities/message_confirmation/index.js +21 -0
  6. package/dist/generated/entities/message_confirmation/index.js.map +7 -0
  7. package/dist/generated/entities/message_object/index.js +23 -0
  8. package/dist/generated/entities/message_object/index.js.map +7 -0
  9. package/dist/generated/entities/message_recipient/index.js +31 -0
  10. package/dist/generated/entities/message_recipient/index.js.map +7 -0
  11. package/dist/generated/entities.ids.generated.js +8 -0
  12. package/dist/generated/entities.ids.generated.js.map +2 -2
  13. package/dist/generated/entity-fields-registry.js +10 -0
  14. package/dist/generated/entity-fields-registry.js.map +2 -2
  15. package/dist/modules/customers/backend/customers/deals/[id]/page.js +27 -8
  16. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  17. package/dist/modules/customers/lib/messageObjectPreviews.js +131 -0
  18. package/dist/modules/customers/lib/messageObjectPreviews.js.map +7 -0
  19. package/dist/modules/customers/message-objects.js +71 -0
  20. package/dist/modules/customers/message-objects.js.map +7 -0
  21. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js +51 -0
  22. package/dist/modules/customers/widgets/messages/CustomerMessageObjectDetail.js.map +7 -0
  23. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js +35 -0
  24. package/dist/modules/customers/widgets/messages/CustomerMessageObjectPreview.js.map +7 -0
  25. package/dist/modules/customers/widgets/messages/index.js +7 -0
  26. package/dist/modules/customers/widgets/messages/index.js.map +7 -0
  27. package/dist/modules/messages/acl.js +15 -0
  28. package/dist/modules/messages/acl.js.map +7 -0
  29. package/dist/modules/messages/api/[id]/actions/[actionId]/route.js +92 -0
  30. package/dist/modules/messages/api/[id]/actions/[actionId]/route.js.map +7 -0
  31. package/dist/modules/messages/api/[id]/archive/route.js +120 -0
  32. package/dist/modules/messages/api/[id]/archive/route.js.map +7 -0
  33. package/dist/modules/messages/api/[id]/attachments/route.js +195 -0
  34. package/dist/modules/messages/api/[id]/attachments/route.js.map +7 -0
  35. package/dist/modules/messages/api/[id]/confirmation/route.js +67 -0
  36. package/dist/modules/messages/api/[id]/confirmation/route.js.map +7 -0
  37. package/dist/modules/messages/api/[id]/conversation/archive/route.js +68 -0
  38. package/dist/modules/messages/api/[id]/conversation/archive/route.js.map +7 -0
  39. package/dist/modules/messages/api/[id]/conversation/read/route.js +68 -0
  40. package/dist/modules/messages/api/[id]/conversation/read/route.js.map +7 -0
  41. package/dist/modules/messages/api/[id]/conversation/route.js +68 -0
  42. package/dist/modules/messages/api/[id]/conversation/route.js.map +7 -0
  43. package/dist/modules/messages/api/[id]/forward/route.js +85 -0
  44. package/dist/modules/messages/api/[id]/forward/route.js.map +7 -0
  45. package/dist/modules/messages/api/[id]/forward-preview/route.js +70 -0
  46. package/dist/modules/messages/api/[id]/forward-preview/route.js.map +7 -0
  47. package/dist/modules/messages/api/[id]/read/route.js +120 -0
  48. package/dist/modules/messages/api/[id]/read/route.js.map +7 -0
  49. package/dist/modules/messages/api/[id]/reply/route.js +87 -0
  50. package/dist/modules/messages/api/[id]/reply/route.js.map +7 -0
  51. package/dist/modules/messages/api/[id]/route.js +350 -0
  52. package/dist/modules/messages/api/[id]/route.js.map +7 -0
  53. package/dist/modules/messages/api/object-types/route.js +54 -0
  54. package/dist/modules/messages/api/object-types/route.js.map +7 -0
  55. package/dist/modules/messages/api/openapi.js +261 -0
  56. package/dist/modules/messages/api/openapi.js.map +7 -0
  57. package/dist/modules/messages/api/route.js +262 -0
  58. package/dist/modules/messages/api/route.js.map +7 -0
  59. package/dist/modules/messages/api/token/[token]/route.js +99 -0
  60. package/dist/modules/messages/api/token/[token]/route.js.map +7 -0
  61. package/dist/modules/messages/api/types/route.js +40 -0
  62. package/dist/modules/messages/api/types/route.js.map +7 -0
  63. package/dist/modules/messages/api/unread-count/route.js +43 -0
  64. package/dist/modules/messages/api/unread-count/route.js.map +7 -0
  65. package/dist/modules/messages/backend/messages/[id]/page.js +10 -0
  66. package/dist/modules/messages/backend/messages/[id]/page.js.map +7 -0
  67. package/dist/modules/messages/backend/messages/[id]/page.meta.js +16 -0
  68. package/dist/modules/messages/backend/messages/[id]/page.meta.js.map +7 -0
  69. package/dist/modules/messages/backend/messages/compose/page.js +10 -0
  70. package/dist/modules/messages/backend/messages/compose/page.js.map +7 -0
  71. package/dist/modules/messages/backend/messages/compose/page.meta.js +17 -0
  72. package/dist/modules/messages/backend/messages/compose/page.meta.js.map +7 -0
  73. package/dist/modules/messages/backend/page.js +10 -0
  74. package/dist/modules/messages/backend/page.js.map +7 -0
  75. package/dist/modules/messages/backend/page.meta.js +33 -0
  76. package/dist/modules/messages/backend/page.meta.js.map +7 -0
  77. package/dist/modules/messages/commands/actions.js +265 -0
  78. package/dist/modules/messages/commands/actions.js.map +7 -0
  79. package/dist/modules/messages/commands/attachments.js +217 -0
  80. package/dist/modules/messages/commands/attachments.js.map +7 -0
  81. package/dist/modules/messages/commands/confirmations.js +151 -0
  82. package/dist/modules/messages/commands/confirmations.js.map +7 -0
  83. package/dist/modules/messages/commands/conversation.js +240 -0
  84. package/dist/modules/messages/commands/conversation.js.map +7 -0
  85. package/dist/modules/messages/commands/messages.js +748 -0
  86. package/dist/modules/messages/commands/messages.js.map +7 -0
  87. package/dist/modules/messages/commands/recipients.js +259 -0
  88. package/dist/modules/messages/commands/recipients.js.map +7 -0
  89. package/dist/modules/messages/commands/shared.js +258 -0
  90. package/dist/modules/messages/commands/shared.js.map +7 -0
  91. package/dist/modules/messages/commands/tokens.js +69 -0
  92. package/dist/modules/messages/commands/tokens.js.map +7 -0
  93. package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -0
  94. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +7 -0
  95. package/dist/modules/messages/components/MessageDetailPageClient.js +261 -0
  96. package/dist/modules/messages/components/MessageDetailPageClient.js.map +7 -0
  97. package/dist/modules/messages/components/MessagesInboxPageClient.js +390 -0
  98. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +7 -0
  99. package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js +31 -0
  100. package/dist/modules/messages/components/confirmation/MessageConfirmationActions.js.map +7 -0
  101. package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js +69 -0
  102. package/dist/modules/messages/components/confirmation/MessageConfirmationContent.js.map +7 -0
  103. package/dist/modules/messages/components/defaults/DefaultMessageActions.js +31 -0
  104. package/dist/modules/messages/components/defaults/DefaultMessageActions.js.map +7 -0
  105. package/dist/modules/messages/components/defaults/DefaultMessageContent.js +19 -0
  106. package/dist/modules/messages/components/defaults/DefaultMessageContent.js.map +7 -0
  107. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js +90 -0
  108. package/dist/modules/messages/components/defaults/DefaultMessageListItem.js.map +7 -0
  109. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js +86 -0
  110. package/dist/modules/messages/components/defaults/MessageRecordObjectDetail.js.map +7 -0
  111. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js +61 -0
  112. package/dist/modules/messages/components/defaults/MessageRecordObjectPreview.js.map +7 -0
  113. package/dist/modules/messages/components/message-detail/detail-panels.js +27 -0
  114. package/dist/modules/messages/components/message-detail/detail-panels.js.map +7 -0
  115. package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js +52 -0
  116. package/dist/modules/messages/components/message-detail/hooks/useMessageDetails.js.map +7 -0
  117. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js +289 -0
  118. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsActions.js.map +7 -0
  119. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +103 -0
  120. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +7 -0
  121. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js +78 -0
  122. package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.js.map +7 -0
  123. package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js +94 -0
  124. package/dist/modules/messages/components/message-detail/panels/MainMessageHeader.js.map +7 -0
  125. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +110 -0
  126. package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +7 -0
  127. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js +58 -0
  128. package/dist/modules/messages/components/message-detail/panels/MessageListComponent.js.map +7 -0
  129. package/dist/modules/messages/components/message-detail/panels/actions-panel.js +51 -0
  130. package/dist/modules/messages/components/message-detail/panels/actions-panel.js.map +7 -0
  131. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js +66 -0
  132. package/dist/modules/messages/components/message-detail/panels/attachments-panel.js.map +7 -0
  133. package/dist/modules/messages/components/message-detail/panels/body-panel.js +20 -0
  134. package/dist/modules/messages/components/message-detail/panels/body-panel.js.map +7 -0
  135. package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js +36 -0
  136. package/dist/modules/messages/components/message-detail/panels/composer-dialogs.js.map +7 -0
  137. package/dist/modules/messages/components/message-detail/panels/dialogs.js +96 -0
  138. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +7 -0
  139. package/dist/modules/messages/components/message-detail/panels/index.js +25 -0
  140. package/dist/modules/messages/components/message-detail/panels/index.js.map +7 -0
  141. package/dist/modules/messages/components/message-detail/panels/meta-panel.js +14 -0
  142. package/dist/modules/messages/components/message-detail/panels/meta-panel.js.map +7 -0
  143. package/dist/modules/messages/components/message-detail/panels/objects-panel.js +51 -0
  144. package/dist/modules/messages/components/message-detail/panels/objects-panel.js.map +7 -0
  145. package/dist/modules/messages/components/message-detail/panels/thread-panel.js +54 -0
  146. package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +7 -0
  147. package/dist/modules/messages/components/message-detail/types.js +1 -0
  148. package/dist/modules/messages/components/message-detail/types.js.map +7 -0
  149. package/dist/modules/messages/components/message-detail/utils.js +54 -0
  150. package/dist/modules/messages/components/message-detail/utils.js.map +7 -0
  151. package/dist/modules/messages/components/utils/PriorityBadge.js +52 -0
  152. package/dist/modules/messages/components/utils/PriorityBadge.js.map +7 -0
  153. package/dist/modules/messages/components/utils/typeUiRegistry.js +77 -0
  154. package/dist/modules/messages/components/utils/typeUiRegistry.js.map +7 -0
  155. package/dist/modules/messages/data/entities.js +309 -0
  156. package/dist/modules/messages/data/entities.js.map +7 -0
  157. package/dist/modules/messages/data/validators.js +272 -0
  158. package/dist/modules/messages/data/validators.js.map +7 -0
  159. package/dist/modules/messages/emails/MessageEmail.js +108 -0
  160. package/dist/modules/messages/emails/MessageEmail.js.map +7 -0
  161. package/dist/modules/messages/events.js +24 -0
  162. package/dist/modules/messages/events.js.map +7 -0
  163. package/dist/modules/messages/frontend/messages/view/[token]/page.js +247 -0
  164. package/dist/modules/messages/frontend/messages/view/[token]/page.js.map +7 -0
  165. package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js +9 -0
  166. package/dist/modules/messages/frontend/messages/view/[token]/page.meta.js.map +7 -0
  167. package/dist/modules/messages/index.js +21 -0
  168. package/dist/modules/messages/index.js.map +7 -0
  169. package/dist/modules/messages/lib/actions.js +141 -0
  170. package/dist/modules/messages/lib/actions.js.map +7 -0
  171. package/dist/modules/messages/lib/attachments.js +131 -0
  172. package/dist/modules/messages/lib/attachments.js.map +7 -0
  173. package/dist/modules/messages/lib/constants.js +7 -0
  174. package/dist/modules/messages/lib/constants.js.map +7 -0
  175. package/dist/modules/messages/lib/email-sender.js +201 -0
  176. package/dist/modules/messages/lib/email-sender.js.map +7 -0
  177. package/dist/modules/messages/lib/forwarding.js +179 -0
  178. package/dist/modules/messages/lib/forwarding.js.map +7 -0
  179. package/dist/modules/messages/lib/message-objects-registry.js +49 -0
  180. package/dist/modules/messages/lib/message-objects-registry.js.map +7 -0
  181. package/dist/modules/messages/lib/message-types-registry.js +41 -0
  182. package/dist/modules/messages/lib/message-types-registry.js.map +7 -0
  183. package/dist/modules/messages/lib/object-validation.js +20 -0
  184. package/dist/modules/messages/lib/object-validation.js.map +7 -0
  185. package/dist/modules/messages/lib/operationMetadata.js +21 -0
  186. package/dist/modules/messages/lib/operationMetadata.js.map +7 -0
  187. package/dist/modules/messages/lib/priorityUtils.js +61 -0
  188. package/dist/modules/messages/lib/priorityUtils.js.map +7 -0
  189. package/dist/modules/messages/lib/routeHelpers.js +44 -0
  190. package/dist/modules/messages/lib/routeHelpers.js.map +7 -0
  191. package/dist/modules/messages/message-objects.js +7 -0
  192. package/dist/modules/messages/message-objects.js.map +7 -0
  193. package/dist/modules/messages/message-types.js +67 -0
  194. package/dist/modules/messages/message-types.js.map +7 -0
  195. package/dist/modules/messages/migrations/Migration20260213181243.js +31 -0
  196. package/dist/modules/messages/migrations/Migration20260213181243.js.map +7 -0
  197. package/dist/modules/messages/migrations/Migration20260215165126.js +16 -0
  198. package/dist/modules/messages/migrations/Migration20260215165126.js.map +7 -0
  199. package/dist/modules/messages/notifications.js +27 -0
  200. package/dist/modules/messages/notifications.js.map +7 -0
  201. package/dist/modules/messages/setup.js +21 -0
  202. package/dist/modules/messages/setup.js.map +7 -0
  203. package/dist/modules/messages/subscribers/message-notification.js +108 -0
  204. package/dist/modules/messages/subscribers/message-notification.js.map +7 -0
  205. package/dist/modules/messages/workers/send-email.worker.js +253 -0
  206. package/dist/modules/messages/workers/send-email.worker.js.map +7 -0
  207. package/dist/modules/sales/backend/sales/documents/[id]/page.js +30 -11
  208. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  209. package/dist/modules/sales/commands/payments.js +12 -6
  210. package/dist/modules/sales/commands/payments.js.map +2 -2
  211. package/dist/modules/sales/lib/messageObjectPreviews.js +114 -0
  212. package/dist/modules/sales/lib/messageObjectPreviews.js.map +7 -0
  213. package/dist/modules/sales/message-objects.js +57 -0
  214. package/dist/modules/sales/message-objects.js.map +7 -0
  215. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js +51 -0
  216. package/dist/modules/sales/widgets/messages/SalesDocumentMessageDetail.js.map +7 -0
  217. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js +36 -0
  218. package/dist/modules/sales/widgets/messages/SalesDocumentMessagePreview.js.map +7 -0
  219. package/dist/modules/sales/widgets/messages/index.js +7 -0
  220. package/dist/modules/sales/widgets/messages/index.js.map +7 -0
  221. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js +55 -1
  222. package/dist/modules/staff/backend/staff/leave-requests/[id]/page.js.map +2 -2
  223. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js +60 -1
  224. package/dist/modules/staff/backend/staff/my-leave-requests/[id]/page.js.map +2 -2
  225. package/dist/modules/staff/backend/staff/team-members/[id]/page.js +2 -19
  226. package/dist/modules/staff/backend/staff/team-members/[id]/page.js.map +2 -2
  227. package/dist/modules/staff/components/LeaveRequestDetail.js +112 -0
  228. package/dist/modules/staff/components/LeaveRequestDetail.js.map +7 -0
  229. package/dist/modules/staff/components/LeaveRequestForm.js +3 -1
  230. package/dist/modules/staff/components/LeaveRequestForm.js.map +2 -2
  231. package/dist/modules/staff/components/LeaveRequestPreview.js +43 -0
  232. package/dist/modules/staff/components/LeaveRequestPreview.js.map +7 -0
  233. package/dist/modules/staff/lib/messageObjectPreviews.js +148 -0
  234. package/dist/modules/staff/lib/messageObjectPreviews.js.map +7 -0
  235. package/dist/modules/staff/message-objects.js +104 -0
  236. package/dist/modules/staff/message-objects.js.map +7 -0
  237. package/dist/modules/staff/message-types.js +23 -0
  238. package/dist/modules/staff/message-types.js.map +7 -0
  239. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js +51 -0
  240. package/dist/modules/staff/widgets/messages/StaffMessageObjectDetail.js.map +7 -0
  241. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js +34 -0
  242. package/dist/modules/staff/widgets/messages/StaffMessageObjectPreview.js.map +7 -0
  243. package/dist/modules/staff/widgets/messages/index.js +7 -0
  244. package/dist/modules/staff/widgets/messages/index.js.map +7 -0
  245. package/generated/entities/message/index.ts +31 -0
  246. package/generated/entities/message_access_token/index.ts +8 -0
  247. package/generated/entities/message_confirmation/index.ts +9 -0
  248. package/generated/entities/message_object/index.ts +10 -0
  249. package/generated/entities/message_recipient/index.ts +14 -0
  250. package/generated/entities.ids.generated.ts +8 -0
  251. package/generated/entity-fields-registry.ts +10 -0
  252. package/jest.setup.ts +5 -0
  253. package/package.json +2 -2
  254. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +20 -4
  255. package/src/modules/customers/i18n/de.json +4 -0
  256. package/src/modules/customers/i18n/en.json +4 -0
  257. package/src/modules/customers/i18n/es.json +4 -0
  258. package/src/modules/customers/i18n/pl.json +4 -0
  259. package/src/modules/customers/lib/messageObjectPreviews.ts +154 -0
  260. package/src/modules/customers/message-objects.ts +70 -0
  261. package/src/modules/customers/widgets/messages/CustomerMessageObjectDetail.tsx +57 -0
  262. package/src/modules/customers/widgets/messages/CustomerMessageObjectPreview.tsx +49 -0
  263. package/src/modules/customers/widgets/messages/index.ts +2 -0
  264. package/src/modules/messages/acl.ts +11 -0
  265. package/src/modules/messages/api/[id]/actions/[actionId]/route.ts +103 -0
  266. package/src/modules/messages/api/[id]/archive/route.ts +138 -0
  267. package/src/modules/messages/api/[id]/attachments/route.ts +217 -0
  268. package/src/modules/messages/api/[id]/confirmation/route.ts +73 -0
  269. package/src/modules/messages/api/[id]/conversation/archive/route.ts +69 -0
  270. package/src/modules/messages/api/[id]/conversation/read/route.ts +69 -0
  271. package/src/modules/messages/api/[id]/conversation/route.ts +69 -0
  272. package/src/modules/messages/api/[id]/forward/route.ts +87 -0
  273. package/src/modules/messages/api/[id]/forward-preview/route.ts +75 -0
  274. package/src/modules/messages/api/[id]/read/route.ts +138 -0
  275. package/src/modules/messages/api/[id]/reply/route.ts +89 -0
  276. package/src/modules/messages/api/[id]/route.ts +401 -0
  277. package/src/modules/messages/api/object-types/route.ts +54 -0
  278. package/src/modules/messages/api/openapi.ts +261 -0
  279. package/src/modules/messages/api/route.ts +374 -0
  280. package/src/modules/messages/api/token/[token]/route.ts +103 -0
  281. package/src/modules/messages/api/types/route.ts +39 -0
  282. package/src/modules/messages/api/unread-count/route.ts +55 -0
  283. package/src/modules/messages/backend/messages/[id]/page.meta.ts +12 -0
  284. package/src/modules/messages/backend/messages/[id]/page.tsx +12 -0
  285. package/src/modules/messages/backend/messages/compose/page.meta.ts +13 -0
  286. package/src/modules/messages/backend/messages/compose/page.tsx +12 -0
  287. package/src/modules/messages/backend/page.meta.ts +31 -0
  288. package/src/modules/messages/backend/page.tsx +12 -0
  289. package/src/modules/messages/commands/actions.ts +307 -0
  290. package/src/modules/messages/commands/attachments.ts +227 -0
  291. package/src/modules/messages/commands/confirmations.ts +183 -0
  292. package/src/modules/messages/commands/conversation.ts +292 -0
  293. package/src/modules/messages/commands/messages.ts +845 -0
  294. package/src/modules/messages/commands/recipients.ts +281 -0
  295. package/src/modules/messages/commands/shared.ts +350 -0
  296. package/src/modules/messages/commands/tokens.ts +80 -0
  297. package/src/modules/messages/components/ComposeMessagePageClient.tsx +23 -0
  298. package/src/modules/messages/components/MessageDetailPageClient.tsx +287 -0
  299. package/src/modules/messages/components/MessagesInboxPageClient.tsx +469 -0
  300. package/src/modules/messages/components/confirmation/MessageConfirmationActions.tsx +35 -0
  301. package/src/modules/messages/components/confirmation/MessageConfirmationContent.tsx +88 -0
  302. package/src/modules/messages/components/defaults/DefaultMessageActions.tsx +37 -0
  303. package/src/modules/messages/components/defaults/DefaultMessageContent.tsx +21 -0
  304. package/src/modules/messages/components/defaults/DefaultMessageListItem.tsx +102 -0
  305. package/src/modules/messages/components/defaults/MessageRecordObjectDetail.tsx +114 -0
  306. package/src/modules/messages/components/defaults/MessageRecordObjectPreview.tsx +74 -0
  307. package/src/modules/messages/components/message-detail/detail-panels.ts +13 -0
  308. package/src/modules/messages/components/message-detail/hooks/useMessageDetails.ts +56 -0
  309. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsActions.ts +367 -0
  310. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +134 -0
  311. package/src/modules/messages/components/message-detail/hooks/useMessageDetailsQueries.ts +102 -0
  312. package/src/modules/messages/components/message-detail/panels/MainMessageHeader.tsx +108 -0
  313. package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +144 -0
  314. package/src/modules/messages/components/message-detail/panels/MessageListComponent.tsx +63 -0
  315. package/src/modules/messages/components/message-detail/panels/actions-panel.tsx +66 -0
  316. package/src/modules/messages/components/message-detail/panels/attachments-panel.tsx +86 -0
  317. package/src/modules/messages/components/message-detail/panels/body-panel.tsx +32 -0
  318. package/src/modules/messages/components/message-detail/panels/composer-dialogs.tsx +42 -0
  319. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +107 -0
  320. package/src/modules/messages/components/message-detail/panels/index.ts +11 -0
  321. package/src/modules/messages/components/message-detail/panels/meta-panel.tsx +19 -0
  322. package/src/modules/messages/components/message-detail/panels/objects-panel.tsx +65 -0
  323. package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +65 -0
  324. package/src/modules/messages/components/message-detail/types.ts +114 -0
  325. package/src/modules/messages/components/message-detail/utils.ts +62 -0
  326. package/src/modules/messages/components/utils/PriorityBadge.tsx +63 -0
  327. package/src/modules/messages/components/utils/typeUiRegistry.ts +106 -0
  328. package/src/modules/messages/data/entities.ts +284 -0
  329. package/src/modules/messages/data/validators.ts +297 -0
  330. package/src/modules/messages/emails/MessageEmail.tsx +143 -0
  331. package/src/modules/messages/events.ts +24 -0
  332. package/src/modules/messages/frontend/messages/view/[token]/page.meta.ts +5 -0
  333. package/src/modules/messages/frontend/messages/view/[token]/page.tsx +389 -0
  334. package/src/modules/messages/i18n/de.json +240 -0
  335. package/src/modules/messages/i18n/en.json +240 -0
  336. package/src/modules/messages/i18n/es.json +240 -0
  337. package/src/modules/messages/i18n/pl.json +240 -0
  338. package/src/modules/messages/index.ts +19 -0
  339. package/src/modules/messages/lib/actions.ts +204 -0
  340. package/src/modules/messages/lib/attachments.ts +197 -0
  341. package/src/modules/messages/lib/constants.ts +2 -0
  342. package/src/modules/messages/lib/email-sender.ts +255 -0
  343. package/src/modules/messages/lib/forwarding.ts +240 -0
  344. package/src/modules/messages/lib/message-objects-registry.ts +60 -0
  345. package/src/modules/messages/lib/message-types-registry.ts +48 -0
  346. package/src/modules/messages/lib/object-validation.ts +26 -0
  347. package/src/modules/messages/lib/operationMetadata.ts +43 -0
  348. package/src/modules/messages/lib/priorityUtils.ts +76 -0
  349. package/src/modules/messages/lib/routeHelpers.ts +65 -0
  350. package/src/modules/messages/message-objects.ts +5 -0
  351. package/src/modules/messages/message-types.ts +65 -0
  352. package/src/modules/messages/migrations/.snapshot-open-mercato.json +957 -0
  353. package/src/modules/messages/migrations/Migration20260213181243.ts +34 -0
  354. package/src/modules/messages/migrations/Migration20260215165126.ts +16 -0
  355. package/src/modules/messages/notifications.ts +25 -0
  356. package/src/modules/messages/setup.ts +19 -0
  357. package/src/modules/messages/subscribers/message-notification.ts +138 -0
  358. package/src/modules/messages/workers/send-email.worker.ts +321 -0
  359. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +23 -7
  360. package/src/modules/sales/commands/payments.ts +12 -6
  361. package/src/modules/sales/i18n/de.json +3 -0
  362. package/src/modules/sales/i18n/en.json +3 -0
  363. package/src/modules/sales/i18n/es.json +3 -0
  364. package/src/modules/sales/i18n/pl.json +3 -0
  365. package/src/modules/sales/lib/messageObjectPreviews.ts +150 -0
  366. package/src/modules/sales/message-objects.ts +56 -0
  367. package/src/modules/sales/widgets/messages/SalesDocumentMessageDetail.tsx +57 -0
  368. package/src/modules/sales/widgets/messages/SalesDocumentMessagePreview.tsx +46 -0
  369. package/src/modules/sales/widgets/messages/index.ts +2 -0
  370. package/src/modules/staff/backend/staff/leave-requests/[id]/page.tsx +54 -0
  371. package/src/modules/staff/backend/staff/my-leave-requests/[id]/page.tsx +58 -0
  372. package/src/modules/staff/backend/staff/team-members/[id]/page.tsx +2 -32
  373. package/src/modules/staff/components/LeaveRequestDetail.tsx +135 -0
  374. package/src/modules/staff/components/LeaveRequestForm.tsx +3 -0
  375. package/src/modules/staff/components/LeaveRequestPreview.tsx +74 -0
  376. package/src/modules/staff/i18n/de.json +8 -0
  377. package/src/modules/staff/i18n/en.json +8 -0
  378. package/src/modules/staff/i18n/es.json +8 -0
  379. package/src/modules/staff/i18n/pl.json +8 -0
  380. package/src/modules/staff/lib/messageObjectPreviews.ts +182 -0
  381. package/src/modules/staff/message-objects.ts +102 -0
  382. package/src/modules/staff/message-types.ts +21 -0
  383. package/src/modules/staff/widgets/messages/StaffMessageObjectDetail.tsx +57 -0
  384. package/src/modules/staff/widgets/messages/StaffMessageObjectPreview.tsx +44 -0
  385. package/src/modules/staff/widgets/messages/index.ts +2 -0
@@ -0,0 +1,748 @@
1
+ import { z } from "zod";
2
+ import { registerCommand } from "@open-mercato/shared/lib/commands";
3
+ import { extractUndoPayload } from "@open-mercato/shared/lib/commands/undo";
4
+ import { Message, MessageObject, MessageRecipient } from "../data/entities.js";
5
+ import { emitMessagesEvent } from "../events.js";
6
+ import {
7
+ composeMessageSchema,
8
+ forwardMessageSchema,
9
+ replyMessageSchema,
10
+ updateDraftSchema
11
+ } from "../data/validators.js";
12
+ import { linkAttachmentsToMessage, linkLibraryAttachmentsToMessage, copyAttachmentsForForwardMessages } from "../lib/attachments.js";
13
+ import { MESSAGE_ATTACHMENT_ENTITY_ID } from "../lib/constants.js";
14
+ import { getMessageTypeOrDefault } from "../lib/message-types-registry.js";
15
+ import { validateMessageObjectsForType } from "../lib/object-validation.js";
16
+ import { buildForwardBodyFromLegacyInput, buildForwardPreviewFromThreadSlice, buildForwardThreadSlice } from "../lib/forwarding.js";
17
+ import {
18
+ assertOrganizationAccess,
19
+ loadMessageAggregateSnapshot,
20
+ restoreMessageAggregateSnapshot
21
+ } from "./shared.js";
22
+ async function emitMessageSentEvent(_container, payload) {
23
+ await emitMessagesEvent("messages.message.sent", payload, { persistent: true });
24
+ }
25
+ async function emitMessageDeletedEvent(_container, payload) {
26
+ await emitMessagesEvent("messages.message.deleted", payload, { persistent: true });
27
+ }
28
+ const scopeSchema = z.object({
29
+ tenantId: z.string().uuid(),
30
+ organizationId: z.string().uuid().nullable(),
31
+ userId: z.string().uuid()
32
+ });
33
+ const composeCommandSchema = composeMessageSchema.safeExtend({
34
+ tenantId: scopeSchema.shape.tenantId,
35
+ organizationId: scopeSchema.shape.organizationId,
36
+ userId: scopeSchema.shape.userId
37
+ });
38
+ const updateDraftCommandSchema = updateDraftSchema.safeExtend({
39
+ messageId: z.string().uuid(),
40
+ tenantId: scopeSchema.shape.tenantId,
41
+ organizationId: scopeSchema.shape.organizationId,
42
+ userId: scopeSchema.shape.userId
43
+ });
44
+ const replyCommandSchema = replyMessageSchema.safeExtend({
45
+ messageId: z.string().uuid(),
46
+ tenantId: scopeSchema.shape.tenantId,
47
+ organizationId: scopeSchema.shape.organizationId,
48
+ userId: scopeSchema.shape.userId
49
+ });
50
+ const forwardCommandSchema = forwardMessageSchema.safeExtend({
51
+ messageId: z.string().uuid(),
52
+ tenantId: scopeSchema.shape.tenantId,
53
+ organizationId: scopeSchema.shape.organizationId,
54
+ userId: scopeSchema.shape.userId
55
+ });
56
+ const deleteForActorCommandSchema = z.object({
57
+ messageId: z.string().uuid(),
58
+ tenantId: scopeSchema.shape.tenantId,
59
+ organizationId: scopeSchema.shape.organizationId,
60
+ userId: scopeSchema.shape.userId
61
+ });
62
+ function toIso(value) {
63
+ return value ? value.toISOString() : null;
64
+ }
65
+ function toDate(value) {
66
+ if (!value) return null;
67
+ return new Date(value);
68
+ }
69
+ function buildReplySubject(subject) {
70
+ if (/^re:\s*/i.test(subject)) return subject;
71
+ return `Re: ${subject}`;
72
+ }
73
+ async function requireMessageById(em, scope, messageId) {
74
+ const message = await em.findOne(Message, {
75
+ id: messageId,
76
+ tenantId: scope.tenantId,
77
+ deletedAt: null
78
+ });
79
+ if (!message) throw new Error("Message not found");
80
+ assertOrganizationAccess(scope, message);
81
+ return message;
82
+ }
83
+ const composeMessageCommand = {
84
+ id: "messages.messages.compose",
85
+ async execute(rawInput, ctx) {
86
+ const input = composeCommandSchema.parse(rawInput);
87
+ if (input.objects?.length) {
88
+ const objectValidationError = validateMessageObjectsForType(input.type, input.objects);
89
+ if (objectValidationError) throw new Error(objectValidationError);
90
+ }
91
+ const em = ctx.container.resolve("em").fork();
92
+ let messageId = "";
93
+ let responseThreadId = null;
94
+ let responseExternalEmail = null;
95
+ await em.transactional(async (trx) => {
96
+ const threadId = input.parentMessageId ? (await trx.findOne(Message, {
97
+ id: input.parentMessageId,
98
+ tenantId: input.tenantId,
99
+ organizationId: input.organizationId,
100
+ deletedAt: null
101
+ }))?.threadId ?? input.parentMessageId : void 0;
102
+ const isPublicVisibility = input.visibility === "public";
103
+ const sendViaEmail = isPublicVisibility ? true : input.sendViaEmail;
104
+ const message = trx.create(Message, {
105
+ type: input.type,
106
+ visibility: input.visibility ?? null,
107
+ sourceEntityType: input.sourceEntityType,
108
+ sourceEntityId: input.sourceEntityId,
109
+ externalEmail: input.externalEmail,
110
+ externalName: input.externalName,
111
+ threadId: threadId ?? void 0,
112
+ parentMessageId: input.parentMessageId,
113
+ senderUserId: input.userId,
114
+ subject: input.subject,
115
+ body: input.body,
116
+ bodyFormat: input.bodyFormat,
117
+ priority: input.priority,
118
+ status: input.isDraft ? "draft" : "sent",
119
+ isDraft: input.isDraft ?? false,
120
+ sentAt: input.isDraft ? null : /* @__PURE__ */ new Date(),
121
+ actionData: input.actionData,
122
+ sendViaEmail,
123
+ tenantId: input.tenantId,
124
+ organizationId: input.organizationId
125
+ });
126
+ await trx.persistAndFlush(message);
127
+ if (!threadId && !input.isDraft && !message.threadId) {
128
+ message.threadId = message.id;
129
+ await trx.flush();
130
+ }
131
+ for (const recipient of input.recipients) {
132
+ trx.persist(trx.create(MessageRecipient, {
133
+ messageId: message.id,
134
+ recipientUserId: recipient.userId,
135
+ recipientType: recipient.type,
136
+ status: "unread"
137
+ }));
138
+ }
139
+ if (input.objects) {
140
+ for (const obj of input.objects) {
141
+ trx.persist(trx.create(MessageObject, {
142
+ messageId: message.id,
143
+ entityModule: obj.entityModule,
144
+ entityType: obj.entityType,
145
+ entityId: obj.entityId,
146
+ actionRequired: obj.actionRequired,
147
+ actionType: obj.actionType,
148
+ actionLabel: obj.actionLabel
149
+ }));
150
+ }
151
+ }
152
+ await trx.flush();
153
+ if (input.attachmentIds?.length) {
154
+ await linkAttachmentsToMessage(
155
+ trx,
156
+ message.id,
157
+ input.attachmentIds,
158
+ input.organizationId,
159
+ input.tenantId
160
+ );
161
+ }
162
+ if (input.attachmentRecordId) {
163
+ await linkLibraryAttachmentsToMessage(
164
+ trx,
165
+ message.id,
166
+ input.attachmentRecordId,
167
+ input.organizationId,
168
+ input.tenantId
169
+ );
170
+ }
171
+ messageId = message.id;
172
+ responseThreadId = message.threadId ?? null;
173
+ responseExternalEmail = message.externalEmail ?? null;
174
+ });
175
+ if (!input.isDraft) {
176
+ await emitMessageSentEvent(ctx.container, {
177
+ messageId,
178
+ senderUserId: input.userId,
179
+ recipientUserIds: input.recipients.map((recipient) => recipient.userId),
180
+ sendViaEmail: input.visibility === "public" ? true : input.sendViaEmail,
181
+ externalEmail: responseExternalEmail,
182
+ tenantId: input.tenantId,
183
+ organizationId: input.organizationId
184
+ });
185
+ }
186
+ return {
187
+ id: messageId,
188
+ threadId: responseThreadId,
189
+ externalEmail: responseExternalEmail,
190
+ isDraft: input.isDraft,
191
+ recipientUserIds: input.recipients.map((recipient) => recipient.userId)
192
+ };
193
+ },
194
+ async captureAfter(_input, result, ctx) {
195
+ const em = ctx.container.resolve("em").fork();
196
+ return loadMessageAggregateSnapshot(em, result.id);
197
+ },
198
+ buildLog: async ({ input, result, snapshots }) => {
199
+ const parsed = composeCommandSchema.parse(input);
200
+ return {
201
+ actionLabel: parsed.isDraft ? "Create draft message" : "Compose message",
202
+ resourceKind: "messages.message",
203
+ resourceId: result.id,
204
+ tenantId: parsed.tenantId,
205
+ organizationId: parsed.organizationId,
206
+ payload: {
207
+ undo: {
208
+ after: snapshots.after ?? null
209
+ }
210
+ },
211
+ snapshotAfter: snapshots.after ?? null
212
+ };
213
+ },
214
+ undo: async ({ logEntry, ctx }) => {
215
+ const undo = extractUndoPayload(logEntry);
216
+ const after = undo?.after;
217
+ if (!after) return;
218
+ const em = ctx.container.resolve("em").fork();
219
+ const message = await em.findOne(Message, { id: after.message.id });
220
+ if (!message) return;
221
+ message.deletedAt = /* @__PURE__ */ new Date();
222
+ await em.flush();
223
+ }
224
+ };
225
+ const updateDraftCommand = {
226
+ id: "messages.messages.update_draft",
227
+ async prepare(rawInput, ctx) {
228
+ const input = updateDraftCommandSchema.parse(rawInput);
229
+ const em = ctx.container.resolve("em").fork();
230
+ const snapshot = await loadMessageAggregateSnapshot(em, input.messageId, {
231
+ tenantId: input.tenantId,
232
+ organizationId: input.organizationId
233
+ });
234
+ return snapshot ? { before: snapshot } : {};
235
+ },
236
+ async execute(rawInput, ctx) {
237
+ const input = updateDraftCommandSchema.parse(rawInput);
238
+ const em = ctx.container.resolve("em").fork();
239
+ const message = await requireMessageById(em, input, input.messageId);
240
+ if (message.senderUserId !== input.userId) throw new Error("Access denied");
241
+ if (!message.isDraft) throw new Error("Only draft messages can be edited");
242
+ const nextMessageType = input.type ?? message.type;
243
+ if (input.objects) {
244
+ const objectValidationError = validateMessageObjectsForType(nextMessageType, input.objects);
245
+ if (objectValidationError) throw new Error(objectValidationError);
246
+ } else if (input.type !== void 0) {
247
+ const existingObjects = await em.find(MessageObject, { messageId: message.id });
248
+ if (existingObjects.length > 0) {
249
+ const objectValidationError = validateMessageObjectsForType(
250
+ nextMessageType,
251
+ existingObjects.map((item) => ({
252
+ entityModule: item.entityModule,
253
+ entityType: item.entityType,
254
+ entityId: item.entityId
255
+ }))
256
+ );
257
+ if (objectValidationError) throw new Error(objectValidationError);
258
+ }
259
+ }
260
+ if (input.type !== void 0) message.type = input.type;
261
+ if (input.visibility !== void 0) message.visibility = input.visibility;
262
+ if (input.sourceEntityType !== void 0) message.sourceEntityType = input.sourceEntityType;
263
+ if (input.sourceEntityId !== void 0) message.sourceEntityId = input.sourceEntityId;
264
+ if (input.externalEmail !== void 0) message.externalEmail = input.externalEmail;
265
+ if (input.externalName !== void 0) message.externalName = input.externalName;
266
+ if (input.subject !== void 0) message.subject = input.subject;
267
+ if (input.body !== void 0) message.body = input.body;
268
+ if (input.bodyFormat !== void 0) message.bodyFormat = input.bodyFormat;
269
+ if (input.priority !== void 0) message.priority = input.priority;
270
+ if (input.actionData !== void 0) message.actionData = input.actionData;
271
+ if (input.sendViaEmail !== void 0) message.sendViaEmail = input.sendViaEmail;
272
+ if (input.recipients) {
273
+ await em.nativeDelete(MessageRecipient, { messageId: message.id });
274
+ for (const recipient of input.recipients) {
275
+ em.persist(em.create(MessageRecipient, {
276
+ messageId: message.id,
277
+ recipientUserId: recipient.userId,
278
+ recipientType: recipient.type,
279
+ status: "unread"
280
+ }));
281
+ }
282
+ }
283
+ if (input.objects) {
284
+ await em.nativeDelete(MessageObject, { messageId: message.id });
285
+ for (const object of input.objects) {
286
+ em.persist(em.create(MessageObject, {
287
+ messageId: message.id,
288
+ entityModule: object.entityModule,
289
+ entityType: object.entityType,
290
+ entityId: object.entityId,
291
+ actionRequired: object.actionRequired,
292
+ actionType: object.actionType,
293
+ actionLabel: object.actionLabel
294
+ }));
295
+ }
296
+ }
297
+ if (input.attachmentIds) {
298
+ const { Attachment } = await import("@open-mercato/core/modules/attachments/data/entities");
299
+ if (input.attachmentIds.length === 0) {
300
+ await em.nativeDelete(Attachment, {
301
+ entityId: MESSAGE_ATTACHMENT_ENTITY_ID,
302
+ recordId: message.id,
303
+ tenantId: input.tenantId,
304
+ organizationId: input.organizationId
305
+ });
306
+ } else {
307
+ await em.nativeDelete(Attachment, {
308
+ entityId: MESSAGE_ATTACHMENT_ENTITY_ID,
309
+ recordId: message.id,
310
+ tenantId: input.tenantId,
311
+ organizationId: input.organizationId,
312
+ id: { $nin: input.attachmentIds }
313
+ });
314
+ }
315
+ await linkAttachmentsToMessage(
316
+ em,
317
+ message.id,
318
+ input.attachmentIds,
319
+ input.organizationId,
320
+ input.tenantId
321
+ );
322
+ }
323
+ await em.flush();
324
+ return { ok: true, id: message.id };
325
+ },
326
+ async captureAfter(rawInput, _result, ctx) {
327
+ const input = updateDraftCommandSchema.parse(rawInput);
328
+ const em = ctx.container.resolve("em").fork();
329
+ return loadMessageAggregateSnapshot(em, input.messageId, {
330
+ tenantId: input.tenantId,
331
+ organizationId: input.organizationId
332
+ });
333
+ },
334
+ buildLog: async ({ input, snapshots }) => {
335
+ const parsed = updateDraftCommandSchema.parse(input);
336
+ return {
337
+ actionLabel: "Update draft message",
338
+ resourceKind: "messages.message",
339
+ resourceId: parsed.messageId,
340
+ tenantId: parsed.tenantId,
341
+ organizationId: parsed.organizationId,
342
+ payload: {
343
+ undo: {
344
+ before: snapshots.before ?? null,
345
+ after: snapshots.after ?? null
346
+ }
347
+ },
348
+ snapshotBefore: snapshots.before ?? null,
349
+ snapshotAfter: snapshots.after ?? null
350
+ };
351
+ },
352
+ undo: async ({ logEntry, ctx }) => {
353
+ const undo = extractUndoPayload(logEntry);
354
+ const before = undo?.before;
355
+ if (!before) return;
356
+ const em = ctx.container.resolve("em").fork();
357
+ await restoreMessageAggregateSnapshot(em, before);
358
+ }
359
+ };
360
+ const replyMessageCommand = {
361
+ id: "messages.messages.reply",
362
+ async execute(rawInput, ctx) {
363
+ const input = replyCommandSchema.parse(rawInput);
364
+ const em = ctx.container.resolve("em").fork();
365
+ const original = await requireMessageById(em, input, input.messageId);
366
+ const ownRecipient = await em.findOne(MessageRecipient, {
367
+ messageId: original.id,
368
+ recipientUserId: input.userId,
369
+ deletedAt: null
370
+ });
371
+ if (original.senderUserId !== input.userId && !ownRecipient) throw new Error("Access denied");
372
+ const messageType = getMessageTypeOrDefault(original.type);
373
+ if (messageType.allowReply === false) throw new Error("Reply is not allowed for this message type");
374
+ const recipientIds = new Set(
375
+ (input.recipients ?? []).map((recipient) => recipient.userId).filter((recipientUserId) => recipientUserId !== input.userId)
376
+ );
377
+ if (recipientIds.size === 0) {
378
+ const originalRecipients = await em.find(MessageRecipient, { messageId: original.id, deletedAt: null });
379
+ if (input.replyAll) {
380
+ if (original.senderUserId !== input.userId) recipientIds.add(original.senderUserId);
381
+ for (const recipient of originalRecipients) {
382
+ if (recipient.recipientUserId !== input.userId) recipientIds.add(recipient.recipientUserId);
383
+ }
384
+ } else if (original.senderUserId !== input.userId) {
385
+ recipientIds.add(original.senderUserId);
386
+ } else {
387
+ for (const recipient of originalRecipients) {
388
+ if (recipient.recipientUserId !== input.userId) {
389
+ recipientIds.add(recipient.recipientUserId);
390
+ break;
391
+ }
392
+ }
393
+ }
394
+ }
395
+ if (recipientIds.size === 0) throw new Error("No recipients available for reply");
396
+ let messageId = "";
397
+ let responseExternalEmail = null;
398
+ await em.transactional(async (trx) => {
399
+ const message = trx.create(Message, {
400
+ type: original.type,
401
+ visibility: original.visibility ?? null,
402
+ sourceEntityType: original.sourceEntityType,
403
+ sourceEntityId: original.sourceEntityId,
404
+ externalEmail: original.externalEmail,
405
+ externalName: original.externalName,
406
+ threadId: original.threadId ?? original.id,
407
+ parentMessageId: original.id,
408
+ senderUserId: input.userId,
409
+ subject: buildReplySubject(original.subject),
410
+ body: input.body,
411
+ bodyFormat: input.bodyFormat,
412
+ priority: original.priority,
413
+ status: "sent",
414
+ isDraft: false,
415
+ sentAt: /* @__PURE__ */ new Date(),
416
+ sendViaEmail: input.sendViaEmail,
417
+ tenantId: input.tenantId,
418
+ organizationId: input.organizationId
419
+ });
420
+ await trx.persistAndFlush(message);
421
+ for (const recipientUserId of recipientIds) {
422
+ trx.persist(trx.create(MessageRecipient, {
423
+ messageId: message.id,
424
+ recipientUserId,
425
+ recipientType: "to",
426
+ status: "unread"
427
+ }));
428
+ }
429
+ await trx.flush();
430
+ if (input.attachmentIds?.length) {
431
+ await linkAttachmentsToMessage(
432
+ trx,
433
+ message.id,
434
+ input.attachmentIds,
435
+ input.organizationId,
436
+ input.tenantId
437
+ );
438
+ }
439
+ if (input.attachmentRecordId) {
440
+ await linkLibraryAttachmentsToMessage(
441
+ trx,
442
+ message.id,
443
+ input.attachmentRecordId,
444
+ input.organizationId,
445
+ input.tenantId
446
+ );
447
+ }
448
+ messageId = message.id;
449
+ responseExternalEmail = message.externalEmail ?? null;
450
+ });
451
+ await emitMessageSentEvent(ctx.container, {
452
+ messageId,
453
+ senderUserId: input.userId,
454
+ recipientUserIds: Array.from(recipientIds),
455
+ sendViaEmail: input.sendViaEmail,
456
+ externalEmail: responseExternalEmail,
457
+ replyTo: original.id,
458
+ tenantId: input.tenantId,
459
+ organizationId: input.organizationId
460
+ });
461
+ return {
462
+ id: messageId,
463
+ externalEmail: responseExternalEmail,
464
+ recipientUserIds: Array.from(recipientIds)
465
+ };
466
+ },
467
+ async captureAfter(_input, result, ctx) {
468
+ const em = ctx.container.resolve("em").fork();
469
+ return loadMessageAggregateSnapshot(em, result.id);
470
+ },
471
+ buildLog: async ({ input, result, snapshots }) => {
472
+ const parsed = replyCommandSchema.parse(input);
473
+ return {
474
+ actionLabel: "Reply to message",
475
+ resourceKind: "messages.message",
476
+ resourceId: result.id,
477
+ parentResourceKind: "messages.message",
478
+ parentResourceId: parsed.messageId,
479
+ tenantId: parsed.tenantId,
480
+ organizationId: parsed.organizationId,
481
+ payload: {
482
+ undo: {
483
+ after: snapshots.after ?? null
484
+ }
485
+ },
486
+ snapshotAfter: snapshots.after ?? null
487
+ };
488
+ },
489
+ undo: async ({ logEntry, ctx }) => {
490
+ const undo = extractUndoPayload(logEntry);
491
+ const after = undo?.after;
492
+ if (!after) return;
493
+ const em = ctx.container.resolve("em").fork();
494
+ const message = await em.findOne(Message, { id: after.message.id });
495
+ if (!message) return;
496
+ message.deletedAt = /* @__PURE__ */ new Date();
497
+ await em.flush();
498
+ }
499
+ };
500
+ const forwardMessageCommand = {
501
+ id: "messages.messages.forward",
502
+ async execute(rawInput, ctx) {
503
+ const input = forwardCommandSchema.parse(rawInput);
504
+ const em = ctx.container.resolve("em").fork();
505
+ const original = await requireMessageById(em, input, input.messageId);
506
+ const isRecipient = await em.findOne(MessageRecipient, {
507
+ messageId: input.messageId,
508
+ recipientUserId: input.userId,
509
+ deletedAt: null
510
+ });
511
+ if (original.senderUserId !== input.userId && !isRecipient) throw new Error("Access denied");
512
+ const messageType = getMessageTypeOrDefault(original.type);
513
+ if (messageType.allowForward === false) throw new Error("Forward is not allowed for this message type");
514
+ const originalObjects = await em.find(MessageObject, { messageId: input.messageId });
515
+ const forwardThreadSlice = await buildForwardThreadSlice(em, {
516
+ tenantId: input.tenantId,
517
+ organizationId: input.organizationId,
518
+ userId: input.userId
519
+ }, original);
520
+ const generatedPreview = await buildForwardPreviewFromThreadSlice(em, {
521
+ tenantId: input.tenantId,
522
+ organizationId: input.organizationId,
523
+ userId: input.userId
524
+ }, original, forwardThreadSlice);
525
+ const forwardedBody = typeof input.body === "string" ? input.body : buildForwardBodyFromLegacyInput(generatedPreview.body, input.additionalBody);
526
+ let newMessageId = "";
527
+ let responseExternalEmail = null;
528
+ await em.transactional(async (trx) => {
529
+ const newMessage = trx.create(Message, {
530
+ type: original.type,
531
+ visibility: original.visibility ?? null,
532
+ sourceEntityType: original.sourceEntityType,
533
+ sourceEntityId: original.sourceEntityId,
534
+ externalEmail: original.externalEmail,
535
+ externalName: original.externalName,
536
+ threadId: original.threadId ?? original.id,
537
+ parentMessageId: original.id,
538
+ senderUserId: input.userId,
539
+ subject: `Fwd: ${original.subject}`,
540
+ body: forwardedBody,
541
+ bodyFormat: original.bodyFormat,
542
+ priority: original.priority,
543
+ status: "sent",
544
+ isDraft: false,
545
+ sentAt: /* @__PURE__ */ new Date(),
546
+ sendViaEmail: input.sendViaEmail,
547
+ tenantId: input.tenantId,
548
+ organizationId: input.organizationId
549
+ });
550
+ await trx.persistAndFlush(newMessage);
551
+ for (const recipient of input.recipients) {
552
+ trx.persist(trx.create(MessageRecipient, {
553
+ messageId: newMessage.id,
554
+ recipientUserId: recipient.userId,
555
+ recipientType: recipient.type,
556
+ status: "unread"
557
+ }));
558
+ }
559
+ for (const obj of originalObjects) {
560
+ trx.persist(trx.create(MessageObject, {
561
+ messageId: newMessage.id,
562
+ entityModule: obj.entityModule,
563
+ entityType: obj.entityType,
564
+ entityId: obj.entityId,
565
+ actionRequired: obj.actionRequired,
566
+ actionType: obj.actionType,
567
+ actionLabel: obj.actionLabel,
568
+ entitySnapshot: obj.entitySnapshot
569
+ }));
570
+ }
571
+ await trx.flush();
572
+ if (input.includeAttachments !== false) {
573
+ await copyAttachmentsForForwardMessages(
574
+ trx,
575
+ forwardThreadSlice.map((item) => item.id),
576
+ newMessage.id,
577
+ input.organizationId,
578
+ input.tenantId
579
+ );
580
+ }
581
+ newMessageId = newMessage.id;
582
+ responseExternalEmail = newMessage.externalEmail ?? null;
583
+ });
584
+ await emitMessageSentEvent(ctx.container, {
585
+ messageId: newMessageId,
586
+ senderUserId: input.userId,
587
+ recipientUserIds: input.recipients.map((item) => item.userId),
588
+ sendViaEmail: input.sendViaEmail,
589
+ externalEmail: responseExternalEmail,
590
+ forwardedFrom: original.id,
591
+ tenantId: input.tenantId,
592
+ organizationId: input.organizationId
593
+ });
594
+ return {
595
+ id: newMessageId,
596
+ externalEmail: responseExternalEmail,
597
+ recipientUserIds: input.recipients.map((item) => item.userId)
598
+ };
599
+ },
600
+ async captureAfter(_input, result, ctx) {
601
+ const em = ctx.container.resolve("em").fork();
602
+ return loadMessageAggregateSnapshot(em, result.id);
603
+ },
604
+ buildLog: async ({ input, result, snapshots }) => {
605
+ const parsed = forwardCommandSchema.parse(input);
606
+ return {
607
+ actionLabel: "Forward message",
608
+ resourceKind: "messages.message",
609
+ resourceId: result.id,
610
+ parentResourceKind: "messages.message",
611
+ parentResourceId: parsed.messageId,
612
+ tenantId: parsed.tenantId,
613
+ organizationId: parsed.organizationId,
614
+ payload: {
615
+ undo: {
616
+ after: snapshots.after ?? null
617
+ }
618
+ },
619
+ snapshotAfter: snapshots.after ?? null
620
+ };
621
+ },
622
+ undo: async ({ logEntry, ctx }) => {
623
+ const undo = extractUndoPayload(logEntry);
624
+ const after = undo?.after;
625
+ if (!after) return;
626
+ const em = ctx.container.resolve("em").fork();
627
+ const message = await em.findOne(Message, { id: after.message.id });
628
+ if (!message) return;
629
+ message.deletedAt = /* @__PURE__ */ new Date();
630
+ await em.flush();
631
+ }
632
+ };
633
+ const deleteForActorCommand = {
634
+ id: "messages.messages.delete_for_actor",
635
+ async prepare(rawInput, ctx) {
636
+ const input = deleteForActorCommandSchema.parse(rawInput);
637
+ const em = ctx.container.resolve("em").fork();
638
+ const message = await requireMessageById(em, input, input.messageId);
639
+ const recipient = await em.findOne(MessageRecipient, {
640
+ messageId: input.messageId,
641
+ recipientUserId: input.userId,
642
+ deletedAt: null
643
+ });
644
+ return {
645
+ before: {
646
+ messageId: message.id,
647
+ messageDeletedAt: toIso(message.deletedAt),
648
+ recipientId: recipient?.id ?? null,
649
+ recipientStatus: recipient?.status ?? null,
650
+ recipientDeletedAt: toIso(recipient?.deletedAt)
651
+ }
652
+ };
653
+ },
654
+ async execute(rawInput, ctx) {
655
+ const input = deleteForActorCommandSchema.parse(rawInput);
656
+ const em = ctx.container.resolve("em").fork();
657
+ const message = await requireMessageById(em, input, input.messageId);
658
+ const recipient = await em.findOne(MessageRecipient, {
659
+ messageId: input.messageId,
660
+ recipientUserId: input.userId,
661
+ deletedAt: null
662
+ });
663
+ if (recipient) {
664
+ recipient.status = "deleted";
665
+ recipient.deletedAt = /* @__PURE__ */ new Date();
666
+ await em.flush();
667
+ await emitMessageDeletedEvent(ctx.container, {
668
+ messageId: input.messageId,
669
+ actorUserId: input.userId,
670
+ target: "recipient",
671
+ tenantId: input.tenantId,
672
+ organizationId: input.organizationId
673
+ });
674
+ return { ok: true };
675
+ }
676
+ if (message.senderUserId === input.userId) {
677
+ message.deletedAt = /* @__PURE__ */ new Date();
678
+ await em.flush();
679
+ await emitMessageDeletedEvent(ctx.container, {
680
+ messageId: input.messageId,
681
+ actorUserId: input.userId,
682
+ target: "sender",
683
+ tenantId: input.tenantId,
684
+ organizationId: input.organizationId
685
+ });
686
+ return { ok: true };
687
+ }
688
+ throw new Error("Access denied");
689
+ },
690
+ async captureAfter(rawInput, _result, ctx) {
691
+ const input = deleteForActorCommandSchema.parse(rawInput);
692
+ const em = ctx.container.resolve("em").fork();
693
+ const message = await em.findOne(Message, { id: input.messageId, tenantId: input.tenantId });
694
+ const recipient = await em.findOne(MessageRecipient, {
695
+ messageId: input.messageId,
696
+ recipientUserId: input.userId
697
+ });
698
+ return {
699
+ messageId: input.messageId,
700
+ messageDeletedAt: toIso(message?.deletedAt),
701
+ recipientId: recipient?.id ?? null,
702
+ recipientStatus: recipient?.status ?? null,
703
+ recipientDeletedAt: toIso(recipient?.deletedAt)
704
+ };
705
+ },
706
+ buildLog: async ({ input, snapshots }) => {
707
+ const parsed = deleteForActorCommandSchema.parse(input);
708
+ return {
709
+ actionLabel: "Delete message for actor",
710
+ resourceKind: "messages.message",
711
+ resourceId: parsed.messageId,
712
+ tenantId: parsed.tenantId,
713
+ organizationId: parsed.organizationId,
714
+ payload: {
715
+ undo: {
716
+ before: snapshots.before ?? null,
717
+ after: snapshots.after ?? null
718
+ }
719
+ },
720
+ snapshotBefore: snapshots.before ?? null,
721
+ snapshotAfter: snapshots.after ?? null
722
+ };
723
+ },
724
+ undo: async ({ logEntry, ctx }) => {
725
+ const undo = extractUndoPayload(logEntry);
726
+ const before = undo?.before;
727
+ if (!before) return;
728
+ const em = ctx.container.resolve("em").fork();
729
+ const message = await em.findOne(Message, { id: before.messageId });
730
+ if (message) {
731
+ message.deletedAt = toDate(before.messageDeletedAt);
732
+ }
733
+ if (before.recipientId) {
734
+ const recipient = await em.findOne(MessageRecipient, { id: before.recipientId });
735
+ if (recipient) {
736
+ recipient.status = before.recipientStatus ?? "unread";
737
+ recipient.deletedAt = toDate(before.recipientDeletedAt);
738
+ }
739
+ }
740
+ await em.flush();
741
+ }
742
+ };
743
+ registerCommand(composeMessageCommand);
744
+ registerCommand(updateDraftCommand);
745
+ registerCommand(replyMessageCommand);
746
+ registerCommand(forwardMessageCommand);
747
+ registerCommand(deleteForActorCommand);
748
+ //# sourceMappingURL=messages.js.map