@open-mercato/core 0.6.8-develop.6983.1.e4f794099e → 0.6.8-develop.6985.1.fb93574faa

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 (597) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/notification/index.js +6 -0
  3. package/dist/generated/entities/notification/index.js.map +2 -2
  4. package/dist/generated/entities/notification_preference/index.js +19 -0
  5. package/dist/generated/entities/notification_preference/index.js.map +7 -0
  6. package/dist/generated/entities/notification_type/index.js +21 -0
  7. package/dist/generated/entities/notification_type/index.js.map +7 -0
  8. package/dist/generated/entities/notification_type_override/index.js +17 -0
  9. package/dist/generated/entities/notification_type_override/index.js.map +7 -0
  10. package/dist/generated/entities/push_notification_delivery/index.js +41 -0
  11. package/dist/generated/entities/push_notification_delivery/index.js.map +7 -0
  12. package/dist/generated/entities/user_device/index.js +35 -0
  13. package/dist/generated/entities/user_device/index.js.map +7 -0
  14. package/dist/generated/entities.ids.generated.js +12 -1
  15. package/dist/generated/entities.ids.generated.js.map +2 -2
  16. package/dist/generated/entity-fields-registry.js +72 -0
  17. package/dist/generated/entity-fields-registry.js.map +2 -2
  18. package/dist/helpers/integration/api.js +2 -1
  19. package/dist/helpers/integration/api.js.map +2 -2
  20. package/dist/helpers/integration/appRoot.js +9 -0
  21. package/dist/helpers/integration/appRoot.js.map +7 -0
  22. package/dist/helpers/integration/dbFixtures.js +1 -4
  23. package/dist/helpers/integration/dbFixtures.js.map +2 -2
  24. package/dist/helpers/integration/pushFake.js +126 -0
  25. package/dist/helpers/integration/pushFake.js.map +7 -0
  26. package/dist/modules/auth/notifications.js +16 -0
  27. package/dist/modules/auth/notifications.js.map +2 -2
  28. package/dist/modules/business_rules/notifications.js +2 -0
  29. package/dist/modules/business_rules/notifications.js.map +2 -2
  30. package/dist/modules/catalog/notifications.js +2 -0
  31. package/dist/modules/catalog/notifications.js.map +2 -2
  32. package/dist/modules/communication_channels/acl.js +9 -0
  33. package/dist/modules/communication_channels/acl.js.map +2 -2
  34. package/dist/modules/communication_channels/api/delete/admin/channels/[id]/route.js +133 -0
  35. package/dist/modules/communication_channels/api/delete/admin/channels/[id]/route.js.map +7 -0
  36. package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +6 -2
  37. package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +2 -2
  38. package/dist/modules/communication_channels/api/get/channels/[id]/route.js +6 -2
  39. package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +2 -2
  40. package/dist/modules/communication_channels/api/get/channels/route.js +2 -1
  41. package/dist/modules/communication_channels/api/get/channels/route.js.map +2 -2
  42. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +10 -5
  43. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
  44. package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +29 -1
  45. package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +2 -2
  46. package/dist/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.js +157 -0
  47. package/dist/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.js.map +7 -0
  48. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +8 -1
  49. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
  50. package/dist/modules/communication_channels/commands/admin-delete-channel.js +141 -0
  51. package/dist/modules/communication_channels/commands/admin-delete-channel.js.map +7 -0
  52. package/dist/modules/communication_channels/commands/connect-credential-channel.js +25 -8
  53. package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +2 -2
  54. package/dist/modules/communication_channels/commands/deliver-outbound-message.js +2 -2
  55. package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +2 -2
  56. package/dist/modules/communication_channels/commands/push-register.js +1 -1
  57. package/dist/modules/communication_channels/commands/push-register.js.map +2 -2
  58. package/dist/modules/communication_channels/commands/push-unregister.js +4 -3
  59. package/dist/modules/communication_channels/commands/push-unregister.js.map +2 -2
  60. package/dist/modules/communication_channels/data/entities.js +4 -0
  61. package/dist/modules/communication_channels/data/entities.js.map +2 -2
  62. package/dist/modules/communication_channels/data/validators.js +2 -1
  63. package/dist/modules/communication_channels/data/validators.js.map +2 -2
  64. package/dist/modules/communication_channels/lib/access-control.js +11 -1
  65. package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
  66. package/dist/modules/communication_channels/lib/connect-channel.js +20 -12
  67. package/dist/modules/communication_channels/lib/connect-channel.js.map +2 -2
  68. package/dist/modules/communication_channels/lib/push-adapter.js +68 -0
  69. package/dist/modules/communication_channels/lib/push-adapter.js.map +7 -0
  70. package/dist/modules/communication_channels/lib/push-capabilities.js +31 -0
  71. package/dist/modules/communication_channels/lib/push-capabilities.js.map +7 -0
  72. package/dist/modules/communication_channels/lib/push-connect-error.js +20 -0
  73. package/dist/modules/communication_channels/lib/push-connect-error.js.map +7 -0
  74. package/dist/modules/communication_channels/lib/push-credential-errors.js +41 -0
  75. package/dist/modules/communication_channels/lib/push-credential-errors.js.map +7 -0
  76. package/dist/modules/communication_channels/lib/push-envelope.js +46 -0
  77. package/dist/modules/communication_channels/lib/push-envelope.js.map +7 -0
  78. package/dist/modules/communication_channels/lib/refcounted-client-cache.js +64 -0
  79. package/dist/modules/communication_channels/lib/refcounted-client-cache.js.map +7 -0
  80. package/dist/modules/communication_channels/migrations/Migration20260703123630_communication_channels.js +13 -0
  81. package/dist/modules/communication_channels/migrations/Migration20260703123630_communication_channels.js.map +7 -0
  82. package/dist/modules/communication_channels/notifications.js +4 -0
  83. package/dist/modules/communication_channels/notifications.js.map +2 -2
  84. package/dist/modules/communication_channels/setup.js +2 -0
  85. package/dist/modules/communication_channels/setup.js.map +2 -2
  86. package/dist/modules/configs/lib/upgrade-actions.js +21 -0
  87. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  88. package/dist/modules/customer_accounts/notifications.js +12 -0
  89. package/dist/modules/customer_accounts/notifications.js.map +2 -2
  90. package/dist/modules/customers/notifications.js +4 -0
  91. package/dist/modules/customers/notifications.js.map +2 -2
  92. package/dist/modules/devices/acl.js +11 -0
  93. package/dist/modules/devices/acl.js.map +7 -0
  94. package/dist/modules/devices/api/[id]/route.js +167 -0
  95. package/dist/modules/devices/api/[id]/route.js.map +7 -0
  96. package/dist/modules/devices/api/admin/devices/[id]/route.js +219 -0
  97. package/dist/modules/devices/api/admin/devices/[id]/route.js.map +7 -0
  98. package/dist/modules/devices/api/admin/devices/route.js +140 -0
  99. package/dist/modules/devices/api/admin/devices/route.js.map +7 -0
  100. package/dist/modules/devices/api/auth.js +9 -0
  101. package/dist/modules/devices/api/auth.js.map +7 -0
  102. package/dist/modules/devices/api/deviceList.js +53 -0
  103. package/dist/modules/devices/api/deviceList.js.map +7 -0
  104. package/dist/modules/devices/api/deviceOps.js +118 -0
  105. package/dist/modules/devices/api/deviceOps.js.map +7 -0
  106. package/dist/modules/devices/api/openapi.js +19 -0
  107. package/dist/modules/devices/api/openapi.js.map +7 -0
  108. package/dist/modules/devices/api/route.js +143 -0
  109. package/dist/modules/devices/api/route.js.map +7 -0
  110. package/dist/modules/devices/backend/devices/[id]/page.js +135 -0
  111. package/dist/modules/devices/backend/devices/[id]/page.js.map +7 -0
  112. package/dist/modules/devices/backend/devices/[id]/page.meta.js +16 -0
  113. package/dist/modules/devices/backend/devices/[id]/page.meta.js.map +7 -0
  114. package/dist/modules/devices/backend/devices/create/page.js +68 -0
  115. package/dist/modules/devices/backend/devices/create/page.js.map +7 -0
  116. package/dist/modules/devices/backend/devices/create/page.meta.js +16 -0
  117. package/dist/modules/devices/backend/devices/create/page.meta.js.map +7 -0
  118. package/dist/modules/devices/backend/devices/page.js +235 -0
  119. package/dist/modules/devices/backend/devices/page.js.map +7 -0
  120. package/dist/modules/devices/backend/devices/page.meta.js +23 -0
  121. package/dist/modules/devices/backend/devices/page.meta.js.map +7 -0
  122. package/dist/modules/devices/commands/deactivate.js +107 -0
  123. package/dist/modules/devices/commands/deactivate.js.map +7 -0
  124. package/dist/modules/devices/commands/index.js +4 -0
  125. package/dist/modules/devices/commands/index.js.map +7 -0
  126. package/dist/modules/devices/commands/register.js +183 -0
  127. package/dist/modules/devices/commands/register.js.map +7 -0
  128. package/dist/modules/devices/commands/shared.js +74 -0
  129. package/dist/modules/devices/commands/shared.js.map +7 -0
  130. package/dist/modules/devices/commands/update.js +126 -0
  131. package/dist/modules/devices/commands/update.js.map +7 -0
  132. package/dist/modules/devices/data/entities.js +83 -0
  133. package/dist/modules/devices/data/entities.js.map +7 -0
  134. package/dist/modules/devices/data/validators.js +49 -0
  135. package/dist/modules/devices/data/validators.js.map +7 -0
  136. package/dist/modules/devices/di.js +11 -0
  137. package/dist/modules/devices/di.js.map +7 -0
  138. package/dist/modules/devices/encryption.js +12 -0
  139. package/dist/modules/devices/encryption.js.map +7 -0
  140. package/dist/modules/devices/events.js +19 -0
  141. package/dist/modules/devices/events.js.map +7 -0
  142. package/dist/modules/devices/index.js +17 -0
  143. package/dist/modules/devices/index.js.map +7 -0
  144. package/dist/modules/devices/lib/operationMetadata.js +20 -0
  145. package/dist/modules/devices/lib/operationMetadata.js.map +7 -0
  146. package/dist/modules/devices/migrations/Migration20260602120000.js +15 -0
  147. package/dist/modules/devices/migrations/Migration20260602120000.js.map +7 -0
  148. package/dist/modules/devices/migrations/Migration20260630120000.js +15 -0
  149. package/dist/modules/devices/migrations/Migration20260630120000.js.map +7 -0
  150. package/dist/modules/devices/migrations/Migration20260701120000.js +13 -0
  151. package/dist/modules/devices/migrations/Migration20260701120000.js.map +7 -0
  152. package/dist/modules/devices/migrations/Migration20260721120000.js +15 -0
  153. package/dist/modules/devices/migrations/Migration20260721120000.js.map +7 -0
  154. package/dist/modules/devices/setup.js +13 -0
  155. package/dist/modules/devices/setup.js.map +7 -0
  156. package/dist/modules/entities/cli.js +8 -3
  157. package/dist/modules/entities/cli.js.map +2 -2
  158. package/dist/modules/entities/migrations/Migration20260722120000.js +28 -0
  159. package/dist/modules/entities/migrations/Migration20260722120000.js.map +7 -0
  160. package/dist/modules/inbox_ops/notifications.js +2 -0
  161. package/dist/modules/inbox_ops/notifications.js.map +2 -2
  162. package/dist/modules/messages/notifications.js +2 -0
  163. package/dist/modules/messages/notifications.js.map +2 -2
  164. package/dist/modules/notifications/acl.js +3 -1
  165. package/dist/modules/notifications/acl.js.map +2 -2
  166. package/dist/modules/notifications/api/admin/preferences/route.js +167 -0
  167. package/dist/modules/notifications/api/admin/preferences/route.js.map +7 -0
  168. package/dist/modules/notifications/api/channels/route.js +54 -0
  169. package/dist/modules/notifications/api/channels/route.js.map +7 -0
  170. package/dist/modules/notifications/api/preferences/route.js +126 -0
  171. package/dist/modules/notifications/api/preferences/route.js.map +7 -0
  172. package/dist/modules/notifications/api/route.js +8 -1
  173. package/dist/modules/notifications/api/route.js.map +2 -2
  174. package/dist/modules/notifications/api/types/[id]/channels/[channel]/route.js +187 -0
  175. package/dist/modules/notifications/api/types/[id]/channels/[channel]/route.js.map +7 -0
  176. package/dist/modules/notifications/api/types/route.js +225 -0
  177. package/dist/modules/notifications/api/types/route.js.map +7 -0
  178. package/dist/modules/notifications/api/unread-count/route.js +5 -1
  179. package/dist/modules/notifications/api/unread-count/route.js.map +2 -2
  180. package/dist/modules/notifications/backend/notifications/user-preferences/page.js +10 -0
  181. package/dist/modules/notifications/backend/notifications/user-preferences/page.js.map +7 -0
  182. package/dist/modules/notifications/backend/notifications/user-preferences/page.meta.js +28 -0
  183. package/dist/modules/notifications/backend/notifications/user-preferences/page.meta.js.map +7 -0
  184. package/dist/modules/notifications/backend/profile/notification-preferences/page.js +10 -0
  185. package/dist/modules/notifications/backend/profile/notification-preferences/page.js.map +7 -0
  186. package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js +33 -0
  187. package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js.map +7 -0
  188. package/dist/modules/notifications/data/entities.js +128 -1
  189. package/dist/modules/notifications/data/entities.js.map +2 -2
  190. package/dist/modules/notifications/data/validators.js +95 -2
  191. package/dist/modules/notifications/data/validators.js.map +2 -2
  192. package/dist/modules/notifications/di.js +7 -0
  193. package/dist/modules/notifications/di.js.map +2 -2
  194. package/dist/modules/notifications/events.js +17 -0
  195. package/dist/modules/notifications/events.js.map +2 -2
  196. package/dist/modules/notifications/frontend/NotificationPreferenceMatrix.js +190 -0
  197. package/dist/modules/notifications/frontend/NotificationPreferenceMatrix.js.map +7 -0
  198. package/dist/modules/notifications/frontend/NotificationPreferencesPageClient.js +124 -0
  199. package/dist/modules/notifications/frontend/NotificationPreferencesPageClient.js.map +7 -0
  200. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +166 -1
  201. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +2 -2
  202. package/dist/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.js +172 -0
  203. package/dist/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.js.map +7 -0
  204. package/dist/modules/notifications/generators.js +63 -0
  205. package/dist/modules/notifications/generators.js.map +7 -0
  206. package/dist/modules/notifications/lib/delivery-strategies-registry.js +19 -0
  207. package/dist/modules/notifications/lib/delivery-strategies-registry.js.map +7 -0
  208. package/dist/modules/notifications/lib/deliveryStrategies.js.map +2 -2
  209. package/dist/modules/notifications/lib/derive-category.js +8 -0
  210. package/dist/modules/notifications/lib/derive-category.js.map +7 -0
  211. package/dist/modules/notifications/lib/notification-channel-registry.js +35 -0
  212. package/dist/modules/notifications/lib/notification-channel-registry.js.map +7 -0
  213. package/dist/modules/notifications/lib/notification-type-registry.js +87 -0
  214. package/dist/modules/notifications/lib/notification-type-registry.js.map +7 -0
  215. package/dist/modules/notifications/lib/notificationCopy.js +14 -0
  216. package/dist/modules/notifications/lib/notificationCopy.js.map +7 -0
  217. package/dist/modules/notifications/lib/notificationFactory.js +4 -1
  218. package/dist/modules/notifications/lib/notificationFactory.js.map +2 -2
  219. package/dist/modules/notifications/lib/notificationMapper.js +2 -0
  220. package/dist/modules/notifications/lib/notificationMapper.js.map +2 -2
  221. package/dist/modules/notifications/lib/notificationPreferenceService.js +83 -0
  222. package/dist/modules/notifications/lib/notificationPreferenceService.js.map +7 -0
  223. package/dist/modules/notifications/lib/notificationService.js +83 -28
  224. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  225. package/dist/modules/notifications/lib/notificationVisibility.js +24 -0
  226. package/dist/modules/notifications/lib/notificationVisibility.js.map +7 -0
  227. package/dist/modules/notifications/lib/routeHelpers.js +11 -1
  228. package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
  229. package/dist/modules/notifications/lib/shouldDeliver.js +46 -0
  230. package/dist/modules/notifications/lib/shouldDeliver.js.map +7 -0
  231. package/dist/modules/notifications/lib/strategies/email-delivery-strategy.js +54 -0
  232. package/dist/modules/notifications/lib/strategies/email-delivery-strategy.js.map +7 -0
  233. package/dist/modules/notifications/lib/strategies/in-app-delivery-strategy.js +12 -0
  234. package/dist/modules/notifications/lib/strategies/in-app-delivery-strategy.js.map +7 -0
  235. package/dist/modules/notifications/lib/typeCatalogue.js +71 -0
  236. package/dist/modules/notifications/lib/typeCatalogue.js.map +7 -0
  237. package/dist/modules/notifications/lib/typeChannelSettings.js +12 -0
  238. package/dist/modules/notifications/lib/typeChannelSettings.js.map +7 -0
  239. package/dist/modules/notifications/lib/typeOverrides.js +19 -0
  240. package/dist/modules/notifications/lib/typeOverrides.js.map +7 -0
  241. package/dist/modules/notifications/migrations/Migration20260625122947_notifications.js +14 -0
  242. package/dist/modules/notifications/migrations/Migration20260625122947_notifications.js.map +7 -0
  243. package/dist/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.js +15 -0
  244. package/dist/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.js.map +7 -0
  245. package/dist/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.js +13 -0
  246. package/dist/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.js.map +7 -0
  247. package/dist/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.js +15 -0
  248. package/dist/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.js.map +7 -0
  249. package/dist/modules/notifications/migrations/Migration20260706120000_notifications_channels.js +13 -0
  250. package/dist/modules/notifications/migrations/Migration20260706120000_notifications_channels.js.map +7 -0
  251. package/dist/modules/notifications/migrations/Migration20260716123121_notifications.js +14 -0
  252. package/dist/modules/notifications/migrations/Migration20260716123121_notifications.js.map +7 -0
  253. package/dist/modules/notifications/notification-channels.js +26 -0
  254. package/dist/modules/notifications/notification-channels.js.map +7 -0
  255. package/dist/modules/notifications/notifications.delivery-strategies.js +12 -0
  256. package/dist/modules/notifications/notifications.delivery-strategies.js.map +7 -0
  257. package/dist/modules/notifications/setup.js +16 -1
  258. package/dist/modules/notifications/setup.js.map +2 -2
  259. package/dist/modules/notifications/subscribers/deliver-notification.js +66 -57
  260. package/dist/modules/notifications/subscribers/deliver-notification.js.map +2 -2
  261. package/dist/modules/notifications/subscribers/sync-notification-types.js +16 -0
  262. package/dist/modules/notifications/subscribers/sync-notification-types.js.map +7 -0
  263. package/dist/modules/notifications/widgets/injection/profile-preferences-menu/widget.js +23 -0
  264. package/dist/modules/notifications/widgets/injection/profile-preferences-menu/widget.js.map +7 -0
  265. package/dist/modules/notifications/widgets/injection-table.js +14 -0
  266. package/dist/modules/notifications/widgets/injection-table.js.map +7 -0
  267. package/dist/modules/push_notifications/acl.js +13 -0
  268. package/dist/modules/push_notifications/acl.js.map +7 -0
  269. package/dist/modules/push_notifications/api/custom-send/route.js +141 -0
  270. package/dist/modules/push_notifications/api/custom-send/route.js.map +7 -0
  271. package/dist/modules/push_notifications/api/deliveries/[id]/route.js +110 -0
  272. package/dist/modules/push_notifications/api/deliveries/[id]/route.js.map +7 -0
  273. package/dist/modules/push_notifications/api/deliveries/route.js +56 -0
  274. package/dist/modules/push_notifications/api/deliveries/route.js.map +7 -0
  275. package/dist/modules/push_notifications/api/openapi.js +19 -0
  276. package/dist/modules/push_notifications/api/openapi.js.map +7 -0
  277. package/dist/modules/push_notifications/backend/push_notifications/[id]/page.js +103 -0
  278. package/dist/modules/push_notifications/backend/push_notifications/[id]/page.js.map +7 -0
  279. package/dist/modules/push_notifications/backend/push_notifications/[id]/page.meta.js +13 -0
  280. package/dist/modules/push_notifications/backend/push_notifications/[id]/page.meta.js.map +7 -0
  281. package/dist/modules/push_notifications/backend/push_notifications/page.js +213 -0
  282. package/dist/modules/push_notifications/backend/push_notifications/page.js.map +7 -0
  283. package/dist/modules/push_notifications/backend/push_notifications/page.meta.js +23 -0
  284. package/dist/modules/push_notifications/backend/push_notifications/page.meta.js.map +7 -0
  285. package/dist/modules/push_notifications/backend/push_notifications/send/page.js +245 -0
  286. package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +7 -0
  287. package/dist/modules/push_notifications/backend/push_notifications/send/page.meta.js +26 -0
  288. package/dist/modules/push_notifications/backend/push_notifications/send/page.meta.js.map +7 -0
  289. package/dist/modules/push_notifications/data/entities.js +92 -0
  290. package/dist/modules/push_notifications/data/entities.js.map +7 -0
  291. package/dist/modules/push_notifications/data/extensions.js +23 -0
  292. package/dist/modules/push_notifications/data/extensions.js.map +7 -0
  293. package/dist/modules/push_notifications/data/validators.js +89 -0
  294. package/dist/modules/push_notifications/data/validators.js.map +7 -0
  295. package/dist/modules/push_notifications/di.js +17 -0
  296. package/dist/modules/push_notifications/di.js.map +7 -0
  297. package/dist/modules/push_notifications/events.js +24 -0
  298. package/dist/modules/push_notifications/events.js.map +7 -0
  299. package/dist/modules/push_notifications/index.js +16 -0
  300. package/dist/modules/push_notifications/index.js.map +7 -0
  301. package/dist/modules/push_notifications/lib/fake-provider-recorder.js +80 -0
  302. package/dist/modules/push_notifications/lib/fake-provider-recorder.js.map +7 -0
  303. package/dist/modules/push_notifications/lib/push-delivery-strategy.js +54 -0
  304. package/dist/modules/push_notifications/lib/push-delivery-strategy.js.map +7 -0
  305. package/dist/modules/push_notifications/lib/push-delivery.js +297 -0
  306. package/dist/modules/push_notifications/lib/push-delivery.js.map +7 -0
  307. package/dist/modules/push_notifications/lib/push-fanout.js +138 -0
  308. package/dist/modules/push_notifications/lib/push-fanout.js.map +7 -0
  309. package/dist/modules/push_notifications/lib/push-health.js +32 -0
  310. package/dist/modules/push_notifications/lib/push-health.js.map +7 -0
  311. package/dist/modules/push_notifications/lib/push-reaper.js +87 -0
  312. package/dist/modules/push_notifications/lib/push-reaper.js.map +7 -0
  313. package/dist/modules/push_notifications/lib/push-receipt-reaper.js +136 -0
  314. package/dist/modules/push_notifications/lib/push-receipt-reaper.js.map +7 -0
  315. package/dist/modules/push_notifications/lib/push-stub-adapter.js +63 -0
  316. package/dist/modules/push_notifications/lib/push-stub-adapter.js.map +7 -0
  317. package/dist/modules/push_notifications/lib/queue.js +53 -0
  318. package/dist/modules/push_notifications/lib/queue.js.map +7 -0
  319. package/dist/modules/push_notifications/lib/reclaim-window.js +13 -0
  320. package/dist/modules/push_notifications/lib/reclaim-window.js.map +7 -0
  321. package/dist/modules/push_notifications/lib/send-custom-push.js +48 -0
  322. package/dist/modules/push_notifications/lib/send-custom-push.js.map +7 -0
  323. package/dist/modules/push_notifications/migrations/Migration20260625150049_push_notifications.js +16 -0
  324. package/dist/modules/push_notifications/migrations/Migration20260625150049_push_notifications.js.map +7 -0
  325. package/dist/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.js +13 -0
  326. package/dist/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.js.map +7 -0
  327. package/dist/modules/push_notifications/notifications.delivery-strategies.js +8 -0
  328. package/dist/modules/push_notifications/notifications.delivery-strategies.js.map +7 -0
  329. package/dist/modules/push_notifications/notifications.js +40 -0
  330. package/dist/modules/push_notifications/notifications.js.map +7 -0
  331. package/dist/modules/push_notifications/setup.js +52 -0
  332. package/dist/modules/push_notifications/setup.js.map +7 -0
  333. package/dist/modules/push_notifications/workers/reclaim-stuck.worker.js +57 -0
  334. package/dist/modules/push_notifications/workers/reclaim-stuck.worker.js.map +7 -0
  335. package/dist/modules/push_notifications/workers/send-push.worker.js +27 -0
  336. package/dist/modules/push_notifications/workers/send-push.worker.js.map +7 -0
  337. package/dist/modules/sales/notifications.js +8 -0
  338. package/dist/modules/sales/notifications.js.map +2 -2
  339. package/dist/modules/staff/notifications.js +6 -0
  340. package/dist/modules/staff/notifications.js.map +2 -2
  341. package/dist/modules/workflows/notifications.js +2 -0
  342. package/dist/modules/workflows/notifications.js.map +2 -2
  343. package/generated/entities/notification/index.ts +3 -0
  344. package/generated/entities/notification_preference/index.ts +8 -0
  345. package/generated/entities/notification_type/index.ts +9 -0
  346. package/generated/entities/notification_type_override/index.ts +7 -0
  347. package/generated/entities/push_notification_delivery/index.ts +19 -0
  348. package/generated/entities/user_device/index.ts +16 -0
  349. package/generated/entities.ids.generated.ts +12 -1
  350. package/generated/entity-fields-registry.ts +72 -0
  351. package/package.json +7 -7
  352. package/src/helpers/integration/api.ts +2 -1
  353. package/src/helpers/integration/appRoot.ts +13 -0
  354. package/src/helpers/integration/dbFixtures.ts +1 -5
  355. package/src/helpers/integration/pushFake.ts +219 -0
  356. package/src/modules/auth/i18n/de.json +1 -0
  357. package/src/modules/auth/i18n/en.json +1 -0
  358. package/src/modules/auth/i18n/es.json +1 -0
  359. package/src/modules/auth/i18n/ko.json +1 -0
  360. package/src/modules/auth/i18n/pl.json +1 -0
  361. package/src/modules/auth/notifications.ts +16 -0
  362. package/src/modules/business_rules/i18n/de.json +2 -1
  363. package/src/modules/business_rules/i18n/en.json +2 -1
  364. package/src/modules/business_rules/i18n/es.json +2 -1
  365. package/src/modules/business_rules/i18n/ko.json +2 -1
  366. package/src/modules/business_rules/i18n/pl.json +2 -1
  367. package/src/modules/business_rules/notifications.ts +2 -0
  368. package/src/modules/catalog/i18n/de.json +2 -1
  369. package/src/modules/catalog/i18n/en.json +2 -1
  370. package/src/modules/catalog/i18n/es.json +2 -1
  371. package/src/modules/catalog/i18n/ko.json +2 -1
  372. package/src/modules/catalog/i18n/pl.json +2 -1
  373. package/src/modules/catalog/notifications.ts +2 -0
  374. package/src/modules/communication_channels/acl.ts +9 -0
  375. package/src/modules/communication_channels/api/delete/admin/channels/[id]/route.ts +168 -0
  376. package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +6 -2
  377. package/src/modules/communication_channels/api/get/channels/[id]/route.ts +6 -2
  378. package/src/modules/communication_channels/api/get/channels/route.ts +2 -1
  379. package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +16 -5
  380. package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +37 -1
  381. package/src/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.ts +175 -0
  382. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +11 -1
  383. package/src/modules/communication_channels/commands/admin-delete-channel.ts +203 -0
  384. package/src/modules/communication_channels/commands/connect-credential-channel.ts +63 -15
  385. package/src/modules/communication_channels/commands/deliver-outbound-message.ts +10 -2
  386. package/src/modules/communication_channels/commands/push-register.ts +7 -1
  387. package/src/modules/communication_channels/commands/push-unregister.ts +14 -3
  388. package/src/modules/communication_channels/data/entities.ts +10 -0
  389. package/src/modules/communication_channels/data/validators.ts +1 -0
  390. package/src/modules/communication_channels/i18n/de.json +35 -1
  391. package/src/modules/communication_channels/i18n/en.json +35 -1
  392. package/src/modules/communication_channels/i18n/es.json +35 -1
  393. package/src/modules/communication_channels/i18n/ko.json +35 -1
  394. package/src/modules/communication_channels/i18n/pl.json +35 -1
  395. package/src/modules/communication_channels/lib/access-control.ts +42 -0
  396. package/src/modules/communication_channels/lib/adapter.ts +25 -0
  397. package/src/modules/communication_channels/lib/connect-channel.ts +61 -26
  398. package/src/modules/communication_channels/lib/push-adapter.ts +139 -0
  399. package/src/modules/communication_channels/lib/push-capabilities.ts +42 -0
  400. package/src/modules/communication_channels/lib/push-connect-error.ts +52 -0
  401. package/src/modules/communication_channels/lib/push-credential-errors.ts +58 -0
  402. package/src/modules/communication_channels/lib/push-envelope.ts +104 -0
  403. package/src/modules/communication_channels/lib/refcounted-client-cache.ts +123 -0
  404. package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +9 -0
  405. package/src/modules/communication_channels/migrations/Migration20260703123630_communication_channels.ts +20 -0
  406. package/src/modules/communication_channels/notifications.ts +4 -0
  407. package/src/modules/communication_channels/setup.ts +2 -0
  408. package/src/modules/configs/i18n/de.json +5 -1
  409. package/src/modules/configs/i18n/en.json +5 -1
  410. package/src/modules/configs/i18n/es.json +5 -1
  411. package/src/modules/configs/i18n/ko.json +5 -1
  412. package/src/modules/configs/i18n/pl.json +5 -1
  413. package/src/modules/configs/lib/upgrade-actions.ts +21 -0
  414. package/src/modules/customer_accounts/i18n/de.json +2 -1
  415. package/src/modules/customer_accounts/i18n/en.json +2 -1
  416. package/src/modules/customer_accounts/i18n/es.json +2 -1
  417. package/src/modules/customer_accounts/i18n/ko.json +2 -1
  418. package/src/modules/customer_accounts/i18n/pl.json +2 -1
  419. package/src/modules/customer_accounts/notifications.ts +12 -0
  420. package/src/modules/customers/i18n/de.json +2 -1
  421. package/src/modules/customers/i18n/en.json +2 -1
  422. package/src/modules/customers/i18n/es.json +2 -1
  423. package/src/modules/customers/i18n/ko.json +2 -1
  424. package/src/modules/customers/i18n/pl.json +2 -1
  425. package/src/modules/customers/notifications.ts +4 -0
  426. package/src/modules/devices/AGENTS.md +101 -0
  427. package/src/modules/devices/acl.ts +7 -0
  428. package/src/modules/devices/api/[id]/route.ts +180 -0
  429. package/src/modules/devices/api/admin/devices/[id]/route.ts +235 -0
  430. package/src/modules/devices/api/admin/devices/route.ts +160 -0
  431. package/src/modules/devices/api/auth.ts +13 -0
  432. package/src/modules/devices/api/deviceList.ts +54 -0
  433. package/src/modules/devices/api/deviceOps.ts +186 -0
  434. package/src/modules/devices/api/openapi.ts +23 -0
  435. package/src/modules/devices/api/route.ts +165 -0
  436. package/src/modules/devices/backend/devices/[id]/page.meta.ts +12 -0
  437. package/src/modules/devices/backend/devices/[id]/page.tsx +164 -0
  438. package/src/modules/devices/backend/devices/create/page.meta.ts +12 -0
  439. package/src/modules/devices/backend/devices/create/page.tsx +81 -0
  440. package/src/modules/devices/backend/devices/page.meta.ts +21 -0
  441. package/src/modules/devices/backend/devices/page.tsx +259 -0
  442. package/src/modules/devices/commands/deactivate.ts +126 -0
  443. package/src/modules/devices/commands/index.ts +3 -0
  444. package/src/modules/devices/commands/register.ts +199 -0
  445. package/src/modules/devices/commands/shared.ts +119 -0
  446. package/src/modules/devices/commands/update.ts +142 -0
  447. package/src/modules/devices/data/entities.ts +79 -0
  448. package/src/modules/devices/data/validators.ts +65 -0
  449. package/src/modules/devices/di.ts +9 -0
  450. package/src/modules/devices/encryption.ts +15 -0
  451. package/src/modules/devices/events.ts +16 -0
  452. package/src/modules/devices/i18n/de.json +45 -0
  453. package/src/modules/devices/i18n/en.json +45 -0
  454. package/src/modules/devices/i18n/es.json +45 -0
  455. package/src/modules/devices/i18n/ko.json +45 -0
  456. package/src/modules/devices/i18n/pl.json +45 -0
  457. package/src/modules/devices/index.ts +15 -0
  458. package/src/modules/devices/lib/operationMetadata.ts +35 -0
  459. package/src/modules/devices/migrations/.snapshot-open-mercato.json +200 -0
  460. package/src/modules/devices/migrations/Migration20260602120000.ts +15 -0
  461. package/src/modules/devices/migrations/Migration20260630120000.ts +20 -0
  462. package/src/modules/devices/migrations/Migration20260701120000.ts +13 -0
  463. package/src/modules/devices/migrations/Migration20260721120000.ts +18 -0
  464. package/src/modules/devices/setup.ts +11 -0
  465. package/src/modules/entities/cli.ts +16 -2
  466. package/src/modules/entities/migrations/Migration20260722120000.ts +38 -0
  467. package/src/modules/inbox_ops/i18n/de.json +2 -1
  468. package/src/modules/inbox_ops/i18n/en.json +2 -1
  469. package/src/modules/inbox_ops/i18n/es.json +2 -1
  470. package/src/modules/inbox_ops/i18n/ko.json +2 -1
  471. package/src/modules/inbox_ops/i18n/pl.json +2 -1
  472. package/src/modules/inbox_ops/notifications.ts +2 -0
  473. package/src/modules/messages/i18n/de.json +2 -1
  474. package/src/modules/messages/i18n/en.json +2 -1
  475. package/src/modules/messages/i18n/es.json +2 -1
  476. package/src/modules/messages/i18n/ko.json +2 -1
  477. package/src/modules/messages/i18n/pl.json +2 -1
  478. package/src/modules/messages/notifications.ts +2 -0
  479. package/src/modules/notifications/AGENTS.md +54 -0
  480. package/src/modules/notifications/acl.ts +2 -0
  481. package/src/modules/notifications/api/admin/preferences/route.ts +193 -0
  482. package/src/modules/notifications/api/channels/route.ts +54 -0
  483. package/src/modules/notifications/api/preferences/route.ts +131 -0
  484. package/src/modules/notifications/api/route.ts +8 -1
  485. package/src/modules/notifications/api/types/[id]/channels/[channel]/route.ts +226 -0
  486. package/src/modules/notifications/api/types/route.ts +239 -0
  487. package/src/modules/notifications/api/unread-count/route.ts +5 -1
  488. package/src/modules/notifications/backend/notifications/user-preferences/page.meta.ts +26 -0
  489. package/src/modules/notifications/backend/notifications/user-preferences/page.tsx +12 -0
  490. package/src/modules/notifications/backend/profile/notification-preferences/page.meta.ts +31 -0
  491. package/src/modules/notifications/backend/profile/notification-preferences/page.tsx +12 -0
  492. package/src/modules/notifications/data/entities.ts +144 -0
  493. package/src/modules/notifications/data/validators.ts +116 -0
  494. package/src/modules/notifications/di.ts +7 -0
  495. package/src/modules/notifications/events.ts +23 -0
  496. package/src/modules/notifications/frontend/NotificationPreferenceMatrix.tsx +287 -0
  497. package/src/modules/notifications/frontend/NotificationPreferencesPageClient.tsx +155 -0
  498. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +273 -2
  499. package/src/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.tsx +214 -0
  500. package/src/modules/notifications/generators.ts +82 -0
  501. package/src/modules/notifications/i18n/de.json +43 -0
  502. package/src/modules/notifications/i18n/en.json +43 -0
  503. package/src/modules/notifications/i18n/es.json +43 -0
  504. package/src/modules/notifications/i18n/ko.json +43 -0
  505. package/src/modules/notifications/i18n/pl.json +44 -1
  506. package/src/modules/notifications/lib/delivery-strategies-registry.ts +30 -0
  507. package/src/modules/notifications/lib/deliveryStrategies.ts +40 -4
  508. package/src/modules/notifications/lib/derive-category.ts +15 -0
  509. package/src/modules/notifications/lib/notification-channel-registry.ts +59 -0
  510. package/src/modules/notifications/lib/notification-type-registry.ts +182 -0
  511. package/src/modules/notifications/lib/notificationCopy.ts +34 -0
  512. package/src/modules/notifications/lib/notificationFactory.ts +5 -1
  513. package/src/modules/notifications/lib/notificationMapper.ts +2 -0
  514. package/src/modules/notifications/lib/notificationPreferenceService.ts +138 -0
  515. package/src/modules/notifications/lib/notificationService.ts +129 -25
  516. package/src/modules/notifications/lib/notificationVisibility.ts +48 -0
  517. package/src/modules/notifications/lib/routeHelpers.ts +14 -1
  518. package/src/modules/notifications/lib/shouldDeliver.ts +112 -0
  519. package/src/modules/notifications/lib/strategies/email-delivery-strategy.ts +63 -0
  520. package/src/modules/notifications/lib/strategies/in-app-delivery-strategy.ts +21 -0
  521. package/src/modules/notifications/lib/typeCatalogue.ts +141 -0
  522. package/src/modules/notifications/lib/typeChannelSettings.ts +29 -0
  523. package/src/modules/notifications/lib/typeOverrides.ts +46 -0
  524. package/src/modules/notifications/migrations/.snapshot-open-mercato.json +874 -100
  525. package/src/modules/notifications/migrations/Migration20260625122947_notifications.ts +14 -0
  526. package/src/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.ts +15 -0
  527. package/src/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.ts +13 -0
  528. package/src/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.ts +15 -0
  529. package/src/modules/notifications/migrations/Migration20260706120000_notifications_channels.ts +13 -0
  530. package/src/modules/notifications/migrations/Migration20260716123121_notifications.ts +14 -0
  531. package/src/modules/notifications/notification-channels.ts +30 -0
  532. package/src/modules/notifications/notifications.delivery-strategies.ts +15 -0
  533. package/src/modules/notifications/setup.ts +23 -1
  534. package/src/modules/notifications/subscribers/deliver-notification.ts +105 -71
  535. package/src/modules/notifications/subscribers/sync-notification-types.ts +18 -0
  536. package/src/modules/notifications/widgets/injection/profile-preferences-menu/widget.ts +35 -0
  537. package/src/modules/notifications/widgets/injection-table.ts +18 -0
  538. package/src/modules/push_notifications/AGENTS.md +92 -0
  539. package/src/modules/push_notifications/acl.ts +9 -0
  540. package/src/modules/push_notifications/api/custom-send/route.ts +175 -0
  541. package/src/modules/push_notifications/api/deliveries/[id]/route.ts +122 -0
  542. package/src/modules/push_notifications/api/deliveries/route.ts +58 -0
  543. package/src/modules/push_notifications/api/openapi.ts +22 -0
  544. package/src/modules/push_notifications/backend/push_notifications/[id]/page.meta.ts +9 -0
  545. package/src/modules/push_notifications/backend/push_notifications/[id]/page.tsx +149 -0
  546. package/src/modules/push_notifications/backend/push_notifications/page.meta.ts +21 -0
  547. package/src/modules/push_notifications/backend/push_notifications/page.tsx +239 -0
  548. package/src/modules/push_notifications/backend/push_notifications/send/page.meta.ts +24 -0
  549. package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +327 -0
  550. package/src/modules/push_notifications/data/entities.ts +111 -0
  551. package/src/modules/push_notifications/data/extensions.ts +29 -0
  552. package/src/modules/push_notifications/data/validators.ts +102 -0
  553. package/src/modules/push_notifications/di.ts +20 -0
  554. package/src/modules/push_notifications/events.ts +21 -0
  555. package/src/modules/push_notifications/i18n/de.json +79 -0
  556. package/src/modules/push_notifications/i18n/en.json +79 -0
  557. package/src/modules/push_notifications/i18n/es.json +79 -0
  558. package/src/modules/push_notifications/i18n/ko.json +79 -0
  559. package/src/modules/push_notifications/i18n/pl.json +79 -0
  560. package/src/modules/push_notifications/index.ts +15 -0
  561. package/src/modules/push_notifications/lib/fake-provider-recorder.ts +154 -0
  562. package/src/modules/push_notifications/lib/push-delivery-strategy.ts +90 -0
  563. package/src/modules/push_notifications/lib/push-delivery.ts +455 -0
  564. package/src/modules/push_notifications/lib/push-fanout.ts +237 -0
  565. package/src/modules/push_notifications/lib/push-health.ts +47 -0
  566. package/src/modules/push_notifications/lib/push-reaper.ts +140 -0
  567. package/src/modules/push_notifications/lib/push-receipt-reaper.ts +210 -0
  568. package/src/modules/push_notifications/lib/push-stub-adapter.ts +80 -0
  569. package/src/modules/push_notifications/lib/queue.ts +74 -0
  570. package/src/modules/push_notifications/lib/reclaim-window.ts +16 -0
  571. package/src/modules/push_notifications/lib/send-custom-push.ts +100 -0
  572. package/src/modules/push_notifications/migrations/.snapshot-open-mercato.json +386 -0
  573. package/src/modules/push_notifications/migrations/Migration20260625150049_push_notifications.ts +16 -0
  574. package/src/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.ts +13 -0
  575. package/src/modules/push_notifications/notifications.delivery-strategies.ts +8 -0
  576. package/src/modules/push_notifications/notifications.ts +50 -0
  577. package/src/modules/push_notifications/setup.ts +92 -0
  578. package/src/modules/push_notifications/workers/reclaim-stuck.worker.ts +78 -0
  579. package/src/modules/push_notifications/workers/send-push.worker.ts +34 -0
  580. package/src/modules/sales/i18n/de.json +1 -0
  581. package/src/modules/sales/i18n/en.json +1 -0
  582. package/src/modules/sales/i18n/es.json +1 -0
  583. package/src/modules/sales/i18n/ko.json +1 -0
  584. package/src/modules/sales/i18n/pl.json +1 -0
  585. package/src/modules/sales/notifications.ts +8 -0
  586. package/src/modules/staff/i18n/de.json +1 -0
  587. package/src/modules/staff/i18n/en.json +1 -0
  588. package/src/modules/staff/i18n/es.json +1 -0
  589. package/src/modules/staff/i18n/ko.json +1 -0
  590. package/src/modules/staff/i18n/pl.json +1 -0
  591. package/src/modules/staff/notifications.ts +6 -0
  592. package/src/modules/workflows/i18n/de.json +1 -0
  593. package/src/modules/workflows/i18n/en.json +1 -0
  594. package/src/modules/workflows/i18n/es.json +1 -0
  595. package/src/modules/workflows/i18n/ko.json +1 -0
  596. package/src/modules/workflows/i18n/pl.json +1 -0
  597. package/src/modules/workflows/notifications.ts +2 -0
@@ -0,0 +1,8 @@
1
+ import type { NotificationDeliveryStrategy } from '@open-mercato/core/modules/notifications/lib/deliveryStrategies'
2
+ import { mobilePushDeliveryStrategy } from './lib/push-delivery-strategy'
3
+
4
+ // Discovered by the notifications `delivery-strategies` generator plugin and registered into the
5
+ // notifications delivery seam at bootstrap (see notifications/generators.ts).
6
+ export const deliveryStrategies: NotificationDeliveryStrategy[] = [mobilePushDeliveryStrategy]
7
+
8
+ export default deliveryStrategies
@@ -0,0 +1,50 @@
1
+ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
2
+
3
+ /**
4
+ * Type id for admin-composed one-off custom pushes (see `lib/send-custom-push.ts` +
5
+ * `api/custom-send`). It is `hiddenFromSettings` (never listed in the client catalogue / mobile
6
+ * preferences screen) and `nonOptOut` (an admin broadcast the user cannot pre-disable). The message
7
+ * title/body are literal free text supplied per send, so the `titleKey`/`bodyKey` below are only
8
+ * placeholders and are never resolved at delivery time.
9
+ */
10
+ export const ADMIN_CUSTOM_MESSAGE_TYPE = 'admin.custom_message'
11
+
12
+ /**
13
+ * Silent counterpart of {@link ADMIN_CUSTOM_MESSAGE_TYPE}: the type an admin "silent" one-off push is
14
+ * labelled with (see `lib/send-custom-push.ts`). Same hidden / non-opt-out semantics, but `silent`
15
+ * so the delivery is a data-only content-available wake-up rather than a visible banner.
16
+ */
17
+ export const ADMIN_CUSTOM_SILENT_TYPE = 'admin.custom_silent'
18
+
19
+ export const notificationTypes: NotificationTypeDefinition[] = [
20
+ {
21
+ type: ADMIN_CUSTOM_MESSAGE_TYPE,
22
+ module: 'push_notifications',
23
+ titleKey: 'push_notifications.types.admin_custom_message.title',
24
+ bodyKey: 'push_notifications.types.admin_custom_message.body',
25
+ labelKey: 'push_notifications.types.admin_custom_message.label',
26
+ icon: 'megaphone',
27
+ severity: 'info',
28
+ actions: [],
29
+ category: 'system',
30
+ nonOptOut: true,
31
+ silent: false,
32
+ hiddenFromSettings: true,
33
+ },
34
+ {
35
+ type: ADMIN_CUSTOM_SILENT_TYPE,
36
+ module: 'push_notifications',
37
+ titleKey: 'push_notifications.types.admin_custom_silent.title',
38
+ bodyKey: 'push_notifications.types.admin_custom_silent.body',
39
+ labelKey: 'push_notifications.types.admin_custom_silent.label',
40
+ icon: 'megaphone',
41
+ severity: 'info',
42
+ actions: [],
43
+ category: 'system',
44
+ nonOptOut: true,
45
+ silent: true,
46
+ hiddenFromSettings: true,
47
+ },
48
+ ]
49
+
50
+ export default notificationTypes
@@ -0,0 +1,92 @@
1
+ import { createHash } from 'node:crypto'
2
+ import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
3
+ import { createLogger } from '@open-mercato/shared/lib/logger'
4
+ import { PUSH_STUCK_RECLAIM_QUEUE } from './lib/queue'
5
+
6
+ const logger = createLogger('push_notifications')
7
+
8
+ type SchedulerServiceLike = {
9
+ register: (registration: {
10
+ id: string
11
+ name: string
12
+ scopeType: 'system' | 'organization' | 'tenant'
13
+ organizationId?: string
14
+ tenantId?: string
15
+ scheduleType: 'cron' | 'interval'
16
+ scheduleValue: string
17
+ timezone?: string
18
+ targetType: 'queue' | 'command'
19
+ targetQueue?: string
20
+ targetPayload?: unknown
21
+ sourceType?: 'user' | 'module'
22
+ sourceModule?: string
23
+ isEnabled?: boolean
24
+ description?: string
25
+ }) => Promise<void>
26
+ }
27
+
28
+ /**
29
+ * How often the stuck-delivery reclaim tick fires. Default 120s — stranded rows are rare, so a slower
30
+ * cadence than the delivery path is fine. Tunable via OM_PUSH_RECLAIM_TICK_SECONDS (min 30s).
31
+ */
32
+ const RECLAIM_TICK_INTERVAL_SECONDS = Math.max(
33
+ 30,
34
+ Number.parseInt(process.env.OM_PUSH_RECLAIM_TICK_SECONDS ?? '120', 10) || 120,
35
+ )
36
+
37
+ /**
38
+ * `scheduled_jobs.id` is a uuid column, so a module-owned schedule's stable
39
+ * registration key must be hashed into a uuid rather than used verbatim — this
40
+ * keeps `schedulerService.register()` an idempotent upsert across re-runs of
41
+ * seedDefaults instead of trying to insert a raw string into the uuid PK.
42
+ * Mirrors the communication_channels poll-tick registration.
43
+ */
44
+ function stableScheduleUuid(stableKey: string): string {
45
+ const hex = createHash('sha256').update(stableKey).digest('hex')
46
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`
47
+ }
48
+
49
+ export const setup: ModuleSetupConfig = {
50
+ defaultRoleFeatures: {
51
+ superadmin: ['push_notifications.*'],
52
+ admin: ['push_notifications.*'],
53
+ // The delivery log is ops/admin observability; employees are not granted it by default.
54
+ },
55
+
56
+ async seedDefaults({ container, tenantId }) {
57
+ /**
58
+ * Register the stuck-delivery reclaim tick with `@open-mercato/scheduler`. Tenant-scoped (one row
59
+ * per tenant, keyed by a deterministic uuid so re-runs upsert) — the sweep covers org-bound and
60
+ * tenant-level delivery rows alike. Skipped silently when the scheduler module isn't enabled so
61
+ * the delivery rails stay usable in scheduler-less harnesses (mirrors communication_channels).
62
+ */
63
+ const cradle = container as { hasRegistration?: (name: string) => boolean }
64
+ if (typeof cradle.hasRegistration !== 'function' || !cradle.hasRegistration('schedulerService')) {
65
+ return
66
+ }
67
+ const schedulerService = container.resolve('schedulerService') as SchedulerServiceLike
68
+ try {
69
+ await schedulerService.register({
70
+ id: stableScheduleUuid(`push_notifications:reclaim-stuck:${tenantId}`),
71
+ name: 'Push delivery stuck-row reclaim',
72
+ description:
73
+ `Every ${RECLAIM_TICK_INTERVAL_SECONDS}s, recover push deliveries stranded in 'sending' by a crashed worker (re-enqueue if attempts remain, else expire) and poll async provider receipts (Expo) to soft-delete unregistered devices.`,
74
+ scopeType: 'tenant',
75
+ tenantId,
76
+ scheduleType: 'interval',
77
+ scheduleValue: `${RECLAIM_TICK_INTERVAL_SECONDS}s`,
78
+ timezone: 'UTC',
79
+ targetType: 'queue',
80
+ targetQueue: PUSH_STUCK_RECLAIM_QUEUE,
81
+ targetPayload: { scope: { tenantId } },
82
+ sourceType: 'module',
83
+ sourceModule: 'push_notifications',
84
+ isEnabled: true,
85
+ })
86
+ } catch (error) {
87
+ logger.warn('Failed to register reclaim-stuck schedule', { error })
88
+ }
89
+ },
90
+ }
91
+
92
+ export default setup
@@ -0,0 +1,78 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import type { JobContext, QueuedJob, WorkerMeta } from '@open-mercato/queue'
3
+ import { createLogger } from '@open-mercato/shared/lib/logger'
4
+ import { PUSH_STUCK_RECLAIM_QUEUE } from '../lib/queue'
5
+ import { reclaimStuckPushDeliveries } from '../lib/push-reaper'
6
+ import { checkPushReceipts } from '../lib/push-receipt-reaper'
7
+
8
+ const logger = createLogger('push_notifications')
9
+
10
+ /**
11
+ * Scheduler tick payload. Fired by the `@open-mercato/scheduler` interval entry registered in
12
+ * setup.ts (`push_notifications:reclaim-stuck`). The scheduler adds `tenantId` at the top level of the
13
+ * enqueued payload on top of the configured `targetPayload`, so accept either shape.
14
+ */
15
+ export type ReclaimStuckTickPayload = {
16
+ scope?: { tenantId?: string | null }
17
+ tenantId?: string | null
18
+ }
19
+
20
+ export const metadata: WorkerMeta = {
21
+ queue: PUSH_STUCK_RECLAIM_QUEUE,
22
+ id: 'push_notifications:reclaim-stuck',
23
+ concurrency: 1, // single-flight per tenant tick — the atomic claim guards overlaps anyway
24
+ }
25
+
26
+ type HandlerContext = JobContext & {
27
+ resolve: <T = unknown>(name: string) => T
28
+ }
29
+
30
+ export default async function handle(
31
+ job: QueuedJob<ReclaimStuckTickPayload>,
32
+ ctx: HandlerContext,
33
+ ): Promise<void> {
34
+ const raw = (job?.payload ?? {}) as ReclaimStuckTickPayload
35
+ const tenantId = raw.scope?.tenantId ?? raw.tenantId ?? null
36
+ if (!tenantId) {
37
+ logger.warn('reclaim-stuck skipping tick — payload has no tenantId', { payload: raw })
38
+ return
39
+ }
40
+
41
+ const em = (ctx.resolve('em') as EntityManager).fork()
42
+ try {
43
+ const result = await reclaimStuckPushDeliveries(em, { tenantId })
44
+ if (result.reEnqueued > 0 || result.expired > 0) {
45
+ logger.info('reclaim-stuck swept stuck delivery rows', {
46
+ tenantId,
47
+ reEnqueued: result.reEnqueued,
48
+ expired: result.expired,
49
+ })
50
+ }
51
+ } catch (error) {
52
+ logger.error('reclaim-stuck sweep failed', {
53
+ tenantId,
54
+ error: error instanceof Error ? error.message : String(error),
55
+ })
56
+ throw error
57
+ }
58
+
59
+ // Piggyback the Expo async-receipt hygiene pass on the same per-tenant tick (no separate scheduler
60
+ // entry). Best-effort and isolated on its own EM fork: a receipt-check failure logs and returns, so it
61
+ // never fails/retries the stuck-row reclaim above nor the tick itself.
62
+ try {
63
+ const receiptEm = (ctx.resolve('em') as EntityManager).fork()
64
+ const receipts = await checkPushReceipts(receiptEm, { tenantId }, ctx.resolve)
65
+ if (receipts.unregistered > 0) {
66
+ logger.info('reclaim-stuck pruned devices from async push receipts', {
67
+ tenantId,
68
+ unregistered: receipts.unregistered,
69
+ checked: receipts.checked,
70
+ })
71
+ }
72
+ } catch (error) {
73
+ logger.error('reclaim-stuck receipt sweep failed', {
74
+ tenantId,
75
+ error: error instanceof Error ? error.message : String(error),
76
+ })
77
+ }
78
+ }
@@ -0,0 +1,34 @@
1
+ import type { EntityManager } from '@mikro-orm/postgresql'
2
+ import type { JobContext, QueuedJob, WorkerMeta } from '@open-mercato/queue'
3
+ import { createLogger } from '@open-mercato/shared/lib/logger'
4
+ import { PUSH_DELIVERIES_QUEUE, type PushDeliveryJob } from '../lib/queue'
5
+ import { processPushDeliveryJob } from '../lib/push-delivery'
6
+
7
+ const logger = createLogger('push_notifications')
8
+
9
+ export const metadata: WorkerMeta = {
10
+ queue: PUSH_DELIVERIES_QUEUE,
11
+ id: 'push_notifications:send-push',
12
+ concurrency: 8,
13
+ }
14
+
15
+ type HandlerContext = JobContext & {
16
+ resolve: <T = unknown>(name: string) => T
17
+ }
18
+
19
+ export default async function handle(
20
+ job: QueuedJob<PushDeliveryJob>,
21
+ ctx: HandlerContext,
22
+ ): Promise<void> {
23
+ const em = (ctx.resolve('em') as EntityManager).fork()
24
+ try {
25
+ await processPushDeliveryJob(em, job.payload, ctx.resolve)
26
+ } catch (error) {
27
+ logger.error('send-push job processing failed', {
28
+ deliveryId: job.payload.deliveryId,
29
+ tenantId: job.payload.tenantId,
30
+ error: error instanceof Error ? error.message : String(error),
31
+ })
32
+ throw error
33
+ }
34
+ }
@@ -4,6 +4,7 @@
4
4
  "audit_logs.resource_kind.sales.payment": "Zahlung",
5
5
  "audit_logs.resource_kind.sales.shipment": "Versand",
6
6
  "customers~sales.nav.group": "Vertrieb",
7
+ "notifications.categories.sales": "Vertrieb",
7
8
  "sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Der Bruttobetrag der Rücksendeanpassung überschreitet den verbleibenden Gesamtbetrag. Bitte verringern Sie den Betrag oder entfernen Sie bestehende Rücksendungen.",
8
9
  "sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Der Nettobetrag der Rücksendeanpassung überschreitet den verbleibenden Gesamtbetrag. Bitte verringern Sie den Betrag oder entfernen Sie bestehende Rücksendungen.",
9
10
  "sales.audit.channels.create": "Vertriebskanal erstellen",
@@ -4,6 +4,7 @@
4
4
  "audit_logs.resource_kind.sales.payment": "Payment",
5
5
  "audit_logs.resource_kind.sales.shipment": "Shipment",
6
6
  "customers~sales.nav.group": "Sales",
7
+ "notifications.categories.sales": "Sales",
7
8
  "sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Return adjustment amountGross exceeds the remaining grand total. Reduce the amount or remove existing returns first.",
8
9
  "sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Return adjustment amountNet exceeds the remaining grand total. Reduce the amount or remove existing returns first.",
9
10
  "sales.audit.channels.create": "Create sales channel",
@@ -4,6 +4,7 @@
4
4
  "audit_logs.resource_kind.sales.payment": "Pago",
5
5
  "audit_logs.resource_kind.sales.shipment": "Envío",
6
6
  "customers~sales.nav.group": "Ventas",
7
+ "notifications.categories.sales": "Ventas",
7
8
  "sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "El importe bruto del ajuste de devolución supera el total restante. Reduzca el importe o elimine las devoluciones existentes.",
8
9
  "sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "El importe neto del ajuste de devolución supera el total restante. Reduzca el importe o elimine las devoluciones existentes.",
9
10
  "sales.audit.channels.create": "Crear canal de ventas",
@@ -4,6 +4,7 @@
4
4
  "audit_logs.resource_kind.sales.payment": "결제",
5
5
  "audit_logs.resource_kind.sales.shipment": "배송",
6
6
  "customers~sales.nav.group": "영업",
7
+ "notifications.categories.sales": "판매",
7
8
  "sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "반품 조정 금액(세포함)이 남은 총액을 초과합니다. 금액을 줄이거나 기존 반품을 먼저 삭제하세요.",
8
9
  "sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "반품 조정 금액(세제외)이 남은 총액을 초과합니다. 금액을 줄이거나 기존 반품을 먼저 삭제하세요.",
9
10
  "sales.audit.channels.create": "판매 채널 생성",
@@ -4,6 +4,7 @@
4
4
  "audit_logs.resource_kind.sales.payment": "Płatność",
5
5
  "audit_logs.resource_kind.sales.shipment": "Wysyłka",
6
6
  "customers~sales.nav.group": "Sprzedaż",
7
+ "notifications.categories.sales": "Sprzeda\u017c",
7
8
  "sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Kwota brutto korekty zwrotu przekracza pozostałą wartość zamówienia. Zmniejsz kwotę lub usuń istniejące zwroty.",
8
9
  "sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Kwota netto korekty zwrotu przekracza pozostałą wartość zamówienia. Zmniejsz kwotę lub usuń istniejące zwroty.",
9
10
  "sales.audit.channels.create": "Utwórz kanał sprzedaży",
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
3
3
  export const notificationTypes: NotificationTypeDefinition[] = [
4
4
  {
5
5
  type: 'sales.order.created',
6
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
7
+ channels: ['in_app', 'email'],
6
8
  module: 'sales',
7
9
  titleKey: 'sales.notifications.order.created.title',
8
10
  bodyKey: 'sales.notifications.order.created.body',
@@ -22,6 +24,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
22
24
  },
23
25
  {
24
26
  type: 'sales.quote.created',
27
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
28
+ channels: ['in_app', 'email'],
25
29
  module: 'sales',
26
30
  titleKey: 'sales.notifications.quote.created.title',
27
31
  bodyKey: 'sales.notifications.quote.created.body',
@@ -41,6 +45,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
41
45
  },
42
46
  {
43
47
  type: 'sales.payment.received',
48
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
49
+ channels: ['in_app', 'email'],
44
50
  module: 'sales',
45
51
  titleKey: 'sales.notifications.payment.received.title',
46
52
  bodyKey: 'sales.notifications.payment.received.body',
@@ -60,6 +66,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
60
66
  },
61
67
  {
62
68
  type: 'sales.quote.expiring',
69
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
70
+ channels: ['in_app', 'email'],
63
71
  module: 'sales',
64
72
  titleKey: 'sales.notifications.quote.expiring.title',
65
73
  bodyKey: 'sales.notifications.quote.expiring.body',
@@ -5,6 +5,7 @@
5
5
  "audit_logs.resource_kind.staff.team_member_address": "Adresse",
6
6
  "audit_logs.resource_kind.staff.team_member_comment": "Kommentar",
7
7
  "audit_logs.resource_kind.staff.team_member_job_history": "Beschäftigungsverlauf",
8
+ "notifications.categories.staff": "Personal",
8
9
  "staff.attendees.actions.add": "Teilnehmer hinzufügen",
9
10
  "staff.attendees.actions.delete": "Löschen",
10
11
  "staff.attendees.actions.deleteConfirm": "Teilnehmer \"{{name}}\" löschen?",
@@ -5,6 +5,7 @@
5
5
  "audit_logs.resource_kind.staff.team_member_address": "Address",
6
6
  "audit_logs.resource_kind.staff.team_member_comment": "Comment",
7
7
  "audit_logs.resource_kind.staff.team_member_job_history": "Job History",
8
+ "notifications.categories.staff": "Staff",
8
9
  "staff.attendees.actions.add": "Add attendee",
9
10
  "staff.attendees.actions.delete": "Delete",
10
11
  "staff.attendees.actions.deleteConfirm": "Delete attendee \"{{name}}\"?",
@@ -5,6 +5,7 @@
5
5
  "audit_logs.resource_kind.staff.team_member_address": "Dirección",
6
6
  "audit_logs.resource_kind.staff.team_member_comment": "Comentario",
7
7
  "audit_logs.resource_kind.staff.team_member_job_history": "Historial laboral",
8
+ "notifications.categories.staff": "Personal",
8
9
  "staff.attendees.actions.add": "Añadir asistente",
9
10
  "staff.attendees.actions.delete": "Eliminar",
10
11
  "staff.attendees.actions.deleteConfirm": "¿Eliminar asistente \"{{name}}\"?",
@@ -5,6 +5,7 @@
5
5
  "audit_logs.resource_kind.staff.team_member_address": "주소",
6
6
  "audit_logs.resource_kind.staff.team_member_comment": "코멘트",
7
7
  "audit_logs.resource_kind.staff.team_member_job_history": "경력 사항",
8
+ "notifications.categories.staff": "직원",
8
9
  "staff.attendees.actions.add": "참석자 추가",
9
10
  "staff.attendees.actions.delete": "삭제",
10
11
  "staff.attendees.actions.deleteConfirm": "참석자 \"{{name}}\"을(를) 삭제하시겠습니까?",
@@ -5,6 +5,7 @@
5
5
  "audit_logs.resource_kind.staff.team_member_address": "Adres",
6
6
  "audit_logs.resource_kind.staff.team_member_comment": "Komentarz",
7
7
  "audit_logs.resource_kind.staff.team_member_job_history": "Historia zatrudnienia",
8
+ "notifications.categories.staff": "Personel",
8
9
  "staff.attendees.actions.add": "Dodaj uczestnika",
9
10
  "staff.attendees.actions.delete": "Usuń",
10
11
  "staff.attendees.actions.deleteConfirm": "Usunąć uczestnika \"{{name}}\"?",
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
3
3
  export const notificationTypes: NotificationTypeDefinition[] = [
4
4
  {
5
5
  type: 'staff.leave_request.pending',
6
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
7
+ channels: ['in_app', 'email'],
6
8
  module: 'staff',
7
9
  titleKey: 'staff.notifications.leaveRequest.pending.title',
8
10
  bodyKey: 'staff.notifications.leaveRequest.pending.body',
@@ -30,6 +32,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
30
32
  },
31
33
  {
32
34
  type: 'staff.leave_request.approved',
35
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
36
+ channels: ['in_app', 'email'],
33
37
  module: 'staff',
34
38
  titleKey: 'staff.notifications.leaveRequest.approved.title',
35
39
  bodyKey: 'staff.notifications.leaveRequest.approved.body',
@@ -49,6 +53,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
49
53
  },
50
54
  {
51
55
  type: 'staff.leave_request.rejected',
56
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
57
+ channels: ['in_app', 'email'],
52
58
  module: 'staff',
53
59
  titleKey: 'staff.notifications.leaveRequest.rejected.title',
54
60
  bodyKey: 'staff.notifications.leaveRequest.rejected.body',
@@ -43,6 +43,7 @@
43
43
  "demo.userTask.description": "Dieser Workflow ist pausiert und wartet auf Benutzereingabe. Bitte schließen Sie die Aufgabe unten ab, um fortzufahren.",
44
44
  "demo.userTask.dueLabel": "Fällig",
45
45
  "demo.userTask.title": "Benutzeraktion erforderlich",
46
+ "notifications.categories.workflows": "Workflows",
46
47
  "orderApproval.approveButton": "Genehmigen",
47
48
  "orderApproval.approvedStatus": "Genehmigt",
48
49
  "orderApproval.commentsLabel": "Kommentare",
@@ -43,6 +43,7 @@
43
43
  "demo.userTask.description": "This workflow is paused waiting for user input. Please complete the task below to continue.",
44
44
  "demo.userTask.dueLabel": "Due",
45
45
  "demo.userTask.title": "User Action Required",
46
+ "notifications.categories.workflows": "Workflows",
46
47
  "orderApproval.approveButton": "Approve",
47
48
  "orderApproval.approvedStatus": "Approved",
48
49
  "orderApproval.commentsLabel": "Comments",
@@ -43,6 +43,7 @@
43
43
  "demo.userTask.description": "Este flujo de trabajo esta pausado esperando entrada del usuario. Completa la tarea a continuacion para continuar.",
44
44
  "demo.userTask.dueLabel": "Vence",
45
45
  "demo.userTask.title": "Se requiere accion del usuario",
46
+ "notifications.categories.workflows": "Flujos de trabajo",
46
47
  "orderApproval.approveButton": "Aprobar",
47
48
  "orderApproval.approvedStatus": "Aprobado",
48
49
  "orderApproval.commentsLabel": "Comentarios",
@@ -43,6 +43,7 @@
43
43
  "demo.userTask.description": "이 워크플로우는 사용자 입력을 기다리며 일시 중지되었습니다. 계속하려면 아래 작업을 완료해 주세요.",
44
44
  "demo.userTask.dueLabel": "기한",
45
45
  "demo.userTask.title": "사용자 작업 필요",
46
+ "notifications.categories.workflows": "워크플로",
46
47
  "orderApproval.approveButton": "승인",
47
48
  "orderApproval.approvedStatus": "승인됨",
48
49
  "orderApproval.commentsLabel": "코멘트",
@@ -43,6 +43,7 @@
43
43
  "demo.userTask.description": "Ten proces jest wstrzymany w oczekiwaniu na dane wejściowe użytkownika. Proszę wykonać zadanie poniżej, aby kontynuować.",
44
44
  "demo.userTask.dueLabel": "Termin",
45
45
  "demo.userTask.title": "Wymagane Działanie Użytkownika",
46
+ "notifications.categories.workflows": "Przep\u0142ywy pracy",
46
47
  "orderApproval.approveButton": "Zatwierdź",
47
48
  "orderApproval.approvedStatus": "Zatwierdzone",
48
49
  "orderApproval.commentsLabel": "Komentarze",
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
3
3
  export const notificationTypes: NotificationTypeDefinition[] = [
4
4
  {
5
5
  type: 'workflows.task.assigned',
6
+ // Ships without push — operators re-enable it per type from the Notification Delivery settings.
7
+ channels: ['in_app', 'email'],
6
8
  module: 'workflows',
7
9
  titleKey: 'workflows.notifications.task.assigned.title',
8
10
  bodyKey: 'workflows.notifications.task.assigned.body',