@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.
- package/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/notification/index.js +6 -0
- package/dist/generated/entities/notification/index.js.map +2 -2
- package/dist/generated/entities/notification_preference/index.js +19 -0
- package/dist/generated/entities/notification_preference/index.js.map +7 -0
- package/dist/generated/entities/notification_type/index.js +21 -0
- package/dist/generated/entities/notification_type/index.js.map +7 -0
- package/dist/generated/entities/notification_type_override/index.js +17 -0
- package/dist/generated/entities/notification_type_override/index.js.map +7 -0
- package/dist/generated/entities/push_notification_delivery/index.js +41 -0
- package/dist/generated/entities/push_notification_delivery/index.js.map +7 -0
- package/dist/generated/entities/user_device/index.js +35 -0
- package/dist/generated/entities/user_device/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +12 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +72 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/api.js +2 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/appRoot.js +9 -0
- package/dist/helpers/integration/appRoot.js.map +7 -0
- package/dist/helpers/integration/dbFixtures.js +1 -4
- package/dist/helpers/integration/dbFixtures.js.map +2 -2
- package/dist/helpers/integration/pushFake.js +126 -0
- package/dist/helpers/integration/pushFake.js.map +7 -0
- package/dist/modules/auth/notifications.js +16 -0
- package/dist/modules/auth/notifications.js.map +2 -2
- package/dist/modules/business_rules/notifications.js +2 -0
- package/dist/modules/business_rules/notifications.js.map +2 -2
- package/dist/modules/catalog/notifications.js +2 -0
- package/dist/modules/catalog/notifications.js.map +2 -2
- package/dist/modules/communication_channels/acl.js +9 -0
- package/dist/modules/communication_channels/acl.js.map +2 -2
- package/dist/modules/communication_channels/api/delete/admin/channels/[id]/route.js +133 -0
- package/dist/modules/communication_channels/api/delete/admin/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +6 -2
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +2 -2
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js +6 -2
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +2 -2
- package/dist/modules/communication_channels/api/get/channels/route.js +2 -1
- package/dist/modules/communication_channels/api/get/channels/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +10 -5
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +29 -1
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.js +157 -0
- package/dist/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +8 -1
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/admin-delete-channel.js +141 -0
- package/dist/modules/communication_channels/commands/admin-delete-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js +25 -8
- package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +2 -2
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js +2 -2
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +2 -2
- package/dist/modules/communication_channels/commands/push-register.js +1 -1
- package/dist/modules/communication_channels/commands/push-register.js.map +2 -2
- package/dist/modules/communication_channels/commands/push-unregister.js +4 -3
- package/dist/modules/communication_channels/commands/push-unregister.js.map +2 -2
- package/dist/modules/communication_channels/data/entities.js +4 -0
- package/dist/modules/communication_channels/data/entities.js.map +2 -2
- package/dist/modules/communication_channels/data/validators.js +2 -1
- package/dist/modules/communication_channels/data/validators.js.map +2 -2
- package/dist/modules/communication_channels/lib/access-control.js +11 -1
- package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
- package/dist/modules/communication_channels/lib/connect-channel.js +20 -12
- package/dist/modules/communication_channels/lib/connect-channel.js.map +2 -2
- package/dist/modules/communication_channels/lib/push-adapter.js +68 -0
- package/dist/modules/communication_channels/lib/push-adapter.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-capabilities.js +31 -0
- package/dist/modules/communication_channels/lib/push-capabilities.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-connect-error.js +20 -0
- package/dist/modules/communication_channels/lib/push-connect-error.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-credential-errors.js +41 -0
- package/dist/modules/communication_channels/lib/push-credential-errors.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-envelope.js +46 -0
- package/dist/modules/communication_channels/lib/push-envelope.js.map +7 -0
- package/dist/modules/communication_channels/lib/refcounted-client-cache.js +64 -0
- package/dist/modules/communication_channels/lib/refcounted-client-cache.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260703123630_communication_channels.js +13 -0
- package/dist/modules/communication_channels/migrations/Migration20260703123630_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/notifications.js +4 -0
- package/dist/modules/communication_channels/notifications.js.map +2 -2
- package/dist/modules/communication_channels/setup.js +2 -0
- package/dist/modules/communication_channels/setup.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +21 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_accounts/notifications.js +12 -0
- package/dist/modules/customer_accounts/notifications.js.map +2 -2
- package/dist/modules/customers/notifications.js +4 -0
- package/dist/modules/customers/notifications.js.map +2 -2
- package/dist/modules/devices/acl.js +11 -0
- package/dist/modules/devices/acl.js.map +7 -0
- package/dist/modules/devices/api/[id]/route.js +167 -0
- package/dist/modules/devices/api/[id]/route.js.map +7 -0
- package/dist/modules/devices/api/admin/devices/[id]/route.js +219 -0
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +7 -0
- package/dist/modules/devices/api/admin/devices/route.js +140 -0
- package/dist/modules/devices/api/admin/devices/route.js.map +7 -0
- package/dist/modules/devices/api/auth.js +9 -0
- package/dist/modules/devices/api/auth.js.map +7 -0
- package/dist/modules/devices/api/deviceList.js +53 -0
- package/dist/modules/devices/api/deviceList.js.map +7 -0
- package/dist/modules/devices/api/deviceOps.js +118 -0
- package/dist/modules/devices/api/deviceOps.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +19 -0
- package/dist/modules/devices/api/openapi.js.map +7 -0
- package/dist/modules/devices/api/route.js +143 -0
- package/dist/modules/devices/api/route.js.map +7 -0
- package/dist/modules/devices/backend/devices/[id]/page.js +135 -0
- package/dist/modules/devices/backend/devices/[id]/page.js.map +7 -0
- package/dist/modules/devices/backend/devices/[id]/page.meta.js +16 -0
- package/dist/modules/devices/backend/devices/[id]/page.meta.js.map +7 -0
- package/dist/modules/devices/backend/devices/create/page.js +68 -0
- package/dist/modules/devices/backend/devices/create/page.js.map +7 -0
- package/dist/modules/devices/backend/devices/create/page.meta.js +16 -0
- package/dist/modules/devices/backend/devices/create/page.meta.js.map +7 -0
- package/dist/modules/devices/backend/devices/page.js +235 -0
- package/dist/modules/devices/backend/devices/page.js.map +7 -0
- package/dist/modules/devices/backend/devices/page.meta.js +23 -0
- package/dist/modules/devices/backend/devices/page.meta.js.map +7 -0
- package/dist/modules/devices/commands/deactivate.js +107 -0
- package/dist/modules/devices/commands/deactivate.js.map +7 -0
- package/dist/modules/devices/commands/index.js +4 -0
- package/dist/modules/devices/commands/index.js.map +7 -0
- package/dist/modules/devices/commands/register.js +183 -0
- package/dist/modules/devices/commands/register.js.map +7 -0
- package/dist/modules/devices/commands/shared.js +74 -0
- package/dist/modules/devices/commands/shared.js.map +7 -0
- package/dist/modules/devices/commands/update.js +126 -0
- package/dist/modules/devices/commands/update.js.map +7 -0
- package/dist/modules/devices/data/entities.js +83 -0
- package/dist/modules/devices/data/entities.js.map +7 -0
- package/dist/modules/devices/data/validators.js +49 -0
- package/dist/modules/devices/data/validators.js.map +7 -0
- package/dist/modules/devices/di.js +11 -0
- package/dist/modules/devices/di.js.map +7 -0
- package/dist/modules/devices/encryption.js +12 -0
- package/dist/modules/devices/encryption.js.map +7 -0
- package/dist/modules/devices/events.js +19 -0
- package/dist/modules/devices/events.js.map +7 -0
- package/dist/modules/devices/index.js +17 -0
- package/dist/modules/devices/index.js.map +7 -0
- package/dist/modules/devices/lib/operationMetadata.js +20 -0
- package/dist/modules/devices/lib/operationMetadata.js.map +7 -0
- package/dist/modules/devices/migrations/Migration20260602120000.js +15 -0
- package/dist/modules/devices/migrations/Migration20260602120000.js.map +7 -0
- package/dist/modules/devices/migrations/Migration20260630120000.js +15 -0
- package/dist/modules/devices/migrations/Migration20260630120000.js.map +7 -0
- package/dist/modules/devices/migrations/Migration20260701120000.js +13 -0
- package/dist/modules/devices/migrations/Migration20260701120000.js.map +7 -0
- package/dist/modules/devices/migrations/Migration20260721120000.js +15 -0
- package/dist/modules/devices/migrations/Migration20260721120000.js.map +7 -0
- package/dist/modules/devices/setup.js +13 -0
- package/dist/modules/devices/setup.js.map +7 -0
- package/dist/modules/entities/cli.js +8 -3
- package/dist/modules/entities/cli.js.map +2 -2
- package/dist/modules/entities/migrations/Migration20260722120000.js +28 -0
- package/dist/modules/entities/migrations/Migration20260722120000.js.map +7 -0
- package/dist/modules/inbox_ops/notifications.js +2 -0
- package/dist/modules/inbox_ops/notifications.js.map +2 -2
- package/dist/modules/messages/notifications.js +2 -0
- package/dist/modules/messages/notifications.js.map +2 -2
- package/dist/modules/notifications/acl.js +3 -1
- package/dist/modules/notifications/acl.js.map +2 -2
- package/dist/modules/notifications/api/admin/preferences/route.js +167 -0
- package/dist/modules/notifications/api/admin/preferences/route.js.map +7 -0
- package/dist/modules/notifications/api/channels/route.js +54 -0
- package/dist/modules/notifications/api/channels/route.js.map +7 -0
- package/dist/modules/notifications/api/preferences/route.js +126 -0
- package/dist/modules/notifications/api/preferences/route.js.map +7 -0
- package/dist/modules/notifications/api/route.js +8 -1
- package/dist/modules/notifications/api/route.js.map +2 -2
- package/dist/modules/notifications/api/types/[id]/channels/[channel]/route.js +187 -0
- package/dist/modules/notifications/api/types/[id]/channels/[channel]/route.js.map +7 -0
- package/dist/modules/notifications/api/types/route.js +225 -0
- package/dist/modules/notifications/api/types/route.js.map +7 -0
- package/dist/modules/notifications/api/unread-count/route.js +5 -1
- package/dist/modules/notifications/api/unread-count/route.js.map +2 -2
- package/dist/modules/notifications/backend/notifications/user-preferences/page.js +10 -0
- package/dist/modules/notifications/backend/notifications/user-preferences/page.js.map +7 -0
- package/dist/modules/notifications/backend/notifications/user-preferences/page.meta.js +28 -0
- package/dist/modules/notifications/backend/notifications/user-preferences/page.meta.js.map +7 -0
- package/dist/modules/notifications/backend/profile/notification-preferences/page.js +10 -0
- package/dist/modules/notifications/backend/profile/notification-preferences/page.js.map +7 -0
- package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js +33 -0
- package/dist/modules/notifications/backend/profile/notification-preferences/page.meta.js.map +7 -0
- package/dist/modules/notifications/data/entities.js +128 -1
- package/dist/modules/notifications/data/entities.js.map +2 -2
- package/dist/modules/notifications/data/validators.js +95 -2
- package/dist/modules/notifications/data/validators.js.map +2 -2
- package/dist/modules/notifications/di.js +7 -0
- package/dist/modules/notifications/di.js.map +2 -2
- package/dist/modules/notifications/events.js +17 -0
- package/dist/modules/notifications/events.js.map +2 -2
- package/dist/modules/notifications/frontend/NotificationPreferenceMatrix.js +190 -0
- package/dist/modules/notifications/frontend/NotificationPreferenceMatrix.js.map +7 -0
- package/dist/modules/notifications/frontend/NotificationPreferencesPageClient.js +124 -0
- package/dist/modules/notifications/frontend/NotificationPreferencesPageClient.js.map +7 -0
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +166 -1
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +2 -2
- package/dist/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.js +172 -0
- package/dist/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.js.map +7 -0
- package/dist/modules/notifications/generators.js +63 -0
- package/dist/modules/notifications/generators.js.map +7 -0
- package/dist/modules/notifications/lib/delivery-strategies-registry.js +19 -0
- package/dist/modules/notifications/lib/delivery-strategies-registry.js.map +7 -0
- package/dist/modules/notifications/lib/deliveryStrategies.js.map +2 -2
- package/dist/modules/notifications/lib/derive-category.js +8 -0
- package/dist/modules/notifications/lib/derive-category.js.map +7 -0
- package/dist/modules/notifications/lib/notification-channel-registry.js +35 -0
- package/dist/modules/notifications/lib/notification-channel-registry.js.map +7 -0
- package/dist/modules/notifications/lib/notification-type-registry.js +87 -0
- package/dist/modules/notifications/lib/notification-type-registry.js.map +7 -0
- package/dist/modules/notifications/lib/notificationCopy.js +14 -0
- package/dist/modules/notifications/lib/notificationCopy.js.map +7 -0
- package/dist/modules/notifications/lib/notificationFactory.js +4 -1
- package/dist/modules/notifications/lib/notificationFactory.js.map +2 -2
- package/dist/modules/notifications/lib/notificationMapper.js +2 -0
- package/dist/modules/notifications/lib/notificationMapper.js.map +2 -2
- package/dist/modules/notifications/lib/notificationPreferenceService.js +83 -0
- package/dist/modules/notifications/lib/notificationPreferenceService.js.map +7 -0
- package/dist/modules/notifications/lib/notificationService.js +83 -28
- package/dist/modules/notifications/lib/notificationService.js.map +2 -2
- package/dist/modules/notifications/lib/notificationVisibility.js +24 -0
- package/dist/modules/notifications/lib/notificationVisibility.js.map +7 -0
- package/dist/modules/notifications/lib/routeHelpers.js +11 -1
- package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
- package/dist/modules/notifications/lib/shouldDeliver.js +46 -0
- package/dist/modules/notifications/lib/shouldDeliver.js.map +7 -0
- package/dist/modules/notifications/lib/strategies/email-delivery-strategy.js +54 -0
- package/dist/modules/notifications/lib/strategies/email-delivery-strategy.js.map +7 -0
- package/dist/modules/notifications/lib/strategies/in-app-delivery-strategy.js +12 -0
- package/dist/modules/notifications/lib/strategies/in-app-delivery-strategy.js.map +7 -0
- package/dist/modules/notifications/lib/typeCatalogue.js +71 -0
- package/dist/modules/notifications/lib/typeCatalogue.js.map +7 -0
- package/dist/modules/notifications/lib/typeChannelSettings.js +12 -0
- package/dist/modules/notifications/lib/typeChannelSettings.js.map +7 -0
- package/dist/modules/notifications/lib/typeOverrides.js +19 -0
- package/dist/modules/notifications/lib/typeOverrides.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260625122947_notifications.js +14 -0
- package/dist/modules/notifications/migrations/Migration20260625122947_notifications.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.js +15 -0
- package/dist/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.js +13 -0
- package/dist/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.js +15 -0
- package/dist/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260706120000_notifications_channels.js +13 -0
- package/dist/modules/notifications/migrations/Migration20260706120000_notifications_channels.js.map +7 -0
- package/dist/modules/notifications/migrations/Migration20260716123121_notifications.js +14 -0
- package/dist/modules/notifications/migrations/Migration20260716123121_notifications.js.map +7 -0
- package/dist/modules/notifications/notification-channels.js +26 -0
- package/dist/modules/notifications/notification-channels.js.map +7 -0
- package/dist/modules/notifications/notifications.delivery-strategies.js +12 -0
- package/dist/modules/notifications/notifications.delivery-strategies.js.map +7 -0
- package/dist/modules/notifications/setup.js +16 -1
- package/dist/modules/notifications/setup.js.map +2 -2
- package/dist/modules/notifications/subscribers/deliver-notification.js +66 -57
- package/dist/modules/notifications/subscribers/deliver-notification.js.map +2 -2
- package/dist/modules/notifications/subscribers/sync-notification-types.js +16 -0
- package/dist/modules/notifications/subscribers/sync-notification-types.js.map +7 -0
- package/dist/modules/notifications/widgets/injection/profile-preferences-menu/widget.js +23 -0
- package/dist/modules/notifications/widgets/injection/profile-preferences-menu/widget.js.map +7 -0
- package/dist/modules/notifications/widgets/injection-table.js +14 -0
- package/dist/modules/notifications/widgets/injection-table.js.map +7 -0
- package/dist/modules/push_notifications/acl.js +13 -0
- package/dist/modules/push_notifications/acl.js.map +7 -0
- package/dist/modules/push_notifications/api/custom-send/route.js +141 -0
- package/dist/modules/push_notifications/api/custom-send/route.js.map +7 -0
- package/dist/modules/push_notifications/api/deliveries/[id]/route.js +110 -0
- package/dist/modules/push_notifications/api/deliveries/[id]/route.js.map +7 -0
- package/dist/modules/push_notifications/api/deliveries/route.js +56 -0
- package/dist/modules/push_notifications/api/deliveries/route.js.map +7 -0
- package/dist/modules/push_notifications/api/openapi.js +19 -0
- package/dist/modules/push_notifications/api/openapi.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/[id]/page.js +103 -0
- package/dist/modules/push_notifications/backend/push_notifications/[id]/page.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/[id]/page.meta.js +13 -0
- package/dist/modules/push_notifications/backend/push_notifications/[id]/page.meta.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/page.js +213 -0
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/page.meta.js +23 -0
- package/dist/modules/push_notifications/backend/push_notifications/page.meta.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +245 -0
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +7 -0
- package/dist/modules/push_notifications/backend/push_notifications/send/page.meta.js +26 -0
- package/dist/modules/push_notifications/backend/push_notifications/send/page.meta.js.map +7 -0
- package/dist/modules/push_notifications/data/entities.js +92 -0
- package/dist/modules/push_notifications/data/entities.js.map +7 -0
- package/dist/modules/push_notifications/data/extensions.js +23 -0
- package/dist/modules/push_notifications/data/extensions.js.map +7 -0
- package/dist/modules/push_notifications/data/validators.js +89 -0
- package/dist/modules/push_notifications/data/validators.js.map +7 -0
- package/dist/modules/push_notifications/di.js +17 -0
- package/dist/modules/push_notifications/di.js.map +7 -0
- package/dist/modules/push_notifications/events.js +24 -0
- package/dist/modules/push_notifications/events.js.map +7 -0
- package/dist/modules/push_notifications/index.js +16 -0
- package/dist/modules/push_notifications/index.js.map +7 -0
- package/dist/modules/push_notifications/lib/fake-provider-recorder.js +80 -0
- package/dist/modules/push_notifications/lib/fake-provider-recorder.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-delivery-strategy.js +54 -0
- package/dist/modules/push_notifications/lib/push-delivery-strategy.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-delivery.js +297 -0
- package/dist/modules/push_notifications/lib/push-delivery.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-fanout.js +138 -0
- package/dist/modules/push_notifications/lib/push-fanout.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-health.js +32 -0
- package/dist/modules/push_notifications/lib/push-health.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-reaper.js +87 -0
- package/dist/modules/push_notifications/lib/push-reaper.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-receipt-reaper.js +136 -0
- package/dist/modules/push_notifications/lib/push-receipt-reaper.js.map +7 -0
- package/dist/modules/push_notifications/lib/push-stub-adapter.js +63 -0
- package/dist/modules/push_notifications/lib/push-stub-adapter.js.map +7 -0
- package/dist/modules/push_notifications/lib/queue.js +53 -0
- package/dist/modules/push_notifications/lib/queue.js.map +7 -0
- package/dist/modules/push_notifications/lib/reclaim-window.js +13 -0
- package/dist/modules/push_notifications/lib/reclaim-window.js.map +7 -0
- package/dist/modules/push_notifications/lib/send-custom-push.js +48 -0
- package/dist/modules/push_notifications/lib/send-custom-push.js.map +7 -0
- package/dist/modules/push_notifications/migrations/Migration20260625150049_push_notifications.js +16 -0
- package/dist/modules/push_notifications/migrations/Migration20260625150049_push_notifications.js.map +7 -0
- package/dist/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.js +13 -0
- package/dist/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.js.map +7 -0
- package/dist/modules/push_notifications/notifications.delivery-strategies.js +8 -0
- package/dist/modules/push_notifications/notifications.delivery-strategies.js.map +7 -0
- package/dist/modules/push_notifications/notifications.js +40 -0
- package/dist/modules/push_notifications/notifications.js.map +7 -0
- package/dist/modules/push_notifications/setup.js +52 -0
- package/dist/modules/push_notifications/setup.js.map +7 -0
- package/dist/modules/push_notifications/workers/reclaim-stuck.worker.js +57 -0
- package/dist/modules/push_notifications/workers/reclaim-stuck.worker.js.map +7 -0
- package/dist/modules/push_notifications/workers/send-push.worker.js +27 -0
- package/dist/modules/push_notifications/workers/send-push.worker.js.map +7 -0
- package/dist/modules/sales/notifications.js +8 -0
- package/dist/modules/sales/notifications.js.map +2 -2
- package/dist/modules/staff/notifications.js +6 -0
- package/dist/modules/staff/notifications.js.map +2 -2
- package/dist/modules/workflows/notifications.js +2 -0
- package/dist/modules/workflows/notifications.js.map +2 -2
- package/generated/entities/notification/index.ts +3 -0
- package/generated/entities/notification_preference/index.ts +8 -0
- package/generated/entities/notification_type/index.ts +9 -0
- package/generated/entities/notification_type_override/index.ts +7 -0
- package/generated/entities/push_notification_delivery/index.ts +19 -0
- package/generated/entities/user_device/index.ts +16 -0
- package/generated/entities.ids.generated.ts +12 -1
- package/generated/entity-fields-registry.ts +72 -0
- package/package.json +7 -7
- package/src/helpers/integration/api.ts +2 -1
- package/src/helpers/integration/appRoot.ts +13 -0
- package/src/helpers/integration/dbFixtures.ts +1 -5
- package/src/helpers/integration/pushFake.ts +219 -0
- package/src/modules/auth/i18n/de.json +1 -0
- package/src/modules/auth/i18n/en.json +1 -0
- package/src/modules/auth/i18n/es.json +1 -0
- package/src/modules/auth/i18n/ko.json +1 -0
- package/src/modules/auth/i18n/pl.json +1 -0
- package/src/modules/auth/notifications.ts +16 -0
- package/src/modules/business_rules/i18n/de.json +2 -1
- package/src/modules/business_rules/i18n/en.json +2 -1
- package/src/modules/business_rules/i18n/es.json +2 -1
- package/src/modules/business_rules/i18n/ko.json +2 -1
- package/src/modules/business_rules/i18n/pl.json +2 -1
- package/src/modules/business_rules/notifications.ts +2 -0
- package/src/modules/catalog/i18n/de.json +2 -1
- package/src/modules/catalog/i18n/en.json +2 -1
- package/src/modules/catalog/i18n/es.json +2 -1
- package/src/modules/catalog/i18n/ko.json +2 -1
- package/src/modules/catalog/i18n/pl.json +2 -1
- package/src/modules/catalog/notifications.ts +2 -0
- package/src/modules/communication_channels/acl.ts +9 -0
- package/src/modules/communication_channels/api/delete/admin/channels/[id]/route.ts +168 -0
- package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +6 -2
- package/src/modules/communication_channels/api/get/channels/[id]/route.ts +6 -2
- package/src/modules/communication_channels/api/get/channels/route.ts +2 -1
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +16 -5
- package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +37 -1
- package/src/modules/communication_channels/api/post/channels/connect/tenant-credentials/route.ts +175 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +11 -1
- package/src/modules/communication_channels/commands/admin-delete-channel.ts +203 -0
- package/src/modules/communication_channels/commands/connect-credential-channel.ts +63 -15
- package/src/modules/communication_channels/commands/deliver-outbound-message.ts +10 -2
- package/src/modules/communication_channels/commands/push-register.ts +7 -1
- package/src/modules/communication_channels/commands/push-unregister.ts +14 -3
- package/src/modules/communication_channels/data/entities.ts +10 -0
- package/src/modules/communication_channels/data/validators.ts +1 -0
- package/src/modules/communication_channels/i18n/de.json +35 -1
- package/src/modules/communication_channels/i18n/en.json +35 -1
- package/src/modules/communication_channels/i18n/es.json +35 -1
- package/src/modules/communication_channels/i18n/ko.json +35 -1
- package/src/modules/communication_channels/i18n/pl.json +35 -1
- package/src/modules/communication_channels/lib/access-control.ts +42 -0
- package/src/modules/communication_channels/lib/adapter.ts +25 -0
- package/src/modules/communication_channels/lib/connect-channel.ts +61 -26
- package/src/modules/communication_channels/lib/push-adapter.ts +139 -0
- package/src/modules/communication_channels/lib/push-capabilities.ts +42 -0
- package/src/modules/communication_channels/lib/push-connect-error.ts +52 -0
- package/src/modules/communication_channels/lib/push-credential-errors.ts +58 -0
- package/src/modules/communication_channels/lib/push-envelope.ts +104 -0
- package/src/modules/communication_channels/lib/refcounted-client-cache.ts +123 -0
- package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +9 -0
- package/src/modules/communication_channels/migrations/Migration20260703123630_communication_channels.ts +20 -0
- package/src/modules/communication_channels/notifications.ts +4 -0
- package/src/modules/communication_channels/setup.ts +2 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/ko.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +21 -0
- package/src/modules/customer_accounts/i18n/de.json +2 -1
- package/src/modules/customer_accounts/i18n/en.json +2 -1
- package/src/modules/customer_accounts/i18n/es.json +2 -1
- package/src/modules/customer_accounts/i18n/ko.json +2 -1
- package/src/modules/customer_accounts/i18n/pl.json +2 -1
- package/src/modules/customer_accounts/notifications.ts +12 -0
- package/src/modules/customers/i18n/de.json +2 -1
- package/src/modules/customers/i18n/en.json +2 -1
- package/src/modules/customers/i18n/es.json +2 -1
- package/src/modules/customers/i18n/ko.json +2 -1
- package/src/modules/customers/i18n/pl.json +2 -1
- package/src/modules/customers/notifications.ts +4 -0
- package/src/modules/devices/AGENTS.md +101 -0
- package/src/modules/devices/acl.ts +7 -0
- package/src/modules/devices/api/[id]/route.ts +180 -0
- package/src/modules/devices/api/admin/devices/[id]/route.ts +235 -0
- package/src/modules/devices/api/admin/devices/route.ts +160 -0
- package/src/modules/devices/api/auth.ts +13 -0
- package/src/modules/devices/api/deviceList.ts +54 -0
- package/src/modules/devices/api/deviceOps.ts +186 -0
- package/src/modules/devices/api/openapi.ts +23 -0
- package/src/modules/devices/api/route.ts +165 -0
- package/src/modules/devices/backend/devices/[id]/page.meta.ts +12 -0
- package/src/modules/devices/backend/devices/[id]/page.tsx +164 -0
- package/src/modules/devices/backend/devices/create/page.meta.ts +12 -0
- package/src/modules/devices/backend/devices/create/page.tsx +81 -0
- package/src/modules/devices/backend/devices/page.meta.ts +21 -0
- package/src/modules/devices/backend/devices/page.tsx +259 -0
- package/src/modules/devices/commands/deactivate.ts +126 -0
- package/src/modules/devices/commands/index.ts +3 -0
- package/src/modules/devices/commands/register.ts +199 -0
- package/src/modules/devices/commands/shared.ts +119 -0
- package/src/modules/devices/commands/update.ts +142 -0
- package/src/modules/devices/data/entities.ts +79 -0
- package/src/modules/devices/data/validators.ts +65 -0
- package/src/modules/devices/di.ts +9 -0
- package/src/modules/devices/encryption.ts +15 -0
- package/src/modules/devices/events.ts +16 -0
- package/src/modules/devices/i18n/de.json +45 -0
- package/src/modules/devices/i18n/en.json +45 -0
- package/src/modules/devices/i18n/es.json +45 -0
- package/src/modules/devices/i18n/ko.json +45 -0
- package/src/modules/devices/i18n/pl.json +45 -0
- package/src/modules/devices/index.ts +15 -0
- package/src/modules/devices/lib/operationMetadata.ts +35 -0
- package/src/modules/devices/migrations/.snapshot-open-mercato.json +200 -0
- package/src/modules/devices/migrations/Migration20260602120000.ts +15 -0
- package/src/modules/devices/migrations/Migration20260630120000.ts +20 -0
- package/src/modules/devices/migrations/Migration20260701120000.ts +13 -0
- package/src/modules/devices/migrations/Migration20260721120000.ts +18 -0
- package/src/modules/devices/setup.ts +11 -0
- package/src/modules/entities/cli.ts +16 -2
- package/src/modules/entities/migrations/Migration20260722120000.ts +38 -0
- package/src/modules/inbox_ops/i18n/de.json +2 -1
- package/src/modules/inbox_ops/i18n/en.json +2 -1
- package/src/modules/inbox_ops/i18n/es.json +2 -1
- package/src/modules/inbox_ops/i18n/ko.json +2 -1
- package/src/modules/inbox_ops/i18n/pl.json +2 -1
- package/src/modules/inbox_ops/notifications.ts +2 -0
- package/src/modules/messages/i18n/de.json +2 -1
- package/src/modules/messages/i18n/en.json +2 -1
- package/src/modules/messages/i18n/es.json +2 -1
- package/src/modules/messages/i18n/ko.json +2 -1
- package/src/modules/messages/i18n/pl.json +2 -1
- package/src/modules/messages/notifications.ts +2 -0
- package/src/modules/notifications/AGENTS.md +54 -0
- package/src/modules/notifications/acl.ts +2 -0
- package/src/modules/notifications/api/admin/preferences/route.ts +193 -0
- package/src/modules/notifications/api/channels/route.ts +54 -0
- package/src/modules/notifications/api/preferences/route.ts +131 -0
- package/src/modules/notifications/api/route.ts +8 -1
- package/src/modules/notifications/api/types/[id]/channels/[channel]/route.ts +226 -0
- package/src/modules/notifications/api/types/route.ts +239 -0
- package/src/modules/notifications/api/unread-count/route.ts +5 -1
- package/src/modules/notifications/backend/notifications/user-preferences/page.meta.ts +26 -0
- package/src/modules/notifications/backend/notifications/user-preferences/page.tsx +12 -0
- package/src/modules/notifications/backend/profile/notification-preferences/page.meta.ts +31 -0
- package/src/modules/notifications/backend/profile/notification-preferences/page.tsx +12 -0
- package/src/modules/notifications/data/entities.ts +144 -0
- package/src/modules/notifications/data/validators.ts +116 -0
- package/src/modules/notifications/di.ts +7 -0
- package/src/modules/notifications/events.ts +23 -0
- package/src/modules/notifications/frontend/NotificationPreferenceMatrix.tsx +287 -0
- package/src/modules/notifications/frontend/NotificationPreferencesPageClient.tsx +155 -0
- package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +273 -2
- package/src/modules/notifications/frontend/NotificationUserPreferencesAdminPageClient.tsx +214 -0
- package/src/modules/notifications/generators.ts +82 -0
- package/src/modules/notifications/i18n/de.json +43 -0
- package/src/modules/notifications/i18n/en.json +43 -0
- package/src/modules/notifications/i18n/es.json +43 -0
- package/src/modules/notifications/i18n/ko.json +43 -0
- package/src/modules/notifications/i18n/pl.json +44 -1
- package/src/modules/notifications/lib/delivery-strategies-registry.ts +30 -0
- package/src/modules/notifications/lib/deliveryStrategies.ts +40 -4
- package/src/modules/notifications/lib/derive-category.ts +15 -0
- package/src/modules/notifications/lib/notification-channel-registry.ts +59 -0
- package/src/modules/notifications/lib/notification-type-registry.ts +182 -0
- package/src/modules/notifications/lib/notificationCopy.ts +34 -0
- package/src/modules/notifications/lib/notificationFactory.ts +5 -1
- package/src/modules/notifications/lib/notificationMapper.ts +2 -0
- package/src/modules/notifications/lib/notificationPreferenceService.ts +138 -0
- package/src/modules/notifications/lib/notificationService.ts +129 -25
- package/src/modules/notifications/lib/notificationVisibility.ts +48 -0
- package/src/modules/notifications/lib/routeHelpers.ts +14 -1
- package/src/modules/notifications/lib/shouldDeliver.ts +112 -0
- package/src/modules/notifications/lib/strategies/email-delivery-strategy.ts +63 -0
- package/src/modules/notifications/lib/strategies/in-app-delivery-strategy.ts +21 -0
- package/src/modules/notifications/lib/typeCatalogue.ts +141 -0
- package/src/modules/notifications/lib/typeChannelSettings.ts +29 -0
- package/src/modules/notifications/lib/typeOverrides.ts +46 -0
- package/src/modules/notifications/migrations/.snapshot-open-mercato.json +874 -100
- package/src/modules/notifications/migrations/Migration20260625122947_notifications.ts +14 -0
- package/src/modules/notifications/migrations/Migration20260626120500_notifications_push_payload.ts +15 -0
- package/src/modules/notifications/migrations/Migration20260626130000_notifications_non_opt_out.ts +13 -0
- package/src/modules/notifications/migrations/Migration20260626140000_notifications_type_category_silent.ts +15 -0
- package/src/modules/notifications/migrations/Migration20260706120000_notifications_channels.ts +13 -0
- package/src/modules/notifications/migrations/Migration20260716123121_notifications.ts +14 -0
- package/src/modules/notifications/notification-channels.ts +30 -0
- package/src/modules/notifications/notifications.delivery-strategies.ts +15 -0
- package/src/modules/notifications/setup.ts +23 -1
- package/src/modules/notifications/subscribers/deliver-notification.ts +105 -71
- package/src/modules/notifications/subscribers/sync-notification-types.ts +18 -0
- package/src/modules/notifications/widgets/injection/profile-preferences-menu/widget.ts +35 -0
- package/src/modules/notifications/widgets/injection-table.ts +18 -0
- package/src/modules/push_notifications/AGENTS.md +92 -0
- package/src/modules/push_notifications/acl.ts +9 -0
- package/src/modules/push_notifications/api/custom-send/route.ts +175 -0
- package/src/modules/push_notifications/api/deliveries/[id]/route.ts +122 -0
- package/src/modules/push_notifications/api/deliveries/route.ts +58 -0
- package/src/modules/push_notifications/api/openapi.ts +22 -0
- package/src/modules/push_notifications/backend/push_notifications/[id]/page.meta.ts +9 -0
- package/src/modules/push_notifications/backend/push_notifications/[id]/page.tsx +149 -0
- package/src/modules/push_notifications/backend/push_notifications/page.meta.ts +21 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +239 -0
- package/src/modules/push_notifications/backend/push_notifications/send/page.meta.ts +24 -0
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +327 -0
- package/src/modules/push_notifications/data/entities.ts +111 -0
- package/src/modules/push_notifications/data/extensions.ts +29 -0
- package/src/modules/push_notifications/data/validators.ts +102 -0
- package/src/modules/push_notifications/di.ts +20 -0
- package/src/modules/push_notifications/events.ts +21 -0
- package/src/modules/push_notifications/i18n/de.json +79 -0
- package/src/modules/push_notifications/i18n/en.json +79 -0
- package/src/modules/push_notifications/i18n/es.json +79 -0
- package/src/modules/push_notifications/i18n/ko.json +79 -0
- package/src/modules/push_notifications/i18n/pl.json +79 -0
- package/src/modules/push_notifications/index.ts +15 -0
- package/src/modules/push_notifications/lib/fake-provider-recorder.ts +154 -0
- package/src/modules/push_notifications/lib/push-delivery-strategy.ts +90 -0
- package/src/modules/push_notifications/lib/push-delivery.ts +455 -0
- package/src/modules/push_notifications/lib/push-fanout.ts +237 -0
- package/src/modules/push_notifications/lib/push-health.ts +47 -0
- package/src/modules/push_notifications/lib/push-reaper.ts +140 -0
- package/src/modules/push_notifications/lib/push-receipt-reaper.ts +210 -0
- package/src/modules/push_notifications/lib/push-stub-adapter.ts +80 -0
- package/src/modules/push_notifications/lib/queue.ts +74 -0
- package/src/modules/push_notifications/lib/reclaim-window.ts +16 -0
- package/src/modules/push_notifications/lib/send-custom-push.ts +100 -0
- package/src/modules/push_notifications/migrations/.snapshot-open-mercato.json +386 -0
- package/src/modules/push_notifications/migrations/Migration20260625150049_push_notifications.ts +16 -0
- package/src/modules/push_notifications/migrations/Migration20260626120000_push_notifications_silent.ts +13 -0
- package/src/modules/push_notifications/notifications.delivery-strategies.ts +8 -0
- package/src/modules/push_notifications/notifications.ts +50 -0
- package/src/modules/push_notifications/setup.ts +92 -0
- package/src/modules/push_notifications/workers/reclaim-stuck.worker.ts +78 -0
- package/src/modules/push_notifications/workers/send-push.worker.ts +34 -0
- package/src/modules/sales/i18n/de.json +1 -0
- package/src/modules/sales/i18n/en.json +1 -0
- package/src/modules/sales/i18n/es.json +1 -0
- package/src/modules/sales/i18n/ko.json +1 -0
- package/src/modules/sales/i18n/pl.json +1 -0
- package/src/modules/sales/notifications.ts +8 -0
- package/src/modules/staff/i18n/de.json +1 -0
- package/src/modules/staff/i18n/en.json +1 -0
- package/src/modules/staff/i18n/es.json +1 -0
- package/src/modules/staff/i18n/ko.json +1 -0
- package/src/modules/staff/i18n/pl.json +1 -0
- package/src/modules/staff/notifications.ts +6 -0
- package/src/modules/workflows/i18n/de.json +1 -0
- package/src/modules/workflows/i18n/en.json +1 -0
- package/src/modules/workflows/i18n/es.json +1 -0
- package/src/modules/workflows/i18n/ko.json +1 -0
- package/src/modules/workflows/i18n/pl.json +1 -0
- package/src/modules/workflows/notifications.ts +2 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { NotificationDeliveryStrategy } from '@open-mercato/core/modules/notifications/lib/deliveryStrategies'
|
|
2
|
+
import { mobilePushDeliveryStrategy } from './lib/push-delivery-strategy'
|
|
3
|
+
|
|
4
|
+
// Discovered by the notifications `delivery-strategies` generator plugin and registered into the
|
|
5
|
+
// notifications delivery seam at bootstrap (see notifications/generators.ts).
|
|
6
|
+
export const deliveryStrategies: NotificationDeliveryStrategy[] = [mobilePushDeliveryStrategy]
|
|
7
|
+
|
|
8
|
+
export default deliveryStrategies
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Type id for admin-composed one-off custom pushes (see `lib/send-custom-push.ts` +
|
|
5
|
+
* `api/custom-send`). It is `hiddenFromSettings` (never listed in the client catalogue / mobile
|
|
6
|
+
* preferences screen) and `nonOptOut` (an admin broadcast the user cannot pre-disable). The message
|
|
7
|
+
* title/body are literal free text supplied per send, so the `titleKey`/`bodyKey` below are only
|
|
8
|
+
* placeholders and are never resolved at delivery time.
|
|
9
|
+
*/
|
|
10
|
+
export const ADMIN_CUSTOM_MESSAGE_TYPE = 'admin.custom_message'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Silent counterpart of {@link ADMIN_CUSTOM_MESSAGE_TYPE}: the type an admin "silent" one-off push is
|
|
14
|
+
* labelled with (see `lib/send-custom-push.ts`). Same hidden / non-opt-out semantics, but `silent`
|
|
15
|
+
* so the delivery is a data-only content-available wake-up rather than a visible banner.
|
|
16
|
+
*/
|
|
17
|
+
export const ADMIN_CUSTOM_SILENT_TYPE = 'admin.custom_silent'
|
|
18
|
+
|
|
19
|
+
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
20
|
+
{
|
|
21
|
+
type: ADMIN_CUSTOM_MESSAGE_TYPE,
|
|
22
|
+
module: 'push_notifications',
|
|
23
|
+
titleKey: 'push_notifications.types.admin_custom_message.title',
|
|
24
|
+
bodyKey: 'push_notifications.types.admin_custom_message.body',
|
|
25
|
+
labelKey: 'push_notifications.types.admin_custom_message.label',
|
|
26
|
+
icon: 'megaphone',
|
|
27
|
+
severity: 'info',
|
|
28
|
+
actions: [],
|
|
29
|
+
category: 'system',
|
|
30
|
+
nonOptOut: true,
|
|
31
|
+
silent: false,
|
|
32
|
+
hiddenFromSettings: true,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
type: ADMIN_CUSTOM_SILENT_TYPE,
|
|
36
|
+
module: 'push_notifications',
|
|
37
|
+
titleKey: 'push_notifications.types.admin_custom_silent.title',
|
|
38
|
+
bodyKey: 'push_notifications.types.admin_custom_silent.body',
|
|
39
|
+
labelKey: 'push_notifications.types.admin_custom_silent.label',
|
|
40
|
+
icon: 'megaphone',
|
|
41
|
+
severity: 'info',
|
|
42
|
+
actions: [],
|
|
43
|
+
category: 'system',
|
|
44
|
+
nonOptOut: true,
|
|
45
|
+
silent: true,
|
|
46
|
+
hiddenFromSettings: true,
|
|
47
|
+
},
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
export default notificationTypes
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto'
|
|
2
|
+
import type { ModuleSetupConfig } from '@open-mercato/shared/modules/setup'
|
|
3
|
+
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
4
|
+
import { PUSH_STUCK_RECLAIM_QUEUE } from './lib/queue'
|
|
5
|
+
|
|
6
|
+
const logger = createLogger('push_notifications')
|
|
7
|
+
|
|
8
|
+
type SchedulerServiceLike = {
|
|
9
|
+
register: (registration: {
|
|
10
|
+
id: string
|
|
11
|
+
name: string
|
|
12
|
+
scopeType: 'system' | 'organization' | 'tenant'
|
|
13
|
+
organizationId?: string
|
|
14
|
+
tenantId?: string
|
|
15
|
+
scheduleType: 'cron' | 'interval'
|
|
16
|
+
scheduleValue: string
|
|
17
|
+
timezone?: string
|
|
18
|
+
targetType: 'queue' | 'command'
|
|
19
|
+
targetQueue?: string
|
|
20
|
+
targetPayload?: unknown
|
|
21
|
+
sourceType?: 'user' | 'module'
|
|
22
|
+
sourceModule?: string
|
|
23
|
+
isEnabled?: boolean
|
|
24
|
+
description?: string
|
|
25
|
+
}) => Promise<void>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* How often the stuck-delivery reclaim tick fires. Default 120s — stranded rows are rare, so a slower
|
|
30
|
+
* cadence than the delivery path is fine. Tunable via OM_PUSH_RECLAIM_TICK_SECONDS (min 30s).
|
|
31
|
+
*/
|
|
32
|
+
const RECLAIM_TICK_INTERVAL_SECONDS = Math.max(
|
|
33
|
+
30,
|
|
34
|
+
Number.parseInt(process.env.OM_PUSH_RECLAIM_TICK_SECONDS ?? '120', 10) || 120,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* `scheduled_jobs.id` is a uuid column, so a module-owned schedule's stable
|
|
39
|
+
* registration key must be hashed into a uuid rather than used verbatim — this
|
|
40
|
+
* keeps `schedulerService.register()` an idempotent upsert across re-runs of
|
|
41
|
+
* seedDefaults instead of trying to insert a raw string into the uuid PK.
|
|
42
|
+
* Mirrors the communication_channels poll-tick registration.
|
|
43
|
+
*/
|
|
44
|
+
function stableScheduleUuid(stableKey: string): string {
|
|
45
|
+
const hex = createHash('sha256').update(stableKey).digest('hex')
|
|
46
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const setup: ModuleSetupConfig = {
|
|
50
|
+
defaultRoleFeatures: {
|
|
51
|
+
superadmin: ['push_notifications.*'],
|
|
52
|
+
admin: ['push_notifications.*'],
|
|
53
|
+
// The delivery log is ops/admin observability; employees are not granted it by default.
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
async seedDefaults({ container, tenantId }) {
|
|
57
|
+
/**
|
|
58
|
+
* Register the stuck-delivery reclaim tick with `@open-mercato/scheduler`. Tenant-scoped (one row
|
|
59
|
+
* per tenant, keyed by a deterministic uuid so re-runs upsert) — the sweep covers org-bound and
|
|
60
|
+
* tenant-level delivery rows alike. Skipped silently when the scheduler module isn't enabled so
|
|
61
|
+
* the delivery rails stay usable in scheduler-less harnesses (mirrors communication_channels).
|
|
62
|
+
*/
|
|
63
|
+
const cradle = container as { hasRegistration?: (name: string) => boolean }
|
|
64
|
+
if (typeof cradle.hasRegistration !== 'function' || !cradle.hasRegistration('schedulerService')) {
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
const schedulerService = container.resolve('schedulerService') as SchedulerServiceLike
|
|
68
|
+
try {
|
|
69
|
+
await schedulerService.register({
|
|
70
|
+
id: stableScheduleUuid(`push_notifications:reclaim-stuck:${tenantId}`),
|
|
71
|
+
name: 'Push delivery stuck-row reclaim',
|
|
72
|
+
description:
|
|
73
|
+
`Every ${RECLAIM_TICK_INTERVAL_SECONDS}s, recover push deliveries stranded in 'sending' by a crashed worker (re-enqueue if attempts remain, else expire) and poll async provider receipts (Expo) to soft-delete unregistered devices.`,
|
|
74
|
+
scopeType: 'tenant',
|
|
75
|
+
tenantId,
|
|
76
|
+
scheduleType: 'interval',
|
|
77
|
+
scheduleValue: `${RECLAIM_TICK_INTERVAL_SECONDS}s`,
|
|
78
|
+
timezone: 'UTC',
|
|
79
|
+
targetType: 'queue',
|
|
80
|
+
targetQueue: PUSH_STUCK_RECLAIM_QUEUE,
|
|
81
|
+
targetPayload: { scope: { tenantId } },
|
|
82
|
+
sourceType: 'module',
|
|
83
|
+
sourceModule: 'push_notifications',
|
|
84
|
+
isEnabled: true,
|
|
85
|
+
})
|
|
86
|
+
} catch (error) {
|
|
87
|
+
logger.warn('Failed to register reclaim-stuck schedule', { error })
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export default setup
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import type { JobContext, QueuedJob, WorkerMeta } from '@open-mercato/queue'
|
|
3
|
+
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
4
|
+
import { PUSH_STUCK_RECLAIM_QUEUE } from '../lib/queue'
|
|
5
|
+
import { reclaimStuckPushDeliveries } from '../lib/push-reaper'
|
|
6
|
+
import { checkPushReceipts } from '../lib/push-receipt-reaper'
|
|
7
|
+
|
|
8
|
+
const logger = createLogger('push_notifications')
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Scheduler tick payload. Fired by the `@open-mercato/scheduler` interval entry registered in
|
|
12
|
+
* setup.ts (`push_notifications:reclaim-stuck`). The scheduler adds `tenantId` at the top level of the
|
|
13
|
+
* enqueued payload on top of the configured `targetPayload`, so accept either shape.
|
|
14
|
+
*/
|
|
15
|
+
export type ReclaimStuckTickPayload = {
|
|
16
|
+
scope?: { tenantId?: string | null }
|
|
17
|
+
tenantId?: string | null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const metadata: WorkerMeta = {
|
|
21
|
+
queue: PUSH_STUCK_RECLAIM_QUEUE,
|
|
22
|
+
id: 'push_notifications:reclaim-stuck',
|
|
23
|
+
concurrency: 1, // single-flight per tenant tick — the atomic claim guards overlaps anyway
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type HandlerContext = JobContext & {
|
|
27
|
+
resolve: <T = unknown>(name: string) => T
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export default async function handle(
|
|
31
|
+
job: QueuedJob<ReclaimStuckTickPayload>,
|
|
32
|
+
ctx: HandlerContext,
|
|
33
|
+
): Promise<void> {
|
|
34
|
+
const raw = (job?.payload ?? {}) as ReclaimStuckTickPayload
|
|
35
|
+
const tenantId = raw.scope?.tenantId ?? raw.tenantId ?? null
|
|
36
|
+
if (!tenantId) {
|
|
37
|
+
logger.warn('reclaim-stuck skipping tick — payload has no tenantId', { payload: raw })
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const em = (ctx.resolve('em') as EntityManager).fork()
|
|
42
|
+
try {
|
|
43
|
+
const result = await reclaimStuckPushDeliveries(em, { tenantId })
|
|
44
|
+
if (result.reEnqueued > 0 || result.expired > 0) {
|
|
45
|
+
logger.info('reclaim-stuck swept stuck delivery rows', {
|
|
46
|
+
tenantId,
|
|
47
|
+
reEnqueued: result.reEnqueued,
|
|
48
|
+
expired: result.expired,
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
logger.error('reclaim-stuck sweep failed', {
|
|
53
|
+
tenantId,
|
|
54
|
+
error: error instanceof Error ? error.message : String(error),
|
|
55
|
+
})
|
|
56
|
+
throw error
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Piggyback the Expo async-receipt hygiene pass on the same per-tenant tick (no separate scheduler
|
|
60
|
+
// entry). Best-effort and isolated on its own EM fork: a receipt-check failure logs and returns, so it
|
|
61
|
+
// never fails/retries the stuck-row reclaim above nor the tick itself.
|
|
62
|
+
try {
|
|
63
|
+
const receiptEm = (ctx.resolve('em') as EntityManager).fork()
|
|
64
|
+
const receipts = await checkPushReceipts(receiptEm, { tenantId }, ctx.resolve)
|
|
65
|
+
if (receipts.unregistered > 0) {
|
|
66
|
+
logger.info('reclaim-stuck pruned devices from async push receipts', {
|
|
67
|
+
tenantId,
|
|
68
|
+
unregistered: receipts.unregistered,
|
|
69
|
+
checked: receipts.checked,
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
} catch (error) {
|
|
73
|
+
logger.error('reclaim-stuck receipt sweep failed', {
|
|
74
|
+
tenantId,
|
|
75
|
+
error: error instanceof Error ? error.message : String(error),
|
|
76
|
+
})
|
|
77
|
+
}
|
|
78
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
2
|
+
import type { JobContext, QueuedJob, WorkerMeta } from '@open-mercato/queue'
|
|
3
|
+
import { createLogger } from '@open-mercato/shared/lib/logger'
|
|
4
|
+
import { PUSH_DELIVERIES_QUEUE, type PushDeliveryJob } from '../lib/queue'
|
|
5
|
+
import { processPushDeliveryJob } from '../lib/push-delivery'
|
|
6
|
+
|
|
7
|
+
const logger = createLogger('push_notifications')
|
|
8
|
+
|
|
9
|
+
export const metadata: WorkerMeta = {
|
|
10
|
+
queue: PUSH_DELIVERIES_QUEUE,
|
|
11
|
+
id: 'push_notifications:send-push',
|
|
12
|
+
concurrency: 8,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type HandlerContext = JobContext & {
|
|
16
|
+
resolve: <T = unknown>(name: string) => T
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default async function handle(
|
|
20
|
+
job: QueuedJob<PushDeliveryJob>,
|
|
21
|
+
ctx: HandlerContext,
|
|
22
|
+
): Promise<void> {
|
|
23
|
+
const em = (ctx.resolve('em') as EntityManager).fork()
|
|
24
|
+
try {
|
|
25
|
+
await processPushDeliveryJob(em, job.payload, ctx.resolve)
|
|
26
|
+
} catch (error) {
|
|
27
|
+
logger.error('send-push job processing failed', {
|
|
28
|
+
deliveryId: job.payload.deliveryId,
|
|
29
|
+
tenantId: job.payload.tenantId,
|
|
30
|
+
error: error instanceof Error ? error.message : String(error),
|
|
31
|
+
})
|
|
32
|
+
throw error
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"audit_logs.resource_kind.sales.payment": "Zahlung",
|
|
5
5
|
"audit_logs.resource_kind.sales.shipment": "Versand",
|
|
6
6
|
"customers~sales.nav.group": "Vertrieb",
|
|
7
|
+
"notifications.categories.sales": "Vertrieb",
|
|
7
8
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Der Bruttobetrag der Rücksendeanpassung überschreitet den verbleibenden Gesamtbetrag. Bitte verringern Sie den Betrag oder entfernen Sie bestehende Rücksendungen.",
|
|
8
9
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Der Nettobetrag der Rücksendeanpassung überschreitet den verbleibenden Gesamtbetrag. Bitte verringern Sie den Betrag oder entfernen Sie bestehende Rücksendungen.",
|
|
9
10
|
"sales.audit.channels.create": "Vertriebskanal erstellen",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"audit_logs.resource_kind.sales.payment": "Payment",
|
|
5
5
|
"audit_logs.resource_kind.sales.shipment": "Shipment",
|
|
6
6
|
"customers~sales.nav.group": "Sales",
|
|
7
|
+
"notifications.categories.sales": "Sales",
|
|
7
8
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Return adjustment amountGross exceeds the remaining grand total. Reduce the amount or remove existing returns first.",
|
|
8
9
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Return adjustment amountNet exceeds the remaining grand total. Reduce the amount or remove existing returns first.",
|
|
9
10
|
"sales.audit.channels.create": "Create sales channel",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"audit_logs.resource_kind.sales.payment": "Pago",
|
|
5
5
|
"audit_logs.resource_kind.sales.shipment": "Envío",
|
|
6
6
|
"customers~sales.nav.group": "Ventas",
|
|
7
|
+
"notifications.categories.sales": "Ventas",
|
|
7
8
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "El importe bruto del ajuste de devolución supera el total restante. Reduzca el importe o elimine las devoluciones existentes.",
|
|
8
9
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "El importe neto del ajuste de devolución supera el total restante. Reduzca el importe o elimine las devoluciones existentes.",
|
|
9
10
|
"sales.audit.channels.create": "Crear canal de ventas",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"audit_logs.resource_kind.sales.payment": "결제",
|
|
5
5
|
"audit_logs.resource_kind.sales.shipment": "배송",
|
|
6
6
|
"customers~sales.nav.group": "영업",
|
|
7
|
+
"notifications.categories.sales": "판매",
|
|
7
8
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "반품 조정 금액(세포함)이 남은 총액을 초과합니다. 금액을 줄이거나 기존 반품을 먼저 삭제하세요.",
|
|
8
9
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "반품 조정 금액(세제외)이 남은 총액을 초과합니다. 금액을 줄이거나 기존 반품을 먼저 삭제하세요.",
|
|
9
10
|
"sales.audit.channels.create": "판매 채널 생성",
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"audit_logs.resource_kind.sales.payment": "Płatność",
|
|
5
5
|
"audit_logs.resource_kind.sales.shipment": "Wysyłka",
|
|
6
6
|
"customers~sales.nav.group": "Sprzedaż",
|
|
7
|
+
"notifications.categories.sales": "Sprzeda\u017c",
|
|
7
8
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalGross": "Kwota brutto korekty zwrotu przekracza pozostałą wartość zamówienia. Zmniejsz kwotę lub usuń istniejące zwroty.",
|
|
8
9
|
"sales.adjustments.error.returnExceedsRemainingGrandTotalNet": "Kwota netto korekty zwrotu przekracza pozostałą wartość zamówienia. Zmniejsz kwotę lub usuń istniejące zwroty.",
|
|
9
10
|
"sales.audit.channels.create": "Utwórz kanał sprzedaży",
|
|
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
|
|
|
3
3
|
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
4
4
|
{
|
|
5
5
|
type: 'sales.order.created',
|
|
6
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
7
|
+
channels: ['in_app', 'email'],
|
|
6
8
|
module: 'sales',
|
|
7
9
|
titleKey: 'sales.notifications.order.created.title',
|
|
8
10
|
bodyKey: 'sales.notifications.order.created.body',
|
|
@@ -22,6 +24,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
|
|
|
22
24
|
},
|
|
23
25
|
{
|
|
24
26
|
type: 'sales.quote.created',
|
|
27
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
28
|
+
channels: ['in_app', 'email'],
|
|
25
29
|
module: 'sales',
|
|
26
30
|
titleKey: 'sales.notifications.quote.created.title',
|
|
27
31
|
bodyKey: 'sales.notifications.quote.created.body',
|
|
@@ -41,6 +45,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
|
|
|
41
45
|
},
|
|
42
46
|
{
|
|
43
47
|
type: 'sales.payment.received',
|
|
48
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
49
|
+
channels: ['in_app', 'email'],
|
|
44
50
|
module: 'sales',
|
|
45
51
|
titleKey: 'sales.notifications.payment.received.title',
|
|
46
52
|
bodyKey: 'sales.notifications.payment.received.body',
|
|
@@ -60,6 +66,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
|
|
|
60
66
|
},
|
|
61
67
|
{
|
|
62
68
|
type: 'sales.quote.expiring',
|
|
69
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
70
|
+
channels: ['in_app', 'email'],
|
|
63
71
|
module: 'sales',
|
|
64
72
|
titleKey: 'sales.notifications.quote.expiring.title',
|
|
65
73
|
bodyKey: 'sales.notifications.quote.expiring.body',
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"audit_logs.resource_kind.staff.team_member_address": "Adresse",
|
|
6
6
|
"audit_logs.resource_kind.staff.team_member_comment": "Kommentar",
|
|
7
7
|
"audit_logs.resource_kind.staff.team_member_job_history": "Beschäftigungsverlauf",
|
|
8
|
+
"notifications.categories.staff": "Personal",
|
|
8
9
|
"staff.attendees.actions.add": "Teilnehmer hinzufügen",
|
|
9
10
|
"staff.attendees.actions.delete": "Löschen",
|
|
10
11
|
"staff.attendees.actions.deleteConfirm": "Teilnehmer \"{{name}}\" löschen?",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"audit_logs.resource_kind.staff.team_member_address": "Address",
|
|
6
6
|
"audit_logs.resource_kind.staff.team_member_comment": "Comment",
|
|
7
7
|
"audit_logs.resource_kind.staff.team_member_job_history": "Job History",
|
|
8
|
+
"notifications.categories.staff": "Staff",
|
|
8
9
|
"staff.attendees.actions.add": "Add attendee",
|
|
9
10
|
"staff.attendees.actions.delete": "Delete",
|
|
10
11
|
"staff.attendees.actions.deleteConfirm": "Delete attendee \"{{name}}\"?",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"audit_logs.resource_kind.staff.team_member_address": "Dirección",
|
|
6
6
|
"audit_logs.resource_kind.staff.team_member_comment": "Comentario",
|
|
7
7
|
"audit_logs.resource_kind.staff.team_member_job_history": "Historial laboral",
|
|
8
|
+
"notifications.categories.staff": "Personal",
|
|
8
9
|
"staff.attendees.actions.add": "Añadir asistente",
|
|
9
10
|
"staff.attendees.actions.delete": "Eliminar",
|
|
10
11
|
"staff.attendees.actions.deleteConfirm": "¿Eliminar asistente \"{{name}}\"?",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"audit_logs.resource_kind.staff.team_member_address": "주소",
|
|
6
6
|
"audit_logs.resource_kind.staff.team_member_comment": "코멘트",
|
|
7
7
|
"audit_logs.resource_kind.staff.team_member_job_history": "경력 사항",
|
|
8
|
+
"notifications.categories.staff": "직원",
|
|
8
9
|
"staff.attendees.actions.add": "참석자 추가",
|
|
9
10
|
"staff.attendees.actions.delete": "삭제",
|
|
10
11
|
"staff.attendees.actions.deleteConfirm": "참석자 \"{{name}}\"을(를) 삭제하시겠습니까?",
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"audit_logs.resource_kind.staff.team_member_address": "Adres",
|
|
6
6
|
"audit_logs.resource_kind.staff.team_member_comment": "Komentarz",
|
|
7
7
|
"audit_logs.resource_kind.staff.team_member_job_history": "Historia zatrudnienia",
|
|
8
|
+
"notifications.categories.staff": "Personel",
|
|
8
9
|
"staff.attendees.actions.add": "Dodaj uczestnika",
|
|
9
10
|
"staff.attendees.actions.delete": "Usuń",
|
|
10
11
|
"staff.attendees.actions.deleteConfirm": "Usunąć uczestnika \"{{name}}\"?",
|
|
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
|
|
|
3
3
|
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
4
4
|
{
|
|
5
5
|
type: 'staff.leave_request.pending',
|
|
6
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
7
|
+
channels: ['in_app', 'email'],
|
|
6
8
|
module: 'staff',
|
|
7
9
|
titleKey: 'staff.notifications.leaveRequest.pending.title',
|
|
8
10
|
bodyKey: 'staff.notifications.leaveRequest.pending.body',
|
|
@@ -30,6 +32,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
|
|
|
30
32
|
},
|
|
31
33
|
{
|
|
32
34
|
type: 'staff.leave_request.approved',
|
|
35
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
36
|
+
channels: ['in_app', 'email'],
|
|
33
37
|
module: 'staff',
|
|
34
38
|
titleKey: 'staff.notifications.leaveRequest.approved.title',
|
|
35
39
|
bodyKey: 'staff.notifications.leaveRequest.approved.body',
|
|
@@ -49,6 +53,8 @@ export const notificationTypes: NotificationTypeDefinition[] = [
|
|
|
49
53
|
},
|
|
50
54
|
{
|
|
51
55
|
type: 'staff.leave_request.rejected',
|
|
56
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
57
|
+
channels: ['in_app', 'email'],
|
|
52
58
|
module: 'staff',
|
|
53
59
|
titleKey: 'staff.notifications.leaveRequest.rejected.title',
|
|
54
60
|
bodyKey: 'staff.notifications.leaveRequest.rejected.body',
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"demo.userTask.description": "Dieser Workflow ist pausiert und wartet auf Benutzereingabe. Bitte schließen Sie die Aufgabe unten ab, um fortzufahren.",
|
|
44
44
|
"demo.userTask.dueLabel": "Fällig",
|
|
45
45
|
"demo.userTask.title": "Benutzeraktion erforderlich",
|
|
46
|
+
"notifications.categories.workflows": "Workflows",
|
|
46
47
|
"orderApproval.approveButton": "Genehmigen",
|
|
47
48
|
"orderApproval.approvedStatus": "Genehmigt",
|
|
48
49
|
"orderApproval.commentsLabel": "Kommentare",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"demo.userTask.description": "This workflow is paused waiting for user input. Please complete the task below to continue.",
|
|
44
44
|
"demo.userTask.dueLabel": "Due",
|
|
45
45
|
"demo.userTask.title": "User Action Required",
|
|
46
|
+
"notifications.categories.workflows": "Workflows",
|
|
46
47
|
"orderApproval.approveButton": "Approve",
|
|
47
48
|
"orderApproval.approvedStatus": "Approved",
|
|
48
49
|
"orderApproval.commentsLabel": "Comments",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"demo.userTask.description": "Este flujo de trabajo esta pausado esperando entrada del usuario. Completa la tarea a continuacion para continuar.",
|
|
44
44
|
"demo.userTask.dueLabel": "Vence",
|
|
45
45
|
"demo.userTask.title": "Se requiere accion del usuario",
|
|
46
|
+
"notifications.categories.workflows": "Flujos de trabajo",
|
|
46
47
|
"orderApproval.approveButton": "Aprobar",
|
|
47
48
|
"orderApproval.approvedStatus": "Aprobado",
|
|
48
49
|
"orderApproval.commentsLabel": "Comentarios",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"demo.userTask.description": "이 워크플로우는 사용자 입력을 기다리며 일시 중지되었습니다. 계속하려면 아래 작업을 완료해 주세요.",
|
|
44
44
|
"demo.userTask.dueLabel": "기한",
|
|
45
45
|
"demo.userTask.title": "사용자 작업 필요",
|
|
46
|
+
"notifications.categories.workflows": "워크플로",
|
|
46
47
|
"orderApproval.approveButton": "승인",
|
|
47
48
|
"orderApproval.approvedStatus": "승인됨",
|
|
48
49
|
"orderApproval.commentsLabel": "코멘트",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"demo.userTask.description": "Ten proces jest wstrzymany w oczekiwaniu na dane wejściowe użytkownika. Proszę wykonać zadanie poniżej, aby kontynuować.",
|
|
44
44
|
"demo.userTask.dueLabel": "Termin",
|
|
45
45
|
"demo.userTask.title": "Wymagane Działanie Użytkownika",
|
|
46
|
+
"notifications.categories.workflows": "Przep\u0142ywy pracy",
|
|
46
47
|
"orderApproval.approveButton": "Zatwierdź",
|
|
47
48
|
"orderApproval.approvedStatus": "Zatwierdzone",
|
|
48
49
|
"orderApproval.commentsLabel": "Komentarze",
|
|
@@ -3,6 +3,8 @@ import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/no
|
|
|
3
3
|
export const notificationTypes: NotificationTypeDefinition[] = [
|
|
4
4
|
{
|
|
5
5
|
type: 'workflows.task.assigned',
|
|
6
|
+
// Ships without push — operators re-enable it per type from the Notification Delivery settings.
|
|
7
|
+
channels: ['in_app', 'email'],
|
|
6
8
|
module: 'workflows',
|
|
7
9
|
titleKey: 'workflows.notifications.task.assigned.title',
|
|
8
10
|
bodyKey: 'workflows.notifications.task.assigned.body',
|