@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,33 @@
1
+ import React from "react";
2
+ const slidersIcon = React.createElement(
3
+ "svg",
4
+ { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
5
+ React.createElement("line", { x1: 4, y1: 21, x2: 4, y2: 14 }),
6
+ React.createElement("line", { x1: 4, y1: 10, x2: 4, y2: 3 }),
7
+ React.createElement("line", { x1: 12, y1: 21, x2: 12, y2: 12 }),
8
+ React.createElement("line", { x1: 12, y1: 8, x2: 12, y2: 3 }),
9
+ React.createElement("line", { x1: 20, y1: 21, x2: 20, y2: 16 }),
10
+ React.createElement("line", { x1: 20, y1: 12, x2: 20, y2: 3 }),
11
+ React.createElement("line", { x1: 1, y1: 14, x2: 7, y2: 14 }),
12
+ React.createElement("line", { x1: 9, y1: 8, x2: 15, y2: 8 }),
13
+ React.createElement("line", { x1: 17, y1: 16, x2: 23, y2: 16 })
14
+ );
15
+ const metadata = {
16
+ requireAuth: true,
17
+ requireFeatures: ["notifications.manage_preferences"],
18
+ pageTitle: "Notification Preferences",
19
+ pageTitleKey: "notifications.preferences.pageTitle",
20
+ pageGroup: "Profile",
21
+ pageGroupKey: "notifications.preferences.profileGroup",
22
+ pageOrder: 30,
23
+ icon: slidersIcon,
24
+ pageContext: "profile",
25
+ breadcrumb: [
26
+ { label: "Profile", labelKey: "notifications.preferences.profileGroup" },
27
+ { label: "Notification Preferences", labelKey: "notifications.preferences.pageTitle" }
28
+ ]
29
+ };
30
+ export {
31
+ metadata
32
+ };
33
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/notifications/backend/profile/notification-preferences/page.meta.ts"],
4
+ "sourcesContent": ["import React from 'react'\n\nconst slidersIcon = React.createElement(\n 'svg',\n { width: 16, height: 16, viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round' },\n React.createElement('line', { x1: 4, y1: 21, x2: 4, y2: 14 }),\n React.createElement('line', { x1: 4, y1: 10, x2: 4, y2: 3 }),\n React.createElement('line', { x1: 12, y1: 21, x2: 12, y2: 12 }),\n React.createElement('line', { x1: 12, y1: 8, x2: 12, y2: 3 }),\n React.createElement('line', { x1: 20, y1: 21, x2: 20, y2: 16 }),\n React.createElement('line', { x1: 20, y1: 12, x2: 20, y2: 3 }),\n React.createElement('line', { x1: 1, y1: 14, x2: 7, y2: 14 }),\n React.createElement('line', { x1: 9, y1: 8, x2: 15, y2: 8 }),\n React.createElement('line', { x1: 17, y1: 16, x2: 23, y2: 16 }),\n)\n\nexport const metadata = {\n requireAuth: true,\n requireFeatures: ['notifications.manage_preferences'],\n pageTitle: 'Notification Preferences',\n pageTitleKey: 'notifications.preferences.pageTitle',\n pageGroup: 'Profile',\n pageGroupKey: 'notifications.preferences.profileGroup',\n pageOrder: 30,\n icon: slidersIcon,\n pageContext: 'profile' as const,\n breadcrumb: [\n { label: 'Profile', labelKey: 'notifications.preferences.profileGroup' },\n { label: 'Notification Preferences', labelKey: 'notifications.preferences.pageTitle' },\n ],\n} as const\n"],
5
+ "mappings": "AAAA,OAAO,WAAW;AAElB,MAAM,cAAc,MAAM;AAAA,EACxB;AAAA,EACA,EAAE,OAAO,IAAI,QAAQ,IAAI,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,GAAG,eAAe,SAAS,gBAAgB,QAAQ;AAAA,EACrJ,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAC5D,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;AAAA,EAC3D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAC9D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EAC5D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAAA,EAC9D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EAC7D,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC;AAAA,EAC5D,MAAM,cAAc,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EAC3D,MAAM,cAAc,QAAQ,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,CAAC;AAChE;AAEO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,kCAAkC;AAAA,EACpD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AAAA,IACV,EAAE,OAAO,WAAW,UAAU,yCAAyC;AAAA,IACvE,EAAE,OAAO,4BAA4B,UAAU,sCAAsC;AAAA,EACvF;AACF;",
6
+ "names": []
7
+ }
@@ -78,6 +78,15 @@ __decorateClass([
78
78
  __decorateClass([
79
79
  Property({ name: "group_key", type: "text", nullable: true })
80
80
  ], Notification.prototype, "groupKey", 2);
81
+ __decorateClass([
82
+ Property({ name: "data", type: "json", nullable: true })
83
+ ], Notification.prototype, "data", 2);
84
+ __decorateClass([
85
+ Property({ name: "push_options", type: "json", nullable: true })
86
+ ], Notification.prototype, "pushOptions", 2);
87
+ __decorateClass([
88
+ Property({ name: "channels", type: "json", nullable: true })
89
+ ], Notification.prototype, "channels", 2);
81
90
  __decorateClass([
82
91
  Property({ name: "created_at", type: Date, onCreate: () => /* @__PURE__ */ new Date() })
83
92
  ], Notification.prototype, "createdAt", 2);
@@ -107,7 +116,125 @@ Notification = __decorateClass([
107
116
  Index({ name: "notifications_expires_idx", properties: ["expiresAt"] }),
108
117
  Index({ name: "notifications_group_idx", properties: ["groupKey", "recipientUserId"] })
109
118
  ], Notification);
119
+ OptionalProps;
120
+ let NotificationType = class {
121
+ constructor() {
122
+ this.silent = false;
123
+ this.nonOptOut = false;
124
+ this.createdAt = /* @__PURE__ */ new Date();
125
+ this.updatedAt = /* @__PURE__ */ new Date();
126
+ }
127
+ };
128
+ __decorateClass([
129
+ PrimaryKey({ name: "id", type: "text" })
130
+ ], NotificationType.prototype, "id", 2);
131
+ __decorateClass([
132
+ Property({ name: "tenant_id", type: "uuid", nullable: true })
133
+ ], NotificationType.prototype, "tenantId", 2);
134
+ __decorateClass([
135
+ Property({ name: "label_key", type: "text" })
136
+ ], NotificationType.prototype, "labelKey", 2);
137
+ __decorateClass([
138
+ Property({ name: "description_key", type: "text", nullable: true })
139
+ ], NotificationType.prototype, "descriptionKey", 2);
140
+ __decorateClass([
141
+ Property({ name: "category", type: "text", nullable: true })
142
+ ], NotificationType.prototype, "category", 2);
143
+ __decorateClass([
144
+ Property({ name: "silent", type: "boolean", default: false })
145
+ ], NotificationType.prototype, "silent", 2);
146
+ __decorateClass([
147
+ Property({ name: "non_opt_out", type: "boolean", default: false })
148
+ ], NotificationType.prototype, "nonOptOut", 2);
149
+ __decorateClass([
150
+ Property({ name: "created_at", type: Date, onCreate: () => /* @__PURE__ */ new Date() })
151
+ ], NotificationType.prototype, "createdAt", 2);
152
+ __decorateClass([
153
+ Property({ name: "updated_at", type: Date, onCreate: () => /* @__PURE__ */ new Date(), onUpdate: () => /* @__PURE__ */ new Date() })
154
+ ], NotificationType.prototype, "updatedAt", 2);
155
+ NotificationType = __decorateClass([
156
+ Entity({ tableName: "notification_types" }),
157
+ Index({ name: "notification_types_tenant_idx", properties: ["tenantId"] })
158
+ ], NotificationType);
159
+ OptionalProps;
160
+ let NotificationTypeOverride = class {
161
+ constructor() {
162
+ this.createdAt = /* @__PURE__ */ new Date();
163
+ this.updatedAt = /* @__PURE__ */ new Date();
164
+ }
165
+ };
166
+ __decorateClass([
167
+ PrimaryKey({ type: "uuid", defaultRaw: "gen_random_uuid()" })
168
+ ], NotificationTypeOverride.prototype, "id", 2);
169
+ __decorateClass([
170
+ Property({ name: "tenant_id", type: "uuid" })
171
+ ], NotificationTypeOverride.prototype, "tenantId", 2);
172
+ __decorateClass([
173
+ Property({ name: "notification_type_id", type: "text" })
174
+ ], NotificationTypeOverride.prototype, "notificationTypeId", 2);
175
+ __decorateClass([
176
+ Property({ name: "channels", type: "json", nullable: true })
177
+ ], NotificationTypeOverride.prototype, "channels", 2);
178
+ __decorateClass([
179
+ Property({ name: "non_opt_out", type: "boolean", nullable: true })
180
+ ], NotificationTypeOverride.prototype, "nonOptOut", 2);
181
+ __decorateClass([
182
+ Property({ name: "created_at", type: Date, onCreate: () => /* @__PURE__ */ new Date() })
183
+ ], NotificationTypeOverride.prototype, "createdAt", 2);
184
+ __decorateClass([
185
+ Property({ name: "updated_at", type: Date, onCreate: () => /* @__PURE__ */ new Date(), onUpdate: () => /* @__PURE__ */ new Date() })
186
+ ], NotificationTypeOverride.prototype, "updatedAt", 2);
187
+ NotificationTypeOverride = __decorateClass([
188
+ Entity({ tableName: "notification_type_overrides" }),
189
+ Index({
190
+ name: "notification_type_overrides_unique",
191
+ expression: 'create unique index "notification_type_overrides_unique" on "notification_type_overrides" ("tenant_id", "notification_type_id");'
192
+ })
193
+ ], NotificationTypeOverride);
194
+ OptionalProps;
195
+ let NotificationPreference = class {
196
+ constructor() {
197
+ this.enabled = true;
198
+ this.createdAt = /* @__PURE__ */ new Date();
199
+ this.updatedAt = /* @__PURE__ */ new Date();
200
+ }
201
+ };
202
+ __decorateClass([
203
+ PrimaryKey({ type: "uuid", defaultRaw: "gen_random_uuid()" })
204
+ ], NotificationPreference.prototype, "id", 2);
205
+ __decorateClass([
206
+ Property({ name: "tenant_id", type: "uuid" })
207
+ ], NotificationPreference.prototype, "tenantId", 2);
208
+ __decorateClass([
209
+ Property({ name: "user_id", type: "uuid" })
210
+ ], NotificationPreference.prototype, "userId", 2);
211
+ __decorateClass([
212
+ Property({ name: "notification_type_id", type: "text" })
213
+ ], NotificationPreference.prototype, "notificationTypeId", 2);
214
+ __decorateClass([
215
+ Property({ name: "channel", type: "text" })
216
+ ], NotificationPreference.prototype, "channel", 2);
217
+ __decorateClass([
218
+ Property({ name: "enabled", type: "boolean", default: true })
219
+ ], NotificationPreference.prototype, "enabled", 2);
220
+ __decorateClass([
221
+ Property({ name: "created_at", type: Date, onCreate: () => /* @__PURE__ */ new Date() })
222
+ ], NotificationPreference.prototype, "createdAt", 2);
223
+ __decorateClass([
224
+ Property({ name: "updated_at", type: Date, onCreate: () => /* @__PURE__ */ new Date(), onUpdate: () => /* @__PURE__ */ new Date() })
225
+ ], NotificationPreference.prototype, "updatedAt", 2);
226
+ NotificationPreference = __decorateClass([
227
+ Entity({ tableName: "notification_preferences" }),
228
+ Index({ name: "notification_preferences_tenant_user_idx", properties: ["tenantId", "userId"] }),
229
+ Index({
230
+ name: "notification_preferences_unique",
231
+ expression: 'create unique index "notification_preferences_unique" on "notification_preferences" ("tenant_id", "user_id", "notification_type_id", "channel");'
232
+ })
233
+ ], NotificationPreference);
110
234
  export {
111
- Notification
235
+ Notification,
236
+ NotificationPreference,
237
+ NotificationType,
238
+ NotificationTypeOverride
112
239
  };
113
240
  //# sourceMappingURL=entities.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/notifications/data/entities.ts"],
4
- "sourcesContent": ["import { OptionalProps } from '@mikro-orm/core'\nimport { Entity, Index, PrimaryKey, Property } from '@mikro-orm/decorators/legacy'\nimport type { NotificationActionData } from '@open-mercato/shared/modules/notifications/types'\n\nexport type NotificationStatus = 'unread' | 'read' | 'actioned' | 'dismissed'\nexport type NotificationSeverity = 'info' | 'warning' | 'success' | 'error'\n\n@Entity({ tableName: 'notifications' })\n@Index({ name: 'notifications_recipient_status_idx', properties: ['recipientUserId', 'status', 'createdAt'] })\n@Index({ name: 'notifications_source_idx', properties: ['sourceEntityType', 'sourceEntityId'] })\n@Index({ name: 'notifications_tenant_idx', properties: ['tenantId', 'organizationId'] })\n@Index({ name: 'notifications_expires_idx', properties: ['expiresAt'] })\n@Index({ name: 'notifications_group_idx', properties: ['groupKey', 'recipientUserId'] })\nexport class Notification {\n [OptionalProps]?: 'status' | 'severity' | 'createdAt'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'recipient_user_id', type: 'uuid' })\n recipientUserId!: string\n\n @Property({ name: 'type', type: 'text' })\n type!: string\n\n // i18n keys (preferred for i18n-first approach)\n @Property({ name: 'title_key', type: 'text', nullable: true })\n titleKey?: string | null\n\n @Property({ name: 'body_key', type: 'text', nullable: true })\n bodyKey?: string | null\n\n // Template variables for i18n interpolation (stored as JSONB)\n @Property({ name: 'title_variables', type: 'json', nullable: true })\n titleVariables?: Record<string, string> | null\n\n @Property({ name: 'body_variables', type: 'json', nullable: true })\n bodyVariables?: Record<string, string> | null\n\n // Fallback text (for backward compatibility or when keys are not available)\n @Property({ name: 'title', type: 'text' })\n title!: string\n\n @Property({ name: 'body', type: 'text', nullable: true })\n body?: string | null\n\n @Property({ name: 'icon', type: 'text', nullable: true })\n icon?: string | null\n\n @Property({ name: 'severity', type: 'text', default: 'info' })\n severity: NotificationSeverity = 'info'\n\n @Property({ name: 'status', type: 'text', default: 'unread' })\n status: NotificationStatus = 'unread'\n\n @Property({ name: 'action_data', type: 'json', nullable: true })\n actionData?: NotificationActionData | null\n\n @Property({ name: 'action_result', type: 'json', nullable: true })\n actionResult?: Record<string, unknown> | null\n\n @Property({ name: 'action_taken', type: 'text', nullable: true })\n actionTaken?: string | null\n\n @Property({ name: 'source_module', type: 'text', nullable: true })\n sourceModule?: string | null\n\n @Property({ name: 'source_entity_type', type: 'text', nullable: true })\n sourceEntityType?: string | null\n\n @Property({ name: 'source_entity_id', type: 'uuid', nullable: true })\n sourceEntityId?: string | null\n\n @Property({ name: 'link_href', type: 'text', nullable: true })\n linkHref?: string | null\n\n @Property({ name: 'group_key', type: 'text', nullable: true })\n groupKey?: string | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'read_at', type: Date, nullable: true })\n readAt?: Date | null\n\n @Property({ name: 'actioned_at', type: Date, nullable: true })\n actionedAt?: Date | null\n\n @Property({ name: 'dismissed_at', type: Date, nullable: true })\n dismissedAt?: Date | null\n\n @Property({ name: 'expires_at', type: Date, nullable: true })\n expiresAt?: Date | null\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n}\n"],
5
- "mappings": ";;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,QAAQ,OAAO,YAAY,gBAAgB;AAajD;AADI,IAAM,eAAN,MAAmB;AAAA,EAAnB;AAqCL,oBAAiC;AAGjC,kBAA6B;AA2B7B,qBAAkB,oBAAI,KAAK;AAAA;AAmB7B;AAlFE;AAAA,EADC,WAAW,EAAE,MAAM,QAAQ,YAAY,oBAAoB,CAAC;AAAA,GAHlD,aAIX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,qBAAqB,MAAM,OAAO,CAAC;AAAA,GAN1C,aAOX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,GAT7B,aAUX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAblD,aAcX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,YAAY,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAhBjD,aAiBX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GApBxD,aAqBX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,kBAAkB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAvBvD,aAwBX;AAIA;AAAA,EADC,SAAS,EAAE,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,GA3B9B,aA4BX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA9B7C,aA+BX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAjC7C,aAkCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,YAAY,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,GApClD,aAqCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,UAAU,MAAM,QAAQ,SAAS,SAAS,CAAC;AAAA,GAvClD,aAwCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,eAAe,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA1CpD,aA2CX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,iBAAiB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA7CtD,aA8CX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,gBAAgB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAhDrD,aAiDX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,iBAAiB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAnDtD,aAoDX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,sBAAsB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAtD3D,aAuDX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,oBAAoB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAzDzD,aA0DX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA5DlD,aA6DX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA/DlD,aAgEX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,MAAM,oBAAI,KAAK,EAAE,CAAC;AAAA,GAlE7D,aAmEX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,WAAW,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GArE9C,aAsEX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,eAAe,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GAxElD,aAyEX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,gBAAgB,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GA3EnD,aA4EX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GA9EjD,aA+EX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,OAAO,CAAC;AAAA,GAjFlC,aAkFX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GApFxD,aAqFX;AArFW,eAAN;AAAA,EANN,OAAO,EAAE,WAAW,gBAAgB,CAAC;AAAA,EACrC,MAAM,EAAE,MAAM,sCAAsC,YAAY,CAAC,mBAAmB,UAAU,WAAW,EAAE,CAAC;AAAA,EAC5G,MAAM,EAAE,MAAM,4BAA4B,YAAY,CAAC,oBAAoB,gBAAgB,EAAE,CAAC;AAAA,EAC9F,MAAM,EAAE,MAAM,4BAA4B,YAAY,CAAC,YAAY,gBAAgB,EAAE,CAAC;AAAA,EACtF,MAAM,EAAE,MAAM,6BAA6B,YAAY,CAAC,WAAW,EAAE,CAAC;AAAA,EACtE,MAAM,EAAE,MAAM,2BAA2B,YAAY,CAAC,YAAY,iBAAiB,EAAE,CAAC;AAAA,GAC1E;",
4
+ "sourcesContent": ["import { OptionalProps } from '@mikro-orm/core'\nimport { Entity, Index, PrimaryKey, Property } from '@mikro-orm/decorators/legacy'\nimport type { NotificationActionData } from '@open-mercato/shared/modules/notifications/types'\n\nexport type NotificationStatus = 'unread' | 'read' | 'actioned' | 'dismissed'\nexport type NotificationSeverity = 'info' | 'warning' | 'success' | 'error'\n\n@Entity({ tableName: 'notifications' })\n@Index({ name: 'notifications_recipient_status_idx', properties: ['recipientUserId', 'status', 'createdAt'] })\n@Index({ name: 'notifications_source_idx', properties: ['sourceEntityType', 'sourceEntityId'] })\n@Index({ name: 'notifications_tenant_idx', properties: ['tenantId', 'organizationId'] })\n@Index({ name: 'notifications_expires_idx', properties: ['expiresAt'] })\n@Index({ name: 'notifications_group_idx', properties: ['groupKey', 'recipientUserId'] })\nexport class Notification {\n [OptionalProps]?: 'status' | 'severity' | 'createdAt'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'recipient_user_id', type: 'uuid' })\n recipientUserId!: string\n\n @Property({ name: 'type', type: 'text' })\n type!: string\n\n // i18n keys (preferred for i18n-first approach)\n @Property({ name: 'title_key', type: 'text', nullable: true })\n titleKey?: string | null\n\n @Property({ name: 'body_key', type: 'text', nullable: true })\n bodyKey?: string | null\n\n // Template variables for i18n interpolation (stored as JSONB)\n @Property({ name: 'title_variables', type: 'json', nullable: true })\n titleVariables?: Record<string, string> | null\n\n @Property({ name: 'body_variables', type: 'json', nullable: true })\n bodyVariables?: Record<string, string> | null\n\n // Fallback text (for backward compatibility or when keys are not available)\n @Property({ name: 'title', type: 'text' })\n title!: string\n\n @Property({ name: 'body', type: 'text', nullable: true })\n body?: string | null\n\n @Property({ name: 'icon', type: 'text', nullable: true })\n icon?: string | null\n\n @Property({ name: 'severity', type: 'text', default: 'info' })\n severity: NotificationSeverity = 'info'\n\n @Property({ name: 'status', type: 'text', default: 'unread' })\n status: NotificationStatus = 'unread'\n\n @Property({ name: 'action_data', type: 'json', nullable: true })\n actionData?: NotificationActionData | null\n\n @Property({ name: 'action_result', type: 'json', nullable: true })\n actionResult?: Record<string, unknown> | null\n\n @Property({ name: 'action_taken', type: 'text', nullable: true })\n actionTaken?: string | null\n\n @Property({ name: 'source_module', type: 'text', nullable: true })\n sourceModule?: string | null\n\n @Property({ name: 'source_entity_type', type: 'text', nullable: true })\n sourceEntityType?: string | null\n\n @Property({ name: 'source_entity_id', type: 'uuid', nullable: true })\n sourceEntityId?: string | null\n\n @Property({ name: 'link_href', type: 'text', nullable: true })\n linkHref?: string | null\n\n @Property({ name: 'group_key', type: 'text', nullable: true })\n groupKey?: string | null\n\n // Arbitrary app-readable key/values delivered with the push payload and exposed to in-app clients.\n @Property({ name: 'data', type: 'json', nullable: true })\n data?: Record<string, string> | null\n\n // Per-provider push customization (sound/badge/image/priority/channelId/body); push-only.\n // Typed loosely to keep notifications decoupled from communication_channels' PushOptions.\n @Property({ name: 'push_options', type: 'json', nullable: true })\n pushOptions?: Record<string, unknown> | null\n\n // Resolved delivery channels for this notification (target \u2229 type-eligibility \u2229 registered \u2229 preference).\n // Authoritative target filter the dispatcher loops over; `in_app` membership also gates bell/inbox visibility.\n // NULL = legacy/all-channels (delivered and visible everywhere) \u2014 preserves pre-Phase-7 behavior.\n @Property({ name: 'channels', type: 'json', nullable: true })\n channels?: string[] | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'read_at', type: Date, nullable: true })\n readAt?: Date | null\n\n @Property({ name: 'actioned_at', type: Date, nullable: true })\n actionedAt?: Date | null\n\n @Property({ name: 'dismissed_at', type: Date, nullable: true })\n dismissedAt?: Date | null\n\n @Property({ name: 'expires_at', type: Date, nullable: true })\n expiresAt?: Date | null\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n}\n\n/**\n * DB-backed mirror of the code-registered notification type catalogue\n * (the in-memory `NotificationTypeDefinition` seam stays the source of truth).\n * Lets remote clients (mobile apps) enumerate types over HTTP to render a\n * preferences screen without shipping a copy of the catalogue.\n *\n * `tenant_id` is nullable: code-registered types are system-wide (`null`).\n * The string `id` is the frozen notification-type id (e.g. `sales.order.created`).\n */\n@Entity({ tableName: 'notification_types' })\n@Index({ name: 'notification_types_tenant_idx', properties: ['tenantId'] })\nexport class NotificationType {\n [OptionalProps]?: 'tenantId' | 'descriptionKey' | 'category' | 'silent' | 'nonOptOut' | 'createdAt' | 'updatedAt'\n\n @PrimaryKey({ name: 'id', type: 'text' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'label_key', type: 'text' })\n labelKey!: string\n\n @Property({ name: 'description_key', type: 'text', nullable: true })\n descriptionKey?: string | null\n\n @Property({ name: 'category', type: 'text', nullable: true })\n category?: string | null\n\n @Property({ name: 'silent', type: 'boolean', default: false })\n silent: boolean = false\n\n @Property({ name: 'non_opt_out', type: 'boolean', default: false })\n nonOptOut: boolean = false\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n}\n\n/**\n * Tenant-scoped operator override of a notification type's delivery contract.\n * Lazy-seeded like `NotificationPreference`: an absent row means the code\n * declarations apply unchanged. `channels` REPLACES the code-declared\n * `NotificationTypeDefinition.channels` when set (`null` inherits it) \u2014 a\n * channel outside the effective set never delivers for the type in this tenant\n * (checked before both the `nonOptOut` bypass and user preferences) and users\n * cannot opt into it; the preference UIs render the cell locked off.\n * `nonOptOut` overrides the code-declared flag the same way: `true` forces the\n * type on for the tenant's users, `false` makes a code-required type\n * user-editable, `null` inherits. The `notification_type_id` is a soft string\n * reference to a `notification_types.id` (no cross-module ORM relationship);\n * `syncNotificationTypes` never touches this table, so operator edits survive\n * catalogue re-syncs.\n */\n@Entity({ tableName: 'notification_type_overrides' })\n@Index({\n name: 'notification_type_overrides_unique',\n expression:\n 'create unique index \"notification_type_overrides_unique\" on \"notification_type_overrides\" (\"tenant_id\", \"notification_type_id\");',\n})\nexport class NotificationTypeOverride {\n [OptionalProps]?: 'createdAt' | 'updatedAt'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'notification_type_id', type: 'text' })\n notificationTypeId!: string\n\n @Property({ name: 'channels', type: 'json', nullable: true })\n channels?: string[] | null\n\n @Property({ name: 'non_opt_out', type: 'boolean', nullable: true })\n nonOptOut?: boolean | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n}\n\n/**\n * Channel-agnostic per-user notification preference. Lazy-seeded: an absent row\n * means the channel is enabled (default-on). Channels (in_app, push, future\n * email/sms) are free-form strings; the `notification_type_id` is a soft string\n * reference to a `notification_types.id` (no cross-module ORM relationship).\n */\n@Entity({ tableName: 'notification_preferences' })\n@Index({ name: 'notification_preferences_tenant_user_idx', properties: ['tenantId', 'userId'] })\n@Index({\n name: 'notification_preferences_unique',\n expression:\n 'create unique index \"notification_preferences_unique\" on \"notification_preferences\" (\"tenant_id\", \"user_id\", \"notification_type_id\", \"channel\");',\n})\nexport class NotificationPreference {\n [OptionalProps]?: 'enabled' | 'createdAt' | 'updatedAt'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'user_id', type: 'uuid' })\n userId!: string\n\n @Property({ name: 'notification_type_id', type: 'text' })\n notificationTypeId!: string\n\n @Property({ name: 'channel', type: 'text' })\n channel!: string\n\n @Property({ name: 'enabled', type: 'boolean', default: true })\n enabled: boolean = true\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -17,6 +17,14 @@ const notificationActionSchema = z.object({
17
17
  confirmRequired: z.boolean().optional(),
18
18
  confirmMessage: z.string().optional()
19
19
  });
20
+ const pushOptionsSchema = z.object({
21
+ sound: z.string().optional(),
22
+ badge: z.number().int().nonnegative().optional(),
23
+ image: z.string().optional(),
24
+ priority: z.enum(["high", "normal"]).optional(),
25
+ channelId: z.string().optional(),
26
+ body: z.string().optional()
27
+ }).catchall(z.unknown());
20
28
  const baseNotificationFieldsSchema = z.object({
21
29
  type: z.string().min(1).max(100),
22
30
  titleKey: z.string().min(1).max(200).optional(),
@@ -34,7 +42,17 @@ const baseNotificationFieldsSchema = z.object({
34
42
  sourceEntityId: z.string().uuid().optional(),
35
43
  linkHref: safeRelativeHrefSchema.optional(),
36
44
  groupKey: z.string().optional(),
37
- expiresAt: z.string().datetime().optional()
45
+ expiresAt: z.string().datetime().optional(),
46
+ // Arbitrary app-readable key/values delivered with the push (and visible to in-app clients).
47
+ data: z.record(z.string(), z.string()).optional(),
48
+ // Per-provider push customization (sound, badge, image, priority, channelId, body override).
49
+ pushOptions: pushOptionsSchema.optional(),
50
+ // Explicit per-send channel target. When present, delivery is restricted to these channels
51
+ // (intersected with the type's eligibility, the registered strategies, and the recipient's
52
+ // preferences). Absent → all registered channels (pre-Phase-7 behavior). Must be non-empty when
53
+ // provided: an empty array would resolve to zero deliverable channels and silently black-hole the
54
+ // notification (invisible + undelivered) — omit the field instead to target every channel.
55
+ channels: z.array(z.string().min(1).max(32)).min(1).optional()
38
56
  });
39
57
  const titleRequiredRefinement = {
40
58
  refine: (data) => data.titleKey || data.title,
@@ -81,7 +99,77 @@ const notificationDeliveryConfigSchema = z.object({
81
99
  custom: z.record(z.string(), notificationDeliveryCustomSchema).optional()
82
100
  }).optional()
83
101
  });
102
+ const notificationTypeItemSchema = z.object({
103
+ id: z.string(),
104
+ labelKey: z.string(),
105
+ descriptionKey: z.string().nullable().optional(),
106
+ // Free-form grouping label so a client can list/group types under a heading. Defaults to
107
+ // the prefix before the first dot in the type id (`sales.order.created` → `sales`), so in
108
+ // practice it is always populated; kept nullable to avoid narrowing the response contract.
109
+ // This is the STABLE grouping key — clients group on it and display `categoryLabel`.
110
+ category: z.string().nullable().optional(),
111
+ // Localized heading for `category`, resolved server-side from
112
+ // `notifications.categories.<key>` with a humanized fallback. Display-only: grouping on it
113
+ // re-partitions the list whenever the locale changes.
114
+ categoryLabel: z.string().nullable(),
115
+ // Server-resolved display strings so clients without the app dictionary (the mobile app)
116
+ // need no i18n bundle. `null` iff the corresponding `*Key` is null.
117
+ label: z.string().nullable(),
118
+ description: z.string().nullable(),
119
+ // When true the type is delivered as a silent / content-available push.
120
+ silent: z.boolean(),
121
+ // Effective "cannot be opted out of" flag (operator override ?? code-declared); a preferences
122
+ // UI should lock the type on when true.
123
+ nonOptOut: z.boolean(),
124
+ // Effective channel eligibility for the caller's tenant (stored override ?? code-declared
125
+ // `type.channels`). `null` = no restriction (every registered channel). A channel outside
126
+ // the set never delivers for this type in the tenant and users cannot opt into it —
127
+ // preference UIs lock the cell off.
128
+ channels: z.array(z.string()).nullable(),
129
+ // The raw tenant-stored override (`notification_type_overrides.channels`; `null` = inherit
130
+ // code). Admin editors base PATCH payloads on the EFFECTIVE set, but this shows whether an
131
+ // override exists at all.
132
+ storedChannels: z.array(z.string()).nullable(),
133
+ // The raw tenant-stored `nonOptOut` override (`null` = inherit the code-declared flag).
134
+ storedNonOptOut: z.boolean().nullable(),
135
+ // Optimistic-lock version of the tenant's override row (ISO timestamp; `null` when the
136
+ // tenant stores no override yet). PATCH callers echo it back via the standard
137
+ // `x-om-ext-optimistic-lock-expected-updated-at` header.
138
+ updatedAt: z.string().nullable()
139
+ });
140
+ const updateNotificationTypeSchema = z.object({
141
+ id: z.string().min(1),
142
+ // Mirror the create guard: a non-empty array restricts eligibility, `null` clears the override
143
+ // (code declaration reapplies). An empty array is rejected — it would resolve to zero deliverable
144
+ // channels and silently black-hole the type (invisible + undelivered); clear with `null` instead.
145
+ channels: z.array(z.string().min(1)).min(1).nullable().optional(),
146
+ nonOptOut: z.boolean().nullable().optional()
147
+ }).refine((value) => value.channels !== void 0 || value.nonOptOut !== void 0, {
148
+ message: "At least one of channels or nonOptOut must be provided"
149
+ });
150
+ const notificationPreferenceItemSchema = z.object({
151
+ notificationTypeId: z.string(),
152
+ channel: z.string(),
153
+ enabled: z.boolean()
154
+ });
155
+ const updatePreferencesSchema = z.object({
156
+ preferences: z.array(
157
+ z.object({
158
+ notificationTypeId: z.string().trim().min(1).max(128),
159
+ channel: z.string().trim().min(1).max(32),
160
+ enabled: z.boolean()
161
+ })
162
+ ).max(500)
163
+ });
164
+ const adminPreferencesQuerySchema = z.object({
165
+ userId: z.string().uuid()
166
+ });
167
+ const adminUpdatePreferencesSchema = updatePreferencesSchema.extend({
168
+ userId: z.string().uuid()
169
+ });
84
170
  export {
171
+ adminPreferencesQuerySchema,
172
+ adminUpdatePreferencesSchema,
85
173
  createBatchNotificationSchema,
86
174
  createFeatureNotificationSchema,
87
175
  createNotificationSchema,
@@ -90,9 +178,14 @@ export {
90
178
  listNotificationsSchema,
91
179
  notificationActionSchema,
92
180
  notificationDeliveryConfigSchema,
181
+ notificationPreferenceItemSchema,
93
182
  notificationSeveritySchema,
94
183
  notificationStatusSchema,
184
+ notificationTypeItemSchema,
185
+ pushOptionsSchema,
95
186
  restoreNotificationSchema,
96
- safeRelativeHrefSchema
187
+ safeRelativeHrefSchema,
188
+ updateNotificationTypeSchema,
189
+ updatePreferencesSchema
97
190
  };
98
191
  //# sourceMappingURL=validators.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/notifications/data/validators.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\nimport { isSafeNotificationHref } from '../lib/safeHref'\n\nexport const notificationStatusSchema = z.enum(['unread', 'read', 'actioned', 'dismissed'])\nexport const notificationSeveritySchema = z.enum(['info', 'warning', 'success', 'error'])\n\nexport const safeRelativeHrefSchema = z.string().min(1).refine(\n (href) => isSafeNotificationHref(href),\n { message: 'Href must be a same-origin relative path starting with /' }\n)\n\nexport const notificationActionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n labelKey: z.string().optional(),\n variant: z.enum(['default', 'secondary', 'destructive', 'outline', 'ghost']).optional(),\n icon: z.string().optional(),\n commandId: z.string().optional(),\n href: safeRelativeHrefSchema.optional(),\n confirmRequired: z.boolean().optional(),\n confirmMessage: z.string().optional(),\n})\n\nconst baseNotificationFieldsSchema = z.object({\n type: z.string().min(1).max(100),\n titleKey: z.string().min(1).max(200).optional(),\n bodyKey: z.string().min(1).max(200).optional(),\n titleVariables: z.record(z.string(), z.string()).optional(),\n bodyVariables: z.record(z.string(), z.string()).optional(),\n title: z.string().min(1).max(500).optional(),\n body: z.string().max(2000).optional(),\n icon: z.string().max(100).optional(),\n severity: notificationSeveritySchema.optional().default('info'),\n actions: z.array(notificationActionSchema).optional(),\n primaryActionId: z.string().optional(),\n sourceModule: z.string().optional(),\n sourceEntityType: z.string().optional(),\n sourceEntityId: z.string().uuid().optional(),\n linkHref: safeRelativeHrefSchema.optional(),\n groupKey: z.string().optional(),\n expiresAt: z.string().datetime().optional(),\n})\n\nconst titleRequiredRefinement = {\n refine: (data: { titleKey?: string; title?: string }) => data.titleKey || data.title,\n message: 'Either titleKey or title must be provided',\n} as const\n\nexport const createNotificationSchema = baseNotificationFieldsSchema\n .extend({ recipientUserId: z.string().uuid() })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createBatchNotificationSchema = baseNotificationFieldsSchema\n .extend({ recipientUserIds: z.array(z.string().uuid()).min(1).max(1000) })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createRoleNotificationSchema = baseNotificationFieldsSchema\n .extend({ roleId: z.string().uuid() })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createFeatureNotificationSchema = baseNotificationFieldsSchema\n .extend({ requiredFeature: z.string().min(1).max(100) })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const listNotificationsSchema = z.object({\n status: z.union([notificationStatusSchema, z.array(notificationStatusSchema)]).optional(),\n type: z.string().optional(),\n severity: notificationSeveritySchema.optional(),\n sourceEntityType: z.string().optional(),\n sourceEntityId: z.string().uuid().optional(),\n since: z.string().datetime().optional(),\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(20),\n})\n\nexport const executeActionSchema = z.object({\n actionId: z.string().min(1),\n payload: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const restoreNotificationSchema = z.object({\n status: z.enum(['read', 'unread']).optional(),\n})\n\nconst notificationDeliveryStrategySchema = z.object({\n enabled: z.boolean().optional(),\n})\n\nconst notificationDeliveryEmailSchema = notificationDeliveryStrategySchema.extend({\n from: z.string().trim().min(1).optional(),\n replyTo: z.string().trim().min(1).optional(),\n subjectPrefix: z.string().trim().min(1).optional(),\n})\n\nconst notificationDeliveryCustomSchema = notificationDeliveryStrategySchema.extend({\n config: z.unknown().optional(),\n})\n\nexport const notificationDeliveryConfigSchema = z.object({\n appUrl: z.string().url().optional(),\n panelPath: safeRelativeHrefSchema.optional(),\n strategies: z.object({\n database: notificationDeliveryStrategySchema.optional(),\n email: notificationDeliveryEmailSchema.optional(),\n custom: z.record(z.string(), notificationDeliveryCustomSchema).optional(),\n }).optional(),\n})\n\nexport type CreateNotificationInput = z.infer<typeof createNotificationSchema>\nexport type CreateBatchNotificationInput = z.infer<typeof createBatchNotificationSchema>\nexport type CreateRoleNotificationInput = z.infer<typeof createRoleNotificationSchema>\nexport type CreateFeatureNotificationInput = z.infer<typeof createFeatureNotificationSchema>\nexport type ListNotificationsInput = z.infer<typeof listNotificationsSchema>\nexport type ExecuteActionInput = z.infer<typeof executeActionSchema>\nexport type NotificationDeliveryConfigInput = z.infer<typeof notificationDeliveryConfigSchema>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\nimport { isSafeNotificationHref } from '../lib/safeHref'\n\nexport const notificationStatusSchema = z.enum(['unread', 'read', 'actioned', 'dismissed'])\nexport const notificationSeveritySchema = z.enum(['info', 'warning', 'success', 'error'])\n\nexport const safeRelativeHrefSchema = z.string().min(1).refine(\n (href) => isSafeNotificationHref(href),\n { message: 'Href must be a same-origin relative path starting with /' }\n)\n\nexport const notificationActionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n labelKey: z.string().optional(),\n variant: z.enum(['default', 'secondary', 'destructive', 'outline', 'ghost']).optional(),\n icon: z.string().optional(),\n commandId: z.string().optional(),\n href: safeRelativeHrefSchema.optional(),\n confirmRequired: z.boolean().optional(),\n confirmMessage: z.string().optional(),\n})\n\n/**\n * Flat per-provider push customization. Known keys are mapped onto each provider's native message\n * by the push adapters; unknown keys are accepted (passthrough) for providers that understand them.\n * See `communication_channels/lib/push-envelope.ts` (`PushOptions`).\n */\nexport const pushOptionsSchema = z\n .object({\n sound: z.string().optional(),\n badge: z.number().int().nonnegative().optional(),\n image: z.string().optional(),\n priority: z.enum(['high', 'normal']).optional(),\n channelId: z.string().optional(),\n body: z.string().optional(),\n })\n .catchall(z.unknown())\n\nconst baseNotificationFieldsSchema = z.object({\n type: z.string().min(1).max(100),\n titleKey: z.string().min(1).max(200).optional(),\n bodyKey: z.string().min(1).max(200).optional(),\n titleVariables: z.record(z.string(), z.string()).optional(),\n bodyVariables: z.record(z.string(), z.string()).optional(),\n title: z.string().min(1).max(500).optional(),\n body: z.string().max(2000).optional(),\n icon: z.string().max(100).optional(),\n severity: notificationSeveritySchema.optional().default('info'),\n actions: z.array(notificationActionSchema).optional(),\n primaryActionId: z.string().optional(),\n sourceModule: z.string().optional(),\n sourceEntityType: z.string().optional(),\n sourceEntityId: z.string().uuid().optional(),\n linkHref: safeRelativeHrefSchema.optional(),\n groupKey: z.string().optional(),\n expiresAt: z.string().datetime().optional(),\n // Arbitrary app-readable key/values delivered with the push (and visible to in-app clients).\n data: z.record(z.string(), z.string()).optional(),\n // Per-provider push customization (sound, badge, image, priority, channelId, body override).\n pushOptions: pushOptionsSchema.optional(),\n // Explicit per-send channel target. When present, delivery is restricted to these channels\n // (intersected with the type's eligibility, the registered strategies, and the recipient's\n // preferences). Absent \u2192 all registered channels (pre-Phase-7 behavior). Must be non-empty when\n // provided: an empty array would resolve to zero deliverable channels and silently black-hole the\n // notification (invisible + undelivered) \u2014 omit the field instead to target every channel.\n channels: z.array(z.string().min(1).max(32)).min(1).optional(),\n})\n\nconst titleRequiredRefinement = {\n refine: (data: { titleKey?: string; title?: string }) => data.titleKey || data.title,\n message: 'Either titleKey or title must be provided',\n} as const\n\nexport const createNotificationSchema = baseNotificationFieldsSchema\n .extend({ recipientUserId: z.string().uuid() })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createBatchNotificationSchema = baseNotificationFieldsSchema\n .extend({ recipientUserIds: z.array(z.string().uuid()).min(1).max(1000) })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createRoleNotificationSchema = baseNotificationFieldsSchema\n .extend({ roleId: z.string().uuid() })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const createFeatureNotificationSchema = baseNotificationFieldsSchema\n .extend({ requiredFeature: z.string().min(1).max(100) })\n .refine(titleRequiredRefinement.refine, { message: titleRequiredRefinement.message })\n\nexport const listNotificationsSchema = z.object({\n status: z.union([notificationStatusSchema, z.array(notificationStatusSchema)]).optional(),\n type: z.string().optional(),\n severity: notificationSeveritySchema.optional(),\n sourceEntityType: z.string().optional(),\n sourceEntityId: z.string().uuid().optional(),\n since: z.string().datetime().optional(),\n page: z.coerce.number().int().min(1).optional().default(1),\n pageSize: z.coerce.number().int().min(1).max(100).optional().default(20),\n})\n\nexport const executeActionSchema = z.object({\n actionId: z.string().min(1),\n payload: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const restoreNotificationSchema = z.object({\n status: z.enum(['read', 'unread']).optional(),\n})\n\nconst notificationDeliveryStrategySchema = z.object({\n enabled: z.boolean().optional(),\n})\n\nconst notificationDeliveryEmailSchema = notificationDeliveryStrategySchema.extend({\n from: z.string().trim().min(1).optional(),\n replyTo: z.string().trim().min(1).optional(),\n subjectPrefix: z.string().trim().min(1).optional(),\n})\n\nconst notificationDeliveryCustomSchema = notificationDeliveryStrategySchema.extend({\n config: z.unknown().optional(),\n})\n\nexport const notificationDeliveryConfigSchema = z.object({\n appUrl: z.string().url().optional(),\n panelPath: safeRelativeHrefSchema.optional(),\n strategies: z.object({\n database: notificationDeliveryStrategySchema.optional(),\n email: notificationDeliveryEmailSchema.optional(),\n custom: z.record(z.string(), notificationDeliveryCustomSchema).optional(),\n }).optional(),\n})\n\nexport type CreateNotificationInput = z.infer<typeof createNotificationSchema>\nexport type CreateBatchNotificationInput = z.infer<typeof createBatchNotificationSchema>\nexport type CreateRoleNotificationInput = z.infer<typeof createRoleNotificationSchema>\nexport type CreateFeatureNotificationInput = z.infer<typeof createFeatureNotificationSchema>\nexport type ListNotificationsInput = z.infer<typeof listNotificationsSchema>\nexport type ExecuteActionInput = z.infer<typeof executeActionSchema>\nexport type NotificationDeliveryConfigInput = z.infer<typeof notificationDeliveryConfigSchema>\n\n// Notification type catalogue (DB-mirrored read model)\nexport const notificationTypeItemSchema = z.object({\n id: z.string(),\n labelKey: z.string(),\n descriptionKey: z.string().nullable().optional(),\n // Free-form grouping label so a client can list/group types under a heading. Defaults to\n // the prefix before the first dot in the type id (`sales.order.created` \u2192 `sales`), so in\n // practice it is always populated; kept nullable to avoid narrowing the response contract.\n // This is the STABLE grouping key \u2014 clients group on it and display `categoryLabel`.\n category: z.string().nullable().optional(),\n // Localized heading for `category`, resolved server-side from\n // `notifications.categories.<key>` with a humanized fallback. Display-only: grouping on it\n // re-partitions the list whenever the locale changes.\n categoryLabel: z.string().nullable(),\n // Server-resolved display strings so clients without the app dictionary (the mobile app)\n // need no i18n bundle. `null` iff the corresponding `*Key` is null.\n label: z.string().nullable(),\n description: z.string().nullable(),\n // When true the type is delivered as a silent / content-available push.\n silent: z.boolean(),\n // Effective \"cannot be opted out of\" flag (operator override ?? code-declared); a preferences\n // UI should lock the type on when true.\n nonOptOut: z.boolean(),\n // Effective channel eligibility for the caller's tenant (stored override ?? code-declared\n // `type.channels`). `null` = no restriction (every registered channel). A channel outside\n // the set never delivers for this type in the tenant and users cannot opt into it \u2014\n // preference UIs lock the cell off.\n channels: z.array(z.string()).nullable(),\n // The raw tenant-stored override (`notification_type_overrides.channels`; `null` = inherit\n // code). Admin editors base PATCH payloads on the EFFECTIVE set, but this shows whether an\n // override exists at all.\n storedChannels: z.array(z.string()).nullable(),\n // The raw tenant-stored `nonOptOut` override (`null` = inherit the code-declared flag).\n storedNonOptOut: z.boolean().nullable(),\n // Optimistic-lock version of the tenant's override row (ISO timestamp; `null` when the\n // tenant stores no override yet). PATCH callers echo it back via the standard\n // `x-om-ext-optimistic-lock-expected-updated-at` header.\n updatedAt: z.string().nullable(),\n})\n\n// PATCH /api/notifications/types \u2014 operator override of a type's channel eligibility and/or\n// nonOptOut governance. Omitted fields stay untouched; `null` clears the stored override so\n// the code declaration applies again.\nexport const updateNotificationTypeSchema = z\n .object({\n id: z.string().min(1),\n // Mirror the create guard: a non-empty array restricts eligibility, `null` clears the override\n // (code declaration reapplies). An empty array is rejected \u2014 it would resolve to zero deliverable\n // channels and silently black-hole the type (invisible + undelivered); clear with `null` instead.\n channels: z.array(z.string().min(1)).min(1).nullable().optional(),\n nonOptOut: z.boolean().nullable().optional(),\n })\n .refine((value) => value.channels !== undefined || value.nonOptOut !== undefined, {\n message: 'At least one of channels or nonOptOut must be provided',\n })\n\n// Per-user channel preferences\nexport const notificationPreferenceItemSchema = z.object({\n notificationTypeId: z.string(),\n channel: z.string(),\n enabled: z.boolean(),\n})\n\nexport const updatePreferencesSchema = z.object({\n preferences: z\n .array(\n z.object({\n notificationTypeId: z.string().trim().min(1).max(128),\n channel: z.string().trim().min(1).max(32),\n enabled: z.boolean(),\n }),\n )\n .max(500),\n})\n\n// Admin-on-behalf preference management (target a specific user)\nexport const adminPreferencesQuerySchema = z.object({\n userId: z.string().uuid(),\n})\n\nexport const adminUpdatePreferencesSchema = updatePreferencesSchema.extend({\n userId: z.string().uuid(),\n})\n\nexport type NotificationTypeItem = z.infer<typeof notificationTypeItemSchema>\nexport type UpdateNotificationTypeInput = z.infer<typeof updateNotificationTypeSchema>\nexport type NotificationPreferenceItem = z.infer<typeof notificationPreferenceItemSchema>\nexport type UpdatePreferencesInput = z.infer<typeof updatePreferencesSchema>\nexport type AdminUpdatePreferencesInput = z.infer<typeof adminUpdatePreferencesSchema>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,16 @@
1
1
  import { asFunction } from "awilix";
2
2
  import { createNotificationService } from "./lib/notificationService.js";
3
+ import { createNotificationPreferenceService } from "./lib/notificationPreferenceService.js";
3
4
  function register(container) {
4
5
  container.register({
5
6
  notificationService: asFunction(
6
7
  ({ em, eventBus, commandBus }) => createNotificationService({ em, eventBus, commandBus, container })
8
+ ).scoped().proxy(),
9
+ // Cross-module/worker seam advertised by AGENTS.md ("DI: notificationPreferenceService").
10
+ // In-module routes resolve via resolveNotificationPreferenceService() (news up from the
11
+ // request-scoped em) since the request container does not expose this binding.
12
+ notificationPreferenceService: asFunction(
13
+ ({ em }) => createNotificationPreferenceService({ em })
7
14
  ).scoped().proxy()
8
15
  });
9
16
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/notifications/di.ts"],
4
- "sourcesContent": ["import type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { asFunction } from 'awilix'\nimport { createNotificationService } from './lib/notificationService'\n\nexport function register(container: AppContainer): void {\n container.register({\n notificationService: asFunction(({ em, eventBus, commandBus }) =>\n createNotificationService({ em, eventBus, commandBus, container })\n ).scoped().proxy(),\n })\n}\n"],
5
- "mappings": "AACA,SAAS,kBAAkB;AAC3B,SAAS,iCAAiC;AAEnC,SAAS,SAAS,WAA+B;AACtD,YAAU,SAAS;AAAA,IACjB,qBAAqB;AAAA,MAAW,CAAC,EAAE,IAAI,UAAU,WAAW,MAC1D,0BAA0B,EAAE,IAAI,UAAU,YAAY,UAAU,CAAC;AAAA,IACnE,EAAE,OAAO,EAAE,MAAM;AAAA,EACnB,CAAC;AACH;",
4
+ "sourcesContent": ["import type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { asFunction } from 'awilix'\nimport { createNotificationService } from './lib/notificationService'\nimport { createNotificationPreferenceService } from './lib/notificationPreferenceService'\n\nexport function register(container: AppContainer): void {\n container.register({\n notificationService: asFunction(({ em, eventBus, commandBus }) =>\n createNotificationService({ em, eventBus, commandBus, container })\n ).scoped().proxy(),\n // Cross-module/worker seam advertised by AGENTS.md (\"DI: notificationPreferenceService\").\n // In-module routes resolve via resolveNotificationPreferenceService() (news up from the\n // request-scoped em) since the request container does not expose this binding.\n notificationPreferenceService: asFunction(({ em }) =>\n createNotificationPreferenceService({ em })\n ).scoped().proxy(),\n })\n}\n"],
5
+ "mappings": "AACA,SAAS,kBAAkB;AAC3B,SAAS,iCAAiC;AAC1C,SAAS,2CAA2C;AAE7C,SAAS,SAAS,WAA+B;AACtD,YAAU,SAAS;AAAA,IACjB,qBAAqB;AAAA,MAAW,CAAC,EAAE,IAAI,UAAU,WAAW,MAC1D,0BAA0B,EAAE,IAAI,UAAU,YAAY,UAAU,CAAC;AAAA,IACnE,EAAE,OAAO,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA,IAIjB,+BAA+B;AAAA,MAAW,CAAC,EAAE,GAAG,MAC9C,oCAAoC,EAAE,GAAG,CAAC;AAAA,IAC5C,EAAE,OAAO,EAAE,MAAM;AAAA,EACnB,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,7 @@
1
1
  import { createModuleEvents } from "@open-mercato/shared/modules/events";
2
2
  import { NOTIFICATION_SSE_EVENTS } from "./lib/events.js";
3
+ const TYPE_REGISTRY_SYNC_EVENT = "notifications.type_registry.sync";
4
+ const PREFERENCE_UPDATED_EVENT = "notifications.preference.updated";
3
5
  const events = [
4
6
  {
5
7
  id: NOTIFICATION_SSE_EVENTS.CREATED,
@@ -16,6 +18,19 @@ const events = [
16
18
  category: "system",
17
19
  clientBroadcast: true,
18
20
  portalBroadcast: true
21
+ },
22
+ {
23
+ id: TYPE_REGISTRY_SYNC_EVENT,
24
+ label: "Notification Type Registry Sync",
25
+ entity: "notification_type",
26
+ category: "system",
27
+ excludeFromTriggers: true
28
+ },
29
+ {
30
+ id: PREFERENCE_UPDATED_EVENT,
31
+ label: "Notification Preference Updated",
32
+ entity: "notification_preference",
33
+ category: "crud"
19
34
  }
20
35
  ];
21
36
  const eventsConfig = createModuleEvents({
@@ -25,6 +40,8 @@ const eventsConfig = createModuleEvents({
25
40
  const emitNotificationEvent = eventsConfig.emit;
26
41
  var events_default = eventsConfig;
27
42
  export {
43
+ PREFERENCE_UPDATED_EVENT,
44
+ TYPE_REGISTRY_SYNC_EVENT,
28
45
  events_default as default,
29
46
  emitNotificationEvent,
30
47
  eventsConfig
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/modules/notifications/events.ts"],
4
- "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\nimport { NOTIFICATION_SSE_EVENTS } from './lib/events'\n\nconst events = [\n {\n id: NOTIFICATION_SSE_EVENTS.CREATED,\n label: 'Notification Created',\n entity: 'notification',\n category: 'system',\n clientBroadcast: true,\n portalBroadcast: true,\n },\n {\n id: NOTIFICATION_SSE_EVENTS.BATCH_CREATED,\n label: 'Notification Batch Created',\n entity: 'notification',\n category: 'system',\n clientBroadcast: true,\n portalBroadcast: true,\n },\n] as const\n\nexport const eventsConfig = createModuleEvents({\n moduleId: 'notifications',\n events,\n})\n\nexport const emitNotificationEvent = eventsConfig.emit\n\nexport default eventsConfig\n"],
5
- "mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AAExC,MAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI,wBAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI,wBAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AACF;AAEO,MAAM,eAAe,mBAAmB;AAAA,EAC7C,UAAU;AAAA,EACV;AACF,CAAC;AAEM,MAAM,wBAAwB,aAAa;AAElD,IAAO,iBAAQ;",
4
+ "sourcesContent": ["import { createModuleEvents } from '@open-mercato/shared/modules/events'\nimport { NOTIFICATION_SSE_EVENTS } from './lib/events'\n\n/**\n * Reconcile the code-registered notification type catalogue into the\n * `notification_types` table. Emitted at tenant init; consumed by\n * `subscribers/sync-notification-types.ts`.\n */\nexport const TYPE_REGISTRY_SYNC_EVENT = 'notifications.type_registry.sync'\n\n/** Lifecycle event emitted after a user's channel preferences change (workflow-trigger / subscriber surface). */\nexport const PREFERENCE_UPDATED_EVENT = 'notifications.preference.updated'\n\nconst events = [\n {\n id: NOTIFICATION_SSE_EVENTS.CREATED,\n label: 'Notification Created',\n entity: 'notification',\n category: 'system',\n clientBroadcast: true,\n portalBroadcast: true,\n },\n {\n id: NOTIFICATION_SSE_EVENTS.BATCH_CREATED,\n label: 'Notification Batch Created',\n entity: 'notification',\n category: 'system',\n clientBroadcast: true,\n portalBroadcast: true,\n },\n {\n id: TYPE_REGISTRY_SYNC_EVENT,\n label: 'Notification Type Registry Sync',\n entity: 'notification_type',\n category: 'system',\n excludeFromTriggers: true,\n },\n {\n id: PREFERENCE_UPDATED_EVENT,\n label: 'Notification Preference Updated',\n entity: 'notification_preference',\n category: 'crud',\n },\n] as const\n\nexport const eventsConfig = createModuleEvents({\n moduleId: 'notifications',\n events,\n})\n\nexport const emitNotificationEvent = eventsConfig.emit\n\nexport default eventsConfig\n"],
5
+ "mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AAOjC,MAAM,2BAA2B;AAGjC,MAAM,2BAA2B;AAExC,MAAM,SAAS;AAAA,EACb;AAAA,IACE,IAAI,wBAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI,wBAAwB;AAAA,IAC5B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,qBAAqB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AACF;AAEO,MAAM,eAAe,mBAAmB;AAAA,EAC7C,UAAU;AAAA,EACV;AACF,CAAC;AAEM,MAAM,wBAAwB,aAAa;AAElD,IAAO,iBAAQ;",
6
6
  "names": []
7
7
  }