@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,179 @@
1
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { User } from "../../auth/data/entities.js";
3
+ import { Message, MessageRecipient } from "../data/entities.js";
4
+ const FORWARD_MARKER = "---------- Forwarded message ----------";
5
+ const MAX_FORWARD_BODY_LENGTH = 5e4;
6
+ function formatForwardSubject(subject) {
7
+ if (/^fwd:\s*/i.test(subject)) return subject;
8
+ return `Fwd: ${subject}`;
9
+ }
10
+ function formatDateLabel(date) {
11
+ if (!date) return "-";
12
+ return date.toISOString();
13
+ }
14
+ function normalizeSubject(subject) {
15
+ if (typeof subject !== "string") return "(no subject)";
16
+ const trimmed = subject.trim();
17
+ return trimmed.length > 0 ? trimmed : "(no subject)";
18
+ }
19
+ function formatUserLabel(user, fallbackUserId) {
20
+ const name = user?.name?.trim();
21
+ const email = user?.email?.trim();
22
+ if (name && email) return `${name} <${email}>`;
23
+ if (name) return name;
24
+ if (email) return email;
25
+ return fallbackUserId;
26
+ }
27
+ function ensureMaxForwardBodyLength(body) {
28
+ if (body.length > MAX_FORWARD_BODY_LENGTH) {
29
+ throw new Error("Forward body exceeds maximum length");
30
+ }
31
+ }
32
+ async function buildForwardThreadSlice(em, scope, selectedMessage) {
33
+ const threadMessages = await em.find(
34
+ Message,
35
+ {
36
+ threadId: selectedMessage.threadId ?? selectedMessage.id,
37
+ tenantId: scope.tenantId,
38
+ organizationId: scope.organizationId,
39
+ deletedAt: null,
40
+ isDraft: false
41
+ },
42
+ {
43
+ orderBy: {
44
+ sentAt: "ASC",
45
+ createdAt: "ASC",
46
+ id: "ASC"
47
+ }
48
+ }
49
+ );
50
+ const messagesById = new Map(threadMessages.map((item) => [item.id, item]));
51
+ messagesById.set(selectedMessage.id, selectedMessage);
52
+ const threadRootId = selectedMessage.threadId ?? null;
53
+ if (threadRootId && !messagesById.has(threadRootId)) {
54
+ const threadRoot = await em.findOne(Message, {
55
+ id: threadRootId,
56
+ tenantId: scope.tenantId,
57
+ organizationId: scope.organizationId,
58
+ deletedAt: null,
59
+ isDraft: false
60
+ });
61
+ if (threadRoot) {
62
+ messagesById.set(threadRoot.id, threadRoot);
63
+ }
64
+ }
65
+ let parentMessageId = selectedMessage.parentMessageId ?? null;
66
+ while (parentMessageId) {
67
+ const parentMessage = await em.findOne(Message, {
68
+ id: parentMessageId,
69
+ tenantId: scope.tenantId,
70
+ organizationId: scope.organizationId,
71
+ deletedAt: null,
72
+ isDraft: false
73
+ });
74
+ if (!parentMessage) break;
75
+ messagesById.set(parentMessage.id, parentMessage);
76
+ parentMessageId = parentMessage.parentMessageId ?? null;
77
+ }
78
+ const orderedThreadMessages = Array.from(messagesById.values()).sort((a, b) => {
79
+ const aTime = a.sentAt?.getTime() ?? 0;
80
+ const bTime = b.sentAt?.getTime() ?? 0;
81
+ if (aTime !== bTime) return aTime - bTime;
82
+ const aCreatedAt = a.createdAt.getTime();
83
+ const bCreatedAt = b.createdAt.getTime();
84
+ if (aCreatedAt !== bCreatedAt) return aCreatedAt - bCreatedAt;
85
+ return a.id.localeCompare(b.id);
86
+ });
87
+ const selectedIndex = orderedThreadMessages.findIndex((item) => item.id === selectedMessage.id);
88
+ const threadSlice = selectedIndex >= 0 ? orderedThreadMessages.slice(0, selectedIndex + 1) : [selectedMessage];
89
+ if (scope.userId) {
90
+ const sliceIds = threadSlice.map((item) => item.id);
91
+ const recipientRows = sliceIds.length > 0 ? await em.find(MessageRecipient, {
92
+ messageId: { $in: sliceIds },
93
+ recipientUserId: scope.userId,
94
+ deletedAt: null
95
+ }) : [];
96
+ const recipientMessageIds = new Set(recipientRows.map((row) => row.messageId));
97
+ const visibleSlice = threadSlice.filter(
98
+ (item) => item.senderUserId === scope.userId || recipientMessageIds.has(item.id)
99
+ );
100
+ return visibleSlice.map((item) => ({
101
+ id: item.id,
102
+ senderUserId: item.senderUserId,
103
+ subject: item.subject,
104
+ body: item.body,
105
+ sentAt: item.sentAt,
106
+ createdAt: item.createdAt
107
+ }));
108
+ }
109
+ return threadSlice.map((item) => ({
110
+ id: item.id,
111
+ senderUserId: item.senderUserId,
112
+ subject: item.subject,
113
+ body: item.body,
114
+ sentAt: item.sentAt,
115
+ createdAt: item.createdAt
116
+ }));
117
+ }
118
+ async function buildForwardPreviewFromThreadSlice(em, scope, selectedMessage, threadSlice) {
119
+ const allMessageIds = threadSlice.map((item) => item.id);
120
+ const allSenderIds = Array.from(new Set(threadSlice.map((item) => item.senderUserId)));
121
+ const recipients = allMessageIds.length > 0 ? await em.find(MessageRecipient, {
122
+ messageId: { $in: allMessageIds },
123
+ deletedAt: null
124
+ }) : [];
125
+ const allRecipientUserIds = Array.from(new Set(recipients.map((item) => item.recipientUserId)));
126
+ const allUserIds = Array.from(/* @__PURE__ */ new Set([...allSenderIds, ...allRecipientUserIds]));
127
+ const users = allUserIds.length > 0 ? await findWithDecryption(
128
+ em,
129
+ User,
130
+ { id: { $in: allUserIds } },
131
+ void 0,
132
+ { tenantId: scope.tenantId, organizationId: scope.organizationId }
133
+ ) : [];
134
+ const userById = new Map(users.map((user) => [user.id, user]));
135
+ const recipientsByMessageId = /* @__PURE__ */ new Map();
136
+ for (const recipient of recipients) {
137
+ const currentRecipients = recipientsByMessageId.get(recipient.messageId) ?? [];
138
+ currentRecipients.push(recipient);
139
+ recipientsByMessageId.set(recipient.messageId, currentRecipients);
140
+ }
141
+ const body = threadSlice.map((item) => {
142
+ const sender = userById.get(item.senderUserId);
143
+ const toRecipients = recipientsByMessageId.get(item.id) ?? [];
144
+ const toLabel = toRecipients.length > 0 ? toRecipients.map((recipient) => formatUserLabel(userById.get(recipient.recipientUserId), recipient.recipientUserId)).join(", ") : "-";
145
+ return [
146
+ FORWARD_MARKER,
147
+ `From: ${formatUserLabel(sender, item.senderUserId)}`,
148
+ `Date: ${formatDateLabel(item.sentAt ?? item.createdAt)}`,
149
+ `Subject: ${normalizeSubject(item.subject)}`,
150
+ `To: ${toLabel}`,
151
+ "",
152
+ item.body ?? ""
153
+ ].join("\n");
154
+ }).join("\n\n");
155
+ ensureMaxForwardBodyLength(body);
156
+ return {
157
+ subject: formatForwardSubject(selectedMessage.subject),
158
+ body
159
+ };
160
+ }
161
+ async function buildForwardPreview(em, scope, selectedMessage) {
162
+ const threadSlice = await buildForwardThreadSlice(em, scope, selectedMessage);
163
+ return buildForwardPreviewFromThreadSlice(em, scope, selectedMessage, threadSlice);
164
+ }
165
+ function buildForwardBodyFromLegacyInput(generatedBody, additionalBody) {
166
+ const legacyPrefix = additionalBody?.trim();
167
+ const finalBody = legacyPrefix ? `${legacyPrefix}
168
+
169
+ ${generatedBody}` : generatedBody;
170
+ ensureMaxForwardBodyLength(finalBody);
171
+ return finalBody;
172
+ }
173
+ export {
174
+ buildForwardBodyFromLegacyInput,
175
+ buildForwardPreview,
176
+ buildForwardPreviewFromThreadSlice,
177
+ buildForwardThreadSlice
178
+ };
179
+ //# sourceMappingURL=forwarding.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/forwarding.ts"],
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { User } from '../../auth/data/entities'\nimport { Message, MessageRecipient } from '../data/entities'\n\nconst FORWARD_MARKER = '---------- Forwarded message ----------'\nconst MAX_FORWARD_BODY_LENGTH = 50_000\n\ntype MessageScope = {\n tenantId: string\n organizationId: string | null\n userId?: string | null\n}\n\ntype ForwardMessageBlock = {\n id: string\n senderUserId: string\n subject: string\n body: string\n sentAt: Date | null | undefined\n createdAt: Date\n}\n\nfunction formatForwardSubject(subject: string): string {\n if (/^fwd:\\s*/i.test(subject)) return subject\n return `Fwd: ${subject}`\n}\n\nfunction formatDateLabel(date: Date | null | undefined): string {\n if (!date) return '-'\n return date.toISOString()\n}\n\nfunction normalizeSubject(subject: string | null | undefined): string {\n if (typeof subject !== 'string') return '(no subject)'\n const trimmed = subject.trim()\n return trimmed.length > 0 ? trimmed : '(no subject)'\n}\n\nfunction formatUserLabel(user: { name?: string | null; email?: string | null } | undefined, fallbackUserId: string): string {\n const name = user?.name?.trim()\n const email = user?.email?.trim()\n if (name && email) return `${name} <${email}>`\n if (name) return name\n if (email) return email\n return fallbackUserId\n}\n\nfunction ensureMaxForwardBodyLength(body: string): void {\n if (body.length > MAX_FORWARD_BODY_LENGTH) {\n throw new Error('Forward body exceeds maximum length')\n }\n}\n\nexport async function buildForwardThreadSlice(\n em: EntityManager,\n scope: MessageScope,\n selectedMessage: Message,\n): Promise<ForwardMessageBlock[]> {\n const threadMessages = await em.find(\n Message,\n {\n threadId: selectedMessage.threadId ?? selectedMessage.id,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n deletedAt: null,\n isDraft: false,\n },\n {\n orderBy: {\n sentAt: 'ASC',\n createdAt: 'ASC',\n id: 'ASC',\n },\n },\n )\n\n const messagesById = new Map(threadMessages.map((item) => [item.id, item]))\n messagesById.set(selectedMessage.id, selectedMessage)\n\n const threadRootId = selectedMessage.threadId ?? null\n if (threadRootId && !messagesById.has(threadRootId)) {\n const threadRoot = await em.findOne(Message, {\n id: threadRootId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n deletedAt: null,\n isDraft: false,\n })\n if (threadRoot) {\n messagesById.set(threadRoot.id, threadRoot)\n }\n }\n\n let parentMessageId = selectedMessage.parentMessageId ?? null\n while (parentMessageId) {\n const parentMessage = await em.findOne(Message, {\n id: parentMessageId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n deletedAt: null,\n isDraft: false,\n })\n if (!parentMessage) break\n messagesById.set(parentMessage.id, parentMessage)\n parentMessageId = parentMessage.parentMessageId ?? null\n }\n\n const orderedThreadMessages = Array.from(messagesById.values()).sort((a, b) => {\n const aTime = a.sentAt?.getTime() ?? 0\n const bTime = b.sentAt?.getTime() ?? 0\n if (aTime !== bTime) return aTime - bTime\n\n const aCreatedAt = a.createdAt.getTime()\n const bCreatedAt = b.createdAt.getTime()\n if (aCreatedAt !== bCreatedAt) return aCreatedAt - bCreatedAt\n\n return a.id.localeCompare(b.id)\n })\n\n const selectedIndex = orderedThreadMessages.findIndex((item) => item.id === selectedMessage.id)\n const threadSlice = selectedIndex >= 0 ? orderedThreadMessages.slice(0, selectedIndex + 1) : [selectedMessage]\n\n if (scope.userId) {\n const sliceIds = threadSlice.map((item) => item.id)\n const recipientRows = sliceIds.length > 0\n ? await em.find(MessageRecipient, {\n messageId: { $in: sliceIds },\n recipientUserId: scope.userId,\n deletedAt: null,\n })\n : []\n const recipientMessageIds = new Set(recipientRows.map((row) => row.messageId))\n const visibleSlice = threadSlice.filter(\n (item) => item.senderUserId === scope.userId || recipientMessageIds.has(item.id),\n )\n return visibleSlice.map((item) => ({\n id: item.id,\n senderUserId: item.senderUserId,\n subject: item.subject,\n body: item.body,\n sentAt: item.sentAt,\n createdAt: item.createdAt,\n }))\n }\n\n return threadSlice.map((item) => ({\n id: item.id,\n senderUserId: item.senderUserId,\n subject: item.subject,\n body: item.body,\n sentAt: item.sentAt,\n createdAt: item.createdAt,\n }))\n}\n\nexport async function buildForwardPreviewFromThreadSlice(\n em: EntityManager,\n scope: MessageScope,\n selectedMessage: Message,\n threadSlice: ForwardMessageBlock[],\n): Promise<{ subject: string; body: string }> {\n const allMessageIds = threadSlice.map((item) => item.id)\n const allSenderIds = Array.from(new Set(threadSlice.map((item) => item.senderUserId)))\n\n const recipients = allMessageIds.length > 0\n ? await em.find(MessageRecipient, {\n messageId: { $in: allMessageIds },\n deletedAt: null,\n })\n : []\n\n const allRecipientUserIds = Array.from(new Set(recipients.map((item) => item.recipientUserId)))\n const allUserIds = Array.from(new Set([...allSenderIds, ...allRecipientUserIds]))\n const users = allUserIds.length > 0\n ? await findWithDecryption(\n em,\n User,\n { id: { $in: allUserIds } },\n undefined,\n { tenantId: scope.tenantId, organizationId: scope.organizationId },\n )\n : []\n\n const userById = new Map(users.map((user) => [user.id, user]))\n const recipientsByMessageId = new Map<string, MessageRecipient[]>()\n for (const recipient of recipients) {\n const currentRecipients = recipientsByMessageId.get(recipient.messageId) ?? []\n currentRecipients.push(recipient)\n recipientsByMessageId.set(recipient.messageId, currentRecipients)\n }\n\n const body = threadSlice.map((item) => {\n const sender = userById.get(item.senderUserId)\n const toRecipients = recipientsByMessageId.get(item.id) ?? []\n const toLabel = toRecipients.length > 0\n ? toRecipients\n .map((recipient) => formatUserLabel(userById.get(recipient.recipientUserId), recipient.recipientUserId))\n .join(', ')\n : '-'\n\n return [\n FORWARD_MARKER,\n `From: ${formatUserLabel(sender, item.senderUserId)}`,\n `Date: ${formatDateLabel(item.sentAt ?? item.createdAt)}`,\n `Subject: ${normalizeSubject(item.subject)}`,\n `To: ${toLabel}`,\n '',\n item.body ?? '',\n ].join('\\n')\n }).join('\\n\\n')\n\n ensureMaxForwardBodyLength(body)\n\n return {\n subject: formatForwardSubject(selectedMessage.subject),\n body,\n }\n}\n\nexport async function buildForwardPreview(\n em: EntityManager,\n scope: MessageScope,\n selectedMessage: Message,\n): Promise<{ subject: string; body: string }> {\n const threadSlice = await buildForwardThreadSlice(em, scope, selectedMessage)\n return buildForwardPreviewFromThreadSlice(em, scope, selectedMessage, threadSlice)\n}\n\nexport function buildForwardBodyFromLegacyInput(\n generatedBody: string,\n additionalBody?: string,\n): string {\n const legacyPrefix = additionalBody?.trim()\n const finalBody = legacyPrefix\n ? `${legacyPrefix}\\n\\n${generatedBody}`\n : generatedBody\n ensureMaxForwardBodyLength(finalBody)\n return finalBody\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,49 @@
1
+ import defaultTypes from "../message-objects.js";
2
+ const registry = /* @__PURE__ */ new Map();
3
+ function getKey(module, entityType) {
4
+ return `${module}:${entityType}`;
5
+ }
6
+ function ensureDefaults() {
7
+ if (registry.size > 0) return;
8
+ registerMessageObjectTypes(defaultTypes);
9
+ }
10
+ function registerMessageObjectTypes(types, options = {}) {
11
+ if (options.replace) {
12
+ registry.clear();
13
+ }
14
+ for (const type of types) {
15
+ const key = getKey(type.module, type.entityType);
16
+ if (registry.has(key)) {
17
+ console.warn(`[messages] Message object type "${key}" is already registered, overwriting`);
18
+ }
19
+ registry.set(key, type);
20
+ }
21
+ }
22
+ function getMessageObjectType(module, entityType) {
23
+ ensureDefaults();
24
+ return registry.get(getKey(module, entityType));
25
+ }
26
+ function isMessageObjectTypeAllowedForMessageType(objectType, messageType) {
27
+ if (!messageType || !messageType.trim()) return true;
28
+ const allowed = objectType.messageTypes;
29
+ if (!Array.isArray(allowed) || allowed.length === 0) return true;
30
+ return allowed.includes(messageType);
31
+ }
32
+ function getMessageObjectTypesForMessageType(messageType) {
33
+ ensureDefaults();
34
+ return Array.from(registry.values()).filter(
35
+ (objectType) => isMessageObjectTypeAllowedForMessageType(objectType, messageType)
36
+ );
37
+ }
38
+ function getAllMessageObjectTypes() {
39
+ ensureDefaults();
40
+ return Array.from(registry.values());
41
+ }
42
+ export {
43
+ getAllMessageObjectTypes,
44
+ getMessageObjectType,
45
+ getMessageObjectTypesForMessageType,
46
+ isMessageObjectTypeAllowedForMessageType,
47
+ registerMessageObjectTypes
48
+ };
49
+ //# sourceMappingURL=message-objects-registry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/message-objects-registry.ts"],
4
+ "sourcesContent": ["import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\nimport defaultTypes from '../message-objects'\n\nconst registry = new Map<string, MessageObjectTypeDefinition>()\n\nexport type RegisterMessageObjectTypesOptions = {\n replace?: boolean\n}\n\nfunction getKey(module: string, entityType: string): string {\n return `${module}:${entityType}`\n}\n\nfunction ensureDefaults(): void {\n if (registry.size > 0) return\n registerMessageObjectTypes(defaultTypes)\n}\n\nexport function registerMessageObjectTypes(\n types: MessageObjectTypeDefinition[],\n options: RegisterMessageObjectTypesOptions = {},\n): void {\n if (options.replace) {\n registry.clear()\n }\n for (const type of types) {\n const key = getKey(type.module, type.entityType)\n if (registry.has(key)) {\n console.warn(`[messages] Message object type \"${key}\" is already registered, overwriting`)\n }\n registry.set(key, type)\n }\n}\n\nexport function getMessageObjectType(module: string, entityType: string): MessageObjectTypeDefinition | undefined {\n ensureDefaults()\n return registry.get(getKey(module, entityType))\n}\n\nexport function isMessageObjectTypeAllowedForMessageType(\n objectType: MessageObjectTypeDefinition,\n messageType: string,\n): boolean {\n if (!messageType || !messageType.trim()) return true\n const allowed = objectType.messageTypes\n if (!Array.isArray(allowed) || allowed.length === 0) return true\n return allowed.includes(messageType)\n}\n\nexport function getMessageObjectTypesForMessageType(messageType: string): MessageObjectTypeDefinition[] {\n ensureDefaults()\n return Array.from(registry.values()).filter((objectType) =>\n isMessageObjectTypeAllowedForMessageType(objectType, messageType),\n )\n}\n\nexport function getAllMessageObjectTypes(): MessageObjectTypeDefinition[] {\n ensureDefaults()\n return Array.from(registry.values())\n}\n"],
5
+ "mappings": "AACA,OAAO,kBAAkB;AAEzB,MAAM,WAAW,oBAAI,IAAyC;AAM9D,SAAS,OAAO,QAAgB,YAA4B;AAC1D,SAAO,GAAG,MAAM,IAAI,UAAU;AAChC;AAEA,SAAS,iBAAuB;AAC9B,MAAI,SAAS,OAAO,EAAG;AACvB,6BAA2B,YAAY;AACzC;AAEO,SAAS,2BACd,OACA,UAA6C,CAAC,GACxC;AACN,MAAI,QAAQ,SAAS;AACnB,aAAS,MAAM;AAAA,EACjB;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,KAAK,QAAQ,KAAK,UAAU;AAC/C,QAAI,SAAS,IAAI,GAAG,GAAG;AACrB,cAAQ,KAAK,mCAAmC,GAAG,sCAAsC;AAAA,IAC3F;AACA,aAAS,IAAI,KAAK,IAAI;AAAA,EACxB;AACF;AAEO,SAAS,qBAAqB,QAAgB,YAA6D;AAChH,iBAAe;AACf,SAAO,SAAS,IAAI,OAAO,QAAQ,UAAU,CAAC;AAChD;AAEO,SAAS,yCACd,YACA,aACS;AACT,MAAI,CAAC,eAAe,CAAC,YAAY,KAAK,EAAG,QAAO;AAChD,QAAM,UAAU,WAAW;AAC3B,MAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,EAAG,QAAO;AAC5D,SAAO,QAAQ,SAAS,WAAW;AACrC;AAEO,SAAS,oCAAoC,aAAoD;AACtG,iBAAe;AACf,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,IAAO,CAAC,eAC3C,yCAAyC,YAAY,WAAW;AAAA,EAClE;AACF;AAEO,SAAS,2BAA0D;AACxE,iBAAe;AACf,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC;AACrC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ import defaultTypes from "../message-types.js";
2
+ const registry = /* @__PURE__ */ new Map();
3
+ function ensureDefaults() {
4
+ if (registry.size > 0) return;
5
+ registerMessageTypes(defaultTypes);
6
+ }
7
+ function registerMessageTypes(types, options = {}) {
8
+ if (options.replace) {
9
+ registry.clear();
10
+ }
11
+ for (const type of types) {
12
+ if (registry.has(type.type)) {
13
+ console.warn(`[messages] Message type "${type.type}" is already registered, overwriting`);
14
+ }
15
+ registry.set(type.type, type);
16
+ }
17
+ }
18
+ function getMessageType(type) {
19
+ ensureDefaults();
20
+ return registry.get(type);
21
+ }
22
+ function getMessageTypeOrDefault(type) {
23
+ ensureDefaults();
24
+ return registry.get(type) ?? registry.get("default") ?? defaultTypes[0];
25
+ }
26
+ function getAllMessageTypes() {
27
+ ensureDefaults();
28
+ return Array.from(registry.values());
29
+ }
30
+ function getMessageTypesByModule(module) {
31
+ ensureDefaults();
32
+ return Array.from(registry.values()).filter((entry) => entry.module === module);
33
+ }
34
+ export {
35
+ getAllMessageTypes,
36
+ getMessageType,
37
+ getMessageTypeOrDefault,
38
+ getMessageTypesByModule,
39
+ registerMessageTypes
40
+ };
41
+ //# sourceMappingURL=message-types-registry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/message-types-registry.ts"],
4
+ "sourcesContent": ["import type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\nimport defaultTypes from '../message-types'\n\nconst registry = new Map<string, MessageTypeDefinition>()\n\nexport type RegisterMessageTypesOptions = {\n replace?: boolean\n}\n\nfunction ensureDefaults(): void {\n if (registry.size > 0) return\n registerMessageTypes(defaultTypes)\n}\n\nexport function registerMessageTypes(\n types: MessageTypeDefinition[],\n options: RegisterMessageTypesOptions = {},\n): void {\n if (options.replace) {\n registry.clear()\n }\n for (const type of types) {\n if (registry.has(type.type)) {\n console.warn(`[messages] Message type \"${type.type}\" is already registered, overwriting`)\n }\n registry.set(type.type, type)\n }\n}\n\nexport function getMessageType(type: string): MessageTypeDefinition | undefined {\n ensureDefaults()\n return registry.get(type)\n}\n\nexport function getMessageTypeOrDefault(type: string): MessageTypeDefinition {\n ensureDefaults()\n return registry.get(type) ?? registry.get('default') ?? defaultTypes[0]!\n}\n\nexport function getAllMessageTypes(): MessageTypeDefinition[] {\n ensureDefaults()\n return Array.from(registry.values())\n}\n\nexport function getMessageTypesByModule(module: string): MessageTypeDefinition[] {\n ensureDefaults()\n return Array.from(registry.values()).filter((entry) => entry.module === module)\n}\n"],
5
+ "mappings": "AACA,OAAO,kBAAkB;AAEzB,MAAM,WAAW,oBAAI,IAAmC;AAMxD,SAAS,iBAAuB;AAC9B,MAAI,SAAS,OAAO,EAAG;AACvB,uBAAqB,YAAY;AACnC;AAEO,SAAS,qBACd,OACA,UAAuC,CAAC,GAClC;AACN,MAAI,QAAQ,SAAS;AACnB,aAAS,MAAM;AAAA,EACjB;AACA,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,IAAI,KAAK,IAAI,GAAG;AAC3B,cAAQ,KAAK,4BAA4B,KAAK,IAAI,sCAAsC;AAAA,IAC1F;AACA,aAAS,IAAI,KAAK,MAAM,IAAI;AAAA,EAC9B;AACF;AAEO,SAAS,eAAe,MAAiD;AAC9E,iBAAe;AACf,SAAO,SAAS,IAAI,IAAI;AAC1B;AAEO,SAAS,wBAAwB,MAAqC;AAC3E,iBAAe;AACf,SAAO,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,aAAa,CAAC;AACxE;AAEO,SAAS,qBAA8C;AAC5D,iBAAe;AACf,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC;AACrC;AAEO,SAAS,wBAAwB,QAAyC;AAC/E,iBAAe;AACf,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,WAAW,MAAM;AAChF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,20 @@
1
+ import {
2
+ getMessageObjectType,
3
+ isMessageObjectTypeAllowedForMessageType
4
+ } from "./message-objects-registry.js";
5
+ function validateMessageObjectsForType(messageType, objects) {
6
+ for (const object of objects) {
7
+ const objectType = getMessageObjectType(object.entityModule, object.entityType);
8
+ if (!objectType) {
9
+ return `Unsupported message object type: ${object.entityModule}:${object.entityType}`;
10
+ }
11
+ if (!isMessageObjectTypeAllowedForMessageType(objectType, messageType)) {
12
+ return `Object type ${object.entityModule}:${object.entityType} is not allowed for message type ${messageType}`;
13
+ }
14
+ }
15
+ return null;
16
+ }
17
+ export {
18
+ validateMessageObjectsForType
19
+ };
20
+ //# sourceMappingURL=object-validation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/object-validation.ts"],
4
+ "sourcesContent": ["import {\n getMessageObjectType,\n isMessageObjectTypeAllowedForMessageType,\n} from './message-objects-registry'\n\ntype MessageObjectLike = {\n entityModule: string\n entityType: string\n entityId: string\n}\n\nexport function validateMessageObjectsForType(\n messageType: string,\n objects: MessageObjectLike[],\n): string | null {\n for (const object of objects) {\n const objectType = getMessageObjectType(object.entityModule, object.entityType)\n if (!objectType) {\n return `Unsupported message object type: ${object.entityModule}:${object.entityType}`\n }\n if (!isMessageObjectTypeAllowedForMessageType(objectType, messageType)) {\n return `Object type ${object.entityModule}:${object.entityType} is not allowed for message type ${messageType}`\n }\n }\n return null\n}\n"],
5
+ "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAQA,SAAS,8BACd,aACA,SACe;AACf,aAAW,UAAU,SAAS;AAC5B,UAAM,aAAa,qBAAqB,OAAO,cAAc,OAAO,UAAU;AAC9E,QAAI,CAAC,YAAY;AACf,aAAO,oCAAoC,OAAO,YAAY,IAAI,OAAO,UAAU;AAAA,IACrF;AACA,QAAI,CAAC,yCAAyC,YAAY,WAAW,GAAG;AACtE,aAAO,eAAe,OAAO,YAAY,IAAI,OAAO,UAAU,oCAAoC,WAAW;AAAA,IAC/G;AAAA,EACF;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ import { serializeOperationMetadata } from "@open-mercato/shared/lib/commands/operationMetadata";
2
+ function attachOperationMetadataHeader(response, logEntry, fallback = {}) {
3
+ if (!logEntry?.undoToken || !logEntry.id || !logEntry.commandId) return;
4
+ const executedAt = logEntry.createdAt instanceof Date ? logEntry.createdAt.toISOString() : typeof logEntry.createdAt === "string" && logEntry.createdAt.trim().length > 0 ? logEntry.createdAt : (/* @__PURE__ */ new Date()).toISOString();
5
+ response.headers.set(
6
+ "x-om-operation",
7
+ serializeOperationMetadata({
8
+ id: logEntry.id,
9
+ undoToken: logEntry.undoToken,
10
+ commandId: logEntry.commandId,
11
+ actionLabel: logEntry.actionLabel ?? null,
12
+ resourceKind: logEntry.resourceKind ?? fallback.resourceKind ?? null,
13
+ resourceId: logEntry.resourceId ?? fallback.resourceId ?? null,
14
+ executedAt
15
+ })
16
+ );
17
+ }
18
+ export {
19
+ attachOperationMetadataHeader
20
+ };
21
+ //# sourceMappingURL=operationMetadata.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/operationMetadata.ts"],
4
+ "sourcesContent": ["import { serializeOperationMetadata } from '@open-mercato/shared/lib/commands/operationMetadata'\n\nexport type OperationLogEntryLike = {\n id?: string | null\n undoToken?: string | null\n commandId?: string | null\n actionLabel?: string | null\n resourceKind?: string | null\n resourceId?: string | null\n createdAt?: Date | string | null\n}\n\ntype OperationFallback = {\n resourceKind?: string | null\n resourceId?: string | null\n}\n\nexport function attachOperationMetadataHeader(\n response: Response,\n logEntry: OperationLogEntryLike | null | undefined,\n fallback: OperationFallback = {},\n) {\n if (!logEntry?.undoToken || !logEntry.id || !logEntry.commandId) return\n\n const executedAt = logEntry.createdAt instanceof Date\n ? logEntry.createdAt.toISOString()\n : typeof logEntry.createdAt === 'string' && logEntry.createdAt.trim().length > 0\n ? logEntry.createdAt\n : new Date().toISOString()\n\n response.headers.set(\n 'x-om-operation',\n serializeOperationMetadata({\n id: logEntry.id,\n undoToken: logEntry.undoToken,\n commandId: logEntry.commandId,\n actionLabel: logEntry.actionLabel ?? null,\n resourceKind: logEntry.resourceKind ?? fallback.resourceKind ?? null,\n resourceId: logEntry.resourceId ?? fallback.resourceId ?? null,\n executedAt,\n }),\n )\n}\n"],
5
+ "mappings": "AAAA,SAAS,kCAAkC;AAiBpC,SAAS,8BACd,UACA,UACA,WAA8B,CAAC,GAC/B;AACA,MAAI,CAAC,UAAU,aAAa,CAAC,SAAS,MAAM,CAAC,SAAS,UAAW;AAEjE,QAAM,aAAa,SAAS,qBAAqB,OAC7C,SAAS,UAAU,YAAY,IAC/B,OAAO,SAAS,cAAc,YAAY,SAAS,UAAU,KAAK,EAAE,SAAS,IAC3E,SAAS,aACT,oBAAI,KAAK,GAAE,YAAY;AAE7B,WAAS,QAAQ;AAAA,IACf;AAAA,IACA,2BAA2B;AAAA,MACzB,IAAI,SAAS;AAAA,MACb,WAAW,SAAS;AAAA,MACpB,WAAW,SAAS;AAAA,MACpB,aAAa,SAAS,eAAe;AAAA,MACrC,cAAc,SAAS,gBAAgB,SAAS,gBAAgB;AAAA,MAChE,YAAY,SAAS,cAAc,SAAS,cAAc;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,61 @@
1
+ function getPriorityBadgeVariant(priority) {
2
+ switch (priority) {
3
+ case "low":
4
+ return "muted";
5
+ case "normal":
6
+ return "secondary";
7
+ case "high":
8
+ return "default";
9
+ case "urgent":
10
+ return "destructive";
11
+ default:
12
+ return "secondary";
13
+ }
14
+ }
15
+ function getPriorityBadgeClassName(priority) {
16
+ switch (priority) {
17
+ case "low":
18
+ return "text-slate-600 bg-slate-100 border-slate-200";
19
+ case "normal":
20
+ return "text-blue-600 bg-blue-100 border-blue-200";
21
+ case "high":
22
+ return "text-orange-600 bg-orange-100 border-orange-200";
23
+ case "urgent":
24
+ return "text-red-600 bg-red-100 border-red-200";
25
+ default:
26
+ return "text-blue-600 bg-blue-100 border-blue-200";
27
+ }
28
+ }
29
+ function getPriorityLabelKey(priority) {
30
+ return `messages.priority.${priority}`;
31
+ }
32
+ function getPriorityFallbackLabel(priority) {
33
+ switch (priority) {
34
+ case "low":
35
+ return "Low";
36
+ case "normal":
37
+ return "Normal";
38
+ case "high":
39
+ return "High";
40
+ case "urgent":
41
+ return "Urgent";
42
+ default:
43
+ return "Normal";
44
+ }
45
+ }
46
+ function getPriorityOptions() {
47
+ return [
48
+ { value: "low", labelKey: getPriorityLabelKey("low"), fallbackLabel: getPriorityFallbackLabel("low") },
49
+ { value: "normal", labelKey: getPriorityLabelKey("normal"), fallbackLabel: getPriorityFallbackLabel("normal") },
50
+ { value: "high", labelKey: getPriorityLabelKey("high"), fallbackLabel: getPriorityFallbackLabel("high") },
51
+ { value: "urgent", labelKey: getPriorityLabelKey("urgent"), fallbackLabel: getPriorityFallbackLabel("urgent") }
52
+ ];
53
+ }
54
+ export {
55
+ getPriorityBadgeClassName,
56
+ getPriorityBadgeVariant,
57
+ getPriorityFallbackLabel,
58
+ getPriorityLabelKey,
59
+ getPriorityOptions
60
+ };
61
+ //# sourceMappingURL=priorityUtils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/priorityUtils.ts"],
4
+ "sourcesContent": ["import type { BadgeProps } from '@open-mercato/ui/primitives/badge'\n\nexport type MessagePriority = 'low' | 'normal' | 'high' | 'urgent'\n\n/**\n * Get the Badge variant for a given priority level\n */\nexport function getPriorityBadgeVariant(priority: MessagePriority): BadgeProps['variant'] {\n switch (priority) {\n case 'low':\n return 'muted'\n case 'normal':\n return 'secondary'\n case 'high':\n return 'default'\n case 'urgent':\n return 'destructive'\n default:\n return 'secondary'\n }\n}\n\n/**\n * Get custom CSS classes for priority badge colors\n */\nexport function getPriorityBadgeClassName(priority: MessagePriority): string {\n switch (priority) {\n case 'low':\n return 'text-slate-600 bg-slate-100 border-slate-200'\n case 'normal':\n return 'text-blue-600 bg-blue-100 border-blue-200'\n case 'high':\n return 'text-orange-600 bg-orange-100 border-orange-200'\n case 'urgent':\n return 'text-red-600 bg-red-100 border-red-200'\n default:\n return 'text-blue-600 bg-blue-100 border-blue-200'\n }\n}\n\n/**\n * Get the localized priority label key\n */\nexport function getPriorityLabelKey(priority: MessagePriority): string {\n return `messages.priority.${priority}`\n}\n\n/**\n * Get the default fallback label for a priority\n */\nexport function getPriorityFallbackLabel(priority: MessagePriority): string {\n switch (priority) {\n case 'low':\n return 'Low'\n case 'normal':\n return 'Normal'\n case 'high':\n return 'High'\n case 'urgent':\n return 'Urgent'\n default:\n return 'Normal'\n }\n}\n\n/**\n * Get all available priority options for dropdowns/selects\n */\nexport function getPriorityOptions(): Array<{ value: MessagePriority; labelKey: string; fallbackLabel: string }> {\n return [\n { value: 'low', labelKey: getPriorityLabelKey('low'), fallbackLabel: getPriorityFallbackLabel('low') },\n { value: 'normal', labelKey: getPriorityLabelKey('normal'), fallbackLabel: getPriorityFallbackLabel('normal') },\n { value: 'high', labelKey: getPriorityLabelKey('high'), fallbackLabel: getPriorityFallbackLabel('high') },\n { value: 'urgent', labelKey: getPriorityLabelKey('urgent'), fallbackLabel: getPriorityFallbackLabel('urgent') },\n ]\n}"],
5
+ "mappings": "AAOO,SAAS,wBAAwB,UAAkD;AACxF,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,0BAA0B,UAAmC;AAC3E,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,oBAAoB,UAAmC;AACrE,SAAO,qBAAqB,QAAQ;AACtC;AAKO,SAAS,yBAAyB,UAAmC;AAC1E,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,qBAAiG;AAC/G,SAAO;AAAA,IACL,EAAE,OAAO,OAAO,UAAU,oBAAoB,KAAK,GAAG,eAAe,yBAAyB,KAAK,EAAE;AAAA,IACrG,EAAE,OAAO,UAAU,UAAU,oBAAoB,QAAQ,GAAG,eAAe,yBAAyB,QAAQ,EAAE;AAAA,IAC9G,EAAE,OAAO,QAAQ,UAAU,oBAAoB,MAAM,GAAG,eAAe,yBAAyB,MAAM,EAAE;AAAA,IACxG,EAAE,OAAO,UAAU,UAAU,oBAAoB,QAAQ,GAAG,eAAe,yBAAyB,QAAQ,EAAE;AAAA,EAChH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ import { resolveRequestContext } from "@open-mercato/shared/lib/api/context";
2
+ import { hasFeature } from "@open-mercato/shared/security/features";
3
+ function hasOrganizationAccess(scopeOrganizationId, messageOrganizationId) {
4
+ if (scopeOrganizationId) {
5
+ return messageOrganizationId === scopeOrganizationId;
6
+ }
7
+ return messageOrganizationId == null;
8
+ }
9
+ async function resolveMessageContext(req) {
10
+ const { ctx } = await resolveRequestContext(req);
11
+ return {
12
+ ctx,
13
+ scope: {
14
+ tenantId: ctx.auth?.tenantId ?? "",
15
+ organizationId: ctx.auth?.orgId ?? null,
16
+ userId: ctx.auth?.sub ?? ""
17
+ }
18
+ };
19
+ }
20
+ async function parseRequestBodySafe(req) {
21
+ try {
22
+ const text = await req.text();
23
+ if (!text) return {};
24
+ return JSON.parse(text);
25
+ } catch {
26
+ return {};
27
+ }
28
+ }
29
+ async function canUseMessageEmailFeature(ctx, scope) {
30
+ if (!scope.userId || !scope.tenantId) return false;
31
+ const rbac = ctx.container.resolve("rbacService");
32
+ const acl = await rbac.loadAcl(scope.userId, {
33
+ tenantId: scope.tenantId,
34
+ organizationId: scope.organizationId
35
+ });
36
+ return Boolean(acl.isSuperAdmin) || hasFeature(acl.features, "messages.email");
37
+ }
38
+ export {
39
+ canUseMessageEmailFeature,
40
+ hasOrganizationAccess,
41
+ parseRequestBodySafe,
42
+ resolveMessageContext
43
+ };
44
+ //# sourceMappingURL=routeHelpers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/messages/lib/routeHelpers.ts"],
4
+ "sourcesContent": ["import { resolveRequestContext } from '@open-mercato/shared/lib/api/context'\nimport { hasFeature } from '@open-mercato/shared/security/features'\n\nexport function hasOrganizationAccess(\n scopeOrganizationId: string | null,\n messageOrganizationId: string | null | undefined,\n): boolean {\n if (scopeOrganizationId) {\n return messageOrganizationId === scopeOrganizationId\n }\n return messageOrganizationId == null\n}\n\nexport type MessageScope = {\n tenantId: string\n organizationId: string | null\n userId: string\n}\n\nexport async function resolveMessageContext(req: Request): Promise<{\n ctx: Awaited<ReturnType<typeof resolveRequestContext>>['ctx']\n scope: MessageScope\n}> {\n const { ctx } = await resolveRequestContext(req)\n return {\n ctx,\n scope: {\n tenantId: ctx.auth?.tenantId ?? '',\n organizationId: ctx.auth?.orgId ?? null,\n userId: ctx.auth?.sub ?? '',\n },\n }\n}\n\ntype RbacService = {\n loadAcl: (\n userId: string,\n scope: { tenantId: string | null; organizationId: string | null }\n ) => Promise<{ features?: string[]; isSuperAdmin?: boolean }>\n}\n\nexport async function parseRequestBodySafe(req: Request): Promise<unknown> {\n try {\n const text = await req.text()\n if (!text) return {}\n return JSON.parse(text)\n } catch {\n return {}\n }\n}\n\nexport async function canUseMessageEmailFeature(\n ctx: Awaited<ReturnType<typeof resolveRequestContext>>['ctx'],\n scope: MessageScope,\n): Promise<boolean> {\n if (!scope.userId || !scope.tenantId) return false\n\n const rbac = ctx.container.resolve('rbacService') as RbacService\n const acl = await rbac.loadAcl(scope.userId, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n\n return Boolean(acl.isSuperAdmin) || hasFeature(acl.features, 'messages.email')\n}\n"],
5
+ "mappings": "AAAA,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAEpB,SAAS,sBACd,qBACA,uBACS;AACT,MAAI,qBAAqB;AACvB,WAAO,0BAA0B;AAAA,EACnC;AACA,SAAO,yBAAyB;AAClC;AAQA,eAAsB,sBAAsB,KAGzC;AACD,QAAM,EAAE,IAAI,IAAI,MAAM,sBAAsB,GAAG;AAC/C,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,UAAU,IAAI,MAAM,YAAY;AAAA,MAChC,gBAAgB,IAAI,MAAM,SAAS;AAAA,MACnC,QAAQ,IAAI,MAAM,OAAO;AAAA,IAC3B;AAAA,EACF;AACF;AASA,eAAsB,qBAAqB,KAAgC;AACzE,MAAI;AACF,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,0BACpB,KACA,OACkB;AAClB,MAAI,CAAC,MAAM,UAAU,CAAC,MAAM,SAAU,QAAO;AAE7C,QAAM,OAAO,IAAI,UAAU,QAAQ,aAAa;AAChD,QAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,QAAQ;AAAA,IAC3C,UAAU,MAAM;AAAA,IAChB,gBAAgB,MAAM;AAAA,EACxB,CAAC;AAED,SAAO,QAAQ,IAAI,YAAY,KAAK,WAAW,IAAI,UAAU,gBAAgB;AAC/E;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ const messageObjectTypes = [];
2
+ var message_objects_default = messageObjectTypes;
3
+ export {
4
+ message_objects_default as default,
5
+ messageObjectTypes
6
+ };
7
+ //# sourceMappingURL=message-objects.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/messages/message-objects.ts"],
4
+ "sourcesContent": ["import type { MessageObjectTypeDefinition } from '@open-mercato/shared/modules/messages/types'\n\nexport const messageObjectTypes: MessageObjectTypeDefinition[] = []\n\nexport default messageObjectTypes\n"],
5
+ "mappings": "AAEO,MAAM,qBAAoD,CAAC;AAElE,IAAO,0BAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,67 @@
1
+ import { DefaultMessageActions } from "./components/defaults/DefaultMessageActions.js";
2
+ import { MessageConfirmationActions } from "./components/confirmation/MessageConfirmationActions.js";
3
+ import { MessageConfirmationContent } from "./components/confirmation/MessageConfirmationContent.js";
4
+ import { DefaultMessageContent } from "./components/defaults/DefaultMessageContent.js";
5
+ import { DefaultMessageListItem } from "./components/defaults/DefaultMessageListItem.js";
6
+ const messageTypes = [
7
+ {
8
+ type: "default",
9
+ module: "messages",
10
+ labelKey: "messages.types.default",
11
+ icon: "mail",
12
+ ui: {
13
+ listItemComponent: "messages.default.listItem",
14
+ contentComponent: "messages.default.content",
15
+ actionsComponent: "messages.default.actions"
16
+ },
17
+ ListItemComponent: DefaultMessageListItem,
18
+ ContentComponent: DefaultMessageContent,
19
+ ActionsComponent: DefaultMessageActions,
20
+ allowReply: true,
21
+ allowForward: true
22
+ },
23
+ {
24
+ type: "messages.confirmation",
25
+ module: "messages",
26
+ labelKey: "messages.types.confirmation",
27
+ icon: "badge-check",
28
+ color: "green",
29
+ ui: {
30
+ listItemComponent: "messages.default.listItem",
31
+ contentComponent: "messages.confirmation.content",
32
+ actionsComponent: "messages.confirmation.actions"
33
+ },
34
+ ListItemComponent: DefaultMessageListItem,
35
+ ContentComponent: MessageConfirmationContent,
36
+ ActionsComponent: MessageConfirmationActions,
37
+ defaultActions: [
38
+ {
39
+ id: "confirmation",
40
+ label: "Confirm",
41
+ labelKey: "messages.actions.confirmation",
42
+ variant: "default",
43
+ icon: "check",
44
+ commandId: "messages.confirmations.confirm",
45
+ isTerminal: true,
46
+ confirmRequired: true
47
+ }
48
+ ],
49
+ allowReply: true,
50
+ allowForward: true
51
+ },
52
+ {
53
+ type: "messages.defaultWithObjects",
54
+ module: "messages",
55
+ labelKey: "messages.types.defaultWithObjects",
56
+ icon: "attachment",
57
+ color: "blue",
58
+ allowReply: true,
59
+ allowForward: true
60
+ }
61
+ ];
62
+ var message_types_default = messageTypes;
63
+ export {
64
+ message_types_default as default,
65
+ messageTypes
66
+ };
67
+ //# sourceMappingURL=message-types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/messages/message-types.ts"],
4
+ "sourcesContent": ["import type { MessageTypeDefinition } from '@open-mercato/shared/modules/messages/types'\nimport { DefaultMessageActions } from './components/defaults/DefaultMessageActions'\nimport { MessageConfirmationActions } from './components/confirmation/MessageConfirmationActions'\nimport { MessageConfirmationContent } from './components/confirmation/MessageConfirmationContent'\nimport { DefaultMessageContent } from './components/defaults/DefaultMessageContent'\nimport { DefaultMessageListItem } from './components/defaults/DefaultMessageListItem'\n\nexport const messageTypes: MessageTypeDefinition[] = [\n {\n type: 'default',\n module: 'messages',\n labelKey: 'messages.types.default',\n icon: 'mail',\n ui: {\n listItemComponent: 'messages.default.listItem',\n contentComponent: 'messages.default.content',\n actionsComponent: 'messages.default.actions',\n },\n ListItemComponent: DefaultMessageListItem,\n ContentComponent: DefaultMessageContent,\n ActionsComponent: DefaultMessageActions,\n allowReply: true,\n allowForward: true,\n },\n {\n type: 'messages.confirmation',\n module: 'messages',\n labelKey: 'messages.types.confirmation',\n icon: 'badge-check',\n color: 'green',\n ui: {\n listItemComponent: 'messages.default.listItem',\n contentComponent: 'messages.confirmation.content',\n actionsComponent: 'messages.confirmation.actions',\n },\n ListItemComponent: DefaultMessageListItem,\n ContentComponent: MessageConfirmationContent,\n ActionsComponent: MessageConfirmationActions,\n defaultActions: [\n {\n id: 'confirmation',\n label: 'Confirm',\n labelKey: 'messages.actions.confirmation',\n variant: 'default',\n icon: 'check',\n commandId: 'messages.confirmations.confirm',\n isTerminal: true,\n confirmRequired: true,\n },\n ],\n allowReply: true,\n allowForward: true,\n },\n {\n type: 'messages.defaultWithObjects',\n module: 'messages',\n labelKey: 'messages.types.defaultWithObjects',\n icon: 'attachment',\n color: 'blue',\n allowReply: true,\n allowForward: true,\n },\n]\n\nexport default messageTypes\n"],
5
+ "mappings": "AACA,SAAS,6BAA6B;AACtC,SAAS,kCAAkC;AAC3C,SAAS,kCAAkC;AAC3C,SAAS,6BAA6B;AACtC,SAAS,8BAA8B;AAEhC,MAAM,eAAwC;AAAA,EACnD;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,IAAI;AAAA,MACF,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,IACA,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,MACF,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,IACpB;AAAA,IACA,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,IACA,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AACF;AAEA,IAAO,wBAAQ;",
6
+ "names": []
7
+ }