@open-mercato/core 0.6.7-develop.6863.1.61001cf9a8 → 0.6.7

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 (1458) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/AGENTS.md +3 -3
  3. package/agentic/standalone-guide.md +0 -13
  4. package/dist/bootstrap.js +1 -16
  5. package/dist/bootstrap.js.map +2 -2
  6. package/dist/generated/entities/customer_deal_person_link/index.js +0 -2
  7. package/dist/generated/entities/customer_deal_person_link/index.js.map +2 -2
  8. package/dist/generated/entities/customer_user_invitation/index.js +0 -2
  9. package/dist/generated/entities/customer_user_invitation/index.js.map +2 -2
  10. package/dist/generated/entities/gateway_payment_operation/index.js +0 -2
  11. package/dist/generated/entities/gateway_payment_operation/index.js.map +2 -2
  12. package/dist/generated/entities/gateway_transaction/index.js +0 -2
  13. package/dist/generated/entities/gateway_transaction/index.js.map +2 -2
  14. package/dist/generated/entities/organization/index.js +0 -2
  15. package/dist/generated/entities/organization/index.js.map +2 -2
  16. package/dist/generated/entities/resources_resource/index.js +0 -2
  17. package/dist/generated/entities/resources_resource/index.js.map +2 -2
  18. package/dist/generated/entities.ids.generated.js +1 -3
  19. package/dist/generated/entities.ids.generated.js.map +2 -2
  20. package/dist/generated/entity-fields-registry.js +0 -23
  21. package/dist/generated/entity-fields-registry.js.map +2 -2
  22. package/dist/helpers/integration/salesFixtures.js +2 -31
  23. package/dist/helpers/integration/salesFixtures.js.map +2 -2
  24. package/dist/helpers/integration/salesUi.js +0 -5
  25. package/dist/helpers/integration/salesUi.js.map +2 -2
  26. package/dist/modules/api_keys/backend/api-keys/page.js +1 -2
  27. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  28. package/dist/modules/attachments/api/route.js +10 -120
  29. package/dist/modules/attachments/api/route.js.map +2 -2
  30. package/dist/modules/attachments/data/entities.js +1 -67
  31. package/dist/modules/attachments/data/entities.js.map +2 -2
  32. package/dist/modules/attachments/di.js +1 -7
  33. package/dist/modules/attachments/di.js.map +2 -2
  34. package/dist/modules/attachments/fields/attachment.js +1 -1
  35. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  36. package/dist/modules/attachments/lib/drivers/index.js.map +1 -1
  37. package/dist/modules/attachments/lib/drivers/localDriver.js +6 -19
  38. package/dist/modules/attachments/lib/drivers/localDriver.js.map +2 -2
  39. package/dist/modules/attachments/lib/upload-limits.js +0 -33
  40. package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
  41. package/dist/modules/audit_logs/api/audit-logs/access/route.js +1 -5
  42. package/dist/modules/audit_logs/api/audit-logs/access/route.js.map +2 -2
  43. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +1 -5
  44. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +2 -2
  45. package/dist/modules/audit_logs/api/audit-logs/actions/route.js +1 -5
  46. package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
  47. package/dist/modules/audit_logs/components/AccessLogsTable.js +1 -2
  48. package/dist/modules/audit_logs/components/AccessLogsTable.js.map +2 -2
  49. package/dist/modules/audit_logs/components/AuditLogsActions.js +1 -2
  50. package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
  51. package/dist/modules/auth/api/admin/nav.js +4 -17
  52. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  53. package/dist/modules/auth/api/profile/route.js +2 -8
  54. package/dist/modules/auth/api/profile/route.js.map +2 -2
  55. package/dist/modules/auth/api/users/route.js +19 -8
  56. package/dist/modules/auth/api/users/route.js.map +2 -2
  57. package/dist/modules/auth/backend/auth/profile/page.js.map +2 -2
  58. package/dist/modules/auth/backend/profile/change-password/page.js.map +2 -2
  59. package/dist/modules/auth/backend/roles/page.js +1 -2
  60. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  61. package/dist/modules/auth/backend/settings/page.js +9 -14
  62. package/dist/modules/auth/backend/settings/page.js.map +2 -2
  63. package/dist/modules/auth/backend/users/page.js +1 -2
  64. package/dist/modules/auth/backend/users/page.js.map +2 -2
  65. package/dist/modules/auth/cli.js +1 -1
  66. package/dist/modules/auth/cli.js.map +2 -2
  67. package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
  68. package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
  69. package/dist/modules/auth/frontend/login.js +5 -6
  70. package/dist/modules/auth/frontend/login.js.map +2 -2
  71. package/dist/modules/auth/frontend/reset.js +2 -2
  72. package/dist/modules/auth/frontend/reset.js.map +2 -2
  73. package/dist/modules/auth/lib/backendChrome.js +29 -45
  74. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  75. package/dist/modules/auth/lib/setup-app.js +2 -17
  76. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  77. package/dist/modules/auth/lib/tenantAccess.js +0 -7
  78. package/dist/modules/auth/lib/tenantAccess.js.map +2 -2
  79. package/dist/modules/auth/services/rbacService.js +44 -29
  80. package/dist/modules/auth/services/rbacService.js.map +2 -2
  81. package/dist/modules/business_rules/api/rules/route.js +4 -71
  82. package/dist/modules/business_rules/api/rules/route.js.map +2 -2
  83. package/dist/modules/business_rules/backend/rules/page.js +1 -2
  84. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  85. package/dist/modules/business_rules/components/ActionBuilder.js +4 -47
  86. package/dist/modules/business_rules/components/ActionBuilder.js.map +3 -3
  87. package/dist/modules/business_rules/components/ActionRow.js +16 -106
  88. package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
  89. package/dist/modules/business_rules/components/ConditionRow.js +4 -8
  90. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  91. package/dist/modules/business_rules/components/utils/actionValidation.js +0 -6
  92. package/dist/modules/business_rules/components/utils/actionValidation.js.map +2 -2
  93. package/dist/modules/business_rules/lib/action-executor.js +0 -148
  94. package/dist/modules/business_rules/lib/action-executor.js.map +2 -2
  95. package/dist/modules/business_rules/lib/rule-engine.js +1 -5
  96. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  97. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +5 -6
  98. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  99. package/dist/modules/catalog/backend/catalog/products/create/page.js +6 -7
  100. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  101. package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
  102. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  103. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +1 -2
  104. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  105. package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
  106. package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
  107. package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
  108. package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
  109. package/dist/modules/catalog/components/products/ProductsDataTable.js +2 -3
  110. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  111. package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
  112. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  113. package/dist/modules/catalog/events.js +0 -1
  114. package/dist/modules/catalog/events.js.map +2 -2
  115. package/dist/modules/catalog/widgets/injection/product-seo/widget.js +1 -1
  116. package/dist/modules/catalog/widgets/injection/product-seo/widget.js.map +2 -2
  117. package/dist/modules/communication_channels/api/post/test-seed/route.js +2 -52
  118. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  119. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +1 -11
  120. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +2 -2
  121. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +6 -11
  122. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +2 -2
  123. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +1 -2
  124. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
  125. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +3 -4
  126. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
  127. package/dist/modules/communication_channels/data/enrichers.js +4 -4
  128. package/dist/modules/communication_channels/data/enrichers.js.map +2 -2
  129. package/dist/modules/communication_channels/lib/access-control.js +2 -2
  130. package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
  131. package/dist/modules/configs/backend/config/system-status/page.js +1 -2
  132. package/dist/modules/configs/backend/config/system-status/page.js.map +2 -2
  133. package/dist/modules/configs/lib/upgrade-actions.js +0 -12
  134. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  135. package/dist/modules/currencies/backend/currencies/page.js +1 -2
  136. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  137. package/dist/modules/currencies/backend/exchange-rates/page.js +1 -2
  138. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  139. package/dist/modules/currencies/di.js +0 -4
  140. package/dist/modules/currencies/di.js.map +2 -2
  141. package/dist/modules/customer_accounts/api/admin/users/[id].js +1 -10
  142. package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
  143. package/dist/modules/customer_accounts/api/admin/users-invite.js +4 -63
  144. package/dist/modules/customer_accounts/api/admin/users-invite.js.map +2 -2
  145. package/dist/modules/customer_accounts/api/invitations/accept.js +2 -1
  146. package/dist/modules/customer_accounts/api/invitations/accept.js.map +2 -2
  147. package/dist/modules/customer_accounts/api/login.js +2 -4
  148. package/dist/modules/customer_accounts/api/login.js.map +2 -2
  149. package/dist/modules/customer_accounts/api/magic-link/verify.js +2 -4
  150. package/dist/modules/customer_accounts/api/magic-link/verify.js.map +2 -2
  151. package/dist/modules/customer_accounts/api/portal/feature-check.js +4 -5
  152. package/dist/modules/customer_accounts/api/portal/feature-check.js.map +2 -2
  153. package/dist/modules/customer_accounts/api/portal/nav.js +4 -6
  154. package/dist/modules/customer_accounts/api/portal/nav.js.map +2 -2
  155. package/dist/modules/customer_accounts/api/portal/profile.js +1 -5
  156. package/dist/modules/customer_accounts/api/portal/profile.js.map +2 -2
  157. package/dist/modules/customer_accounts/api/portal/sessions-refresh.js +3 -3
  158. package/dist/modules/customer_accounts/api/portal/sessions-refresh.js.map +2 -2
  159. package/dist/modules/customer_accounts/api/portal/users-invite.js +2 -22
  160. package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
  161. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -2
  162. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  163. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +1 -2
  164. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  165. package/dist/modules/customer_accounts/data/entities.js +0 -3
  166. package/dist/modules/customer_accounts/data/entities.js.map +2 -2
  167. package/dist/modules/customer_accounts/data/validators.js +0 -1
  168. package/dist/modules/customer_accounts/data/validators.js.map +2 -2
  169. package/dist/modules/customer_accounts/lib/customerAuth.js +2 -7
  170. package/dist/modules/customer_accounts/lib/customerAuth.js.map +2 -2
  171. package/dist/modules/customer_accounts/lib/customerAuthServer.js +1 -2
  172. package/dist/modules/customer_accounts/lib/customerAuthServer.js.map +2 -2
  173. package/dist/modules/customer_accounts/lib/customerEntityOwnership.js +3 -29
  174. package/dist/modules/customer_accounts/lib/customerEntityOwnership.js.map +2 -2
  175. package/dist/modules/customer_accounts/lib/customerUrl.js +10 -19
  176. package/dist/modules/customer_accounts/lib/customerUrl.js.map +2 -2
  177. package/dist/modules/customer_accounts/services/customerInvitationService.js +2 -32
  178. package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
  179. package/dist/modules/customer_accounts/services/customerRbacService.js +3 -12
  180. package/dist/modules/customer_accounts/services/customerRbacService.js.map +2 -2
  181. package/dist/modules/customer_accounts/setup.js +0 -6
  182. package/dist/modules/customer_accounts/setup.js.map +2 -2
  183. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js +7 -47
  184. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js.map +2 -2
  185. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
  186. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  187. package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js +1 -1
  188. package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js.map +2 -2
  189. package/dist/modules/customer_accounts/widgets/injection-table.js +1 -1
  190. package/dist/modules/customer_accounts/widgets/injection-table.js.map +2 -2
  191. package/dist/modules/customers/analytics.js +1 -4
  192. package/dist/modules/customers/analytics.js.map +2 -2
  193. package/dist/modules/customers/api/companies/[id]/route.js +4 -3
  194. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  195. package/dist/modules/customers/api/deals/[id]/people/route.js +2 -4
  196. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  197. package/dist/modules/customers/api/deals/[id]/route.js +3 -7
  198. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  199. package/dist/modules/customers/api/deals/aggregate/route.js +4 -5
  200. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  201. package/dist/modules/customers/api/deals/summary/route.js +119 -14
  202. package/dist/modules/customers/api/deals/summary/route.js.map +2 -2
  203. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +2 -3
  204. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
  205. package/dist/modules/customers/api/utils.js +18 -12
  206. package/dist/modules/customers/api/utils.js.map +2 -2
  207. package/dist/modules/customers/backend/customers/companies/[id]/page.js +1 -2
  208. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  209. package/dist/modules/customers/backend/customers/companies/page.js +1 -2
  210. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  211. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +5 -16
  212. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  213. package/dist/modules/customers/backend/customers/deals/[id]/page.js +11 -18
  214. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  215. package/dist/modules/customers/backend/customers/deals/page.js +1 -2
  216. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  217. package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js +3 -17
  218. package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js.map +2 -2
  219. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +1 -7
  220. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
  221. package/dist/modules/customers/backend/customers/people/[id]/page.js +1 -2
  222. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  223. package/dist/modules/customers/backend/customers/people/page.js +1 -2
  224. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  225. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +10 -26
  226. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  227. package/dist/modules/customers/cli.js +11 -28
  228. package/dist/modules/customers/cli.js.map +2 -2
  229. package/dist/modules/customers/commands/deals.js +10 -48
  230. package/dist/modules/customers/commands/deals.js.map +2 -2
  231. package/dist/modules/customers/commands/people.js +0 -2
  232. package/dist/modules/customers/commands/people.js.map +2 -2
  233. package/dist/modules/customers/components/CustomerTodosTable.js +1 -2
  234. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  235. package/dist/modules/customers/components/detail/ActiveDealCard.js +1 -2
  236. package/dist/modules/customers/components/detail/ActiveDealCard.js.map +2 -2
  237. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +3 -2
  238. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
  239. package/dist/modules/customers/components/detail/CompanyDetailTabs.js +6 -26
  240. package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +2 -2
  241. package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -6
  242. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
  243. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +1 -1
  244. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +1 -1
  245. package/dist/modules/customers/components/detail/DealDetailTabs.js +8 -30
  246. package/dist/modules/customers/components/detail/DealDetailTabs.js.map +2 -2
  247. package/dist/modules/customers/components/detail/DealForm.js +1 -2
  248. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  249. package/dist/modules/customers/components/detail/DealsSection.js +1 -1
  250. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  251. package/dist/modules/customers/components/detail/PersonDetailTabs.js +8 -30
  252. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
  253. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +216 -231
  254. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  255. package/dist/modules/customers/components/detail/dashboard/helpers.js +3 -4
  256. package/dist/modules/customers/components/detail/dashboard/helpers.js.map +2 -2
  257. package/dist/modules/customers/components/formConfig.js +10 -14
  258. package/dist/modules/customers/components/formConfig.js.map +2 -2
  259. package/dist/modules/customers/data/entities.js +0 -8
  260. package/dist/modules/customers/data/entities.js.map +2 -2
  261. package/dist/modules/customers/data/validators.js +2 -5
  262. package/dist/modules/customers/data/validators.js.map +2 -2
  263. package/dist/modules/customers/lib/calendar/format.js +4 -8
  264. package/dist/modules/customers/lib/calendar/format.js.map +2 -2
  265. package/dist/modules/customers/lib/visibilityFilter.js +4 -6
  266. package/dist/modules/customers/lib/visibilityFilter.js.map +2 -2
  267. package/dist/modules/customers/search.js +29 -50
  268. package/dist/modules/customers/search.js.map +2 -2
  269. package/dist/modules/dashboards/api/layout/[itemId]/route.js +3 -6
  270. package/dist/modules/dashboards/api/layout/[itemId]/route.js.map +2 -2
  271. package/dist/modules/dashboards/api/layout/route.js +9 -22
  272. package/dist/modules/dashboards/api/layout/route.js.map +2 -2
  273. package/dist/modules/dashboards/api/roles/widgets/route.js +3 -9
  274. package/dist/modules/dashboards/api/roles/widgets/route.js.map +2 -2
  275. package/dist/modules/dashboards/api/users/widgets/route.js +3 -9
  276. package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
  277. package/dist/modules/dashboards/api/widgets/catalog.js +3 -6
  278. package/dist/modules/dashboards/api/widgets/catalog.js.map +2 -2
  279. package/dist/modules/dashboards/api/widgets/data/batch/route.js +3 -12
  280. package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
  281. package/dist/modules/dashboards/api/widgets/data/route.js +3 -28
  282. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  283. package/dist/modules/dashboards/api/widgets/data/schema.js +18 -28
  284. package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
  285. package/dist/modules/dashboards/lib/access.js +3 -5
  286. package/dist/modules/dashboards/lib/access.js.map +2 -2
  287. package/dist/modules/dashboards/lib/aggregations.js +46 -113
  288. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  289. package/dist/modules/dashboards/lib/formatters.js +11 -84
  290. package/dist/modules/dashboards/lib/formatters.js.map +2 -2
  291. package/dist/modules/dashboards/services/widgetDataService.js +14 -316
  292. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  293. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +3 -9
  294. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +2 -2
  295. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js +2 -52
  296. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js.map +2 -2
  297. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js +30 -52
  298. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js.map +2 -2
  299. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +2 -2
  300. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  301. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +3 -9
  302. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +2 -2
  303. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +3 -8
  304. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  305. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +18 -26
  306. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  307. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +14 -22
  308. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  309. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +4 -10
  310. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  311. package/dist/modules/data_sync/api/mappings/[id]/route.js +9 -22
  312. package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
  313. package/dist/modules/data_sync/api/mappings/route.js +4 -13
  314. package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
  315. package/dist/modules/data_sync/api/options.js +2 -7
  316. package/dist/modules/data_sync/api/options.js.map +2 -2
  317. package/dist/modules/data_sync/api/run.js +2 -7
  318. package/dist/modules/data_sync/api/run.js.map +2 -2
  319. package/dist/modules/data_sync/api/runs/[id]/cancel.js +3 -8
  320. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  321. package/dist/modules/data_sync/api/runs/[id]/retry.js +2 -7
  322. package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
  323. package/dist/modules/data_sync/api/runs/[id]/route.js +3 -8
  324. package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
  325. package/dist/modules/data_sync/api/runs.js +2 -7
  326. package/dist/modules/data_sync/api/runs.js.map +2 -2
  327. package/dist/modules/data_sync/api/schedules/[id]/route.js +6 -19
  328. package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
  329. package/dist/modules/data_sync/api/schedules/route.js +4 -13
  330. package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
  331. package/dist/modules/data_sync/api/validate.js +4 -9
  332. package/dist/modules/data_sync/api/validate.js.map +2 -2
  333. package/dist/modules/data_sync/backend/data-sync/page.js +1 -2
  334. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  335. package/dist/modules/data_sync/lib/queue.js +1 -16
  336. package/dist/modules/data_sync/lib/queue.js.map +2 -2
  337. package/dist/modules/data_sync/lib/start-run.js +1 -2
  338. package/dist/modules/data_sync/lib/start-run.js.map +2 -2
  339. package/dist/modules/data_sync/lib/sync-engine.js +2 -35
  340. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  341. package/dist/modules/data_sync/lib/sync-run-service.js +2 -70
  342. package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
  343. package/dist/modules/data_sync/workers/sync-export.js +2 -9
  344. package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
  345. package/dist/modules/data_sync/workers/sync-import.js +2 -9
  346. package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
  347. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +12 -34
  348. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
  349. package/dist/modules/dictionaries/api/openapi.js +2 -15
  350. package/dist/modules/dictionaries/api/openapi.js.map +2 -2
  351. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
  352. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  353. package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js +29 -30
  354. package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js.map +2 -2
  355. package/dist/modules/dictionaries/data/validators.js +0 -7
  356. package/dist/modules/dictionaries/data/validators.js.map +2 -2
  357. package/dist/modules/dictionaries/lib/clientEntries.js +3 -4
  358. package/dist/modules/dictionaries/lib/clientEntries.js.map +2 -2
  359. package/dist/modules/directory/api/organization-branding/route.js +3 -10
  360. package/dist/modules/directory/api/organization-branding/route.js.map +2 -2
  361. package/dist/modules/directory/api/organization-switcher/route.js +20 -84
  362. package/dist/modules/directory/api/organization-switcher/route.js.map +2 -2
  363. package/dist/modules/directory/api/organizations/route.js +0 -7
  364. package/dist/modules/directory/api/organizations/route.js.map +3 -3
  365. package/dist/modules/directory/api/tenants/route.js +2 -8
  366. package/dist/modules/directory/api/tenants/route.js.map +2 -2
  367. package/dist/modules/directory/backend/directory/branding/page.js +8 -31
  368. package/dist/modules/directory/backend/directory/branding/page.js.map +2 -2
  369. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +16 -7
  370. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
  371. package/dist/modules/directory/backend/directory/organizations/page.js +1 -2
  372. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  373. package/dist/modules/directory/backend/directory/tenants/page.js +1 -2
  374. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  375. package/dist/modules/directory/commands/organizations.js +1 -8
  376. package/dist/modules/directory/commands/organizations.js.map +2 -2
  377. package/dist/modules/directory/commands/tenants.js +0 -6
  378. package/dist/modules/directory/commands/tenants.js.map +2 -2
  379. package/dist/modules/directory/data/entities.js +0 -4
  380. package/dist/modules/directory/data/entities.js.map +2 -2
  381. package/dist/modules/directory/data/validators.js +0 -2
  382. package/dist/modules/directory/data/validators.js.map +2 -2
  383. package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js +1 -5
  384. package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js.map +2 -2
  385. package/dist/modules/directory/utils/organizationScope.js +3 -11
  386. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  387. package/dist/modules/entities/api/definitions.js +3 -53
  388. package/dist/modules/entities/api/definitions.js.map +2 -2
  389. package/dist/modules/entities/api/entities.js +2 -21
  390. package/dist/modules/entities/api/entities.js.map +2 -2
  391. package/dist/modules/entities/api/entity-settings.js +9 -59
  392. package/dist/modules/entities/api/entity-settings.js.map +2 -2
  393. package/dist/modules/entities/api/records.js +24 -3
  394. package/dist/modules/entities/api/records.js.map +2 -2
  395. package/dist/modules/entities/api/relations/options.js +16 -11
  396. package/dist/modules/entities/api/relations/options.js.map +2 -2
  397. package/dist/modules/entities/api/sidebar-entities.js +12 -34
  398. package/dist/modules/entities/api/sidebar-entities.js.map +2 -2
  399. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +4 -23
  400. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  401. package/dist/modules/entities/backend/entities/user/create/page.js +7 -16
  402. package/dist/modules/entities/backend/entities/user/create/page.js.map +2 -2
  403. package/dist/modules/entities/cli.js +19 -193
  404. package/dist/modules/entities/cli.js.map +2 -2
  405. package/dist/modules/entities/components/SystemEntitiesTable.js +1 -2
  406. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  407. package/dist/modules/entities/components/UserEntitiesTable.js +1 -2
  408. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  409. package/dist/modules/entities/lib/entityAcl.js +9 -87
  410. package/dist/modules/entities/lib/entityAcl.js.map +3 -3
  411. package/dist/modules/feature_toggles/components/FeatureGuard.js +2 -3
  412. package/dist/modules/feature_toggles/components/FeatureGuard.js.map +2 -2
  413. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js +2 -5
  414. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js.map +2 -2
  415. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js +2 -5
  416. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js.map +2 -2
  417. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js +2 -5
  418. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js.map +2 -2
  419. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js +2 -5
  420. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js.map +2 -2
  421. package/dist/modules/inbox_ops/ai-tools.js +2 -5
  422. package/dist/modules/inbox_ops/ai-tools.js.map +2 -2
  423. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js +1 -14
  424. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js.map +2 -2
  425. package/dist/modules/inbox_ops/api/proposals/route.js +1 -16
  426. package/dist/modules/inbox_ops/api/proposals/route.js.map +2 -2
  427. package/dist/modules/inbox_ops/api/webhook/inbound.js +10 -14
  428. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  429. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
  430. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  431. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +20 -25
  432. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  433. package/dist/modules/inbox_ops/search.js +4 -15
  434. package/dist/modules/inbox_ops/search.js.map +2 -2
  435. package/dist/modules/integrations/api/[id]/credentials/route.js +5 -11
  436. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  437. package/dist/modules/integrations/api/[id]/health/route.js +3 -6
  438. package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
  439. package/dist/modules/integrations/api/[id]/route.js +3 -6
  440. package/dist/modules/integrations/api/[id]/route.js.map +2 -2
  441. package/dist/modules/integrations/api/[id]/state/route.js +3 -6
  442. package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
  443. package/dist/modules/integrations/api/[id]/version/route.js +3 -6
  444. package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
  445. package/dist/modules/integrations/api/logs/route.js +3 -6
  446. package/dist/modules/integrations/api/logs/route.js.map +2 -2
  447. package/dist/modules/integrations/api/route.js +3 -6
  448. package/dist/modules/integrations/api/route.js.map +2 -2
  449. package/dist/modules/integrations/api/umes-read.js +2 -2
  450. package/dist/modules/integrations/api/umes-read.js.map +2 -2
  451. package/dist/modules/integrations/backend/integrations/[id]/page.js +4 -2
  452. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  453. package/dist/modules/integrations/lib/organization-scope.js +9 -2
  454. package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
  455. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +5 -0
  456. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +2 -2
  457. package/dist/modules/messages/api/[id]/route.js +0 -15
  458. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  459. package/dist/modules/messages/api/route.js +8 -77
  460. package/dist/modules/messages/api/route.js.map +2 -2
  461. package/dist/modules/messages/components/ComposeMessagePageClient.js +1 -2
  462. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
  463. package/dist/modules/messages/components/MessageDetailPageClient.js +2 -3
  464. package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
  465. package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -2
  466. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  467. package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
  468. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
  469. package/dist/modules/messages/lib/routeHelpers.js +3 -1
  470. package/dist/modules/messages/lib/routeHelpers.js.map +2 -2
  471. package/dist/modules/messages/lib/searchLookup.js +16 -8
  472. package/dist/modules/messages/lib/searchLookup.js.map +2 -2
  473. package/dist/modules/messages/search.js +5 -10
  474. package/dist/modules/messages/search.js.map +2 -2
  475. package/dist/modules/notifications/api/route.js +4 -83
  476. package/dist/modules/notifications/api/route.js.map +2 -2
  477. package/dist/modules/notifications/api/unread-count/route.js +6 -25
  478. package/dist/modules/notifications/api/unread-count/route.js.map +2 -2
  479. package/dist/modules/notifications/di.js +1 -1
  480. package/dist/modules/notifications/di.js.map +2 -2
  481. package/dist/modules/notifications/events.js +2 -4
  482. package/dist/modules/notifications/events.js.map +2 -2
  483. package/dist/modules/notifications/lib/notificationRecipients.js +7 -6
  484. package/dist/modules/notifications/lib/notificationRecipients.js.map +2 -2
  485. package/dist/modules/notifications/lib/notificationService.js +4 -48
  486. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  487. package/dist/modules/notifications/lib/routeHelpers.js +2 -16
  488. package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
  489. package/dist/modules/payment_gateways/api/capture/route.js +1 -1
  490. package/dist/modules/payment_gateways/api/capture/route.js.map +2 -2
  491. package/dist/modules/payment_gateways/api/sessions/route.js +3 -6
  492. package/dist/modules/payment_gateways/api/sessions/route.js.map +2 -2
  493. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +1 -11
  494. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
  495. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +2 -3
  496. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  497. package/dist/modules/payment_gateways/data/entities.js +0 -11
  498. package/dist/modules/payment_gateways/data/entities.js.map +2 -2
  499. package/dist/modules/payment_gateways/di.js +1 -17
  500. package/dist/modules/payment_gateways/di.js.map +2 -2
  501. package/dist/modules/payment_gateways/lib/gateway-service.js +14 -93
  502. package/dist/modules/payment_gateways/lib/gateway-service.js.map +2 -2
  503. package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js +0 -1
  504. package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js.map +2 -2
  505. package/dist/modules/payment_gateways/lib/session-idempotency.js +0 -33
  506. package/dist/modules/payment_gateways/lib/session-idempotency.js.map +2 -2
  507. package/dist/modules/payment_gateways/setup.js +0 -47
  508. package/dist/modules/payment_gateways/setup.js.map +2 -2
  509. package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
  510. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  511. package/dist/modules/planner/components/unavailabilityReasons.js +3 -3
  512. package/dist/modules/planner/components/unavailabilityReasons.js.map +2 -2
  513. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +3 -3
  514. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  515. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +3 -3
  516. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  517. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
  518. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  519. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +3 -3
  520. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
  521. package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js +3 -3
  522. package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js.map +2 -2
  523. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +3 -3
  524. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  525. package/dist/modules/progress/lib/progressService.js +0 -2
  526. package/dist/modules/progress/lib/progressService.js.map +2 -2
  527. package/dist/modules/progress/lib/progressServiceImpl.js +104 -322
  528. package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
  529. package/dist/modules/query_index/api/openapi.js +1 -13
  530. package/dist/modules/query_index/api/openapi.js.map +2 -2
  531. package/dist/modules/query_index/api/reindex.js +0 -10
  532. package/dist/modules/query_index/api/reindex.js.map +2 -2
  533. package/dist/modules/query_index/api/status.js +105 -165
  534. package/dist/modules/query_index/api/status.js.map +2 -2
  535. package/dist/modules/query_index/cli.js +1 -125
  536. package/dist/modules/query_index/cli.js.map +2 -2
  537. package/dist/modules/query_index/components/QueryIndexesTable.js +42 -130
  538. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  539. package/dist/modules/query_index/data/entities.js +1 -2
  540. package/dist/modules/query_index/data/entities.js.map +2 -2
  541. package/dist/modules/query_index/di.js +0 -3
  542. package/dist/modules/query_index/di.js.map +2 -2
  543. package/dist/modules/query_index/lib/batch.js +4 -11
  544. package/dist/modules/query_index/lib/batch.js.map +2 -2
  545. package/dist/modules/query_index/lib/coverage.js +9 -21
  546. package/dist/modules/query_index/lib/coverage.js.map +2 -2
  547. package/dist/modules/query_index/lib/document.js +5 -12
  548. package/dist/modules/query_index/lib/document.js.map +2 -2
  549. package/dist/modules/query_index/lib/engine.js +48 -105
  550. package/dist/modules/query_index/lib/engine.js.map +2 -2
  551. package/dist/modules/query_index/lib/indexer.js +19 -95
  552. package/dist/modules/query_index/lib/indexer.js.map +2 -2
  553. package/dist/modules/query_index/lib/reindexer.js +37 -43
  554. package/dist/modules/query_index/lib/reindexer.js.map +2 -2
  555. package/dist/modules/query_index/lib/search-tokens.js +15 -34
  556. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  557. package/dist/modules/query_index/lib/subscriber-scope.js +3 -2
  558. package/dist/modules/query_index/lib/subscriber-scope.js.map +2 -2
  559. package/dist/modules/query_index/subscribers/coverage_refresh.js +0 -4
  560. package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
  561. package/dist/modules/query_index/subscribers/delete_one.js +1 -53
  562. package/dist/modules/query_index/subscribers/delete_one.js.map +3 -3
  563. package/dist/modules/query_index/subscribers/upsert_one.js +0 -60
  564. package/dist/modules/query_index/subscribers/upsert_one.js.map +3 -3
  565. package/dist/modules/resources/api/resources.js +0 -2
  566. package/dist/modules/resources/api/resources.js.map +2 -2
  567. package/dist/modules/resources/backend/resources/resource-types/page.js +1 -2
  568. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  569. package/dist/modules/resources/backend/resources/resources/[id]/page.js +2 -3
  570. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  571. package/dist/modules/resources/backend/resources/resources/page.js +1 -2
  572. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  573. package/dist/modules/resources/commands/resources.js +0 -9
  574. package/dist/modules/resources/commands/resources.js.map +2 -2
  575. package/dist/modules/resources/components/detail/dictionaries.js +3 -3
  576. package/dist/modules/resources/components/detail/dictionaries.js.map +2 -2
  577. package/dist/modules/resources/data/entities.js +0 -3
  578. package/dist/modules/resources/data/entities.js.map +2 -2
  579. package/dist/modules/resources/data/validators.js +2 -6
  580. package/dist/modules/resources/data/validators.js.map +2 -2
  581. package/dist/modules/resources/lib/seeds.js +9 -16
  582. package/dist/modules/resources/lib/seeds.js.map +2 -2
  583. package/dist/modules/sales/analytics.js +3 -7
  584. package/dist/modules/sales/analytics.js.map +2 -2
  585. package/dist/modules/sales/api/document-history/route.js +1 -2
  586. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  587. package/dist/modules/sales/api/documents/factory.js +3 -14
  588. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  589. package/dist/modules/sales/backend/sales/documents/[id]/page.js +3 -11
  590. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  591. package/dist/modules/sales/backend/sales/documents/create/page.js +14 -11
  592. package/dist/modules/sales/backend/sales/documents/create/page.js.map +2 -2
  593. package/dist/modules/sales/commands/documents.js +23 -184
  594. package/dist/modules/sales/commands/documents.js.map +2 -2
  595. package/dist/modules/sales/components/documents/ItemsSection.js +10 -20
  596. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  597. package/dist/modules/sales/components/documents/LineItemDialog.js +5 -12
  598. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  599. package/dist/modules/sales/components/documents/SalesDocumentForm.js +2 -48
  600. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  601. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +1 -4
  602. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  603. package/dist/modules/sales/components/useSalesChannelsEnabled.js +35 -2
  604. package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +2 -2
  605. package/dist/modules/sales/data/validators.js +5 -32
  606. package/dist/modules/sales/data/validators.js.map +2 -2
  607. package/dist/modules/sales/di.js +0 -7
  608. package/dist/modules/sales/di.js.map +2 -2
  609. package/dist/modules/sales/events.js +0 -1
  610. package/dist/modules/sales/events.js.map +2 -2
  611. package/dist/modules/sales/lib/historyHelpers.js +1 -69
  612. package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
  613. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +2 -51
  614. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  615. package/dist/modules/sales/workflows.js +7 -10
  616. package/dist/modules/sales/workflows.js.map +2 -2
  617. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js +1 -11
  618. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js.map +2 -2
  619. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  620. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  621. package/dist/modules/staff/api/interceptors.js +3 -5
  622. package/dist/modules/staff/api/interceptors.js.map +2 -2
  623. package/dist/modules/staff/api/leave-requests.js +42 -45
  624. package/dist/modules/staff/api/leave-requests.js.map +2 -2
  625. package/dist/modules/staff/components/detail/dictionaries.js +3 -3
  626. package/dist/modules/staff/components/detail/dictionaries.js.map +2 -2
  627. package/dist/modules/sync_excel/api/upload/route.js +2 -15
  628. package/dist/modules/sync_excel/api/upload/route.js.map +2 -2
  629. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
  630. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
  631. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +4 -5
  632. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +2 -2
  633. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +3 -4
  634. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
  635. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +2 -3
  636. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  637. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +2 -3
  638. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  639. package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -2
  640. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
  641. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +2 -3
  642. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  643. package/dist/modules/workflows/backend/definitions/page.js +2 -3
  644. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  645. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +3 -6
  646. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  647. package/dist/modules/workflows/backend/instances/page.js +9 -10
  648. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  649. package/dist/modules/workflows/backend/tasks/page.js +7 -8
  650. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  651. package/dist/modules/workflows/components/ActivitiesEditor.js +13 -69
  652. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  653. package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
  654. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  655. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +2 -2
  656. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  657. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +2 -1
  658. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  659. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +2 -1
  660. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  661. package/dist/modules/workflows/components/StepsEditor.js +2 -2
  662. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  663. package/dist/modules/workflows/components/TransitionsEditor.js +165 -207
  664. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  665. package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
  666. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  667. package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
  668. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  669. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
  670. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  671. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
  672. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  673. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
  674. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  675. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
  676. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  677. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
  678. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
  679. package/dist/modules/workflows/data/validators.js +1 -34
  680. package/dist/modules/workflows/data/validators.js.map +3 -3
  681. package/dist/modules/workflows/events.js +0 -1
  682. package/dist/modules/workflows/events.js.map +2 -2
  683. package/dist/modules/workflows/lib/activity-executor.js +14 -59
  684. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  685. package/dist/modules/workflows/lib/format-validation-error.js +1 -46
  686. package/dist/modules/workflows/lib/format-validation-error.js.map +2 -2
  687. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +10 -21
  688. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +2 -2
  689. package/generated/entities/customer_deal_person_link/index.ts +0 -1
  690. package/generated/entities/customer_user_invitation/index.ts +0 -1
  691. package/generated/entities/gateway_payment_operation/index.ts +0 -1
  692. package/generated/entities/gateway_transaction/index.ts +0 -1
  693. package/generated/entities/organization/index.ts +0 -1
  694. package/generated/entities/resources_resource/index.ts +0 -1
  695. package/generated/entities.ids.generated.ts +1 -3
  696. package/generated/entity-fields-registry.ts +0 -23
  697. package/package.json +18 -19
  698. package/src/bootstrap.ts +2 -17
  699. package/src/helpers/integration/salesFixtures.ts +2 -34
  700. package/src/helpers/integration/salesUi.ts +0 -8
  701. package/src/modules/api_keys/backend/api-keys/page.tsx +1 -2
  702. package/src/modules/attachments/api/route.ts +9 -130
  703. package/src/modules/attachments/data/entities.ts +0 -59
  704. package/src/modules/attachments/di.ts +1 -9
  705. package/src/modules/attachments/fields/attachment.tsx +1 -1
  706. package/src/modules/attachments/i18n/de.json +0 -15
  707. package/src/modules/attachments/i18n/en.json +0 -15
  708. package/src/modules/attachments/i18n/es.json +0 -15
  709. package/src/modules/attachments/i18n/pl.json +0 -15
  710. package/src/modules/attachments/lib/drivers/index.ts +1 -1
  711. package/src/modules/attachments/lib/drivers/localDriver.ts +8 -23
  712. package/src/modules/attachments/lib/drivers/types.ts +0 -5
  713. package/src/modules/attachments/lib/upload-limits.ts +0 -35
  714. package/src/modules/attachments/migrations/.snapshot-open-mercato.json +120 -648
  715. package/src/modules/audit_logs/api/audit-logs/access/route.ts +0 -5
  716. package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +0 -5
  717. package/src/modules/audit_logs/api/audit-logs/actions/route.ts +0 -5
  718. package/src/modules/audit_logs/components/AccessLogsTable.tsx +1 -2
  719. package/src/modules/audit_logs/components/AuditLogsActions.tsx +1 -2
  720. package/src/modules/auth/AGENTS.md +8 -12
  721. package/src/modules/auth/api/admin/nav.ts +4 -28
  722. package/src/modules/auth/api/profile/route.ts +2 -8
  723. package/src/modules/auth/api/users/route.ts +28 -8
  724. package/src/modules/auth/backend/auth/profile/page.tsx +0 -1
  725. package/src/modules/auth/backend/profile/change-password/page.tsx +0 -1
  726. package/src/modules/auth/backend/roles/page.tsx +1 -2
  727. package/src/modules/auth/backend/settings/page.tsx +8 -17
  728. package/src/modules/auth/backend/users/page.tsx +1 -2
  729. package/src/modules/auth/cli.ts +1 -1
  730. package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
  731. package/src/modules/auth/frontend/login.tsx +4 -5
  732. package/src/modules/auth/frontend/reset.tsx +2 -2
  733. package/src/modules/auth/i18n/de.json +0 -1
  734. package/src/modules/auth/i18n/en.json +0 -1
  735. package/src/modules/auth/i18n/es.json +0 -1
  736. package/src/modules/auth/i18n/pl.json +0 -1
  737. package/src/modules/auth/lib/backendChrome.tsx +33 -71
  738. package/src/modules/auth/lib/setup-app.ts +2 -21
  739. package/src/modules/auth/lib/tenantAccess.ts +0 -8
  740. package/src/modules/auth/services/rbacService.ts +46 -41
  741. package/src/modules/business_rules/api/rules/route.ts +4 -92
  742. package/src/modules/business_rules/backend/rules/page.tsx +1 -2
  743. package/src/modules/business_rules/components/ActionBuilder.tsx +5 -54
  744. package/src/modules/business_rules/components/ActionRow.tsx +18 -156
  745. package/src/modules/business_rules/components/ConditionRow.tsx +6 -9
  746. package/src/modules/business_rules/components/utils/actionValidation.ts +0 -6
  747. package/src/modules/business_rules/i18n/de.json +0 -12
  748. package/src/modules/business_rules/i18n/en.json +0 -12
  749. package/src/modules/business_rules/i18n/es.json +0 -12
  750. package/src/modules/business_rules/i18n/pl.json +0 -12
  751. package/src/modules/business_rules/lib/action-executor.ts +0 -198
  752. package/src/modules/business_rules/lib/rule-engine.ts +0 -4
  753. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +5 -6
  754. package/src/modules/catalog/backend/catalog/products/create/page.tsx +6 -7
  755. package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
  756. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +1 -2
  757. package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
  758. package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
  759. package/src/modules/catalog/components/products/ProductsDataTable.tsx +2 -3
  760. package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
  761. package/src/modules/catalog/events.ts +0 -1
  762. package/src/modules/catalog/i18n/de.json +0 -18
  763. package/src/modules/catalog/i18n/en.json +0 -18
  764. package/src/modules/catalog/i18n/es.json +0 -18
  765. package/src/modules/catalog/i18n/pl.json +0 -18
  766. package/src/modules/catalog/widgets/injection/product-seo/widget.ts +1 -1
  767. package/src/modules/communication_channels/api/post/test-seed/route.ts +2 -69
  768. package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +1 -11
  769. package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +11 -17
  770. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +1 -2
  771. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +3 -4
  772. package/src/modules/communication_channels/data/enrichers.ts +26 -6
  773. package/src/modules/communication_channels/lib/access-control.ts +3 -3
  774. package/src/modules/configs/backend/config/system-status/page.tsx +1 -2
  775. package/src/modules/configs/lib/upgrade-actions.ts +0 -14
  776. package/src/modules/currencies/backend/currencies/page.tsx +1 -2
  777. package/src/modules/currencies/backend/exchange-rates/page.tsx +1 -2
  778. package/src/modules/currencies/di.ts +1 -4
  779. package/src/modules/currencies/i18n/de.json +0 -1
  780. package/src/modules/currencies/i18n/en.json +0 -1
  781. package/src/modules/currencies/i18n/es.json +0 -1
  782. package/src/modules/currencies/i18n/pl.json +0 -1
  783. package/src/modules/customer_accounts/AGENTS.md +3 -3
  784. package/src/modules/customer_accounts/api/admin/users/[id].ts +1 -16
  785. package/src/modules/customer_accounts/api/admin/users-invite.ts +3 -81
  786. package/src/modules/customer_accounts/api/invitations/accept.ts +2 -1
  787. package/src/modules/customer_accounts/api/login.ts +2 -4
  788. package/src/modules/customer_accounts/api/magic-link/verify.ts +2 -4
  789. package/src/modules/customer_accounts/api/portal/feature-check.ts +7 -5
  790. package/src/modules/customer_accounts/api/portal/nav.ts +3 -5
  791. package/src/modules/customer_accounts/api/portal/profile.ts +1 -5
  792. package/src/modules/customer_accounts/api/portal/sessions-refresh.ts +3 -3
  793. package/src/modules/customer_accounts/api/portal/users-invite.ts +1 -25
  794. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +1 -2
  795. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +1 -2
  796. package/src/modules/customer_accounts/data/entities.ts +0 -3
  797. package/src/modules/customer_accounts/data/validators.ts +0 -1
  798. package/src/modules/customer_accounts/i18n/de.json +0 -6
  799. package/src/modules/customer_accounts/i18n/en.json +0 -6
  800. package/src/modules/customer_accounts/i18n/es.json +0 -6
  801. package/src/modules/customer_accounts/i18n/pl.json +0 -6
  802. package/src/modules/customer_accounts/lib/customerAuth.ts +2 -8
  803. package/src/modules/customer_accounts/lib/customerAuthServer.ts +0 -1
  804. package/src/modules/customer_accounts/lib/customerEntityOwnership.ts +2 -68
  805. package/src/modules/customer_accounts/lib/customerUrl.ts +11 -27
  806. package/src/modules/customer_accounts/migrations/.snapshot-open-mercato.json +0 -16
  807. package/src/modules/customer_accounts/services/customerInvitationService.ts +3 -56
  808. package/src/modules/customer_accounts/services/customerRbacService.ts +3 -16
  809. package/src/modules/customer_accounts/setup.ts +0 -7
  810. package/src/modules/customer_accounts/subscribers/autoLinkCrm.ts +8 -75
  811. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
  812. package/src/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.tsx +3 -1
  813. package/src/modules/customer_accounts/widgets/injection-table.ts +1 -4
  814. package/src/modules/customers/analytics.ts +0 -3
  815. package/src/modules/customers/api/companies/[id]/route.ts +4 -3
  816. package/src/modules/customers/api/deals/[id]/people/route.ts +0 -3
  817. package/src/modules/customers/api/deals/[id]/route.ts +2 -10
  818. package/src/modules/customers/api/deals/aggregate/route.ts +4 -5
  819. package/src/modules/customers/api/deals/summary/route.ts +162 -15
  820. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +2 -3
  821. package/src/modules/customers/api/utils.ts +31 -12
  822. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +1 -2
  823. package/src/modules/customers/backend/customers/companies/page.tsx +1 -2
  824. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +5 -17
  825. package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +0 -1
  826. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +12 -19
  827. package/src/modules/customers/backend/customers/deals/page.tsx +1 -2
  828. package/src/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.tsx +3 -35
  829. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +1 -10
  830. package/src/modules/customers/backend/customers/people/[id]/page.tsx +1 -2
  831. package/src/modules/customers/backend/customers/people/page.tsx +1 -2
  832. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +10 -29
  833. package/src/modules/customers/cli.ts +11 -28
  834. package/src/modules/customers/commands/deals.ts +9 -50
  835. package/src/modules/customers/commands/people.ts +0 -3
  836. package/src/modules/customers/components/CustomerTodosTable.tsx +1 -2
  837. package/src/modules/customers/components/detail/ActiveDealCard.tsx +1 -2
  838. package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +3 -2
  839. package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +7 -30
  840. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -6
  841. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +1 -1
  842. package/src/modules/customers/components/detail/DealDetailTabs.tsx +9 -34
  843. package/src/modules/customers/components/detail/DealForm.tsx +1 -5
  844. package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
  845. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +9 -34
  846. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +13 -28
  847. package/src/modules/customers/components/detail/dashboard/helpers.ts +3 -4
  848. package/src/modules/customers/components/formConfig.tsx +8 -12
  849. package/src/modules/customers/data/entities.ts +1 -9
  850. package/src/modules/customers/data/validators.ts +1 -6
  851. package/src/modules/customers/i18n/de.json +0 -72
  852. package/src/modules/customers/i18n/en.json +0 -72
  853. package/src/modules/customers/i18n/es.json +0 -72
  854. package/src/modules/customers/i18n/pl.json +0 -72
  855. package/src/modules/customers/lib/calendar/format.ts +4 -10
  856. package/src/modules/customers/lib/visibilityFilter.ts +5 -7
  857. package/src/modules/customers/migrations/.snapshot-open-mercato.json +1 -27
  858. package/src/modules/customers/search.ts +27 -59
  859. package/src/modules/dashboards/api/layout/[itemId]/route.ts +3 -6
  860. package/src/modules/dashboards/api/layout/route.ts +9 -22
  861. package/src/modules/dashboards/api/roles/widgets/route.ts +3 -9
  862. package/src/modules/dashboards/api/users/widgets/route.ts +3 -9
  863. package/src/modules/dashboards/api/widgets/catalog.ts +3 -6
  864. package/src/modules/dashboards/api/widgets/data/batch/route.ts +1 -12
  865. package/src/modules/dashboards/api/widgets/data/route.ts +1 -29
  866. package/src/modules/dashboards/api/widgets/data/schema.ts +19 -49
  867. package/src/modules/dashboards/i18n/de.json +0 -5
  868. package/src/modules/dashboards/i18n/en.json +0 -5
  869. package/src/modules/dashboards/i18n/es.json +0 -5
  870. package/src/modules/dashboards/i18n/pl.json +0 -5
  871. package/src/modules/dashboards/lib/access.ts +3 -5
  872. package/src/modules/dashboards/lib/aggregations.ts +48 -198
  873. package/src/modules/dashboards/lib/formatters.ts +12 -137
  874. package/src/modules/dashboards/services/widgetDataService.ts +12 -453
  875. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +3 -9
  876. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/config.ts +0 -86
  877. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.tsx +21 -42
  878. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  879. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +3 -9
  880. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +2 -7
  881. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +15 -25
  882. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +11 -21
  883. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +3 -9
  884. package/src/modules/data_sync/AGENTS.md +0 -1
  885. package/src/modules/data_sync/api/mappings/[id]/route.ts +9 -22
  886. package/src/modules/data_sync/api/mappings/route.ts +4 -13
  887. package/src/modules/data_sync/api/options.ts +2 -7
  888. package/src/modules/data_sync/api/run.ts +2 -7
  889. package/src/modules/data_sync/api/runs/[id]/cancel.ts +3 -8
  890. package/src/modules/data_sync/api/runs/[id]/retry.ts +2 -7
  891. package/src/modules/data_sync/api/runs/[id]/route.ts +3 -8
  892. package/src/modules/data_sync/api/runs.ts +2 -7
  893. package/src/modules/data_sync/api/schedules/[id]/route.ts +6 -19
  894. package/src/modules/data_sync/api/schedules/route.ts +4 -13
  895. package/src/modules/data_sync/api/validate.ts +4 -9
  896. package/src/modules/data_sync/backend/data-sync/page.tsx +1 -2
  897. package/src/modules/data_sync/lib/adapter.ts +0 -18
  898. package/src/modules/data_sync/lib/queue.ts +1 -19
  899. package/src/modules/data_sync/lib/start-run.ts +1 -2
  900. package/src/modules/data_sync/lib/sync-engine.ts +0 -46
  901. package/src/modules/data_sync/lib/sync-run-service.ts +1 -82
  902. package/src/modules/data_sync/workers/sync-export.ts +1 -8
  903. package/src/modules/data_sync/workers/sync-import.ts +1 -8
  904. package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +11 -39
  905. package/src/modules/dictionaries/api/openapi.ts +0 -19
  906. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
  907. package/src/modules/dictionaries/components/hooks/useDictionaryEntries.ts +36 -35
  908. package/src/modules/dictionaries/data/validators.ts +0 -14
  909. package/src/modules/dictionaries/lib/clientEntries.ts +3 -4
  910. package/src/modules/directory/api/organization-branding/route.ts +1 -12
  911. package/src/modules/directory/api/organization-switcher/route.ts +26 -97
  912. package/src/modules/directory/api/organizations/route.ts +0 -7
  913. package/src/modules/directory/api/tenants/route.ts +1 -9
  914. package/src/modules/directory/backend/directory/branding/page.tsx +9 -34
  915. package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +14 -10
  916. package/src/modules/directory/backend/directory/organizations/page.tsx +1 -2
  917. package/src/modules/directory/backend/directory/tenants/page.tsx +1 -2
  918. package/src/modules/directory/commands/organizations.ts +1 -9
  919. package/src/modules/directory/commands/tenants.ts +0 -6
  920. package/src/modules/directory/data/entities.ts +0 -3
  921. package/src/modules/directory/data/validators.ts +0 -2
  922. package/src/modules/directory/i18n/de.json +1 -4
  923. package/src/modules/directory/i18n/en.json +1 -4
  924. package/src/modules/directory/i18n/es.json +1 -4
  925. package/src/modules/directory/i18n/pl.json +1 -4
  926. package/src/modules/directory/migrations/.snapshot-open-mercato.json +1 -18
  927. package/src/modules/directory/subscribers/invalidateOrgScopeCache.ts +1 -4
  928. package/src/modules/directory/utils/organizationScope.ts +3 -9
  929. package/src/modules/entities/api/definitions.ts +3 -55
  930. package/src/modules/entities/api/entities.ts +2 -30
  931. package/src/modules/entities/api/entity-settings.ts +22 -66
  932. package/src/modules/entities/api/records.ts +27 -3
  933. package/src/modules/entities/api/relations/options.ts +25 -11
  934. package/src/modules/entities/api/sidebar-entities.ts +14 -43
  935. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +75 -96
  936. package/src/modules/entities/backend/entities/user/create/page.tsx +7 -16
  937. package/src/modules/entities/cli.ts +21 -238
  938. package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -2
  939. package/src/modules/entities/components/UserEntitiesTable.tsx +1 -2
  940. package/src/modules/entities/i18n/de.json +0 -9
  941. package/src/modules/entities/i18n/en.json +0 -9
  942. package/src/modules/entities/i18n/es.json +0 -9
  943. package/src/modules/entities/i18n/pl.json +0 -9
  944. package/src/modules/entities/lib/entityAcl.ts +11 -98
  945. package/src/modules/feature_toggles/components/FeatureGuard.tsx +2 -9
  946. package/src/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.ts +1 -13
  947. package/src/modules/feature_toggles/components/hooks/useFeatureFlagJson.ts +3 -12
  948. package/src/modules/feature_toggles/components/hooks/useFeatureFlagNumber.ts +1 -10
  949. package/src/modules/feature_toggles/components/hooks/useFeatureFlagString.ts +1 -10
  950. package/src/modules/inbox_ops/ai-tools.ts +3 -5
  951. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.ts +1 -17
  952. package/src/modules/inbox_ops/api/proposals/route.ts +1 -20
  953. package/src/modules/inbox_ops/api/webhook/inbound.ts +12 -14
  954. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
  955. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +19 -24
  956. package/src/modules/inbox_ops/components/proposals/types.ts +0 -1
  957. package/src/modules/inbox_ops/i18n/de.json +0 -3
  958. package/src/modules/inbox_ops/i18n/en.json +0 -3
  959. package/src/modules/inbox_ops/i18n/es.json +0 -3
  960. package/src/modules/inbox_ops/i18n/pl.json +0 -3
  961. package/src/modules/inbox_ops/search.ts +4 -20
  962. package/src/modules/integrations/api/[id]/credentials/route.ts +5 -11
  963. package/src/modules/integrations/api/[id]/health/route.ts +3 -6
  964. package/src/modules/integrations/api/[id]/route.ts +3 -6
  965. package/src/modules/integrations/api/[id]/state/route.ts +3 -6
  966. package/src/modules/integrations/api/[id]/version/route.ts +3 -6
  967. package/src/modules/integrations/api/logs/route.ts +3 -6
  968. package/src/modules/integrations/api/route.ts +3 -6
  969. package/src/modules/integrations/api/umes-read.ts +2 -2
  970. package/src/modules/integrations/backend/integrations/[id]/page.tsx +2 -2
  971. package/src/modules/integrations/lib/organization-scope.ts +25 -5
  972. package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +5 -0
  973. package/src/modules/messages/api/[id]/route.ts +0 -21
  974. package/src/modules/messages/api/route.ts +9 -109
  975. package/src/modules/messages/components/ComposeMessagePageClient.tsx +1 -2
  976. package/src/modules/messages/components/MessageDetailPageClient.tsx +2 -3
  977. package/src/modules/messages/components/MessagesInboxPageClient.tsx +1 -2
  978. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
  979. package/src/modules/messages/i18n/de.json +0 -2
  980. package/src/modules/messages/i18n/en.json +0 -2
  981. package/src/modules/messages/i18n/es.json +0 -2
  982. package/src/modules/messages/i18n/pl.json +0 -2
  983. package/src/modules/messages/lib/routeHelpers.ts +6 -4
  984. package/src/modules/messages/lib/searchLookup.ts +34 -11
  985. package/src/modules/messages/search.ts +5 -11
  986. package/src/modules/notifications/api/route.ts +3 -123
  987. package/src/modules/notifications/api/unread-count/route.ts +5 -42
  988. package/src/modules/notifications/di.ts +1 -1
  989. package/src/modules/notifications/events.ts +0 -2
  990. package/src/modules/notifications/lib/notificationRecipients.ts +8 -6
  991. package/src/modules/notifications/lib/notificationService.ts +1 -63
  992. package/src/modules/notifications/lib/routeHelpers.ts +2 -19
  993. package/src/modules/payment_gateways/api/capture/route.ts +1 -1
  994. package/src/modules/payment_gateways/api/sessions/route.ts +3 -6
  995. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +1 -13
  996. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +2 -3
  997. package/src/modules/payment_gateways/data/entities.ts +2 -13
  998. package/src/modules/payment_gateways/di.ts +2 -28
  999. package/src/modules/payment_gateways/i18n/de.json +1 -8
  1000. package/src/modules/payment_gateways/i18n/en.json +1 -8
  1001. package/src/modules/payment_gateways/i18n/es.json +1 -8
  1002. package/src/modules/payment_gateways/i18n/pl.json +1 -8
  1003. package/src/modules/payment_gateways/lib/gateway-service.ts +18 -114
  1004. package/src/modules/payment_gateways/lib/payment-operation-idempotency.ts +0 -1
  1005. package/src/modules/payment_gateways/lib/session-idempotency.ts +0 -36
  1006. package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +1 -44
  1007. package/src/modules/payment_gateways/setup.ts +0 -62
  1008. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
  1009. package/src/modules/planner/components/unavailabilityReasons.ts +3 -3
  1010. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +3 -3
  1011. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +3 -3
  1012. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
  1013. package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +3 -3
  1014. package/src/modules/portal/frontend/[orgSlug]/portal/reset-password/page.tsx +4 -4
  1015. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +3 -3
  1016. package/src/modules/portal/i18n/de.json +0 -18
  1017. package/src/modules/portal/i18n/en.json +0 -18
  1018. package/src/modules/portal/i18n/es.json +0 -18
  1019. package/src/modules/portal/i18n/pl.json +0 -18
  1020. package/src/modules/progress/AGENTS.md +1 -11
  1021. package/src/modules/progress/lib/progressService.ts +0 -1
  1022. package/src/modules/progress/lib/progressServiceImpl.ts +117 -385
  1023. package/src/modules/query_index/api/openapi.ts +0 -12
  1024. package/src/modules/query_index/api/reindex.ts +0 -15
  1025. package/src/modules/query_index/api/status.ts +136 -238
  1026. package/src/modules/query_index/cli.ts +1 -180
  1027. package/src/modules/query_index/components/QueryIndexesTable.tsx +47 -194
  1028. package/src/modules/query_index/data/entities.ts +0 -7
  1029. package/src/modules/query_index/di.ts +0 -6
  1030. package/src/modules/query_index/i18n/de.json +3 -5
  1031. package/src/modules/query_index/i18n/en.json +3 -5
  1032. package/src/modules/query_index/i18n/es.json +3 -5
  1033. package/src/modules/query_index/i18n/pl.json +3 -5
  1034. package/src/modules/query_index/lib/batch.ts +4 -11
  1035. package/src/modules/query_index/lib/coverage.ts +14 -47
  1036. package/src/modules/query_index/lib/document.ts +4 -35
  1037. package/src/modules/query_index/lib/engine.ts +59 -136
  1038. package/src/modules/query_index/lib/indexer.ts +21 -130
  1039. package/src/modules/query_index/lib/reindexer.ts +40 -62
  1040. package/src/modules/query_index/lib/search-tokens.ts +16 -48
  1041. package/src/modules/query_index/lib/subscriber-scope.ts +7 -2
  1042. package/src/modules/query_index/migrations/.snapshot-open-mercato.json +0 -12
  1043. package/src/modules/query_index/subscribers/coverage_refresh.ts +0 -4
  1044. package/src/modules/query_index/subscribers/delete_one.ts +1 -65
  1045. package/src/modules/query_index/subscribers/upsert_one.ts +1 -68
  1046. package/src/modules/resources/api/resources.ts +0 -2
  1047. package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -2
  1048. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +3 -9
  1049. package/src/modules/resources/backend/resources/resources/page.tsx +1 -2
  1050. package/src/modules/resources/commands/resources.ts +0 -10
  1051. package/src/modules/resources/components/detail/dictionaries.ts +3 -3
  1052. package/src/modules/resources/data/entities.ts +0 -3
  1053. package/src/modules/resources/data/validators.ts +0 -5
  1054. package/src/modules/resources/lib/seeds.ts +9 -16
  1055. package/src/modules/resources/migrations/.snapshot-open-mercato.json +1 -17
  1056. package/src/modules/sales/analytics.ts +0 -4
  1057. package/src/modules/sales/api/document-history/route.ts +0 -1
  1058. package/src/modules/sales/api/documents/factory.ts +3 -28
  1059. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +3 -11
  1060. package/src/modules/sales/backend/sales/documents/create/page.tsx +4 -2
  1061. package/src/modules/sales/commands/documents.ts +31 -298
  1062. package/src/modules/sales/components/documents/ItemsSection.tsx +11 -21
  1063. package/src/modules/sales/components/documents/LineItemDialog.tsx +5 -13
  1064. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +6 -48
  1065. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +1 -6
  1066. package/src/modules/sales/components/useSalesChannelsEnabled.ts +48 -2
  1067. package/src/modules/sales/data/validators.ts +6 -59
  1068. package/src/modules/sales/di.ts +0 -9
  1069. package/src/modules/sales/events.ts +0 -1
  1070. package/src/modules/sales/i18n/de.json +0 -22
  1071. package/src/modules/sales/i18n/en.json +0 -22
  1072. package/src/modules/sales/i18n/es.json +0 -22
  1073. package/src/modules/sales/i18n/pl.json +0 -22
  1074. package/src/modules/sales/lib/historyHelpers.ts +1 -88
  1075. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +3 -64
  1076. package/src/modules/sales/workflows.ts +7 -10
  1077. package/src/modules/shipping_carriers/api/webhook/[provider]/route.ts +1 -11
  1078. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  1079. package/src/modules/staff/api/interceptors.ts +4 -6
  1080. package/src/modules/staff/api/leave-requests.ts +47 -54
  1081. package/src/modules/staff/components/detail/dictionaries.ts +3 -3
  1082. package/src/modules/sync_excel/api/upload/route.ts +2 -15
  1083. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
  1084. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +4 -5
  1085. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +3 -4
  1086. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +2 -3
  1087. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +2 -3
  1088. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +1 -2
  1089. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +2 -3
  1090. package/src/modules/wms/i18n/de.json +0 -2
  1091. package/src/modules/wms/i18n/en.json +0 -2
  1092. package/src/modules/wms/i18n/es.json +0 -2
  1093. package/src/modules/wms/i18n/pl.json +0 -2
  1094. package/src/modules/workflows/backend/definitions/page.tsx +2 -3
  1095. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +4 -13
  1096. package/src/modules/workflows/backend/instances/page.tsx +9 -10
  1097. package/src/modules/workflows/backend/tasks/page.tsx +7 -8
  1098. package/src/modules/workflows/components/ActivitiesEditor.tsx +14 -98
  1099. package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
  1100. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +2 -2
  1101. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +2 -1
  1102. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +2 -1
  1103. package/src/modules/workflows/components/StepsEditor.tsx +2 -2
  1104. package/src/modules/workflows/components/TransitionsEditor.tsx +20 -78
  1105. package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
  1106. package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
  1107. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
  1108. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
  1109. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
  1110. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
  1111. package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
  1112. package/src/modules/workflows/data/validators.ts +1 -52
  1113. package/src/modules/workflows/events.ts +0 -1
  1114. package/src/modules/workflows/i18n/de.json +0 -3
  1115. package/src/modules/workflows/i18n/en.json +0 -3
  1116. package/src/modules/workflows/i18n/es.json +0 -3
  1117. package/src/modules/workflows/i18n/pl.json +0 -3
  1118. package/src/modules/workflows/lib/activity-executor.ts +20 -99
  1119. package/src/modules/workflows/lib/format-validation-error.ts +0 -60
  1120. package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +11 -27
  1121. package/dist/generated/entities/attachment_quota_reservation/index.js +0 -33
  1122. package/dist/generated/entities/attachment_quota_reservation/index.js.map +0 -7
  1123. package/dist/modules/api_keys/extension-points.js +0 -16
  1124. package/dist/modules/api_keys/extension-points.js.map +0 -7
  1125. package/dist/modules/attachments/lib/quota-recovery-queue.js +0 -9
  1126. package/dist/modules/attachments/lib/quota-recovery-queue.js.map +0 -7
  1127. package/dist/modules/attachments/lib/quota-service.js +0 -224
  1128. package/dist/modules/attachments/lib/quota-service.js.map +0 -7
  1129. package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js +0 -13
  1130. package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js.map +0 -7
  1131. package/dist/modules/attachments/workers/quota-recovery.js +0 -45
  1132. package/dist/modules/attachments/workers/quota-recovery.js.map +0 -7
  1133. package/dist/modules/audit_logs/api/audit-logs/readScope.js +0 -12
  1134. package/dist/modules/audit_logs/api/audit-logs/readScope.js.map +0 -7
  1135. package/dist/modules/audit_logs/extension-points.js +0 -14
  1136. package/dist/modules/audit_logs/extension-points.js.map +0 -7
  1137. package/dist/modules/auth/extension-points.js +0 -21
  1138. package/dist/modules/auth/extension-points.js.map +0 -7
  1139. package/dist/modules/business_rules/api/openmercato-call-options/route.js +0 -85
  1140. package/dist/modules/business_rules/api/openmercato-call-options/route.js.map +0 -7
  1141. package/dist/modules/business_rules/events.js +0 -13
  1142. package/dist/modules/business_rules/events.js.map +0 -7
  1143. package/dist/modules/business_rules/extension-points.js +0 -13
  1144. package/dist/modules/business_rules/extension-points.js.map +0 -7
  1145. package/dist/modules/business_rules/lib/openmercato-call-options-types.js +0 -5
  1146. package/dist/modules/business_rules/lib/openmercato-call-options-types.js.map +0 -7
  1147. package/dist/modules/business_rules/lib/openmercato-call-options.js +0 -231
  1148. package/dist/modules/business_rules/lib/openmercato-call-options.js.map +0 -7
  1149. package/dist/modules/catalog/extension-points.js +0 -27
  1150. package/dist/modules/catalog/extension-points.js.map +0 -7
  1151. package/dist/modules/communication_channels/extension-points.js +0 -20
  1152. package/dist/modules/communication_channels/extension-points.js.map +0 -7
  1153. package/dist/modules/configs/extension-points.js +0 -18
  1154. package/dist/modules/configs/extension-points.js.map +0 -7
  1155. package/dist/modules/currencies/extension-points.js +0 -14
  1156. package/dist/modules/currencies/extension-points.js.map +0 -7
  1157. package/dist/modules/currencies/services/baseCurrencyService.js +0 -42
  1158. package/dist/modules/currencies/services/baseCurrencyService.js.map +0 -7
  1159. package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js +0 -26
  1160. package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js.map +0 -7
  1161. package/dist/modules/customer_accounts/extension-points.js +0 -14
  1162. package/dist/modules/customer_accounts/extension-points.js.map +0 -7
  1163. package/dist/modules/customer_accounts/lib/invitationEmail.js +0 -35
  1164. package/dist/modules/customer_accounts/lib/invitationEmail.js.map +0 -7
  1165. package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js +0 -13
  1166. package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js.map +0 -7
  1167. package/dist/modules/customers/extension-points.js +0 -42
  1168. package/dist/modules/customers/extension-points.js.map +0 -7
  1169. package/dist/modules/customers/lib/dealStatus.js +0 -38
  1170. package/dist/modules/customers/lib/dealStatus.js.map +0 -7
  1171. package/dist/modules/customers/lib/dealsSummaryQueries.js +0 -144
  1172. package/dist/modules/customers/lib/dealsSummaryQueries.js.map +0 -7
  1173. package/dist/modules/customers/lib/optionalBaseCurrency.js +0 -19
  1174. package/dist/modules/customers/lib/optionalBaseCurrency.js.map +0 -7
  1175. package/dist/modules/customers/migrations/Migration20260723210000_customers.js +0 -15
  1176. package/dist/modules/customers/migrations/Migration20260723210000_customers.js.map +0 -7
  1177. package/dist/modules/dashboards/components/UnlabelledAmountNotice.js +0 -33
  1178. package/dist/modules/dashboards/components/UnlabelledAmountNotice.js.map +0 -7
  1179. package/dist/modules/dashboards/lib/exactDecimal.js +0 -69
  1180. package/dist/modules/dashboards/lib/exactDecimal.js.map +0 -7
  1181. package/dist/modules/dashboards/lib/optionalBaseCurrency.js +0 -11
  1182. package/dist/modules/dashboards/lib/optionalBaseCurrency.js.map +0 -7
  1183. package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js +0 -26
  1184. package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js.map +0 -7
  1185. package/dist/modules/data_sync/extension-points.js +0 -13
  1186. package/dist/modules/data_sync/extension-points.js.map +0 -7
  1187. package/dist/modules/data_sync/lib/queue-policy.js +0 -15
  1188. package/dist/modules/data_sync/lib/queue-policy.js.map +0 -7
  1189. package/dist/modules/design_system/acl.js +0 -9
  1190. package/dist/modules/design_system/acl.js.map +0 -7
  1191. package/dist/modules/design_system/backend/design-system/page.js +0 -11
  1192. package/dist/modules/design_system/backend/design-system/page.js.map +0 -7
  1193. package/dist/modules/design_system/backend/design-system/page.meta.js +0 -15
  1194. package/dist/modules/design_system/backend/design-system/page.meta.js.map +0 -7
  1195. package/dist/modules/design_system/gallery/components/CodeSnippet.js +0 -52
  1196. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +0 -7
  1197. package/dist/modules/design_system/gallery/components/EntryCard.js +0 -63
  1198. package/dist/modules/design_system/gallery/components/EntryCard.js.map +0 -7
  1199. package/dist/modules/design_system/gallery/components/GalleryShell.js +0 -163
  1200. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +0 -7
  1201. package/dist/modules/design_system/gallery/components/VariantPreview.js +0 -9
  1202. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +0 -7
  1203. package/dist/modules/design_system/gallery/entries/banners.js +0 -186
  1204. package/dist/modules/design_system/gallery/entries/banners.js.map +0 -7
  1205. package/dist/modules/design_system/gallery/entries/buttons.js +0 -361
  1206. package/dist/modules/design_system/gallery/entries/buttons.js.map +0 -7
  1207. package/dist/modules/design_system/gallery/entries/charts.js +0 -457
  1208. package/dist/modules/design_system/gallery/entries/charts.js.map +0 -7
  1209. package/dist/modules/design_system/gallery/entries/dates.js +0 -306
  1210. package/dist/modules/design_system/gallery/entries/dates.js.map +0 -7
  1211. package/dist/modules/design_system/gallery/entries/detail.js +0 -358
  1212. package/dist/modules/design_system/gallery/entries/detail.js.map +0 -7
  1213. package/dist/modules/design_system/gallery/entries/display.js +0 -785
  1214. package/dist/modules/design_system/gallery/entries/display.js.map +0 -7
  1215. package/dist/modules/design_system/gallery/entries/feedback.js +0 -658
  1216. package/dist/modules/design_system/gallery/entries/feedback.js.map +0 -7
  1217. package/dist/modules/design_system/gallery/entries/filters.js +0 -505
  1218. package/dist/modules/design_system/gallery/entries/filters.js.map +0 -7
  1219. package/dist/modules/design_system/gallery/entries/foundations.js +0 -453
  1220. package/dist/modules/design_system/gallery/entries/foundations.js.map +0 -7
  1221. package/dist/modules/design_system/gallery/entries/icons.js +0 -140
  1222. package/dist/modules/design_system/gallery/entries/icons.js.map +0 -7
  1223. package/dist/modules/design_system/gallery/entries/inputs.js +0 -1217
  1224. package/dist/modules/design_system/gallery/entries/inputs.js.map +0 -7
  1225. package/dist/modules/design_system/gallery/entries/messages.js +0 -334
  1226. package/dist/modules/design_system/gallery/entries/messages.js.map +0 -7
  1227. package/dist/modules/design_system/gallery/entries/navigation.js +0 -475
  1228. package/dist/modules/design_system/gallery/entries/navigation.js.map +0 -7
  1229. package/dist/modules/design_system/gallery/entries/notifications.js +0 -257
  1230. package/dist/modules/design_system/gallery/entries/notifications.js.map +0 -7
  1231. package/dist/modules/design_system/gallery/entries/overlays.js +0 -576
  1232. package/dist/modules/design_system/gallery/entries/overlays.js.map +0 -7
  1233. package/dist/modules/design_system/gallery/entries/scaffolding.js +0 -378
  1234. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +0 -7
  1235. package/dist/modules/design_system/gallery/entries/schedule.js +0 -297
  1236. package/dist/modules/design_system/gallery/entries/schedule.js.map +0 -7
  1237. package/dist/modules/design_system/gallery/registry.js +0 -139
  1238. package/dist/modules/design_system/gallery/registry.js.map +0 -7
  1239. package/dist/modules/design_system/gallery/types.js +0 -1
  1240. package/dist/modules/design_system/gallery/types.js.map +0 -7
  1241. package/dist/modules/design_system/index.js +0 -9
  1242. package/dist/modules/design_system/index.js.map +0 -7
  1243. package/dist/modules/design_system/setup.js +0 -14
  1244. package/dist/modules/design_system/setup.js.map +0 -7
  1245. package/dist/modules/dictionaries/lib/fetchAllEntries.js +0 -43
  1246. package/dist/modules/dictionaries/lib/fetchAllEntries.js.map +0 -7
  1247. package/dist/modules/directory/extension-points.js +0 -14
  1248. package/dist/modules/directory/extension-points.js.map +0 -7
  1249. package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js +0 -13
  1250. package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js.map +0 -7
  1251. package/dist/modules/entities/backend/config/settings/page.js +0 -10
  1252. package/dist/modules/entities/backend/config/settings/page.js.map +0 -7
  1253. package/dist/modules/entities/backend/config/settings/page.meta.js +0 -36
  1254. package/dist/modules/entities/backend/config/settings/page.meta.js.map +0 -7
  1255. package/dist/modules/entities/components/EntitySettingsManager.js +0 -136
  1256. package/dist/modules/entities/components/EntitySettingsManager.js.map +0 -7
  1257. package/dist/modules/entities/components/RecordListRelationCell.js +0 -63
  1258. package/dist/modules/entities/components/RecordListRelationCell.js.map +0 -7
  1259. package/dist/modules/entities/components/recordListRelationDisplays.js +0 -80
  1260. package/dist/modules/entities/components/recordListRelationDisplays.js.map +0 -7
  1261. package/dist/modules/entities/extension-points.js +0 -21
  1262. package/dist/modules/entities/extension-points.js.map +0 -7
  1263. package/dist/modules/feature_toggles/components/hooks/staleTime.js +0 -5
  1264. package/dist/modules/feature_toggles/components/hooks/staleTime.js.map +0 -7
  1265. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js +0 -32
  1266. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js.map +0 -7
  1267. package/dist/modules/integrations/extension-points.js +0 -30
  1268. package/dist/modules/integrations/extension-points.js.map +0 -7
  1269. package/dist/modules/integrations/widgets/injection/external-ids/widget.js +0 -14
  1270. package/dist/modules/integrations/widgets/injection/external-ids/widget.js.map +0 -7
  1271. package/dist/modules/messages/extension-points.js +0 -16
  1272. package/dist/modules/messages/extension-points.js.map +0 -7
  1273. package/dist/modules/messages/lib/participantScope.js +0 -15
  1274. package/dist/modules/messages/lib/participantScope.js.map +0 -7
  1275. package/dist/modules/notifications/lib/notificationScope.js +0 -26
  1276. package/dist/modules/notifications/lib/notificationScope.js.map +0 -7
  1277. package/dist/modules/payment_gateways/extension-points.js +0 -19
  1278. package/dist/modules/payment_gateways/extension-points.js.map +0 -7
  1279. package/dist/modules/payment_gateways/lib/capture-ledger.js +0 -183
  1280. package/dist/modules/payment_gateways/lib/capture-ledger.js.map +0 -7
  1281. package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js +0 -58
  1282. package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js.map +0 -7
  1283. package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js +0 -16
  1284. package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js.map +0 -7
  1285. package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js +0 -18
  1286. package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js.map +0 -7
  1287. package/dist/modules/payment_gateways/workers/session-initialization-prune.js +0 -50
  1288. package/dist/modules/payment_gateways/workers/session-initialization-prune.js.map +0 -7
  1289. package/dist/modules/portal/extension-points.js +0 -32
  1290. package/dist/modules/portal/extension-points.js.map +0 -7
  1291. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js +0 -134
  1292. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js.map +0 -7
  1293. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js +0 -11
  1294. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js.map +0 -7
  1295. package/dist/modules/portal/lib/navigation.js +0 -7
  1296. package/dist/modules/portal/lib/navigation.js.map +0 -7
  1297. package/dist/modules/query_index/events.js +0 -20
  1298. package/dist/modules/query_index/events.js.map +0 -7
  1299. package/dist/modules/query_index/extension-points.js +0 -13
  1300. package/dist/modules/query_index/extension-points.js.map +0 -7
  1301. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +0 -17
  1302. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +0 -7
  1303. package/dist/modules/resources/extension-points.js +0 -14
  1304. package/dist/modules/resources/extension-points.js.map +0 -7
  1305. package/dist/modules/resources/migrations/Migration20260608231000.js +0 -13
  1306. package/dist/modules/resources/migrations/Migration20260608231000.js.map +0 -7
  1307. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +0 -167
  1308. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +0 -7
  1309. package/dist/modules/sales/extension-points.js +0 -36
  1310. package/dist/modules/sales/extension-points.js.map +0 -7
  1311. package/dist/modules/sales/services/paymentOrderTotalResolver.js +0 -52
  1312. package/dist/modules/sales/services/paymentOrderTotalResolver.js.map +0 -7
  1313. package/dist/modules/wms/extension-points.js +0 -26
  1314. package/dist/modules/wms/extension-points.js.map +0 -7
  1315. package/dist/modules/workflows/extension-points.js +0 -15
  1316. package/dist/modules/workflows/extension-points.js.map +0 -7
  1317. package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js +0 -10
  1318. package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js.map +0 -7
  1319. package/generated/entities/attachment_quota_reservation/index.ts +0 -15
  1320. package/src/modules/api_keys/extension-points.ts +0 -13
  1321. package/src/modules/api_keys/i18n/ko.json +0 -42
  1322. package/src/modules/attachments/i18n/ko.json +0 -175
  1323. package/src/modules/attachments/lib/quota-recovery-queue.ts +0 -16
  1324. package/src/modules/attachments/lib/quota-service.ts +0 -442
  1325. package/src/modules/attachments/migrations/Migration20260709234741_attachments.ts +0 -12
  1326. package/src/modules/attachments/workers/quota-recovery.ts +0 -68
  1327. package/src/modules/audit_logs/api/audit-logs/readScope.ts +0 -28
  1328. package/src/modules/audit_logs/extension-points.ts +0 -11
  1329. package/src/modules/audit_logs/i18n/ko.json +0 -66
  1330. package/src/modules/auth/extension-points.ts +0 -18
  1331. package/src/modules/auth/i18n/ko.json +0 -255
  1332. package/src/modules/business_rules/api/openmercato-call-options/route.ts +0 -94
  1333. package/src/modules/business_rules/events.ts +0 -10
  1334. package/src/modules/business_rules/extension-points.ts +0 -10
  1335. package/src/modules/business_rules/i18n/ko.json +0 -396
  1336. package/src/modules/business_rules/lib/openmercato-call-options-types.ts +0 -31
  1337. package/src/modules/business_rules/lib/openmercato-call-options.ts +0 -297
  1338. package/src/modules/catalog/extension-points.ts +0 -24
  1339. package/src/modules/catalog/i18n/ko.json +0 -723
  1340. package/src/modules/communication_channels/extension-points.ts +0 -17
  1341. package/src/modules/communication_channels/i18n/ko.json +0 -138
  1342. package/src/modules/configs/extension-points.ts +0 -15
  1343. package/src/modules/configs/i18n/ko.json +0 -197
  1344. package/src/modules/currencies/extension-points.ts +0 -11
  1345. package/src/modules/currencies/i18n/ko.json +0 -160
  1346. package/src/modules/currencies/services/baseCurrencyService.ts +0 -59
  1347. package/src/modules/customer_accounts/emails/CustomerInvitationEmail.tsx +0 -45
  1348. package/src/modules/customer_accounts/extension-points.ts +0 -11
  1349. package/src/modules/customer_accounts/i18n/ko.json +0 -354
  1350. package/src/modules/customer_accounts/lib/invitationEmail.ts +0 -42
  1351. package/src/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.ts +0 -13
  1352. package/src/modules/customers/extension-points.ts +0 -40
  1353. package/src/modules/customers/i18n/ko.json +0 -2855
  1354. package/src/modules/customers/lib/dealStatus.ts +0 -48
  1355. package/src/modules/customers/lib/dealsSummaryQueries.ts +0 -211
  1356. package/src/modules/customers/lib/optionalBaseCurrency.ts +0 -34
  1357. package/src/modules/customers/migrations/Migration20260723210000_customers.ts +0 -15
  1358. package/src/modules/dashboards/components/UnlabelledAmountNotice.tsx +0 -43
  1359. package/src/modules/dashboards/i18n/ko.json +0 -118
  1360. package/src/modules/dashboards/lib/exactDecimal.ts +0 -96
  1361. package/src/modules/dashboards/lib/optionalBaseCurrency.ts +0 -22
  1362. package/src/modules/dashboards/subscribers/invalidateWidgetDataCache.ts +0 -32
  1363. package/src/modules/data_sync/extension-points.ts +0 -10
  1364. package/src/modules/data_sync/i18n/ko.json +0 -125
  1365. package/src/modules/data_sync/lib/queue-policy.ts +0 -30
  1366. package/src/modules/design_system/AGENTS.md +0 -34
  1367. package/src/modules/design_system/acl.ts +0 -5
  1368. package/src/modules/design_system/backend/design-system/page.meta.ts +0 -11
  1369. package/src/modules/design_system/backend/design-system/page.tsx +0 -14
  1370. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +0 -55
  1371. package/src/modules/design_system/gallery/components/EntryCard.tsx +0 -95
  1372. package/src/modules/design_system/gallery/components/GalleryShell.tsx +0 -206
  1373. package/src/modules/design_system/gallery/components/VariantPreview.tsx +0 -15
  1374. package/src/modules/design_system/gallery/entries/banners.tsx +0 -226
  1375. package/src/modules/design_system/gallery/entries/buttons.tsx +0 -422
  1376. package/src/modules/design_system/gallery/entries/charts.tsx +0 -518
  1377. package/src/modules/design_system/gallery/entries/dates.tsx +0 -325
  1378. package/src/modules/design_system/gallery/entries/detail.tsx +0 -403
  1379. package/src/modules/design_system/gallery/entries/display.tsx +0 -893
  1380. package/src/modules/design_system/gallery/entries/feedback.tsx +0 -746
  1381. package/src/modules/design_system/gallery/entries/filters.tsx +0 -570
  1382. package/src/modules/design_system/gallery/entries/foundations.tsx +0 -529
  1383. package/src/modules/design_system/gallery/entries/icons.tsx +0 -168
  1384. package/src/modules/design_system/gallery/entries/inputs.tsx +0 -1516
  1385. package/src/modules/design_system/gallery/entries/messages.tsx +0 -339
  1386. package/src/modules/design_system/gallery/entries/navigation.tsx +0 -573
  1387. package/src/modules/design_system/gallery/entries/notifications.tsx +0 -285
  1388. package/src/modules/design_system/gallery/entries/overlays.tsx +0 -677
  1389. package/src/modules/design_system/gallery/entries/scaffolding.tsx +0 -430
  1390. package/src/modules/design_system/gallery/entries/schedule.tsx +0 -307
  1391. package/src/modules/design_system/gallery/registry.ts +0 -152
  1392. package/src/modules/design_system/gallery/types.ts +0 -32
  1393. package/src/modules/design_system/i18n/.hardcoded-allowlist.json +0 -71
  1394. package/src/modules/design_system/i18n/de.json +0 -58
  1395. package/src/modules/design_system/i18n/en.json +0 -58
  1396. package/src/modules/design_system/i18n/es.json +0 -58
  1397. package/src/modules/design_system/i18n/ko.json +0 -58
  1398. package/src/modules/design_system/i18n/pl.json +0 -58
  1399. package/src/modules/design_system/index.ts +0 -7
  1400. package/src/modules/design_system/setup.ts +0 -12
  1401. package/src/modules/dictionaries/i18n/ko.json +0 -130
  1402. package/src/modules/dictionaries/lib/fetchAllEntries.ts +0 -72
  1403. package/src/modules/directory/extension-points.ts +0 -11
  1404. package/src/modules/directory/i18n/ko.json +0 -105
  1405. package/src/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.ts +0 -13
  1406. package/src/modules/entities/backend/config/settings/page.meta.ts +0 -34
  1407. package/src/modules/entities/backend/config/settings/page.tsx +0 -12
  1408. package/src/modules/entities/components/EntitySettingsManager.tsx +0 -160
  1409. package/src/modules/entities/components/RecordListRelationCell.tsx +0 -90
  1410. package/src/modules/entities/components/recordListRelationDisplays.ts +0 -109
  1411. package/src/modules/entities/extension-points.ts +0 -18
  1412. package/src/modules/entities/i18n/ko.json +0 -260
  1413. package/src/modules/feature_toggles/components/hooks/staleTime.ts +0 -5
  1414. package/src/modules/feature_toggles/i18n/ko.json +0 -96
  1415. package/src/modules/inbox_ops/i18n/ko.json +0 -196
  1416. package/src/modules/inbox_ops/subscribers/search-reindex-proposal-created.ts +0 -39
  1417. package/src/modules/integrations/extension-points.ts +0 -27
  1418. package/src/modules/integrations/i18n/ko.json +0 -129
  1419. package/src/modules/integrations/widgets/injection/external-ids/widget.ts +0 -13
  1420. package/src/modules/messages/extension-points.ts +0 -13
  1421. package/src/modules/messages/i18n/ko.json +0 -263
  1422. package/src/modules/messages/lib/participantScope.ts +0 -64
  1423. package/src/modules/notifications/i18n/ko.json +0 -55
  1424. package/src/modules/notifications/lib/notificationScope.ts +0 -40
  1425. package/src/modules/payment_gateways/extension-points.ts +0 -16
  1426. package/src/modules/payment_gateways/i18n/ko.json +0 -87
  1427. package/src/modules/payment_gateways/lib/capture-ledger.ts +0 -260
  1428. package/src/modules/payment_gateways/lib/order-amount-reconciliation.ts +0 -93
  1429. package/src/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.ts +0 -21
  1430. package/src/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.ts +0 -17
  1431. package/src/modules/payment_gateways/workers/session-initialization-prune.ts +0 -63
  1432. package/src/modules/planner/i18n/ko.json +0 -565
  1433. package/src/modules/portal/extension-points.ts +0 -30
  1434. package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.ts +0 -9
  1435. package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.tsx +0 -164
  1436. package/src/modules/portal/i18n/ko.json +0 -143
  1437. package/src/modules/portal/lib/navigation.ts +0 -3
  1438. package/src/modules/progress/i18n/ko.json +0 -20
  1439. package/src/modules/query_index/events.ts +0 -17
  1440. package/src/modules/query_index/extension-points.ts +0 -10
  1441. package/src/modules/query_index/i18n/ko.json +0 -69
  1442. package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +0 -35
  1443. package/src/modules/resources/extension-points.ts +0 -11
  1444. package/src/modules/resources/i18n/ko.json +0 -770
  1445. package/src/modules/resources/migrations/Migration20260608231000.ts +0 -13
  1446. package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +0 -198
  1447. package/src/modules/sales/extension-points.ts +0 -33
  1448. package/src/modules/sales/i18n/ko.json +0 -1442
  1449. package/src/modules/sales/services/paymentOrderTotalResolver.ts +0 -67
  1450. package/src/modules/shipping_carriers/i18n/ko.json +0 -85
  1451. package/src/modules/staff/i18n/ko.json +0 -1162
  1452. package/src/modules/sync_excel/i18n/ko.json +0 -107
  1453. package/src/modules/translations/i18n/ko.json +0 -45
  1454. package/src/modules/wms/extension-points.ts +0 -23
  1455. package/src/modules/wms/i18n/ko.json +0 -1053
  1456. package/src/modules/workflows/extension-points.ts +0 -12
  1457. package/src/modules/workflows/i18n/ko.json +0 -1204
  1458. package/src/modules/workflows/widgets/injection/order-approval/context-keys.ts +0 -18
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/notifications/lib/notificationService.ts"],
4
- "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { type Kysely, sql } from 'kysely'\nimport { CrudHttpError, conflict } from '@open-mercato/shared/lib/crud/errors'\nimport { invalidateCrudCache } from '@open-mercato/shared/lib/crud/cache'\nimport { Notification, type NotificationStatus } from '../data/entities'\nimport type { CreateNotificationInput, CreateBatchNotificationInput, CreateRoleNotificationInput, CreateFeatureNotificationInput, ExecuteActionInput } from '../data/validators'\nimport type { NotificationPollData } from '@open-mercato/shared/modules/notifications/types'\nimport { NOTIFICATION_EVENTS, NOTIFICATION_SSE_EVENTS } from './events'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport {\n buildNotificationEntity,\n emitNotificationCreated,\n emitNotificationCreatedBatch,\n type NotificationContentInput,\n type NotificationTenantContext,\n} from './notificationFactory'\nimport { toNotificationDto } from './notificationMapper'\nimport { buildNotificationReadScopeWhere } from './notificationScope'\nimport {\n getRecipientUserIdsForFeature,\n getRecipientUserIdsForRole,\n getScopedNotificationRecipientUserIds,\n} from './notificationRecipients'\nimport { assertSafeNotificationHref, sanitizeNotificationActions } from './safeHref'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('notifications').child({ component: 'service' })\n\nfunction debug(message: string, ...details: unknown[]): void {\n logger.debug(message, details.length ? { details } : undefined)\n}\n\nfunction getDb(em: EntityManager): Kysely<any> {\n return em.getKysely<any>()\n}\n\nconst UNIQUE_NOTIFICATION_ACTIVE_STATUSES: NotificationStatus[] = ['unread', 'read', 'actioned']\nconst NOTIFICATION_RESOURCE_KIND = 'notifications.notification'\n\nfunction normalizeOrgScope(organizationId: string | null | undefined): string | null {\n return organizationId ?? null\n}\n\nasync function invalidateNotificationCache(\n container: NotificationServiceDeps['container'],\n ctx: Pick<NotificationServiceContext, 'tenantId' | 'organizationId'>,\n reason: string,\n notificationId?: string,\n): Promise<void> {\n if (!container) return\n await invalidateCrudCache(\n container as Parameters<typeof invalidateCrudCache>[0],\n NOTIFICATION_RESOURCE_KIND,\n {\n id: notificationId,\n tenantId: ctx.tenantId,\n organizationId: normalizeOrgScope(ctx.organizationId),\n },\n ctx.tenantId,\n reason,\n )\n}\n\nasync function assertNotificationRecipientsInScope(\n em: EntityManager,\n recipientUserIds: string[],\n ctx: NotificationServiceContext,\n): Promise<void> {\n const scopedRecipientUserIds = await getScopedNotificationRecipientUserIds(\n getDb(em),\n ctx.tenantId,\n normalizeOrgScope(ctx.organizationId),\n recipientUserIds,\n )\n\n if (scopedRecipientUserIds.length !== recipientUserIds.length) {\n throw new CrudHttpError(404, { error: 'Notification recipient not found' })\n }\n}\n\nfunction applyNotificationContent(\n notification: Notification,\n input: NotificationContentInput,\n recipientUserId: string,\n ctx: NotificationTenantContext,\n) {\n const actions = sanitizeNotificationActions(input.actions)\n const linkHref = assertSafeNotificationHref(input.linkHref)\n\n notification.recipientUserId = recipientUserId\n notification.type = input.type\n notification.titleKey = input.titleKey\n notification.bodyKey = input.bodyKey\n notification.titleVariables = input.titleVariables\n notification.bodyVariables = input.bodyVariables\n notification.title = input.title || input.titleKey || ''\n notification.body = input.body\n notification.icon = input.icon\n notification.severity = input.severity ?? 'info'\n notification.actionData = actions\n ? {\n actions,\n primaryActionId: input.primaryActionId,\n }\n : null\n notification.sourceModule = input.sourceModule\n notification.sourceEntityType = input.sourceEntityType\n notification.sourceEntityId = input.sourceEntityId\n notification.linkHref = linkHref\n notification.groupKey = input.groupKey\n notification.expiresAt = input.expiresAt ? new Date(input.expiresAt) : null\n notification.tenantId = ctx.tenantId\n notification.organizationId = normalizeOrgScope(ctx.organizationId)\n notification.status = 'unread'\n notification.readAt = null\n notification.actionedAt = null\n notification.dismissedAt = null\n notification.actionTaken = null\n notification.actionResult = null\n notification.createdAt = new Date()\n}\n\nasync function findScopedNotificationOrThrow(\n em: EntityManager,\n notificationId: string,\n ctx: NotificationServiceContext,\n): Promise<Notification> {\n const notification = await findOneWithDecryption(\n em,\n Notification,\n {\n id: notificationId,\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n },\n undefined,\n {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId ?? null,\n },\n )\n if (!notification) {\n throw new CrudHttpError(404, { error: 'Notification not found' })\n }\n return notification\n}\n\nasync function emitNotificationSseEvents(\n eventBus: { emit: (event: string, payload: unknown) => Promise<void> },\n notifications: Notification[],\n ctx: NotificationServiceContext,\n recipientUserIds: string[],\n): Promise<void> {\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.BATCH_CREATED, {\n tenantId: ctx.tenantId,\n organizationId: normalizeOrgScope(ctx.organizationId),\n recipientUserIds,\n count: notifications.length,\n })\n\n for (const notification of notifications) {\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n }\n}\n\nasync function createOrRefreshNotification(\n em: EntityManager,\n input: NotificationContentInput,\n recipientUserId: string,\n ctx: NotificationTenantContext,\n): Promise<Notification> {\n if (input.groupKey && input.groupKey.trim().length > 0) {\n const orgScope = normalizeOrgScope(ctx.organizationId) ?? 'global'\n const lockKey = `notifications:${ctx.tenantId}:${orgScope}:${recipientUserId}:${input.type}:${input.groupKey}`\n try {\n const db = getDb(em)\n await sql`select pg_advisory_xact_lock(hashtext(${lockKey}))`.execute(db)\n } catch {\n // If advisory locks are unavailable, continue with best-effort dedupe.\n }\n\n const existing = await em.findOne(Notification, {\n recipientUserId,\n tenantId: ctx.tenantId,\n organizationId: normalizeOrgScope(ctx.organizationId),\n type: input.type,\n groupKey: input.groupKey,\n status: { $in: UNIQUE_NOTIFICATION_ACTIVE_STATUSES },\n }, {\n orderBy: { createdAt: 'desc' },\n })\n\n if (existing) {\n applyNotificationContent(existing, input, recipientUserId, ctx)\n return existing\n }\n }\n\n return buildNotificationEntity(em, input, recipientUserId, ctx)\n}\n\nexport interface NotificationServiceContext {\n tenantId: string\n organizationId?: string | null\n organizationIds?: string[] | null\n userId?: string | null\n}\n\nexport interface NotificationService {\n create(input: CreateNotificationInput, ctx: NotificationServiceContext): Promise<Notification>\n createBatch(input: CreateBatchNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n createForRole(input: CreateRoleNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n createForFeature(input: CreateFeatureNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n markAsRead(notificationId: string, ctx: NotificationServiceContext): Promise<Notification>\n markAllAsRead(ctx: NotificationServiceContext): Promise<number>\n dismiss(notificationId: string, ctx: NotificationServiceContext): Promise<Notification>\n restoreDismissed(\n notificationId: string,\n status: 'read' | 'unread' | undefined,\n ctx: NotificationServiceContext\n ): Promise<Notification>\n executeAction(\n notificationId: string,\n input: ExecuteActionInput,\n ctx: NotificationServiceContext\n ): Promise<{ notification: Notification; result: unknown }>\n getUnreadCount(ctx: NotificationServiceContext): Promise<number>\n getPollData(ctx: NotificationServiceContext, since?: string): Promise<NotificationPollData>\n cleanupExpired(): Promise<number>\n deleteBySource(\n sourceEntityType: string,\n sourceEntityId: string,\n ctx: NotificationServiceContext\n ): Promise<number>\n}\n\nexport interface NotificationServiceDeps {\n em: EntityManager\n eventBus: { emit: (event: string, payload: unknown) => Promise<void> }\n commandBus?: {\n execute: (\n commandId: string,\n options: { input: unknown; ctx: unknown; metadata?: unknown }\n ) => Promise<{ result: unknown }>\n }\n container?: { resolve: (name: string) => unknown }\n}\n\nexport function createNotificationService(deps: NotificationServiceDeps): NotificationService {\n const { em: rootEm, eventBus, commandBus, container } = deps\n\n return {\n async create(input, ctx) {\n const { recipientUserId, ...content } = input\n const writeEm = rootEm.fork()\n const notification = await writeEm.transactional(async (tx) => {\n await assertNotificationRecipientsInScope(tx, [recipientUserId], ctx)\n const entity = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n await tx.flush()\n return entity\n })\n\n await invalidateNotificationCache(container, ctx, 'created')\n await emitNotificationCreated(eventBus, notification, ctx)\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n\n return notification\n },\n\n async createBatch(input, ctx) {\n const recipientUserIds = Array.from(new Set(input.recipientUserIds))\n const { recipientUserIds: _recipientUserIds, ...content } = input\n const notifications: Notification[] = []\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n await assertNotificationRecipientsInScope(tx, recipientUserIds, ctx)\n for (const recipientUserId of recipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await invalidateNotificationCache(container, ctx, 'created')\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, recipientUserIds)\n\n return notifications\n },\n\n async createForRole(input, ctx) {\n const em = rootEm.fork()\n\n const db = getDb(em)\n const recipientUserIds = await getRecipientUserIdsForRole(db, ctx.tenantId, input.roleId)\n if (recipientUserIds.length === 0) {\n return []\n }\n\n const { roleId: _roleId, ...content } = input\n const notifications: Notification[] = []\n const uniqueRecipientUserIds = Array.from(new Set(recipientUserIds))\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n for (const recipientUserId of uniqueRecipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await invalidateNotificationCache(container, ctx, 'created')\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, uniqueRecipientUserIds)\n\n return notifications\n },\n\n async createForFeature(input, ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n const recipientUserIds = await getRecipientUserIdsForFeature(db, ctx.tenantId, input.requiredFeature)\n\n if (recipientUserIds.length === 0) {\n debug('No users found with feature:', input.requiredFeature, 'in tenant:', ctx.tenantId)\n return []\n }\n\n debug('Creating notifications for', recipientUserIds.length, 'user(s) with feature:', input.requiredFeature)\n\n const { requiredFeature: _requiredFeature, ...content } = input\n const notifications: Notification[] = []\n const uniqueRecipientUserIds = Array.from(new Set(recipientUserIds))\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n for (const recipientUserId of uniqueRecipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await invalidateNotificationCache(container, ctx, 'created')\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, uniqueRecipientUserIds)\n\n return notifications\n },\n\n async markAsRead(notificationId, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n if (notification.status === 'unread') {\n notification.status = 'read'\n notification.readAt = new Date()\n await em.flush()\n\n await invalidateNotificationCache(container, ctx, 'updated', notification.id)\n await eventBus.emit(NOTIFICATION_EVENTS.READ, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n }\n\n return notification\n },\n\n async markAllAsRead(ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n const applyScope = <QB extends { where: (...args: any[]) => QB }>(q: QB): QB => {\n let chain = q\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '=', 'unread')\n if (ctx.organizationId) {\n chain = chain.where('organization_id' as any, '=', ctx.organizationId)\n }\n return chain\n }\n\n const targetRows = await applyScope(\n db\n .selectFrom('notifications' as any)\n .select([\n 'id' as any,\n 'organization_id' as any,\n 'recipient_user_id' as any,\n ]),\n ).execute() as Array<{ id: string }>\n\n if (!targetRows.length) {\n return 0\n }\n\n const updateResult = await applyScope(\n db.updateTable('notifications' as any).set({\n status: 'read',\n read_at: sql`now()`,\n } as any) as any,\n ).executeTakeFirst() as { numUpdatedRows?: bigint | number } | undefined\n const result = Number(updateResult?.numUpdatedRows ?? targetRows.length)\n\n await invalidateNotificationCache(container, ctx, 'updated')\n\n const notifications = await findWithDecryption(em, Notification, {\n id: { $in: targetRows.map((row) => row.id) },\n }, undefined, {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId ?? null,\n })\n\n for (const notification of notifications) {\n await eventBus.emit(NOTIFICATION_EVENTS.READ, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n }\n\n return result\n },\n\n async dismiss(notificationId, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n notification.status = 'dismissed'\n notification.dismissedAt = new Date()\n await em.flush()\n\n await invalidateNotificationCache(container, ctx, 'updated', notification.id)\n await eventBus.emit(NOTIFICATION_EVENTS.DISMISSED, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n return notification\n },\n\n async restoreDismissed(notificationId, status, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n if (notification.status !== 'dismissed') {\n return notification\n }\n\n const targetStatus = status ?? 'read'\n notification.status = targetStatus\n notification.dismissedAt = null\n\n if (targetStatus === 'unread') {\n notification.readAt = null\n } else if (!notification.readAt) {\n notification.readAt = new Date()\n }\n\n await em.flush()\n\n await invalidateNotificationCache(container, ctx, 'updated', notification.id)\n await eventBus.emit(NOTIFICATION_EVENTS.RESTORED, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n status: targetStatus,\n })\n\n return notification\n },\n\n async executeAction(notificationId, input, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n const actionData = notification.actionData\n const action = actionData?.actions?.find((a) => a.id === input.actionId)\n\n if (!action) {\n throw new Error('Action not found')\n }\n\n // Reject an already-actioned notification before dispatching the command,\n // so a retry or double-click cannot re-run the side effect.\n if (notification.status === 'actioned') {\n throw conflict('Notification action already executed')\n }\n\n const actionedAt = new Date()\n const previousStatus = notification.status\n const previousActionedAt = notification.actionedAt ?? null\n const previousActionTaken = notification.actionTaken ?? null\n\n // Atomically claim the notification so only one concurrent request can run\n // the side-effecting command. The conditional UPDATE matches only while the\n // notification has not been actioned yet; a losing request updates 0 rows.\n const claimResult = (await getDb(em)\n .updateTable('notifications' as any)\n .set({\n status: 'actioned',\n actioned_at: actionedAt,\n action_taken: input.actionId,\n } as any)\n .where('id' as any, '=', notification.id)\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '!=', 'actioned')\n .executeTakeFirst()) as { numUpdatedRows?: bigint | number } | undefined\n\n if (Number(claimResult?.numUpdatedRows ?? 0) === 0) {\n throw conflict('Notification action already executed')\n }\n\n // The claim is provisional: if the side-effecting command fails, the action\n // never actually completed, so release the claim to its prior state. This\n // lets the user retry the action instead of the notification being locked as\n // `actioned` forever. Only release while we still own the claim\n // (status = 'actioned'), so a concurrent winner's state is never clobbered.\n const releaseClaim = async () => {\n await getDb(em)\n .updateTable('notifications' as any)\n .set({\n status: previousStatus,\n actioned_at: previousActionedAt,\n action_taken: previousActionTaken,\n } as any)\n .where('id' as any, '=', notification.id)\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '=', 'actioned')\n .executeTakeFirst()\n }\n\n let result: unknown = null\n\n if (action.commandId && commandBus && container) {\n const commandInput = {\n id: notification.sourceEntityId,\n ...input.payload,\n }\n\n // Build a CommandRuntimeContext from the notification service context\n const commandCtx = {\n container,\n auth: {\n sub: ctx.userId,\n tenantId: ctx.tenantId,\n orgId: ctx.organizationId,\n },\n organizationScope: null,\n selectedOrganizationId: ctx.organizationId ?? null,\n organizationIds: ctx.organizationId ? [ctx.organizationId] : null,\n }\n\n let commandResult: { result: unknown }\n try {\n commandResult = await commandBus.execute(action.commandId, {\n input: commandInput,\n ctx: commandCtx,\n metadata: {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId,\n resourceKind: 'notifications',\n },\n })\n } catch (err) {\n // Never let a rollback failure mask the original command error \u2014 the\n // caller needs the real failure to decide whether to retry.\n try {\n await releaseClaim()\n } catch (releaseErr) {\n debug('failed to release notification action claim', releaseErr)\n }\n throw err\n }\n\n result = commandResult.result\n }\n\n notification.status = 'actioned'\n notification.actionedAt = actionedAt\n notification.actionTaken = input.actionId\n notification.actionResult = result as Record<string, unknown>\n\n if (!notification.readAt) {\n notification.readAt = new Date()\n }\n\n await em.flush()\n\n await invalidateNotificationCache(container, ctx, 'updated', notification.id)\n await eventBus.emit(NOTIFICATION_EVENTS.ACTIONED, {\n notificationId: notification.id,\n actionId: input.actionId,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n return { notification, result }\n },\n\n async getUnreadCount(ctx) {\n const em = rootEm.fork()\n return em.count(Notification, {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n status: 'unread',\n ...buildNotificationReadScopeWhere(ctx),\n })\n },\n\n async getPollData(ctx, since) {\n const em = rootEm.fork()\n const filters: Record<string, unknown> = {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n ...buildNotificationReadScopeWhere(ctx),\n }\n\n if (since) {\n filters.createdAt = { $gt: new Date(since) }\n }\n\n const [notifications, unreadCount] = await Promise.all([\n em.find(Notification, filters, {\n orderBy: { createdAt: 'desc' },\n limit: 50,\n }),\n em.count(Notification, {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n status: 'unread',\n ...buildNotificationReadScopeWhere(ctx),\n }),\n ])\n\n const recent = notifications.map(toNotificationDto)\n const hasNew = since ? recent.length > 0 : false\n\n return {\n unreadCount,\n recent,\n hasNew,\n lastId: recent[0]?.id,\n }\n },\n\n async cleanupExpired() {\n const em = rootEm.fork()\n const db = getDb(em)\n\n const affectedScopes = await db\n .selectFrom('notifications' as any)\n .select([\n 'tenant_id' as any,\n 'organization_id' as any,\n ])\n .where('expires_at' as any, '<', sql`now()`)\n .where('status' as any, 'not in', ['actioned', 'dismissed'])\n .distinct()\n .execute() as Array<{ tenant_id: string; organization_id: string | null }>\n\n if (!affectedScopes.length) return 0\n\n const updateResult = await db\n .updateTable('notifications' as any)\n .set({\n status: 'dismissed',\n dismissed_at: sql`now()`,\n } as any)\n .where('expires_at' as any, '<', sql`now()`)\n .where('status' as any, 'not in', ['actioned', 'dismissed'])\n .executeTakeFirst() as { numUpdatedRows?: bigint | number } | undefined\n\n for (const scope of affectedScopes) {\n await invalidateNotificationCache(container, {\n tenantId: scope.tenant_id,\n organizationId: scope.organization_id,\n }, 'updated')\n }\n\n return Number(updateResult?.numUpdatedRows ?? 0)\n },\n\n async deleteBySource(sourceEntityType, sourceEntityId, ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n\n const deleteResult = await db\n .deleteFrom('notifications' as any)\n .where('source_entity_type' as any, '=', sourceEntityType)\n .where('source_entity_id' as any, '=', sourceEntityId)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .executeTakeFirst() as { numDeletedRows?: bigint | number } | undefined\n\n const deletedCount = Number(deleteResult?.numDeletedRows ?? 0)\n if (deletedCount > 0) {\n await invalidateNotificationCache(container, ctx, 'deleted')\n }\n\n return deletedCount\n },\n }\n}\n\n/**\n * Helper to create notification service from a DI container.\n * Use this in API routes and commands to avoid DI resolution issues.\n */\nexport function resolveNotificationService(container: {\n resolve: (name: string) => unknown\n}): NotificationService {\n const em = container.resolve('em') as EntityManager\n const eventBus = container.resolve('eventBus') as { emit: (event: string, payload: unknown) => Promise<void> }\n\n // commandBus may not be registered in all contexts, so resolve it safely\n let commandBus: NotificationServiceDeps['commandBus']\n try {\n commandBus = container.resolve('commandBus') as typeof commandBus\n } catch {\n // commandBus not available - actions with commandId won't work\n commandBus = undefined\n }\n\n return createNotificationService({ em, eventBus, commandBus, container })\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { type Kysely, sql } from 'kysely'\nimport { CrudHttpError, conflict } from '@open-mercato/shared/lib/crud/errors'\nimport { Notification, type NotificationStatus } from '../data/entities'\nimport type { CreateNotificationInput, CreateBatchNotificationInput, CreateRoleNotificationInput, CreateFeatureNotificationInput, ExecuteActionInput } from '../data/validators'\nimport type { NotificationPollData } from '@open-mercato/shared/modules/notifications/types'\nimport { NOTIFICATION_EVENTS, NOTIFICATION_SSE_EVENTS } from './events'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport {\n buildNotificationEntity,\n emitNotificationCreated,\n emitNotificationCreatedBatch,\n type NotificationContentInput,\n type NotificationTenantContext,\n} from './notificationFactory'\nimport { toNotificationDto } from './notificationMapper'\nimport {\n getRecipientUserIdsForFeature,\n getRecipientUserIdsForRole,\n getScopedNotificationRecipientUserIds,\n} from './notificationRecipients'\nimport { assertSafeNotificationHref, sanitizeNotificationActions } from './safeHref'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('notifications').child({ component: 'service' })\n\nfunction debug(message: string, ...details: unknown[]): void {\n logger.debug(message, details.length ? { details } : undefined)\n}\n\nfunction getDb(em: EntityManager): Kysely<any> {\n return em.getKysely<any>()\n}\n\nconst UNIQUE_NOTIFICATION_ACTIVE_STATUSES: NotificationStatus[] = ['unread', 'read', 'actioned']\n\nfunction normalizeOrgScope(organizationId: string | null | undefined): string | null {\n return organizationId ?? null\n}\n\nasync function assertNotificationRecipientsInScope(\n em: EntityManager,\n recipientUserIds: string[],\n ctx: NotificationServiceContext,\n): Promise<void> {\n const scopedRecipientUserIds = await getScopedNotificationRecipientUserIds(\n getDb(em),\n ctx.tenantId,\n normalizeOrgScope(ctx.organizationId),\n recipientUserIds,\n )\n\n if (scopedRecipientUserIds.length !== recipientUserIds.length) {\n throw new CrudHttpError(404, { error: 'Notification recipient not found' })\n }\n}\n\nfunction applyNotificationContent(\n notification: Notification,\n input: NotificationContentInput,\n recipientUserId: string,\n ctx: NotificationTenantContext,\n) {\n const actions = sanitizeNotificationActions(input.actions)\n const linkHref = assertSafeNotificationHref(input.linkHref)\n\n notification.recipientUserId = recipientUserId\n notification.type = input.type\n notification.titleKey = input.titleKey\n notification.bodyKey = input.bodyKey\n notification.titleVariables = input.titleVariables\n notification.bodyVariables = input.bodyVariables\n notification.title = input.title || input.titleKey || ''\n notification.body = input.body\n notification.icon = input.icon\n notification.severity = input.severity ?? 'info'\n notification.actionData = actions\n ? {\n actions,\n primaryActionId: input.primaryActionId,\n }\n : null\n notification.sourceModule = input.sourceModule\n notification.sourceEntityType = input.sourceEntityType\n notification.sourceEntityId = input.sourceEntityId\n notification.linkHref = linkHref\n notification.groupKey = input.groupKey\n notification.expiresAt = input.expiresAt ? new Date(input.expiresAt) : null\n notification.tenantId = ctx.tenantId\n notification.organizationId = normalizeOrgScope(ctx.organizationId)\n notification.status = 'unread'\n notification.readAt = null\n notification.actionedAt = null\n notification.dismissedAt = null\n notification.actionTaken = null\n notification.actionResult = null\n notification.createdAt = new Date()\n}\n\nasync function findScopedNotificationOrThrow(\n em: EntityManager,\n notificationId: string,\n ctx: NotificationServiceContext,\n): Promise<Notification> {\n const notification = await findOneWithDecryption(\n em,\n Notification,\n {\n id: notificationId,\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n },\n undefined,\n {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId ?? null,\n },\n )\n if (!notification) {\n throw new CrudHttpError(404, { error: 'Notification not found' })\n }\n return notification\n}\n\nasync function emitNotificationSseEvents(\n eventBus: { emit: (event: string, payload: unknown) => Promise<void> },\n notifications: Notification[],\n ctx: NotificationServiceContext,\n recipientUserIds: string[],\n): Promise<void> {\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.BATCH_CREATED, {\n tenantId: ctx.tenantId,\n organizationId: normalizeOrgScope(ctx.organizationId),\n recipientUserIds,\n count: notifications.length,\n })\n\n for (const notification of notifications) {\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n }\n}\n\nasync function createOrRefreshNotification(\n em: EntityManager,\n input: NotificationContentInput,\n recipientUserId: string,\n ctx: NotificationTenantContext,\n): Promise<Notification> {\n if (input.groupKey && input.groupKey.trim().length > 0) {\n const orgScope = normalizeOrgScope(ctx.organizationId) ?? 'global'\n const lockKey = `notifications:${ctx.tenantId}:${orgScope}:${recipientUserId}:${input.type}:${input.groupKey}`\n try {\n const db = getDb(em)\n await sql`select pg_advisory_xact_lock(hashtext(${lockKey}))`.execute(db)\n } catch {\n // If advisory locks are unavailable, continue with best-effort dedupe.\n }\n\n const existing = await em.findOne(Notification, {\n recipientUserId,\n tenantId: ctx.tenantId,\n organizationId: normalizeOrgScope(ctx.organizationId),\n type: input.type,\n groupKey: input.groupKey,\n status: { $in: UNIQUE_NOTIFICATION_ACTIVE_STATUSES },\n }, {\n orderBy: { createdAt: 'desc' },\n })\n\n if (existing) {\n applyNotificationContent(existing, input, recipientUserId, ctx)\n return existing\n }\n }\n\n return buildNotificationEntity(em, input, recipientUserId, ctx)\n}\n\nexport interface NotificationServiceContext {\n tenantId: string\n organizationId?: string | null\n userId?: string | null\n}\n\nexport interface NotificationService {\n create(input: CreateNotificationInput, ctx: NotificationServiceContext): Promise<Notification>\n createBatch(input: CreateBatchNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n createForRole(input: CreateRoleNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n createForFeature(input: CreateFeatureNotificationInput, ctx: NotificationServiceContext): Promise<Notification[]>\n markAsRead(notificationId: string, ctx: NotificationServiceContext): Promise<Notification>\n markAllAsRead(ctx: NotificationServiceContext): Promise<number>\n dismiss(notificationId: string, ctx: NotificationServiceContext): Promise<Notification>\n restoreDismissed(\n notificationId: string,\n status: 'read' | 'unread' | undefined,\n ctx: NotificationServiceContext\n ): Promise<Notification>\n executeAction(\n notificationId: string,\n input: ExecuteActionInput,\n ctx: NotificationServiceContext\n ): Promise<{ notification: Notification; result: unknown }>\n getUnreadCount(ctx: NotificationServiceContext): Promise<number>\n getPollData(ctx: NotificationServiceContext, since?: string): Promise<NotificationPollData>\n cleanupExpired(): Promise<number>\n deleteBySource(\n sourceEntityType: string,\n sourceEntityId: string,\n ctx: NotificationServiceContext\n ): Promise<number>\n}\n\nexport interface NotificationServiceDeps {\n em: EntityManager\n eventBus: { emit: (event: string, payload: unknown) => Promise<void> }\n commandBus?: {\n execute: (\n commandId: string,\n options: { input: unknown; ctx: unknown; metadata?: unknown }\n ) => Promise<{ result: unknown }>\n }\n container?: { resolve: (name: string) => unknown }\n}\n\nexport function createNotificationService(deps: NotificationServiceDeps): NotificationService {\n const { em: rootEm, eventBus, commandBus, container } = deps\n\n return {\n async create(input, ctx) {\n const { recipientUserId, ...content } = input\n const writeEm = rootEm.fork()\n const notification = await writeEm.transactional(async (tx) => {\n await assertNotificationRecipientsInScope(tx, [recipientUserId], ctx)\n const entity = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n await tx.flush()\n return entity\n })\n\n await emitNotificationCreated(eventBus, notification, ctx)\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n\n return notification\n },\n\n async createBatch(input, ctx) {\n const recipientUserIds = Array.from(new Set(input.recipientUserIds))\n const { recipientUserIds: _recipientUserIds, ...content } = input\n const notifications: Notification[] = []\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n await assertNotificationRecipientsInScope(tx, recipientUserIds, ctx)\n for (const recipientUserId of recipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, recipientUserIds)\n\n return notifications\n },\n\n async createForRole(input, ctx) {\n const em = rootEm.fork()\n\n const db = getDb(em)\n const recipientUserIds = await getRecipientUserIdsForRole(db, ctx.tenantId, input.roleId)\n if (recipientUserIds.length === 0) {\n return []\n }\n\n const { roleId: _roleId, ...content } = input\n const notifications: Notification[] = []\n const uniqueRecipientUserIds = Array.from(new Set(recipientUserIds))\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n for (const recipientUserId of uniqueRecipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, uniqueRecipientUserIds)\n\n return notifications\n },\n\n async createForFeature(input, ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n const recipientUserIds = await getRecipientUserIdsForFeature(db, ctx.tenantId, input.requiredFeature)\n\n if (recipientUserIds.length === 0) {\n debug('No users found with feature:', input.requiredFeature, 'in tenant:', ctx.tenantId)\n return []\n }\n\n debug('Creating notifications for', recipientUserIds.length, 'user(s) with feature:', input.requiredFeature)\n\n const { requiredFeature: _requiredFeature, ...content } = input\n const notifications: Notification[] = []\n const uniqueRecipientUserIds = Array.from(new Set(recipientUserIds))\n const writeEm = rootEm.fork()\n\n await writeEm.transactional(async (tx) => {\n for (const recipientUserId of uniqueRecipientUserIds) {\n const notification = await createOrRefreshNotification(tx, content, recipientUserId, ctx)\n notifications.push(notification)\n }\n await tx.flush()\n })\n\n await emitNotificationCreatedBatch(eventBus, notifications, ctx)\n await emitNotificationSseEvents(eventBus, notifications, ctx, uniqueRecipientUserIds)\n\n return notifications\n },\n\n async markAsRead(notificationId, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n if (notification.status === 'unread') {\n notification.status = 'read'\n notification.readAt = new Date()\n await em.flush()\n\n await eventBus.emit(NOTIFICATION_EVENTS.READ, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n }\n\n return notification\n },\n\n async markAllAsRead(ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n const applyScope = <QB extends { where: (...args: any[]) => QB }>(q: QB): QB => {\n let chain = q\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '=', 'unread')\n if (ctx.organizationId) {\n chain = chain.where('organization_id' as any, '=', ctx.organizationId)\n }\n return chain\n }\n\n const targetRows = await applyScope(\n db\n .selectFrom('notifications' as any)\n .select([\n 'id' as any,\n 'organization_id' as any,\n 'recipient_user_id' as any,\n ]),\n ).execute() as Array<{ id: string }>\n\n if (!targetRows.length) {\n return 0\n }\n\n const updateResult = await applyScope(\n db.updateTable('notifications' as any).set({\n status: 'read',\n read_at: sql`now()`,\n } as any) as any,\n ).executeTakeFirst() as { numUpdatedRows?: bigint | number } | undefined\n const result = Number(updateResult?.numUpdatedRows ?? targetRows.length)\n\n const notifications = await findWithDecryption(em, Notification, {\n id: { $in: targetRows.map((row) => row.id) },\n }, undefined, {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId ?? null,\n })\n\n for (const notification of notifications) {\n await eventBus.emit(NOTIFICATION_EVENTS.READ, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n await eventBus.emit(NOTIFICATION_SSE_EVENTS.CREATED, {\n tenantId: notification.tenantId,\n organizationId: notification.organizationId ?? null,\n recipientUserId: notification.recipientUserId,\n notification: toNotificationDto(notification),\n })\n }\n\n return result\n },\n\n async dismiss(notificationId, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n notification.status = 'dismissed'\n notification.dismissedAt = new Date()\n await em.flush()\n\n await eventBus.emit(NOTIFICATION_EVENTS.DISMISSED, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n return notification\n },\n\n async restoreDismissed(notificationId, status, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n if (notification.status !== 'dismissed') {\n return notification\n }\n\n const targetStatus = status ?? 'read'\n notification.status = targetStatus\n notification.dismissedAt = null\n\n if (targetStatus === 'unread') {\n notification.readAt = null\n } else if (!notification.readAt) {\n notification.readAt = new Date()\n }\n\n await em.flush()\n\n await eventBus.emit(NOTIFICATION_EVENTS.RESTORED, {\n notificationId: notification.id,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n status: targetStatus,\n })\n\n return notification\n },\n\n async executeAction(notificationId, input, ctx) {\n const em = rootEm.fork()\n const notification = await findScopedNotificationOrThrow(em, notificationId, ctx)\n\n const actionData = notification.actionData\n const action = actionData?.actions?.find((a) => a.id === input.actionId)\n\n if (!action) {\n throw new Error('Action not found')\n }\n\n // Reject an already-actioned notification before dispatching the command,\n // so a retry or double-click cannot re-run the side effect.\n if (notification.status === 'actioned') {\n throw conflict('Notification action already executed')\n }\n\n const actionedAt = new Date()\n const previousStatus = notification.status\n const previousActionedAt = notification.actionedAt ?? null\n const previousActionTaken = notification.actionTaken ?? null\n\n // Atomically claim the notification so only one concurrent request can run\n // the side-effecting command. The conditional UPDATE matches only while the\n // notification has not been actioned yet; a losing request updates 0 rows.\n const claimResult = (await getDb(em)\n .updateTable('notifications' as any)\n .set({\n status: 'actioned',\n actioned_at: actionedAt,\n action_taken: input.actionId,\n } as any)\n .where('id' as any, '=', notification.id)\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '!=', 'actioned')\n .executeTakeFirst()) as { numUpdatedRows?: bigint | number } | undefined\n\n if (Number(claimResult?.numUpdatedRows ?? 0) === 0) {\n throw conflict('Notification action already executed')\n }\n\n // The claim is provisional: if the side-effecting command fails, the action\n // never actually completed, so release the claim to its prior state. This\n // lets the user retry the action instead of the notification being locked as\n // `actioned` forever. Only release while we still own the claim\n // (status = 'actioned'), so a concurrent winner's state is never clobbered.\n const releaseClaim = async () => {\n await getDb(em)\n .updateTable('notifications' as any)\n .set({\n status: previousStatus,\n actioned_at: previousActionedAt,\n action_taken: previousActionTaken,\n } as any)\n .where('id' as any, '=', notification.id)\n .where('recipient_user_id' as any, '=', ctx.userId as any)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .where('status' as any, '=', 'actioned')\n .executeTakeFirst()\n }\n\n let result: unknown = null\n\n if (action.commandId && commandBus && container) {\n const commandInput = {\n id: notification.sourceEntityId,\n ...input.payload,\n }\n\n // Build a CommandRuntimeContext from the notification service context\n const commandCtx = {\n container,\n auth: {\n sub: ctx.userId,\n tenantId: ctx.tenantId,\n orgId: ctx.organizationId,\n },\n organizationScope: null,\n selectedOrganizationId: ctx.organizationId ?? null,\n organizationIds: ctx.organizationId ? [ctx.organizationId] : null,\n }\n\n let commandResult: { result: unknown }\n try {\n commandResult = await commandBus.execute(action.commandId, {\n input: commandInput,\n ctx: commandCtx,\n metadata: {\n tenantId: ctx.tenantId,\n organizationId: ctx.organizationId,\n resourceKind: 'notifications',\n },\n })\n } catch (err) {\n // Never let a rollback failure mask the original command error \u2014 the\n // caller needs the real failure to decide whether to retry.\n try {\n await releaseClaim()\n } catch (releaseErr) {\n debug('failed to release notification action claim', releaseErr)\n }\n throw err\n }\n\n result = commandResult.result\n }\n\n notification.status = 'actioned'\n notification.actionedAt = actionedAt\n notification.actionTaken = input.actionId\n notification.actionResult = result as Record<string, unknown>\n\n if (!notification.readAt) {\n notification.readAt = new Date()\n }\n\n await em.flush()\n\n await eventBus.emit(NOTIFICATION_EVENTS.ACTIONED, {\n notificationId: notification.id,\n actionId: input.actionId,\n userId: ctx.userId,\n tenantId: ctx.tenantId,\n })\n\n return { notification, result }\n },\n\n async getUnreadCount(ctx) {\n const em = rootEm.fork()\n return em.count(Notification, {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n status: 'unread',\n })\n },\n\n async getPollData(ctx, since) {\n const em = rootEm.fork()\n const filters: Record<string, unknown> = {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n }\n\n if (since) {\n filters.createdAt = { $gt: new Date(since) }\n }\n\n const [notifications, unreadCount] = await Promise.all([\n em.find(Notification, filters, {\n orderBy: { createdAt: 'desc' },\n limit: 50,\n }),\n em.count(Notification, {\n recipientUserId: ctx.userId,\n tenantId: ctx.tenantId,\n status: 'unread',\n }),\n ])\n\n const recent = notifications.map(toNotificationDto)\n const hasNew = since ? recent.length > 0 : false\n\n return {\n unreadCount,\n recent,\n hasNew,\n lastId: recent[0]?.id,\n }\n },\n\n async cleanupExpired() {\n const em = rootEm.fork()\n const db = getDb(em)\n\n const updateResult = await db\n .updateTable('notifications' as any)\n .set({\n status: 'dismissed',\n dismissed_at: sql`now()`,\n } as any)\n .where('expires_at' as any, '<', sql`now()`)\n .where('status' as any, 'not in', ['actioned', 'dismissed'])\n .executeTakeFirst() as { numUpdatedRows?: bigint | number } | undefined\n\n return Number(updateResult?.numUpdatedRows ?? 0)\n },\n\n async deleteBySource(sourceEntityType, sourceEntityId, ctx) {\n const em = rootEm.fork()\n const db = getDb(em)\n\n const deleteResult = await db\n .deleteFrom('notifications' as any)\n .where('source_entity_type' as any, '=', sourceEntityType)\n .where('source_entity_id' as any, '=', sourceEntityId)\n .where('tenant_id' as any, '=', ctx.tenantId)\n .executeTakeFirst() as { numDeletedRows?: bigint | number } | undefined\n\n return Number(deleteResult?.numDeletedRows ?? 0)\n },\n }\n}\n\n/**\n * Helper to create notification service from a DI container.\n * Use this in API routes and commands to avoid DI resolution issues.\n */\nexport function resolveNotificationService(container: {\n resolve: (name: string) => unknown\n}): NotificationService {\n const em = container.resolve('em') as EntityManager\n const eventBus = container.resolve('eventBus') as { emit: (event: string, payload: unknown) => Promise<void> }\n\n // commandBus may not be registered in all contexts, so resolve it safely\n let commandBus: NotificationServiceDeps['commandBus']\n try {\n commandBus = container.resolve('commandBus') as typeof commandBus\n } catch {\n // commandBus not available - actions with commandId won't work\n commandBus = undefined\n }\n\n return createNotificationService({ em, eventBus, commandBus, container })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,6 @@ import { resolveRequestContext } from "@open-mercato/shared/lib/api/context";
3
3
  import { isCrudHttpError } from "@open-mercato/shared/lib/crud/errors";
4
4
  import { runRouteMutationGuards } from "@open-mercato/shared/lib/crud/route-mutation-guard";
5
5
  import { resolveTranslations } from "@open-mercato/shared/lib/i18n/server";
6
- import { resolveOrganizationScopeForRequest } from "@open-mercato/core/modules/directory/utils/organizationScope";
7
6
  import { resolveNotificationService } from "./notificationService.js";
8
7
  const NOTIFICATION_RESOURCE_KIND = "notifications.notification";
9
8
  const NOTIFICATION_SETTINGS_RESOURCE_KIND = "notifications.settings";
@@ -28,24 +27,11 @@ function notificationCrudErrorResponse(error) {
28
27
  }
29
28
  async function resolveNotificationContext(req) {
30
29
  const { ctx } = await resolveRequestContext(req);
31
- const organizationScope = await resolveOrganizationScopeForRequest({
32
- container: ctx.container,
33
- auth: ctx.auth,
34
- request: req,
35
- ...ctx.selectedOrganizationId === void 0 ? {} : { selectedId: ctx.selectedOrganizationId }
36
- });
37
- const tenantId = organizationScope.tenantId ?? ctx.auth?.tenantId ?? "";
38
- const organizationId = organizationScope.selectedId;
39
- const organizationIds = organizationScope.filterIds;
40
- ctx.organizationScope = organizationScope;
41
- ctx.selectedOrganizationId = organizationId;
42
- ctx.organizationIds = organizationIds;
43
30
  return {
44
31
  service: resolveNotificationService(ctx.container),
45
32
  scope: {
46
- tenantId,
47
- organizationId,
48
- organizationIds,
33
+ tenantId: ctx.auth?.tenantId ?? "",
34
+ organizationId: ctx.selectedOrganizationId ?? null,
49
35
  userId: ctx.auth?.sub ?? null
50
36
  },
51
37
  ctx
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/notifications/lib/routeHelpers.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport type { AwilixContainer } from 'awilix'\nimport { resolveRequestContext } from '@open-mercato/shared/lib/api/context'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { runRouteMutationGuards } from '@open-mercato/shared/lib/crud/route-mutation-guard'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { resolveNotificationService, type NotificationService } from './notificationService'\n\n/**\n * Mutation-guard resource kind for notification rows.\n */\nexport const NOTIFICATION_RESOURCE_KIND = 'notifications.notification'\n\n/**\n * Mutation-guard resource kind for notification delivery settings.\n */\nexport const NOTIFICATION_SETTINGS_RESOURCE_KIND = 'notifications.settings'\n\n/**\n * Notification scope context for service calls\n */\nexport interface NotificationScope {\n tenantId: string\n organizationId: string | null\n organizationIds?: string[] | null\n userId: string | null\n}\n\n/**\n * Resolved notification context from a request\n */\nexport interface NotificationRequestContext {\n service: NotificationService\n scope: NotificationScope\n ctx: Awaited<ReturnType<typeof resolveRequestContext>>['ctx']\n}\n\nfunction formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length ? `${issue.path.join('.')}: ` : ''\n return `${path}${issue.message}`\n })\n .join('; ')\n}\n\nexport async function notificationValidationErrorResponse(error: z.ZodError): Promise<Response> {\n const { t } = await resolveTranslations()\n const prefix = t('api.errors.invalidPayload', 'Invalid request body')\n const details = formatZodIssues(error)\n return Response.json(\n { error: details ? `${prefix}: ${details}` : prefix },\n { status: 400 },\n )\n}\n\nexport function notificationCrudErrorResponse(error: unknown): Response | null {\n if (!isCrudHttpError(error)) return null\n return Response.json(error.body ?? { error: 'Notification request failed' }, { status: error.status })\n}\n\n/**\n * Resolve notification service and scope from a request.\n * Centralizes the common pattern used across all notification API routes.\n */\nexport async function resolveNotificationContext(req: Request): Promise<NotificationRequestContext> {\n const { ctx } = await resolveRequestContext(req)\n const organizationScope = await resolveOrganizationScopeForRequest({\n container: ctx.container,\n auth: ctx.auth,\n request: req,\n ...(ctx.selectedOrganizationId === undefined\n ? {}\n : { selectedId: ctx.selectedOrganizationId }),\n })\n const tenantId = organizationScope.tenantId ?? ctx.auth?.tenantId ?? ''\n const organizationId = organizationScope.selectedId\n const organizationIds = organizationScope.filterIds\n ctx.organizationScope = organizationScope\n ctx.selectedOrganizationId = organizationId\n ctx.organizationIds = organizationIds\n return {\n service: resolveNotificationService(ctx.container),\n scope: {\n tenantId,\n organizationId,\n organizationIds,\n userId: ctx.auth?.sub ?? null,\n },\n ctx,\n }\n}\n\n/**\n * Mutation-guard options for a notification write.\n */\nexport interface NotificationMutationGuardOptions {\n resourceKind: string\n resourceId?: string | null\n operation: 'create' | 'update' | 'delete' | 'custom'\n payload?: Record<string, unknown> | null\n}\n\nexport type GuardedNotificationWriteResult<T> =\n | { ok: true; result: T }\n | { ok: false; response: Response }\n\n/**\n * Run a notification write through the mutation guard lifecycle.\n * Validates before the mutation, performs the write, then runs after-success\n * hooks only when the write succeeded and the guard requested them. Returns the\n * guard's own block response when validation fails so authorization behavior and\n * conflict shapes are preserved.\n */\nexport async function runGuardedNotificationWrite<T>(\n container: AwilixContainer,\n scope: NotificationScope,\n req: Request,\n options: NotificationMutationGuardOptions,\n write: () => Promise<T>,\n): Promise<GuardedNotificationWriteResult<T>> {\n const guarded = await runRouteMutationGuards({\n container,\n req,\n auth: {\n userId: scope.userId ?? '',\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n },\n input: {\n resourceKind: options.resourceKind,\n resourceId: options.resourceId ?? null,\n operation: options.operation,\n mutationPayload: options.payload ?? null,\n },\n })\n if (!guarded.ok) {\n return { ok: false, response: guarded.response }\n }\n\n const result = await write()\n\n await guarded.runAfterSuccess()\n\n return { ok: true, result }\n}\n\n/**\n * Create a POST handler for bulk notification creation routes.\n * Used by batch, role, and feature notification endpoints.\n */\nexport function createBulkNotificationRoute<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n serviceMethod: 'createBatch' | 'createForRole' | 'createForFeature'\n) {\n return async function POST(req: Request) {\n const { service, scope, ctx } = await resolveNotificationContext(req)\n\n const body = await req.json().catch(() => ({}))\n const parsed = schema.safeParse(body)\n if (!parsed.success) {\n return notificationValidationErrorResponse(parsed.error)\n }\n\n try {\n const guarded = await runGuardedNotificationWrite(\n ctx.container,\n scope,\n req,\n {\n resourceKind: NOTIFICATION_RESOURCE_KIND,\n operation: 'create',\n payload: parsed.data as Record<string, unknown>,\n },\n () => service[serviceMethod](parsed.data as never, scope),\n )\n if (!guarded.ok) return guarded.response\n const notifications = guarded.result\n\n return Response.json({\n ok: true,\n count: notifications.length,\n ids: notifications.map((n) => n.id),\n }, { status: 201 })\n } catch (error) {\n const errorResponse = notificationCrudErrorResponse(error)\n if (errorResponse) return errorResponse\n throw error\n }\n }\n}\n\n/**\n * Create OpenAPI spec for bulk notification creation routes.\n */\nexport function createBulkNotificationOpenApi<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n summary: string,\n description?: string\n) {\n return {\n POST: {\n summary,\n description,\n tags: ['Notifications'],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema,\n },\n },\n },\n responses: {\n 201: {\n description: 'Notifications created',\n content: {\n 'application/json': {\n schema: z.object({\n ok: z.boolean(),\n count: z.number(),\n ids: z.array(z.string().uuid()),\n }),\n },\n },\n },\n },\n },\n }\n}\n\n/**\n * Create a PUT handler for single notification action routes.\n * Used by read and dismiss endpoints.\n */\nexport function createSingleNotificationActionRoute(\n serviceMethod: 'markAsRead' | 'dismiss'\n) {\n return async function PUT(req: Request, { params }: { params: Promise<{ id: string }> }) {\n const { id } = await params\n const { service, scope, ctx } = await resolveNotificationContext(req)\n\n try {\n const guarded = await runGuardedNotificationWrite(\n ctx.container,\n scope,\n req,\n {\n resourceKind: NOTIFICATION_RESOURCE_KIND,\n resourceId: id,\n operation: 'update',\n },\n () => service[serviceMethod](id, scope),\n )\n if (!guarded.ok) return guarded.response\n } catch (error) {\n const errorResponse = notificationCrudErrorResponse(error)\n if (errorResponse) return errorResponse\n throw error\n }\n\n return Response.json({ ok: true })\n }\n}\n\n/**\n * Create OpenAPI spec for single notification action routes.\n */\nexport function createSingleNotificationActionOpenApi(\n summary: string,\n description: string\n) {\n return {\n PUT: {\n summary,\n tags: ['Notifications'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string', format: 'uuid' },\n },\n ],\n responses: {\n 200: {\n description,\n content: {\n 'application/json': {\n schema: z.object({ ok: z.boolean() }),\n },\n },\n },\n },\n },\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type { AwilixContainer } from 'awilix'\nimport { resolveRequestContext } from '@open-mercato/shared/lib/api/context'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { runRouteMutationGuards } from '@open-mercato/shared/lib/crud/route-mutation-guard'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { resolveNotificationService, type NotificationService } from './notificationService'\n\n/**\n * Mutation-guard resource kind for notification rows.\n */\nexport const NOTIFICATION_RESOURCE_KIND = 'notifications.notification'\n\n/**\n * Mutation-guard resource kind for notification delivery settings.\n */\nexport const NOTIFICATION_SETTINGS_RESOURCE_KIND = 'notifications.settings'\n\n/**\n * Notification scope context for service calls\n */\nexport interface NotificationScope {\n tenantId: string\n organizationId: string | null\n userId: string | null\n}\n\n/**\n * Resolved notification context from a request\n */\nexport interface NotificationRequestContext {\n service: NotificationService\n scope: NotificationScope\n ctx: Awaited<ReturnType<typeof resolveRequestContext>>['ctx']\n}\n\nfunction formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => {\n const path = issue.path.length ? `${issue.path.join('.')}: ` : ''\n return `${path}${issue.message}`\n })\n .join('; ')\n}\n\nexport async function notificationValidationErrorResponse(error: z.ZodError): Promise<Response> {\n const { t } = await resolveTranslations()\n const prefix = t('api.errors.invalidPayload', 'Invalid request body')\n const details = formatZodIssues(error)\n return Response.json(\n { error: details ? `${prefix}: ${details}` : prefix },\n { status: 400 },\n )\n}\n\nexport function notificationCrudErrorResponse(error: unknown): Response | null {\n if (!isCrudHttpError(error)) return null\n return Response.json(error.body ?? { error: 'Notification request failed' }, { status: error.status })\n}\n\n/**\n * Resolve notification service and scope from a request.\n * Centralizes the common pattern used across all notification API routes.\n */\nexport async function resolveNotificationContext(req: Request): Promise<NotificationRequestContext> {\n const { ctx } = await resolveRequestContext(req)\n return {\n service: resolveNotificationService(ctx.container),\n scope: {\n tenantId: ctx.auth?.tenantId ?? '',\n organizationId: ctx.selectedOrganizationId ?? null,\n userId: ctx.auth?.sub ?? null,\n },\n ctx,\n }\n}\n\n/**\n * Mutation-guard options for a notification write.\n */\nexport interface NotificationMutationGuardOptions {\n resourceKind: string\n resourceId?: string | null\n operation: 'create' | 'update' | 'delete' | 'custom'\n payload?: Record<string, unknown> | null\n}\n\nexport type GuardedNotificationWriteResult<T> =\n | { ok: true; result: T }\n | { ok: false; response: Response }\n\n/**\n * Run a notification write through the mutation guard lifecycle.\n * Validates before the mutation, performs the write, then runs after-success\n * hooks only when the write succeeded and the guard requested them. Returns the\n * guard's own block response when validation fails so authorization behavior and\n * conflict shapes are preserved.\n */\nexport async function runGuardedNotificationWrite<T>(\n container: AwilixContainer,\n scope: NotificationScope,\n req: Request,\n options: NotificationMutationGuardOptions,\n write: () => Promise<T>,\n): Promise<GuardedNotificationWriteResult<T>> {\n const guarded = await runRouteMutationGuards({\n container,\n req,\n auth: {\n userId: scope.userId ?? '',\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n },\n input: {\n resourceKind: options.resourceKind,\n resourceId: options.resourceId ?? null,\n operation: options.operation,\n mutationPayload: options.payload ?? null,\n },\n })\n if (!guarded.ok) {\n return { ok: false, response: guarded.response }\n }\n\n const result = await write()\n\n await guarded.runAfterSuccess()\n\n return { ok: true, result }\n}\n\n/**\n * Create a POST handler for bulk notification creation routes.\n * Used by batch, role, and feature notification endpoints.\n */\nexport function createBulkNotificationRoute<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n serviceMethod: 'createBatch' | 'createForRole' | 'createForFeature'\n) {\n return async function POST(req: Request) {\n const { service, scope, ctx } = await resolveNotificationContext(req)\n\n const body = await req.json().catch(() => ({}))\n const parsed = schema.safeParse(body)\n if (!parsed.success) {\n return notificationValidationErrorResponse(parsed.error)\n }\n\n try {\n const guarded = await runGuardedNotificationWrite(\n ctx.container,\n scope,\n req,\n {\n resourceKind: NOTIFICATION_RESOURCE_KIND,\n operation: 'create',\n payload: parsed.data as Record<string, unknown>,\n },\n () => service[serviceMethod](parsed.data as never, scope),\n )\n if (!guarded.ok) return guarded.response\n const notifications = guarded.result\n\n return Response.json({\n ok: true,\n count: notifications.length,\n ids: notifications.map((n) => n.id),\n }, { status: 201 })\n } catch (error) {\n const errorResponse = notificationCrudErrorResponse(error)\n if (errorResponse) return errorResponse\n throw error\n }\n }\n}\n\n/**\n * Create OpenAPI spec for bulk notification creation routes.\n */\nexport function createBulkNotificationOpenApi<TSchema extends z.ZodTypeAny>(\n schema: TSchema,\n summary: string,\n description?: string\n) {\n return {\n POST: {\n summary,\n description,\n tags: ['Notifications'],\n requestBody: {\n required: true,\n content: {\n 'application/json': {\n schema,\n },\n },\n },\n responses: {\n 201: {\n description: 'Notifications created',\n content: {\n 'application/json': {\n schema: z.object({\n ok: z.boolean(),\n count: z.number(),\n ids: z.array(z.string().uuid()),\n }),\n },\n },\n },\n },\n },\n }\n}\n\n/**\n * Create a PUT handler for single notification action routes.\n * Used by read and dismiss endpoints.\n */\nexport function createSingleNotificationActionRoute(\n serviceMethod: 'markAsRead' | 'dismiss'\n) {\n return async function PUT(req: Request, { params }: { params: Promise<{ id: string }> }) {\n const { id } = await params\n const { service, scope, ctx } = await resolveNotificationContext(req)\n\n try {\n const guarded = await runGuardedNotificationWrite(\n ctx.container,\n scope,\n req,\n {\n resourceKind: NOTIFICATION_RESOURCE_KIND,\n resourceId: id,\n operation: 'update',\n },\n () => service[serviceMethod](id, scope),\n )\n if (!guarded.ok) return guarded.response\n } catch (error) {\n const errorResponse = notificationCrudErrorResponse(error)\n if (errorResponse) return errorResponse\n throw error\n }\n\n return Response.json({ ok: true })\n }\n}\n\n/**\n * Create OpenAPI spec for single notification action routes.\n */\nexport function createSingleNotificationActionOpenApi(\n summary: string,\n description: string\n) {\n return {\n PUT: {\n summary,\n tags: ['Notifications'],\n parameters: [\n {\n name: 'id',\n in: 'path',\n required: true,\n schema: { type: 'string', format: 'uuid' },\n },\n ],\n responses: {\n 200: {\n description,\n content: {\n 'application/json': {\n schema: z.object({ ok: z.boolean() }),\n },\n },\n },\n },\n },\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -83,7 +83,7 @@ const openApi = {
83
83
  tags: [paymentGatewaysTag],
84
84
  responses: [
85
85
  { status: 200, description: "Payment captured" },
86
- { status: 409, description: "Invalid payment status transition, cumulative capture ceiling exceeded, or conflicting capture operation" },
86
+ { status: 409, description: "Invalid payment status transition" },
87
87
  { status: 422, description: "Invalid payload" },
88
88
  { status: 502, description: "Gateway provider error" }
89
89
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/payment_gateways/api/capture/route.ts"],
4
- "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { captureSchema } from '../../data/validators'\nimport type { PaymentGatewayService } from '../../lib/gateway-service'\nimport { paymentGatewaysTag } from '../openapi'\nimport {\n resolveUserFeatures,\n runPaymentGatewayMutationGuardAfterSuccess,\n runPaymentGatewayMutationGuards,\n} from '../guards'\n\nconst gatewayTransactionResourceKind = 'payment_gateways.gateway_transaction'\n\nexport const metadata = {\n path: '/payment_gateways/capture',\n POST: { requireAuth: true, requireFeatures: ['payment_gateways.capture'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const payload = await readJsonSafe<unknown>(req)\n const parsed = captureSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n\n const container = await createRequestContainer()\n const guardResult = await runPaymentGatewayMutationGuards(\n container,\n {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: parsed.data.transactionId,\n operation: 'update',\n requestMethod: req.method,\n requestHeaders: req.headers,\n mutationPayload: parsed.data as Record<string, unknown>,\n },\n resolveUserFeatures(auth),\n )\n if (!guardResult.ok) {\n return NextResponse.json(\n guardResult.errorBody ?? { error: 'Operation blocked by guard' },\n { status: guardResult.errorStatus ?? 422 },\n )\n }\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n\n try {\n const result = await service.capturePayment(\n parsed.data.transactionId,\n parsed.data.amount,\n { organizationId: auth.orgId as string, tenantId: auth.tenantId },\n parsed.data.operationId,\n )\n await runPaymentGatewayMutationGuardAfterSuccess(guardResult.afterSuccessCallbacks, {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: parsed.data.transactionId,\n operation: 'update',\n requestMethod: req.method,\n requestHeaders: req.headers,\n })\n return NextResponse.json(result)\n } catch (err: unknown) {\n if (isCrudHttpError(err)) {\n return NextResponse.json(err.body, { status: err.status })\n }\n const message = err instanceof Error ? err.message : 'Capture failed'\n return NextResponse.json({ error: message }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Capture an authorized payment',\n methods: {\n POST: {\n summary: 'Capture payment',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 200, description: 'Payment captured' },\n { status: 409, description: 'Invalid payment status transition, cumulative capture ceiling exceeded, or conflicting capture operation' },\n { status: 422, description: 'Invalid payload' },\n { status: 502, description: 'Gateway provider error' },\n ],\n },\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { captureSchema } from '../../data/validators'\nimport type { PaymentGatewayService } from '../../lib/gateway-service'\nimport { paymentGatewaysTag } from '../openapi'\nimport {\n resolveUserFeatures,\n runPaymentGatewayMutationGuardAfterSuccess,\n runPaymentGatewayMutationGuards,\n} from '../guards'\n\nconst gatewayTransactionResourceKind = 'payment_gateways.gateway_transaction'\n\nexport const metadata = {\n path: '/payment_gateways/capture',\n POST: { requireAuth: true, requireFeatures: ['payment_gateways.capture'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const payload = await readJsonSafe<unknown>(req)\n const parsed = captureSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n\n const container = await createRequestContainer()\n const guardResult = await runPaymentGatewayMutationGuards(\n container,\n {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: parsed.data.transactionId,\n operation: 'update',\n requestMethod: req.method,\n requestHeaders: req.headers,\n mutationPayload: parsed.data as Record<string, unknown>,\n },\n resolveUserFeatures(auth),\n )\n if (!guardResult.ok) {\n return NextResponse.json(\n guardResult.errorBody ?? { error: 'Operation blocked by guard' },\n { status: guardResult.errorStatus ?? 422 },\n )\n }\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n\n try {\n const result = await service.capturePayment(\n parsed.data.transactionId,\n parsed.data.amount,\n { organizationId: auth.orgId as string, tenantId: auth.tenantId },\n parsed.data.operationId,\n )\n await runPaymentGatewayMutationGuardAfterSuccess(guardResult.afterSuccessCallbacks, {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: parsed.data.transactionId,\n operation: 'update',\n requestMethod: req.method,\n requestHeaders: req.headers,\n })\n return NextResponse.json(result)\n } catch (err: unknown) {\n if (isCrudHttpError(err)) {\n return NextResponse.json(err.body, { status: err.status })\n }\n const message = err instanceof Error ? err.message : 'Capture failed'\n return NextResponse.json({ error: message }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Capture an authorized payment',\n methods: {\n POST: {\n summary: 'Capture payment',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 200, description: 'Payment captured' },\n { status: 409, description: 'Invalid payment status transition' },\n { status: 422, description: 'Invalid payload' },\n { status: 502, description: 'Gateway provider error' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,7 +2,6 @@ import { NextResponse } from "next/server";
2
2
  import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
3
3
  import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
4
4
  import { readJsonSafe } from "@open-mercato/shared/lib/http/readJsonSafe";
5
- import { isCrudHttpError } from "@open-mercato/shared/lib/crud/errors";
6
5
  import { createSessionSchema } from "../../data/validators.js";
7
6
  import { paymentGatewaysTag } from "../openapi.js";
8
7
  import {
@@ -87,10 +86,9 @@ async function POST(req) {
87
86
  paymentId: transaction.paymentId
88
87
  }, { status: 201 });
89
88
  } catch (err) {
90
- if (isCrudHttpError(err)) {
91
- return NextResponse.json(err.body, { status: err.status });
92
- }
93
- return NextResponse.json({ error: "Failed to create payment session" }, { status: 502 });
89
+ const message = err instanceof Error ? err.message : "Failed to create payment session";
90
+ const status = message.includes("No gateway adapter") ? 422 : 502;
91
+ return NextResponse.json({ error: message }, { status });
94
92
  }
95
93
  }
96
94
  const openApi = {
@@ -102,7 +100,6 @@ const openApi = {
102
100
  tags: [paymentGatewaysTag],
103
101
  responses: [
104
102
  { status: 201, description: "Payment session created" },
105
- { status: 409, description: "Amount or currency does not match the referenced order" },
106
103
  { status: 422, description: "Invalid payload or unknown provider" },
107
104
  { status: 502, description: "Gateway provider error" }
108
105
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/payment_gateways/api/sessions/route.ts"],
4
- "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { createSessionSchema } from '../../data/validators'\nimport type { PaymentGatewayService } from '../../lib/gateway-service'\nimport { paymentGatewaysTag } from '../openapi'\nimport {\n resolveUserFeatures,\n runPaymentGatewayMutationGuardAfterSuccess,\n runPaymentGatewayMutationGuards,\n} from '../guards'\n\nconst gatewayTransactionResourceKind = 'payment_gateways.gateway_transaction'\n\nexport const metadata = {\n path: '/payment_gateways/sessions',\n POST: { requireAuth: true, requireFeatures: ['payment_gateways.manage'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const payload = await readJsonSafe<unknown>(req)\n const parsed = createSessionSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n\n const container = await createRequestContainer()\n const guardResult = await runPaymentGatewayMutationGuards(\n container,\n {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: null,\n operation: 'create',\n requestMethod: req.method,\n requestHeaders: req.headers,\n mutationPayload: parsed.data as Record<string, unknown>,\n },\n resolveUserFeatures(auth),\n )\n if (!guardResult.ok) {\n return NextResponse.json(\n guardResult.errorBody ?? { error: 'Operation blocked by guard' },\n { status: guardResult.errorStatus ?? 422 },\n )\n }\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n\n try {\n const { transaction, session } = await service.createPaymentSession({\n providerKey: parsed.data.providerKey,\n paymentId: crypto.randomUUID(),\n orderId: parsed.data.orderId,\n amount: parsed.data.amount,\n currencyCode: parsed.data.currencyCode,\n captureMethod: parsed.data.captureMethod,\n description: parsed.data.description,\n successUrl: parsed.data.successUrl,\n cancelUrl: parsed.data.cancelUrl,\n metadata: parsed.data.metadata,\n presentation: parsed.data.presentation,\n organizationId: auth.orgId as string,\n tenantId: auth.tenantId,\n })\n\n const redirectUrl = session.redirectUrl\n ?? (session.clientSession?.type === 'redirect' ? session.clientSession.redirectUrl : null)\n\n await runPaymentGatewayMutationGuardAfterSuccess(guardResult.afterSuccessCallbacks, {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: transaction.id,\n operation: 'create',\n requestMethod: req.method,\n requestHeaders: req.headers,\n })\n\n return NextResponse.json({\n transactionId: transaction.id,\n sessionId: session.sessionId,\n providerKey: transaction.providerKey,\n clientSecret: session.clientSecret,\n redirectUrl,\n providerData: session.providerData ?? null,\n clientSession: session.clientSession ?? null,\n status: session.status,\n paymentId: transaction.paymentId,\n }, { status: 201 })\n } catch (err: unknown) {\n if (isCrudHttpError(err)) {\n return NextResponse.json(err.body, { status: err.status })\n }\n return NextResponse.json({ error: 'Failed to create payment session' }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Create a payment session via a gateway provider',\n methods: {\n POST: {\n summary: 'Create payment session',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 201, description: 'Payment session created' },\n { status: 409, description: 'Amount or currency does not match the referenced order' },\n { status: 422, description: 'Invalid payload or unknown provider' },\n { status: 502, description: 'Gateway provider error' },\n ],\n },\n },\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { createSessionSchema } from '../../data/validators'\nimport type { PaymentGatewayService } from '../../lib/gateway-service'\nimport { paymentGatewaysTag } from '../openapi'\nimport {\n resolveUserFeatures,\n runPaymentGatewayMutationGuardAfterSuccess,\n runPaymentGatewayMutationGuards,\n} from '../guards'\n\nconst gatewayTransactionResourceKind = 'payment_gateways.gateway_transaction'\n\nexport const metadata = {\n path: '/payment_gateways/sessions',\n POST: { requireAuth: true, requireFeatures: ['payment_gateways.manage'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const payload = await readJsonSafe<unknown>(req)\n const parsed = createSessionSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n\n const container = await createRequestContainer()\n const guardResult = await runPaymentGatewayMutationGuards(\n container,\n {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: null,\n operation: 'create',\n requestMethod: req.method,\n requestHeaders: req.headers,\n mutationPayload: parsed.data as Record<string, unknown>,\n },\n resolveUserFeatures(auth),\n )\n if (!guardResult.ok) {\n return NextResponse.json(\n guardResult.errorBody ?? { error: 'Operation blocked by guard' },\n { status: guardResult.errorStatus ?? 422 },\n )\n }\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n\n try {\n const { transaction, session } = await service.createPaymentSession({\n providerKey: parsed.data.providerKey,\n paymentId: crypto.randomUUID(),\n orderId: parsed.data.orderId,\n amount: parsed.data.amount,\n currencyCode: parsed.data.currencyCode,\n captureMethod: parsed.data.captureMethod,\n description: parsed.data.description,\n successUrl: parsed.data.successUrl,\n cancelUrl: parsed.data.cancelUrl,\n metadata: parsed.data.metadata,\n presentation: parsed.data.presentation,\n organizationId: auth.orgId as string,\n tenantId: auth.tenantId,\n })\n\n const redirectUrl = session.redirectUrl\n ?? (session.clientSession?.type === 'redirect' ? session.clientSession.redirectUrl : null)\n\n await runPaymentGatewayMutationGuardAfterSuccess(guardResult.afterSuccessCallbacks, {\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n userId: auth.sub ?? '',\n resourceKind: gatewayTransactionResourceKind,\n resourceId: transaction.id,\n operation: 'create',\n requestMethod: req.method,\n requestHeaders: req.headers,\n })\n\n return NextResponse.json({\n transactionId: transaction.id,\n sessionId: session.sessionId,\n providerKey: transaction.providerKey,\n clientSecret: session.clientSecret,\n redirectUrl,\n providerData: session.providerData ?? null,\n clientSession: session.clientSession ?? null,\n status: session.status,\n paymentId: transaction.paymentId,\n }, { status: 201 })\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : 'Failed to create payment session'\n const status = message.includes('No gateway adapter') ? 422 : 502\n return NextResponse.json({ error: message }, { status })\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Create a payment session via a gateway provider',\n methods: {\n POST: {\n summary: 'Create payment session',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 201, description: 'Payment session created' },\n { status: 422, description: 'Invalid payload or unknown provider' },\n { status: 502, description: 'Gateway provider error' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,6 @@ import { getPaymentGatewayQueue } from "../../../lib/queue.js";
9
9
  import { processPaymentGatewayWebhookJob } from "../../../lib/webhook-processor.js";
10
10
  import { paymentGatewaysTag } from "../../openapi.js";
11
11
  import { createLogger } from "@open-mercato/shared/lib/logger";
12
- import { readBoundedRequestBody, WebhookBodyTooLargeError } from "@open-mercato/shared/lib/webhooks";
13
12
  const logger = createLogger("payment_gateways").child({ component: "webhook" });
14
13
  const metadata = {
15
14
  path: "/payment_gateways/webhook/[provider]",
@@ -31,15 +30,7 @@ async function POST(req, { params }) {
31
30
  }
32
31
  const rateLimitResponse = await checkProviderWebhookRateLimit(container, req, providerKey);
33
32
  if (rateLimitResponse) return rateLimitResponse;
34
- let rawBody;
35
- try {
36
- rawBody = registration.maxBodyBytes === void 0 ? await req.text() : await readBoundedRequestBody(req, { maxBytes: registration.maxBodyBytes });
37
- } catch (error) {
38
- if (error instanceof WebhookBodyTooLargeError) {
39
- return NextResponse.json({ error: "Webhook payload too large" }, { status: 413 });
40
- }
41
- throw error;
42
- }
33
+ const rawBody = await req.text();
43
34
  const headers = {};
44
35
  req.headers.forEach((value, key) => {
45
36
  headers[key] = value;
@@ -135,7 +126,6 @@ const openApi = {
135
126
  responses: [
136
127
  { status: 202, description: "Webhook accepted for async processing" },
137
128
  { status: 401, description: "Signature verification failed" },
138
- { status: 413, description: "Webhook payload too large" },
139
129
  { status: 404, description: "Unknown provider" }
140
130
  ]
141
131
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/payment_gateways/api/webhook/%5Bprovider%5D/route.ts"],
4
- "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { checkRateLimit, getClientIp, RATE_LIMIT_ERROR_FALLBACK } from '@open-mercato/shared/lib/ratelimit/helpers'\nimport type { RateLimiterService } from '@open-mercato/shared/lib/ratelimit/service'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { getWebhookHandler } from '@open-mercato/shared/modules/payment_gateways/types'\nimport type { IntegrationLogService } from '../../../../integrations/lib/log-service'\nimport type { PaymentGatewayService } from '../../../lib/gateway-service'\nimport type { CredentialsService } from '../../../../integrations/lib/credentials-service'\nimport { GatewayTransaction } from '../../../data/entities'\nimport { getPaymentGatewayQueue } from '../../../lib/queue'\nimport { processPaymentGatewayWebhookJob } from '../../../lib/webhook-processor'\nimport { paymentGatewaysTag } from '../../openapi'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { readBoundedRequestBody, WebhookBodyTooLargeError } from '@open-mercato/shared/lib/webhooks'\n\nconst logger = createLogger('payment_gateways').child({ component: 'webhook' })\n\nexport const metadata = {\n path: '/payment_gateways/webhook/[provider]',\n POST: { requireAuth: false },\n}\n\nconst WEBHOOK_VERIFICATION_FAILED = 'Webhook verification failed'\n\nconst paymentGatewayWebhookRateLimitConfig = {\n points: 60,\n duration: 60,\n keyPrefix: 'payment_gateways:webhook',\n}\n\nexport async function POST(req: Request, { params }: { params: Promise<{ provider: string }> | { provider: string } }) {\n const resolvedParams = await params\n const providerKey = resolvedParams.provider\n const container = await createRequestContainer()\n const registration = getWebhookHandler(providerKey)\n if (!registration) {\n return NextResponse.json({ error: `No webhook handler for provider: ${providerKey}` }, { status: 404 })\n }\n\n const rateLimitResponse = await checkProviderWebhookRateLimit(container, req, providerKey)\n if (rateLimitResponse) return rateLimitResponse\n\n let rawBody: string\n try {\n rawBody = registration.maxBodyBytes === undefined\n ? await req.text()\n : await readBoundedRequestBody(req, { maxBytes: registration.maxBodyBytes })\n } catch (error) {\n if (error instanceof WebhookBodyTooLargeError) {\n return NextResponse.json({ error: 'Webhook payload too large' }, { status: 413 })\n }\n throw error\n }\n const headers: Record<string, string> = {}\n req.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n const em = container.resolve('em') as EntityManager\n const integrationCredentialsService = container.resolve('integrationCredentialsService') as CredentialsService\n const queue = getPaymentGatewayQueue(registration.queue ?? 'payment-gateways-webhook')\n const payload = await readJsonSafe<Record<string, unknown>>(rawBody)\n const sessionIdHint = registration.readSessionIdHint?.(payload) ?? null\n\n try {\n // The webhook endpoint is unauthenticated. Tenant/organization scope MUST come from a\n // GatewayTransaction whose per-tenant credentials successfully verify the inbound\n // signature \u2014 NEVER from attacker-controlled payload metadata. If no candidate\n // transaction can be located by the provider-reported session id, or no candidate's\n // credentials can verify the signature, we fail closed with 401. This prevents\n // forged webhooks (e.g. mock gateway PoC) from mutating another tenant's payment\n // state via `event.data.metadata.{organizationId,tenantId}`.\n const candidates = sessionIdHint\n ? await findWithDecryption(\n em,\n GatewayTransaction,\n {\n providerKey,\n providerSessionId: sessionIdHint,\n deletedAt: null,\n },\n { limit: 10, orderBy: { createdAt: 'desc' } },\n )\n : []\n\n let transaction: GatewayTransaction | null = null\n let matchedScope: { organizationId: string; tenantId: string } | null = null\n let event: Awaited<ReturnType<typeof registration.handler>> | null = null\n let lastVerificationError: unknown = null\n\n for (const candidate of candidates) {\n const candidateScope = { organizationId: candidate.organizationId, tenantId: candidate.tenantId }\n const credentials = await integrationCredentialsService.resolve(`gateway_${providerKey}`, candidateScope) ?? {}\n try {\n event = await registration.handler({ rawBody, headers, credentials })\n transaction = candidate\n matchedScope = candidateScope\n break\n } catch (error: unknown) {\n lastVerificationError = error\n }\n }\n\n if (!event || !transaction || !matchedScope) {\n throw lastVerificationError ?? new Error('Webhook verification failed: no matching transaction')\n }\n\n const scope = matchedScope\n\n const jobPayload = {\n providerKey,\n event,\n transactionId: transaction.id,\n scope,\n }\n\n if (process.env.QUEUE_STRATEGY === 'async') {\n await queue.enqueue({\n name: 'payment-gateway-webhook',\n payload: jobPayload,\n })\n } else {\n await processPaymentGatewayWebhookJob(\n {\n em: container.resolve('em') as EntityManager,\n paymentGatewayService: service,\n integrationLogService: container.resolve('integrationLogService') as IntegrationLogService,\n },\n jobPayload,\n )\n }\n\n return NextResponse.json({ received: true, queued: true }, { status: 202 })\n } catch (err: unknown) {\n logger.warn('Webhook verification failed', { providerKey, err })\n return NextResponse.json({ error: WEBHOOK_VERIFICATION_FAILED }, { status: 401 })\n }\n}\n\nasync function checkProviderWebhookRateLimit(\n container: { resolve: (name: string) => unknown },\n req: Request,\n providerKey: string,\n): Promise<NextResponse | null> {\n const rateLimiterService = tryResolve<RateLimiterService>(container, 'rateLimiterService')\n if (!rateLimiterService) return null\n\n return checkRateLimit(\n rateLimiterService,\n paymentGatewayWebhookRateLimitConfig,\n `${providerKey}:${getClientIp(req, rateLimiterService.trustProxyDepth) ?? 'unknown'}`,\n RATE_LIMIT_ERROR_FALLBACK,\n )\n}\n\nfunction tryResolve<T>(container: { resolve: (name: string) => unknown }, name: string): T | null {\n try {\n return container.resolve(name) as T\n } catch {\n return null\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Receive payment gateway webhook',\n methods: {\n POST: {\n summary: 'Process inbound webhook from payment provider',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 202, description: 'Webhook accepted for async processing' },\n { status: 401, description: 'Signature verification failed' },\n { status: 413, description: 'Webhook payload too large' },\n { status: 404, description: 'Unknown provider' },\n ],\n },\n },\n}\n\nexport default POST\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport { checkRateLimit, getClientIp, RATE_LIMIT_ERROR_FALLBACK } from '@open-mercato/shared/lib/ratelimit/helpers'\nimport type { RateLimiterService } from '@open-mercato/shared/lib/ratelimit/service'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { getWebhookHandler } from '@open-mercato/shared/modules/payment_gateways/types'\nimport type { IntegrationLogService } from '../../../../integrations/lib/log-service'\nimport type { PaymentGatewayService } from '../../../lib/gateway-service'\nimport type { CredentialsService } from '../../../../integrations/lib/credentials-service'\nimport { GatewayTransaction } from '../../../data/entities'\nimport { getPaymentGatewayQueue } from '../../../lib/queue'\nimport { processPaymentGatewayWebhookJob } from '../../../lib/webhook-processor'\nimport { paymentGatewaysTag } from '../../openapi'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('payment_gateways').child({ component: 'webhook' })\n\nexport const metadata = {\n path: '/payment_gateways/webhook/[provider]',\n POST: { requireAuth: false },\n}\n\nconst WEBHOOK_VERIFICATION_FAILED = 'Webhook verification failed'\n\nconst paymentGatewayWebhookRateLimitConfig = {\n points: 60,\n duration: 60,\n keyPrefix: 'payment_gateways:webhook',\n}\n\nexport async function POST(req: Request, { params }: { params: Promise<{ provider: string }> | { provider: string } }) {\n const resolvedParams = await params\n const providerKey = resolvedParams.provider\n const container = await createRequestContainer()\n const registration = getWebhookHandler(providerKey)\n if (!registration) {\n return NextResponse.json({ error: `No webhook handler for provider: ${providerKey}` }, { status: 404 })\n }\n\n const rateLimitResponse = await checkProviderWebhookRateLimit(container, req, providerKey)\n if (rateLimitResponse) return rateLimitResponse\n\n const rawBody = await req.text()\n const headers: Record<string, string> = {}\n req.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n const service = container.resolve('paymentGatewayService') as PaymentGatewayService\n const em = container.resolve('em') as EntityManager\n const integrationCredentialsService = container.resolve('integrationCredentialsService') as CredentialsService\n const queue = getPaymentGatewayQueue(registration.queue ?? 'payment-gateways-webhook')\n const payload = await readJsonSafe<Record<string, unknown>>(rawBody)\n const sessionIdHint = registration.readSessionIdHint?.(payload) ?? null\n\n try {\n // The webhook endpoint is unauthenticated. Tenant/organization scope MUST come from a\n // GatewayTransaction whose per-tenant credentials successfully verify the inbound\n // signature \u2014 NEVER from attacker-controlled payload metadata. If no candidate\n // transaction can be located by the provider-reported session id, or no candidate's\n // credentials can verify the signature, we fail closed with 401. This prevents\n // forged webhooks (e.g. mock gateway PoC) from mutating another tenant's payment\n // state via `event.data.metadata.{organizationId,tenantId}`.\n const candidates = sessionIdHint\n ? await findWithDecryption(\n em,\n GatewayTransaction,\n {\n providerKey,\n providerSessionId: sessionIdHint,\n deletedAt: null,\n },\n { limit: 10, orderBy: { createdAt: 'desc' } },\n )\n : []\n\n let transaction: GatewayTransaction | null = null\n let matchedScope: { organizationId: string; tenantId: string } | null = null\n let event: Awaited<ReturnType<typeof registration.handler>> | null = null\n let lastVerificationError: unknown = null\n\n for (const candidate of candidates) {\n const candidateScope = { organizationId: candidate.organizationId, tenantId: candidate.tenantId }\n const credentials = await integrationCredentialsService.resolve(`gateway_${providerKey}`, candidateScope) ?? {}\n try {\n event = await registration.handler({ rawBody, headers, credentials })\n transaction = candidate\n matchedScope = candidateScope\n break\n } catch (error: unknown) {\n lastVerificationError = error\n }\n }\n\n if (!event || !transaction || !matchedScope) {\n throw lastVerificationError ?? new Error('Webhook verification failed: no matching transaction')\n }\n\n const scope = matchedScope\n\n const jobPayload = {\n providerKey,\n event,\n transactionId: transaction.id,\n scope,\n }\n\n if (process.env.QUEUE_STRATEGY === 'async') {\n await queue.enqueue({\n name: 'payment-gateway-webhook',\n payload: jobPayload,\n })\n } else {\n await processPaymentGatewayWebhookJob(\n {\n em: container.resolve('em') as EntityManager,\n paymentGatewayService: service,\n integrationLogService: container.resolve('integrationLogService') as IntegrationLogService,\n },\n jobPayload,\n )\n }\n\n return NextResponse.json({ received: true, queued: true }, { status: 202 })\n } catch (err: unknown) {\n logger.warn('Webhook verification failed', { providerKey, err })\n return NextResponse.json({ error: WEBHOOK_VERIFICATION_FAILED }, { status: 401 })\n }\n}\n\nasync function checkProviderWebhookRateLimit(\n container: { resolve: (name: string) => unknown },\n req: Request,\n providerKey: string,\n): Promise<NextResponse | null> {\n const rateLimiterService = tryResolve<RateLimiterService>(container, 'rateLimiterService')\n if (!rateLimiterService) return null\n\n return checkRateLimit(\n rateLimiterService,\n paymentGatewayWebhookRateLimitConfig,\n `${providerKey}:${getClientIp(req, rateLimiterService.trustProxyDepth) ?? 'unknown'}`,\n RATE_LIMIT_ERROR_FALLBACK,\n )\n}\n\nfunction tryResolve<T>(container: { resolve: (name: string) => unknown }, name: string): T | null {\n try {\n return container.resolve(name) as T\n } catch {\n return null\n }\n}\n\nexport const openApi = {\n tags: [paymentGatewaysTag],\n summary: 'Receive payment gateway webhook',\n methods: {\n POST: {\n summary: 'Process inbound webhook from payment provider',\n tags: [paymentGatewaysTag],\n responses: [\n { status: 202, description: 'Webhook accepted for async processing' },\n { status: 401, description: 'Signature verification failed' },\n { status: 404, description: 'Unknown provider' },\n ],\n },\n },\n}\n\nexport default POST\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,6 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { extensionPoints } from "@open-mercato/core/modules/payment_gateways/extension-points";
5
4
  import { useSearchParams } from "next/navigation";
6
5
  import { Page, PageHeader, PageBody } from "@open-mercato/ui/backend/Page";
7
6
  import { DataTable } from "@open-mercato/ui/backend/DataTable";
@@ -353,7 +352,7 @@ function PaymentTransactionsPage() {
353
352
  setPage(1);
354
353
  },
355
354
  searchPlaceholder: t("payment_gateways.transactions.searchPlaceholder", "Search by payment, transaction, session, or gateway id"),
356
- perspective: { tableId: extensionPoints.hosts.transactionsTable.tableId },
355
+ perspective: { tableId: "payment_gateways.transactions.list" },
357
356
  pagination: { page, pageSize: 20, total, totalPages, onPageChange: setPage },
358
357
  isLoading,
359
358
  onRowClick: (row) => setSelectedId((current) => current === row.id ? null : row.id),
@@ -546,7 +545,7 @@ function PaymentTransactionsPage() {
546
545
  /* @__PURE__ */ jsx(
547
546
  InjectionSpot,
548
547
  {
549
- spotId: extensionPoints.hosts.transactionsAfter.spotId,
548
+ spotId: "admin.page:payment-gateways/transactions:after",
550
549
  context: { selectedPaymentId: detail.transaction.paymentId }
551
550
  }
552
551
  )