@open-mercato/core 0.6.5-develop.4384.1.ce2ec6eaaa → 0.6.5-develop.4393.1.de282b5dfd
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/channel_ingest_dead_letter/index.js +25 -0
- package/dist/generated/entities/channel_ingest_dead_letter/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_mapping/index.js +25 -0
- package/dist/generated/entities/channel_thread_mapping/index.js.map +7 -0
- package/dist/generated/entities/channel_thread_token/index.js +17 -0
- package/dist/generated/entities/channel_thread_token/index.js.map +7 -0
- package/dist/generated/entities/communication_channel/index.js +43 -0
- package/dist/generated/entities/communication_channel/index.js.map +7 -0
- package/dist/generated/entities/customer_interaction/index.js +4 -0
- package/dist/generated/entities/customer_interaction/index.js.map +2 -2
- package/dist/generated/entities/external_conversation/index.js +25 -0
- package/dist/generated/entities/external_conversation/index.js.map +7 -0
- package/dist/generated/entities/external_message/index.js +25 -0
- package/dist/generated/entities/external_message/index.js.map +7 -0
- package/dist/generated/entities/integration_credentials/index.js +3 -1
- package/dist/generated/entities/integration_credentials/index.js.map +2 -2
- package/dist/generated/entities/message/index.js +2 -0
- package/dist/generated/entities/message/index.js.map +2 -2
- package/dist/generated/entities/message_channel_link/index.js +33 -0
- package/dist/generated/entities/message_channel_link/index.js.map +7 -0
- package/dist/generated/entities/message_reaction/index.js +25 -0
- package/dist/generated/entities/message_reaction/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +11 -0
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +117 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/authFixtures.js +2 -1
- package/dist/helpers/integration/authFixtures.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +58 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +7 -0
- package/dist/modules/communication_channels/acl.js +47 -0
- package/dist/modules/communication_channels/acl.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js +133 -0
- package/dist/modules/communication_channels/api/delete/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js +113 -0
- package/dist/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js +138 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/health/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js +93 -0
- package/dist/modules/communication_channels/api/get/channels/[id]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/channels/route.js +96 -0
- package/dist/modules/communication_channels/api/get/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js +82 -0
- package/dist/modules/communication_channels/api/get/me/channels/route.js.map +7 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +274 -0
- package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +168 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js +143 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/poll-now/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js +127 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js +99 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/set-primary/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +197 -0
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js +124 -0
- package/dist/modules/communication_channels/api/post/channels/connect/credentials/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js +120 -0
- package/dist/modules/communication_channels/api/post/messages/[messageId]/reactions/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js +157 -0
- package/dist/modules/communication_channels/api/post/oauth/[provider]/initiate/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js +115 -0
- package/dist/modules/communication_channels/api/post/send-as-user/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js +217 -0
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +175 -0
- package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +7 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +123 -0
- package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +7 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js +117 -0
- package/dist/modules/communication_channels/api/put/threads/[threadId]/assign/route.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js +180 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js +36 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +107 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +727 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +7 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js +38 -0
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.meta.js.map +7 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js +154 -0
- package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/delete-channel.js +137 -0
- package/dist/modules/communication_channels/commands/delete-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js +400 -0
- package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js +163 -0
- package/dist/modules/communication_channels/commands/disconnect-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +413 -0
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +7 -0
- package/dist/modules/communication_channels/commands/interceptors.js +68 -0
- package/dist/modules/communication_channels/commands/interceptors.js.map +7 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js +198 -0
- package/dist/modules/communication_channels/commands/process-inbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-register.js +146 -0
- package/dist/modules/communication_channels/commands/push-register.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-renew.js +23 -0
- package/dist/modules/communication_channels/commands/push-renew.js.map +7 -0
- package/dist/modules/communication_channels/commands/push-unregister.js +108 -0
- package/dist/modules/communication_channels/commands/push-unregister.js.map +7 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js +113 -0
- package/dist/modules/communication_channels/commands/queue-import-history.js.map +7 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js +193 -0
- package/dist/modules/communication_channels/commands/reassign-conversation.js.map +7 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js +114 -0
- package/dist/modules/communication_channels/commands/set-primary-channel.js.map +7 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js +260 -0
- package/dist/modules/communication_channels/commands/toggle-outbound-reaction.js.map +7 -0
- package/dist/modules/communication_channels/data/enrichers.js +286 -0
- package/dist/modules/communication_channels/data/enrichers.js.map +7 -0
- package/dist/modules/communication_channels/data/entities.js +447 -0
- package/dist/modules/communication_channels/data/entities.js.map +7 -0
- package/dist/modules/communication_channels/data/extensions.js +67 -0
- package/dist/modules/communication_channels/data/extensions.js.map +7 -0
- package/dist/modules/communication_channels/data/validators.js +123 -0
- package/dist/modules/communication_channels/data/validators.js.map +7 -0
- package/dist/modules/communication_channels/di.js +35 -0
- package/dist/modules/communication_channels/di.js.map +7 -0
- package/dist/modules/communication_channels/encryption.js +12 -0
- package/dist/modules/communication_channels/encryption.js.map +7 -0
- package/dist/modules/communication_channels/events.js +124 -0
- package/dist/modules/communication_channels/events.js.map +7 -0
- package/dist/modules/communication_channels/index.js +20 -0
- package/dist/modules/communication_channels/index.js.map +7 -0
- package/dist/modules/communication_channels/lib/access-control.js +43 -0
- package/dist/modules/communication_channels/lib/access-control.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js +36 -0
- package/dist/modules/communication_channels/lib/adapter-compat.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js +22 -0
- package/dist/modules/communication_channels/lib/adapter-registry-singleton.js.map +7 -0
- package/dist/modules/communication_channels/lib/adapter.js +1 -0
- package/dist/modules/communication_channels/lib/adapter.js.map +7 -0
- package/dist/modules/communication_channels/lib/connect-channel.js +95 -0
- package/dist/modules/communication_channels/lib/connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js +79 -0
- package/dist/modules/communication_channels/lib/contact-resolver.js.map +7 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js +97 -0
- package/dist/modules/communication_channels/lib/credential-refresh.js.map +7 -0
- package/dist/modules/communication_channels/lib/dead-letter.js +62 -0
- package/dist/modules/communication_channels/lib/dead-letter.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js +47 -0
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-contact.js +14 -0
- package/dist/modules/communication_channels/lib/email-contact.js.map +7 -0
- package/dist/modules/communication_channels/lib/email-mime.js +259 -0
- package/dist/modules/communication_channels/lib/email-mime.js.map +7 -0
- package/dist/modules/communication_channels/lib/error-classification.js +101 -0
- package/dist/modules/communication_channels/lib/error-classification.js.map +7 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js +185 -0
- package/dist/modules/communication_channels/lib/gmail-pubsub-jwt.js.map +7 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js +114 -0
- package/dist/modules/communication_channels/lib/mutation-guards.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js +32 -0
- package/dist/modules/communication_channels/lib/oauth-client-config.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-state.js +128 -0
- package/dist/modules/communication_channels/lib/oauth-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/oauth-token.js +45 -0
- package/dist/modules/communication_channels/lib/oauth-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/pg-errors.js +11 -0
- package/dist/modules/communication_channels/lib/pg-errors.js.map +7 -0
- package/dist/modules/communication_channels/lib/provider-health.js +24 -0
- package/dist/modules/communication_channels/lib/provider-health.js.map +7 -0
- package/dist/modules/communication_channels/lib/push-state.js +19 -0
- package/dist/modules/communication_channels/lib/push-state.js.map +7 -0
- package/dist/modules/communication_channels/lib/queue.js +54 -0
- package/dist/modules/communication_channels/lib/queue.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js +5 -0
- package/dist/modules/communication_channels/lib/reaction-processor-types.js.map +7 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js +11 -0
- package/dist/modules/communication_channels/lib/reaction-semantics.js.map +7 -0
- package/dist/modules/communication_channels/lib/registry.js +67 -0
- package/dist/modules/communication_channels/lib/registry.js.map +7 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js +43 -0
- package/dist/modules/communication_channels/lib/route-mutation-guard.js.map +7 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js +96 -0
- package/dist/modules/communication_channels/lib/sanitize-channel-html.js.map +7 -0
- package/dist/modules/communication_channels/lib/send-as-user.js +194 -0
- package/dist/modules/communication_channels/lib/send-as-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/system-user.js +22 -0
- package/dist/modules/communication_channels/lib/system-user.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +68 -0
- package/dist/modules/communication_channels/lib/test-seed.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js +263 -0
- package/dist/modules/communication_channels/lib/thread-matcher.js.map +7 -0
- package/dist/modules/communication_channels/lib/thread-token.js +219 -0
- package/dist/modules/communication_channels/lib/thread-token.js.map +7 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js +61 -0
- package/dist/modules/communication_channels/lib/use-connect-channel.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js +50 -0
- package/dist/modules/communication_channels/migrations/Migration20260526134719_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js +19 -0
- package/dist/modules/communication_channels/migrations/Migration20260527195446_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js +13 -0
- package/dist/modules/communication_channels/migrations/Migration20260529231848_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js +17 -0
- package/dist/modules/communication_channels/migrations/Migration20260531120000_communication_channels.js.map +7 -0
- package/dist/modules/communication_channels/notifications.client.js +51 -0
- package/dist/modules/communication_channels/notifications.client.js.map +7 -0
- package/dist/modules/communication_channels/notifications.handlers.js +53 -0
- package/dist/modules/communication_channels/notifications.handlers.js.map +7 -0
- package/dist/modules/communication_channels/notifications.js +56 -0
- package/dist/modules/communication_channels/notifications.js.map +7 -0
- package/dist/modules/communication_channels/setup.js +105 -0
- package/dist/modules/communication_channels/setup.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js +71 -0
- package/dist/modules/communication_channels/subscribers/channel-requires-reauth-notification.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js +103 -0
- package/dist/modules/communication_channels/subscribers/outbound-bridge.js.map +7 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js +51 -0
- package/dist/modules/communication_channels/subscribers/user-deleted-cascade.js.map +7 -0
- package/dist/modules/communication_channels/widgets/components.js +7 -0
- package/dist/modules/communication_channels/widgets/components.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js +18 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js +30 -0
- package/dist/modules/communication_channels/widgets/injection/channel-badge/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js +185 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-info-panel/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js +44 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js +23 -0
- package/dist/modules/communication_channels/widgets/injection/profile-channels-menu/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js +141 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.client.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js +17 -0
- package/dist/modules/communication_channels/widgets/injection/reaction-bar/widget.js.map +7 -0
- package/dist/modules/communication_channels/widgets/injection-table.js +38 -0
- package/dist/modules/communication_channels/widgets/injection-table.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js +25 -0
- package/dist/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js +19 -0
- package/dist/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.js.map +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js +7 -0
- package/dist/modules/communication_channels/widgets/notifications/index.js.map +7 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js +185 -0
- package/dist/modules/communication_channels/workers/channel-import-history.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js +154 -0
- package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +7 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js +95 -0
- package/dist/modules/communication_channels/workers/gmail-renew-watch.js.map +7 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js +56 -0
- package/dist/modules/communication_channels/workers/inbound-processor.js.map +7 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js +85 -0
- package/dist/modules/communication_channels/workers/outbound-delivery.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-channel.js +240 -0
- package/dist/modules/communication_channels/workers/poll-channel.js.map +7 -0
- package/dist/modules/communication_channels/workers/poll-tick.js +132 -0
- package/dist/modules/communication_channels/workers/poll-tick.js.map +7 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js +192 -0
- package/dist/modules/communication_channels/workers/reaction-processor.js.map +7 -0
- package/dist/modules/customers/acl.js +18 -0
- package/dist/modules/customers/acl.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +9 -0
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +18 -7
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js +151 -0
- package/dist/modules/customers/api/interactions/[id]/visibility/route.js.map +7 -0
- package/dist/modules/customers/api/interactions/counts/route.js +6 -0
- package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +26 -7
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/email-threads/route.js +82 -0
- package/dist/modules/customers/api/people/[id]/email-threads/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js +157 -0
- package/dist/modules/customers/api/people/[id]/emails/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/route.js +12 -4
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +10 -0
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +46 -5
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +16 -0
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityCard.js +32 -0
- package/dist/modules/customers/components/detail/ActivityCard.js.map +2 -2
- package/dist/modules/customers/components/detail/ComposeEmailDialog.js +242 -0
- package/dist/modules/customers/components/detail/ComposeEmailDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/DealForm.js +2 -1
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +10 -0
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EmailCardActions.js +179 -0
- package/dist/modules/customers/components/detail/EmailCardActions.js.map +7 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js +52 -0
- package/dist/modules/customers/components/detail/EmailReplyForwardActions.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonDetailTabs.js +7 -1
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js +366 -0
- package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js.map +7 -0
- package/dist/modules/customers/data/enrichers.js +133 -2
- package/dist/modules/customers/data/enrichers.js.map +2 -2
- package/dist/modules/customers/data/entities.js +18 -0
- package/dist/modules/customers/data/entities.js.map +2 -2
- package/dist/modules/customers/data/extensions.js +16 -0
- package/dist/modules/customers/data/extensions.js.map +7 -0
- package/dist/modules/customers/encryption.js +11 -0
- package/dist/modules/customers/encryption.js.map +2 -2
- package/dist/modules/customers/events.js +4 -1
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +64 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +7 -0
- package/dist/modules/customers/lib/kysely.js.map +2 -2
- package/dist/modules/customers/lib/link-channel-message-handler.js +303 -0
- package/dist/modules/customers/lib/link-channel-message-handler.js.map +7 -0
- package/dist/modules/customers/lib/personEmailThreads.js +205 -0
- package/dist/modules/customers/lib/personEmailThreads.js.map +7 -0
- package/dist/modules/customers/lib/visibilityFilter.js +51 -0
- package/dist/modules/customers/lib/visibilityFilter.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js +20 -0
- package/dist/modules/customers/migrations/Migration20260527012240_customers.js.map +7 -0
- package/dist/modules/customers/setup.js +2 -1
- package/dist/modules/customers/setup.js.map +2 -2
- package/dist/modules/customers/subscribers/link-channel-message-received.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-received.js.map +7 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js +12 -0
- package/dist/modules/customers/subscribers/link-channel-message-sent.js.map +7 -0
- package/dist/modules/integrations/data/entities.js +8 -1
- package/dist/modules/integrations/data/entities.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-service.js +29 -14
- package/dist/modules/integrations/lib/credentials-service.js.map +2 -2
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js +15 -0
- package/dist/modules/integrations/migrations/Migration20260526154136_integrations.js.map +7 -0
- package/dist/modules/messages/commands/messages.js +70 -8
- package/dist/modules/messages/commands/messages.js.map +2 -2
- package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -13
- package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js +39 -2
- package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +1 -0
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/data/entities.js +8 -1
- package/dist/modules/messages/data/entities.js.map +2 -2
- package/dist/modules/messages/migrations/Migration20260531130000.js +15 -0
- package/dist/modules/messages/migrations/Migration20260531130000.js.map +7 -0
- package/dist/modules/messages/widgets/injection-table.js +7 -0
- package/dist/modules/messages/widgets/injection-table.js.map +7 -0
- package/generated/entities/channel_ingest_dead_letter/index.ts +11 -0
- package/generated/entities/channel_thread_mapping/index.ts +11 -0
- package/generated/entities/channel_thread_token/index.ts +7 -0
- package/generated/entities/communication_channel/index.ts +20 -0
- package/generated/entities/customer_interaction/index.ts +2 -0
- package/generated/entities/external_conversation/index.ts +11 -0
- package/generated/entities/external_message/index.ts +11 -0
- package/generated/entities/integration_credentials/index.ts +1 -0
- package/generated/entities/message/index.ts +1 -0
- package/generated/entities/message_channel_link/index.ts +15 -0
- package/generated/entities/message_reaction/index.ts +11 -0
- package/generated/entities.ids.generated.ts +11 -0
- package/generated/entity-fields-registry.ts +117 -0
- package/package.json +9 -7
- package/src/helpers/integration/authFixtures.ts +4 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +124 -0
- package/src/modules/communication_channels/acl.ts +43 -0
- package/src/modules/communication_channels/api/delete/channels/[id]/route.ts +163 -0
- package/src/modules/communication_channels/api/delete/messages/[messageId]/reactions/[reactionId]/route.ts +143 -0
- package/src/modules/communication_channels/api/get/channels/[id]/health/route.ts +173 -0
- package/src/modules/communication_channels/api/get/channels/[id]/route.ts +111 -0
- package/src/modules/communication_channels/api/get/channels/route.ts +109 -0
- package/src/modules/communication_channels/api/get/me/channels/route.ts +100 -0
- package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +355 -0
- package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +206 -0
- package/src/modules/communication_channels/api/post/channels/[id]/poll-now/route.ts +174 -0
- package/src/modules/communication_channels/api/post/channels/[id]/push/register/route.ts +158 -0
- package/src/modules/communication_channels/api/post/channels/[id]/set-primary/route.ts +114 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +241 -0
- package/src/modules/communication_channels/api/post/channels/connect/credentials/route.ts +134 -0
- package/src/modules/communication_channels/api/post/messages/[messageId]/reactions/route.ts +143 -0
- package/src/modules/communication_channels/api/post/oauth/[provider]/initiate/route.ts +192 -0
- package/src/modules/communication_channels/api/post/send-as-user/route.ts +125 -0
- package/src/modules/communication_channels/api/post/test-seed/route.ts +267 -0
- package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +227 -0
- package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +161 -0
- package/src/modules/communication_channels/api/put/threads/[threadId]/assign/route.ts +132 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.meta.ts +34 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/[id]/page.tsx +250 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +137 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.meta.ts +36 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +907 -0
- package/src/modules/communication_channels/commands/connect-credential-channel.ts +243 -0
- package/src/modules/communication_channels/commands/delete-channel.ts +193 -0
- package/src/modules/communication_channels/commands/deliver-outbound-message.ts +579 -0
- package/src/modules/communication_channels/commands/disconnect-channel.ts +241 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +602 -0
- package/src/modules/communication_channels/commands/interceptors.ts +104 -0
- package/src/modules/communication_channels/commands/process-inbound-reaction.ts +265 -0
- package/src/modules/communication_channels/commands/push-register.ts +203 -0
- package/src/modules/communication_channels/commands/push-renew.ts +49 -0
- package/src/modules/communication_channels/commands/push-unregister.ts +168 -0
- package/src/modules/communication_channels/commands/queue-import-history.ts +180 -0
- package/src/modules/communication_channels/commands/reassign-conversation.ts +273 -0
- package/src/modules/communication_channels/commands/set-primary-channel.ts +154 -0
- package/src/modules/communication_channels/commands/toggle-outbound-reaction.ts +347 -0
- package/src/modules/communication_channels/data/enrichers.ts +413 -0
- package/src/modules/communication_channels/data/entities.ts +546 -0
- package/src/modules/communication_channels/data/extensions.ts +76 -0
- package/src/modules/communication_channels/data/validators.ts +138 -0
- package/src/modules/communication_channels/di.ts +40 -0
- package/src/modules/communication_channels/encryption.ts +44 -0
- package/src/modules/communication_channels/events.ts +122 -0
- package/src/modules/communication_channels/i18n/de.json +138 -0
- package/src/modules/communication_channels/i18n/en.json +138 -0
- package/src/modules/communication_channels/i18n/es.json +138 -0
- package/src/modules/communication_channels/i18n/pl.json +138 -0
- package/src/modules/communication_channels/index.ts +19 -0
- package/src/modules/communication_channels/lib/access-control.ts +110 -0
- package/src/modules/communication_channels/lib/adapter-compat.ts +57 -0
- package/src/modules/communication_channels/lib/adapter-registry-singleton.ts +35 -0
- package/src/modules/communication_channels/lib/adapter.ts +605 -0
- package/src/modules/communication_channels/lib/connect-channel.ts +163 -0
- package/src/modules/communication_channels/lib/contact-resolver.ts +162 -0
- package/src/modules/communication_channels/lib/credential-refresh.ts +197 -0
- package/src/modules/communication_channels/lib/dead-letter.ts +87 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +60 -0
- package/src/modules/communication_channels/lib/email-contact.ts +17 -0
- package/src/modules/communication_channels/lib/email-mime.ts +425 -0
- package/src/modules/communication_channels/lib/error-classification.ts +144 -0
- package/src/modules/communication_channels/lib/gmail-pubsub-jwt.ts +278 -0
- package/src/modules/communication_channels/lib/mutation-guards.ts +215 -0
- package/src/modules/communication_channels/lib/oauth-client-config.ts +79 -0
- package/src/modules/communication_channels/lib/oauth-state.ts +228 -0
- package/src/modules/communication_channels/lib/oauth-token.ts +81 -0
- package/src/modules/communication_channels/lib/pg-errors.ts +12 -0
- package/src/modules/communication_channels/lib/provider-health.ts +47 -0
- package/src/modules/communication_channels/lib/push-state.ts +38 -0
- package/src/modules/communication_channels/lib/queue.ts +66 -0
- package/src/modules/communication_channels/lib/reaction-processor-types.ts +51 -0
- package/src/modules/communication_channels/lib/reaction-semantics.ts +48 -0
- package/src/modules/communication_channels/lib/registry.ts +99 -0
- package/src/modules/communication_channels/lib/route-mutation-guard.ts +68 -0
- package/src/modules/communication_channels/lib/sanitize-channel-html.ts +129 -0
- package/src/modules/communication_channels/lib/send-as-user.ts +284 -0
- package/src/modules/communication_channels/lib/system-user.ts +74 -0
- package/src/modules/communication_channels/lib/test-seed.ts +140 -0
- package/src/modules/communication_channels/lib/thread-matcher.ts +430 -0
- package/src/modules/communication_channels/lib/thread-token.ts +355 -0
- package/src/modules/communication_channels/lib/use-connect-channel.ts +73 -0
- package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +2142 -0
- package/src/modules/communication_channels/migrations/Migration20260526134719_communication_channels.ts +55 -0
- package/src/modules/communication_channels/migrations/Migration20260527195446_communication_channels.ts +20 -0
- package/src/modules/communication_channels/migrations/Migration20260529231848_communication_channels.ts +13 -0
- package/src/modules/communication_channels/migrations/Migration20260531120000_communication_channels.ts +24 -0
- package/src/modules/communication_channels/notifications.client.ts +50 -0
- package/src/modules/communication_channels/notifications.handlers.ts +86 -0
- package/src/modules/communication_channels/notifications.ts +52 -0
- package/src/modules/communication_channels/setup.ts +158 -0
- package/src/modules/communication_channels/subscribers/channel-requires-reauth-notification.ts +118 -0
- package/src/modules/communication_channels/subscribers/outbound-bridge.ts +175 -0
- package/src/modules/communication_channels/subscribers/user-deleted-cascade.ts +100 -0
- package/src/modules/communication_channels/widgets/components.ts +36 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.client.tsx +38 -0
- package/src/modules/communication_channels/widgets/injection/channel-badge/widget.ts +51 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.client.tsx +278 -0
- package/src/modules/communication_channels/widgets/injection/channel-info-panel/widget.ts +24 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.client.tsx +63 -0
- package/src/modules/communication_channels/widgets/injection/channel-payload-renderer/widget.ts +29 -0
- package/src/modules/communication_channels/widgets/injection/profile-channels-menu/widget.ts +34 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.client.tsx +177 -0
- package/src/modules/communication_channels/widgets/injection/reaction-bar/widget.ts +26 -0
- package/src/modules/communication_channels/widgets/injection-table.ts +47 -0
- package/src/modules/communication_channels/widgets/notifications/ChannelRequiresReauthRenderer.tsx +48 -0
- package/src/modules/communication_channels/widgets/notifications/MessageReceivedRenderer.tsx +45 -0
- package/src/modules/communication_channels/widgets/notifications/index.ts +2 -0
- package/src/modules/communication_channels/workers/channel-import-history.ts +252 -0
- package/src/modules/communication_channels/workers/gmail-history-sync.ts +223 -0
- package/src/modules/communication_channels/workers/gmail-renew-watch.ts +141 -0
- package/src/modules/communication_channels/workers/inbound-processor.ts +114 -0
- package/src/modules/communication_channels/workers/outbound-delivery.ts +155 -0
- package/src/modules/communication_channels/workers/poll-channel.ts +391 -0
- package/src/modules/communication_channels/workers/poll-tick.ts +210 -0
- package/src/modules/communication_channels/workers/reaction-processor.ts +264 -0
- package/src/modules/customers/acl.ts +18 -0
- package/src/modules/customers/api/activities/route.ts +13 -0
- package/src/modules/customers/api/companies/[id]/route.ts +21 -1
- package/src/modules/customers/api/interactions/[id]/visibility/route.ts +179 -0
- package/src/modules/customers/api/interactions/counts/route.ts +10 -0
- package/src/modules/customers/api/interactions/route.ts +51 -5
- package/src/modules/customers/api/people/[id]/email-threads/route.ts +92 -0
- package/src/modules/customers/api/people/[id]/emails/route.ts +184 -0
- package/src/modules/customers/api/people/[id]/route.ts +17 -2
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +11 -1
- package/src/modules/customers/commands/deals.ts +65 -6
- package/src/modules/customers/commands/interactions.ts +30 -0
- package/src/modules/customers/components/detail/ActivityCard.tsx +48 -0
- package/src/modules/customers/components/detail/ComposeEmailDialog.tsx +329 -0
- package/src/modules/customers/components/detail/DealForm.tsx +2 -1
- package/src/modules/customers/components/detail/DealsSection.tsx +26 -0
- package/src/modules/customers/components/detail/EmailCardActions.tsx +258 -0
- package/src/modules/customers/components/detail/EmailReplyForwardActions.tsx +53 -0
- package/src/modules/customers/components/detail/PersonDetailTabs.tsx +8 -1
- package/src/modules/customers/components/detail/PersonEmailThreadsTab.tsx +448 -0
- package/src/modules/customers/data/enrichers.ts +252 -1
- package/src/modules/customers/data/entities.ts +46 -1
- package/src/modules/customers/data/extensions.ts +26 -0
- package/src/modules/customers/encryption.ts +11 -0
- package/src/modules/customers/events.ts +4 -0
- package/src/modules/customers/i18n/de.json +41 -0
- package/src/modules/customers/i18n/en.json +41 -0
- package/src/modules/customers/i18n/es.json +41 -0
- package/src/modules/customers/i18n/pl.json +41 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +107 -0
- package/src/modules/customers/lib/kysely.ts +16 -0
- package/src/modules/customers/lib/link-channel-message-handler.ts +571 -0
- package/src/modules/customers/lib/personEmailThreads.ts +325 -0
- package/src/modules/customers/lib/visibilityFilter.ts +152 -0
- package/src/modules/customers/migrations/.snapshot-open-mercato.json +61 -0
- package/src/modules/customers/migrations/Migration20260527012240_customers.ts +23 -0
- package/src/modules/customers/setup.ts +1 -0
- package/src/modules/customers/subscribers/link-channel-message-received.ts +21 -0
- package/src/modules/customers/subscribers/link-channel-message-sent.ts +21 -0
- package/src/modules/integrations/AGENTS.md +9 -0
- package/src/modules/integrations/data/entities.ts +21 -1
- package/src/modules/integrations/lib/credentials-service.ts +49 -13
- package/src/modules/integrations/migrations/.snapshot-open-mercato.json +26 -1
- package/src/modules/integrations/migrations/Migration20260526154136_integrations.ts +15 -0
- package/src/modules/messages/commands/messages.ts +101 -8
- package/src/modules/messages/components/ComposeMessagePageClient.tsx +17 -0
- package/src/modules/messages/components/MessageDetailPageClient.tsx +43 -0
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +4 -0
- package/src/modules/messages/data/entities.ts +11 -0
- package/src/modules/messages/migrations/.snapshot-open-mercato.json +18 -0
- package/src/modules/messages/migrations/Migration20260531130000.ts +15 -0
- package/src/modules/messages/widgets/injection-table.ts +29 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const id = "id";
|
|
2
|
+
export const message_id = "message_id";
|
|
3
|
+
export const external_conversation_id = "external_conversation_id";
|
|
4
|
+
export const external_message_id = "external_message_id";
|
|
5
|
+
export const provider_key = "provider_key";
|
|
6
|
+
export const channel_type = "channel_type";
|
|
7
|
+
export const direction = "direction";
|
|
8
|
+
export const delivery_status = "delivery_status";
|
|
9
|
+
export const channel_payload = "channel_payload";
|
|
10
|
+
export const channel_content_type = "channel_content_type";
|
|
11
|
+
export const interactive_state = "interactive_state";
|
|
12
|
+
export const channel_metadata = "channel_metadata";
|
|
13
|
+
export const tenant_id = "tenant_id";
|
|
14
|
+
export const organization_id = "organization_id";
|
|
15
|
+
export const created_at = "created_at";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const id = "id";
|
|
2
|
+
export const message_id = "message_id";
|
|
3
|
+
export const emoji = "emoji";
|
|
4
|
+
export const reacted_by_user_id = "reacted_by_user_id";
|
|
5
|
+
export const reacted_by_external_id = "reacted_by_external_id";
|
|
6
|
+
export const reacted_by_display_name = "reacted_by_display_name";
|
|
7
|
+
export const provider_key = "provider_key";
|
|
8
|
+
export const external_reaction_id = "external_reaction_id";
|
|
9
|
+
export const tenant_id = "tenant_id";
|
|
10
|
+
export const organization_id = "organization_id";
|
|
11
|
+
export const created_at = "created_at";
|
|
@@ -28,6 +28,7 @@ export const M = {
|
|
|
28
28
|
"data_sync": "data_sync",
|
|
29
29
|
"sync_excel": "sync_excel",
|
|
30
30
|
"messages": "messages",
|
|
31
|
+
"communication_channels": "communication_channels",
|
|
31
32
|
"translations": "translations",
|
|
32
33
|
"inbox_ops": "inbox_ops",
|
|
33
34
|
"payment_gateways": "payment_gateways",
|
|
@@ -243,6 +244,16 @@ export const M = {
|
|
|
243
244
|
"message_access_token": "messages:message_access_token",
|
|
244
245
|
"message_confirmation": "messages:message_confirmation"
|
|
245
246
|
},
|
|
247
|
+
"communication_channels": {
|
|
248
|
+
"communication_channel": "communication_channels:communication_channel",
|
|
249
|
+
"external_conversation": "communication_channels:external_conversation",
|
|
250
|
+
"external_message": "communication_channels:external_message",
|
|
251
|
+
"message_channel_link": "communication_channels:message_channel_link",
|
|
252
|
+
"channel_thread_mapping": "communication_channels:channel_thread_mapping",
|
|
253
|
+
"message_reaction": "communication_channels:message_reaction",
|
|
254
|
+
"channel_thread_token": "communication_channels:channel_thread_token",
|
|
255
|
+
"channel_ingest_dead_letter": "communication_channels:channel_ingest_dead_letter"
|
|
256
|
+
},
|
|
246
257
|
"translations": {
|
|
247
258
|
"entity_translation": "translations:entity_translation"
|
|
248
259
|
},
|
|
@@ -366,6 +366,63 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
366
366
|
"created_at": "created_at",
|
|
367
367
|
"updated_at": "updated_at"
|
|
368
368
|
},
|
|
369
|
+
"channel_ingest_dead_letter": {
|
|
370
|
+
"id": "id",
|
|
371
|
+
"tenant_id": "tenant_id",
|
|
372
|
+
"organization_id": "organization_id",
|
|
373
|
+
"channel_id": "channel_id",
|
|
374
|
+
"provider_key": "provider_key",
|
|
375
|
+
"external_uid": "external_uid",
|
|
376
|
+
"external_message_id": "external_message_id",
|
|
377
|
+
"error_class": "error_class",
|
|
378
|
+
"error_message": "error_message",
|
|
379
|
+
"raw_body": "raw_body",
|
|
380
|
+
"created_at": "created_at"
|
|
381
|
+
},
|
|
382
|
+
"channel_thread_mapping": {
|
|
383
|
+
"id": "id",
|
|
384
|
+
"external_conversation_id": "external_conversation_id",
|
|
385
|
+
"message_thread_id": "message_thread_id",
|
|
386
|
+
"channel_id": "channel_id",
|
|
387
|
+
"provider_key": "provider_key",
|
|
388
|
+
"external_thread_ref": "external_thread_ref",
|
|
389
|
+
"assigned_user_id": "assigned_user_id",
|
|
390
|
+
"tenant_id": "tenant_id",
|
|
391
|
+
"organization_id": "organization_id",
|
|
392
|
+
"created_at": "created_at",
|
|
393
|
+
"updated_at": "updated_at"
|
|
394
|
+
},
|
|
395
|
+
"channel_thread_token": {
|
|
396
|
+
"id": "id",
|
|
397
|
+
"tenant_id": "tenant_id",
|
|
398
|
+
"organization_id": "organization_id",
|
|
399
|
+
"message_thread_id": "message_thread_id",
|
|
400
|
+
"token": "token",
|
|
401
|
+
"created_at": "created_at",
|
|
402
|
+
"last_seen_at": "last_seen_at"
|
|
403
|
+
},
|
|
404
|
+
"communication_channel": {
|
|
405
|
+
"id": "id",
|
|
406
|
+
"provider_key": "provider_key",
|
|
407
|
+
"channel_type": "channel_type",
|
|
408
|
+
"display_name": "display_name",
|
|
409
|
+
"external_identifier": "external_identifier",
|
|
410
|
+
"credentials_ref": "credentials_ref",
|
|
411
|
+
"capabilities": "capabilities",
|
|
412
|
+
"is_active": "is_active",
|
|
413
|
+
"user_id": "user_id",
|
|
414
|
+
"is_primary": "is_primary",
|
|
415
|
+
"poll_interval_seconds": "poll_interval_seconds",
|
|
416
|
+
"last_polled_at": "last_polled_at",
|
|
417
|
+
"status": "status",
|
|
418
|
+
"last_error": "last_error",
|
|
419
|
+
"channel_state": "channel_state",
|
|
420
|
+
"tenant_id": "tenant_id",
|
|
421
|
+
"organization_id": "organization_id",
|
|
422
|
+
"created_at": "created_at",
|
|
423
|
+
"updated_at": "updated_at",
|
|
424
|
+
"deleted_at": "deleted_at"
|
|
425
|
+
},
|
|
369
426
|
"currency": {
|
|
370
427
|
"id": "id",
|
|
371
428
|
"organization_id": "organization_id",
|
|
@@ -679,6 +736,8 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
679
736
|
"interaction_type": "interaction_type",
|
|
680
737
|
"title": "title",
|
|
681
738
|
"body": "body",
|
|
739
|
+
"external_message_id": "external_message_id",
|
|
740
|
+
"channel_provider_key": "channel_provider_key",
|
|
682
741
|
"status": "status",
|
|
683
742
|
"scheduled_at": "scheduled_at",
|
|
684
743
|
"occurred_at": "occurred_at",
|
|
@@ -1079,6 +1138,32 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
1079
1138
|
"updated_at": "updated_at",
|
|
1080
1139
|
"deleted_at": "deleted_at"
|
|
1081
1140
|
},
|
|
1141
|
+
"external_conversation": {
|
|
1142
|
+
"id": "id",
|
|
1143
|
+
"channel_id": "channel_id",
|
|
1144
|
+
"external_conversation_id": "external_conversation_id",
|
|
1145
|
+
"subject": "subject",
|
|
1146
|
+
"contact_person_id": "contact_person_id",
|
|
1147
|
+
"assigned_user_id": "assigned_user_id",
|
|
1148
|
+
"last_message_at": "last_message_at",
|
|
1149
|
+
"tenant_id": "tenant_id",
|
|
1150
|
+
"organization_id": "organization_id",
|
|
1151
|
+
"created_at": "created_at",
|
|
1152
|
+
"updated_at": "updated_at"
|
|
1153
|
+
},
|
|
1154
|
+
"external_message": {
|
|
1155
|
+
"id": "id",
|
|
1156
|
+
"channel_id": "channel_id",
|
|
1157
|
+
"conversation_id": "conversation_id",
|
|
1158
|
+
"external_message_id": "external_message_id",
|
|
1159
|
+
"direction": "direction",
|
|
1160
|
+
"sender_identifier": "sender_identifier",
|
|
1161
|
+
"sender_display_name": "sender_display_name",
|
|
1162
|
+
"provider_timestamp": "provider_timestamp",
|
|
1163
|
+
"tenant_id": "tenant_id",
|
|
1164
|
+
"organization_id": "organization_id",
|
|
1165
|
+
"created_at": "created_at"
|
|
1166
|
+
},
|
|
1082
1167
|
"feature_toggle": {
|
|
1083
1168
|
"id": "id",
|
|
1084
1169
|
"identifier": "identifier",
|
|
@@ -1260,6 +1345,7 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
1260
1345
|
"credentials": "credentials",
|
|
1261
1346
|
"organization_id": "organization_id",
|
|
1262
1347
|
"tenant_id": "tenant_id",
|
|
1348
|
+
"user_id": "user_id",
|
|
1263
1349
|
"created_at": "created_at",
|
|
1264
1350
|
"updated_at": "updated_at",
|
|
1265
1351
|
"deleted_at": "deleted_at"
|
|
@@ -1323,6 +1409,7 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
1323
1409
|
"source_entity_id": "source_entity_id",
|
|
1324
1410
|
"external_email": "external_email",
|
|
1325
1411
|
"external_email_hash": "external_email_hash",
|
|
1412
|
+
"idempotency_key": "idempotency_key",
|
|
1326
1413
|
"external_name": "external_name",
|
|
1327
1414
|
"external_email_sent_at": "external_email_sent_at",
|
|
1328
1415
|
"external_email_failed_at": "external_email_failed_at",
|
|
@@ -1338,6 +1425,23 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
1338
1425
|
"use_count": "use_count",
|
|
1339
1426
|
"created_at": "created_at"
|
|
1340
1427
|
},
|
|
1428
|
+
"message_channel_link": {
|
|
1429
|
+
"id": "id",
|
|
1430
|
+
"message_id": "message_id",
|
|
1431
|
+
"external_conversation_id": "external_conversation_id",
|
|
1432
|
+
"external_message_id": "external_message_id",
|
|
1433
|
+
"provider_key": "provider_key",
|
|
1434
|
+
"channel_type": "channel_type",
|
|
1435
|
+
"direction": "direction",
|
|
1436
|
+
"delivery_status": "delivery_status",
|
|
1437
|
+
"channel_payload": "channel_payload",
|
|
1438
|
+
"channel_content_type": "channel_content_type",
|
|
1439
|
+
"interactive_state": "interactive_state",
|
|
1440
|
+
"channel_metadata": "channel_metadata",
|
|
1441
|
+
"tenant_id": "tenant_id",
|
|
1442
|
+
"organization_id": "organization_id",
|
|
1443
|
+
"created_at": "created_at"
|
|
1444
|
+
},
|
|
1341
1445
|
"message_confirmation": {
|
|
1342
1446
|
"id": "id",
|
|
1343
1447
|
"message_id": "message_id",
|
|
@@ -1361,6 +1465,19 @@ export const entityFieldsRegistry: Record<string, Record<string, string>> = {
|
|
|
1361
1465
|
"entity_snapshot": "entity_snapshot",
|
|
1362
1466
|
"created_at": "created_at"
|
|
1363
1467
|
},
|
|
1468
|
+
"message_reaction": {
|
|
1469
|
+
"id": "id",
|
|
1470
|
+
"message_id": "message_id",
|
|
1471
|
+
"emoji": "emoji",
|
|
1472
|
+
"reacted_by_user_id": "reacted_by_user_id",
|
|
1473
|
+
"reacted_by_external_id": "reacted_by_external_id",
|
|
1474
|
+
"reacted_by_display_name": "reacted_by_display_name",
|
|
1475
|
+
"provider_key": "provider_key",
|
|
1476
|
+
"external_reaction_id": "external_reaction_id",
|
|
1477
|
+
"tenant_id": "tenant_id",
|
|
1478
|
+
"organization_id": "organization_id",
|
|
1479
|
+
"created_at": "created_at"
|
|
1480
|
+
},
|
|
1364
1481
|
"message_recipient": {
|
|
1365
1482
|
"id": "id",
|
|
1366
1483
|
"message_id": "message_id",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/core",
|
|
3
|
-
"version": "0.6.5-develop.
|
|
3
|
+
"version": "0.6.5-develop.4393.1.de282b5dfd",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -237,22 +237,23 @@
|
|
|
237
237
|
"html-to-text": "^10.0.0",
|
|
238
238
|
"mammoth": "^1.9.0",
|
|
239
239
|
"pdfjs-dist": "^6.0.227",
|
|
240
|
+
"sanitize-html": "^2.13.0",
|
|
240
241
|
"semver": "^7.8.1",
|
|
241
242
|
"svix": "^1.95.1",
|
|
242
243
|
"ts-pattern": "^5.0.0",
|
|
243
244
|
"zod": "^4.4.3"
|
|
244
245
|
},
|
|
245
246
|
"peerDependencies": {
|
|
246
|
-
"@open-mercato/ai-assistant": "0.6.5-develop.
|
|
247
|
-
"@open-mercato/shared": "0.6.5-develop.
|
|
248
|
-
"@open-mercato/ui": "0.6.5-develop.
|
|
247
|
+
"@open-mercato/ai-assistant": "0.6.5-develop.4393.1.de282b5dfd",
|
|
248
|
+
"@open-mercato/shared": "0.6.5-develop.4393.1.de282b5dfd",
|
|
249
|
+
"@open-mercato/ui": "0.6.5-develop.4393.1.de282b5dfd",
|
|
249
250
|
"react": "^19.0.0",
|
|
250
251
|
"react-dom": "^19.0.0"
|
|
251
252
|
},
|
|
252
253
|
"devDependencies": {
|
|
253
|
-
"@open-mercato/ai-assistant": "0.6.5-develop.
|
|
254
|
-
"@open-mercato/shared": "0.6.5-develop.
|
|
255
|
-
"@open-mercato/ui": "0.6.5-develop.
|
|
254
|
+
"@open-mercato/ai-assistant": "0.6.5-develop.4393.1.de282b5dfd",
|
|
255
|
+
"@open-mercato/shared": "0.6.5-develop.4393.1.de282b5dfd",
|
|
256
|
+
"@open-mercato/ui": "0.6.5-develop.4393.1.de282b5dfd",
|
|
256
257
|
"@testing-library/dom": "^10.4.1",
|
|
257
258
|
"@testing-library/jest-dom": "^6.9.1",
|
|
258
259
|
"@testing-library/react": "^16.3.1",
|
|
@@ -261,6 +262,7 @@
|
|
|
261
262
|
"@types/jest": "^30.0.0",
|
|
262
263
|
"@types/react": "^19.2.16",
|
|
263
264
|
"@types/react-dom": "^19.2.3",
|
|
265
|
+
"@types/sanitize-html": "^2.13.0",
|
|
264
266
|
"@types/semver": "^7.5.8",
|
|
265
267
|
"chance": "^1.1.13",
|
|
266
268
|
"jest": "^30.4.2",
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { expect, type APIRequestContext } from '@playwright/test';
|
|
2
|
-
import { apiRequest } from './api';
|
|
2
|
+
import { apiRequest, getAuthToken } from './api';
|
|
3
3
|
import { expectId, readJsonSafe } from './generalFixtures';
|
|
4
4
|
|
|
5
|
+
// Re-exported so tests can import auth helpers from a single fixtures module.
|
|
6
|
+
export { getAuthToken };
|
|
7
|
+
|
|
5
8
|
const BASE_URL = process.env.BASE_URL?.trim() || null;
|
|
6
9
|
|
|
7
10
|
function resolveUrl(path: string): string {
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { expect, type APIRequestContext } from '@playwright/test';
|
|
2
|
+
import { apiRequest } from './api';
|
|
3
|
+
import { expectId, readJsonSafe } from './generalFixtures';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Communication-channels integration fixtures.
|
|
7
|
+
*
|
|
8
|
+
* These drive the TEST-ONLY seed endpoint `POST /api/communication_channels/test-seed`,
|
|
9
|
+
* which is gated by `OM_ENABLE_TEST_CHANNEL_SEEDING` (inert/404 in production). Use
|
|
10
|
+
* {@link isChannelSeedingAvailable} to skip tests when the gate is off rather than
|
|
11
|
+
* failing them.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export type SeedAddressField =
|
|
15
|
+
| string
|
|
16
|
+
| { address: string; name?: string }
|
|
17
|
+
| Array<string | { address: string; name?: string }>;
|
|
18
|
+
|
|
19
|
+
const TEST_SEED_PATH = '/api/communication_channels/test-seed';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Probe whether the env-gated test-seed endpoint is enabled in the target app.
|
|
23
|
+
* Returns false when the route answers 404 (flag off) so callers can `test.skip`.
|
|
24
|
+
* The caller's token must hold `communication_channels.connect_user_channel`.
|
|
25
|
+
*/
|
|
26
|
+
export async function isChannelSeedingAvailable(
|
|
27
|
+
request: APIRequestContext,
|
|
28
|
+
token: string,
|
|
29
|
+
): Promise<boolean> {
|
|
30
|
+
// A malformed body returns 422 when the gate is ON and 404 when it is OFF.
|
|
31
|
+
const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
|
|
32
|
+
token,
|
|
33
|
+
data: { action: '__probe__' },
|
|
34
|
+
});
|
|
35
|
+
return response.status() !== 404;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Seed a connected, network-free `__test_seed__` channel owned by the caller.
|
|
40
|
+
* Returns the new channel id. Tear down with {@link deleteChannelIfExists}.
|
|
41
|
+
*/
|
|
42
|
+
export async function seedConnectedChannel(
|
|
43
|
+
request: APIRequestContext,
|
|
44
|
+
token: string,
|
|
45
|
+
input: { displayName?: string; externalIdentifier?: string } = {},
|
|
46
|
+
): Promise<string> {
|
|
47
|
+
const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
|
|
48
|
+
token,
|
|
49
|
+
data: { action: 'connect-channel', ...input },
|
|
50
|
+
});
|
|
51
|
+
expect(
|
|
52
|
+
response.status(),
|
|
53
|
+
'POST /api/communication_channels/test-seed (connect-channel) should return 201',
|
|
54
|
+
).toBe(201);
|
|
55
|
+
const body = await readJsonSafe<{ channelId?: string }>(response);
|
|
56
|
+
return expectId(body?.channelId, 'connect-channel response should include channelId');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Seed an inbound `MessageChannelLink` for `channelId` and emit
|
|
61
|
+
* `communication_channels.message.received` through the real event bus. The
|
|
62
|
+
* persistent customers link-channel-message-received subscriber is enqueued to
|
|
63
|
+
* the `events` queue — drain it with `drainIntegrationQueue('events')`.
|
|
64
|
+
*
|
|
65
|
+
* Returns the created link + message ids (the message id is the platform
|
|
66
|
+
* `messages.message` id, usable as `messageThreadId` to thread a follow-up).
|
|
67
|
+
*/
|
|
68
|
+
export async function seedInboundMessage(
|
|
69
|
+
request: APIRequestContext,
|
|
70
|
+
token: string,
|
|
71
|
+
input: {
|
|
72
|
+
channelId: string;
|
|
73
|
+
from?: SeedAddressField;
|
|
74
|
+
to?: SeedAddressField;
|
|
75
|
+
cc?: SeedAddressField;
|
|
76
|
+
subject?: string;
|
|
77
|
+
bodyText?: string;
|
|
78
|
+
messageId?: string;
|
|
79
|
+
inReplyTo?: string;
|
|
80
|
+
references?: string[];
|
|
81
|
+
messageThreadId?: string;
|
|
82
|
+
providerKey?: string;
|
|
83
|
+
},
|
|
84
|
+
): Promise<{ channelLinkId: string; messageId: string; conversationId: string }> {
|
|
85
|
+
const response = await apiRequest(request, 'POST', TEST_SEED_PATH, {
|
|
86
|
+
token,
|
|
87
|
+
data: { action: 'emit-inbound', ...input },
|
|
88
|
+
});
|
|
89
|
+
expect(
|
|
90
|
+
response.status(),
|
|
91
|
+
'POST /api/communication_channels/test-seed (emit-inbound) should return 201',
|
|
92
|
+
).toBe(201);
|
|
93
|
+
const body = await readJsonSafe<{
|
|
94
|
+
channelLinkId?: string;
|
|
95
|
+
messageId?: string;
|
|
96
|
+
conversationId?: string;
|
|
97
|
+
}>(response);
|
|
98
|
+
return {
|
|
99
|
+
channelLinkId: expectId(body?.channelLinkId, 'emit-inbound response should include channelLinkId'),
|
|
100
|
+
messageId: expectId(body?.messageId, 'emit-inbound response should include messageId'),
|
|
101
|
+
conversationId: expectId(
|
|
102
|
+
body?.conversationId,
|
|
103
|
+
'emit-inbound response should include conversationId',
|
|
104
|
+
),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Best-effort delete of a seeded channel via the owner-scoped DELETE route.
|
|
110
|
+
* Safe to call with a null id in `finally`.
|
|
111
|
+
*/
|
|
112
|
+
export async function deleteChannelIfExists(
|
|
113
|
+
request: APIRequestContext,
|
|
114
|
+
token: string | null,
|
|
115
|
+
channelId: string | null,
|
|
116
|
+
): Promise<void> {
|
|
117
|
+
if (!token || !channelId) return;
|
|
118
|
+
await apiRequest(
|
|
119
|
+
request,
|
|
120
|
+
'DELETE',
|
|
121
|
+
`/api/communication_channels/channels/${encodeURIComponent(channelId)}`,
|
|
122
|
+
{ token },
|
|
123
|
+
).catch(() => undefined);
|
|
124
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const features = [
|
|
2
|
+
{ id: 'communication_channels.view', title: 'View communication channels', module: 'communication_channels' },
|
|
3
|
+
{ id: 'communication_channels.manage', title: 'Manage communication channels', module: 'communication_channels' },
|
|
4
|
+
{ id: 'communication_channels.react', title: 'React to channel messages', module: 'communication_channels' },
|
|
5
|
+
{ id: 'communication_channels.assign', title: 'Assign channel conversations', module: 'communication_channels' },
|
|
6
|
+
/**
|
|
7
|
+
* Per-user channel ownership (added by the email integration spec).
|
|
8
|
+
*
|
|
9
|
+
* Gates the "Connect my mailbox" flow on the per-user profile page. Split from
|
|
10
|
+
* `communication_channels.manage` so policy can disable new linking while
|
|
11
|
+
* preserving existing accounts (e.g. during a security incident response).
|
|
12
|
+
* Default-granted to all roles in `setup.ts`.
|
|
13
|
+
*/
|
|
14
|
+
{ id: 'communication_channels.connect_user_channel', title: 'Connect own communication channel', module: 'communication_channels' },
|
|
15
|
+
/**
|
|
16
|
+
* Reserved for a future v2 team-oversight capability. NOT consulted in v1:
|
|
17
|
+
* personal mailboxes (`CommunicationChannel.user_id` set) follow the strict
|
|
18
|
+
* owner-only privacy model, so this feature grants NO cross-user channel view.
|
|
19
|
+
* The admin channels list (`GET /api/communication_channels/channels`) returns
|
|
20
|
+
* `user_id IS NULL` rows only; personal mailboxes surface exclusively on the
|
|
21
|
+
* owner's profile page and are never exposed to admins/superadmins in v1.
|
|
22
|
+
* Granted to `superadmin` + `admin` only so the inert grant is in place ahead
|
|
23
|
+
* of the audited v2 oversight feature that will re-activate it.
|
|
24
|
+
*/
|
|
25
|
+
{ id: 'communication_channels.admin', title: 'Administer all communication channels (tenant-wide)', module: 'communication_channels' },
|
|
26
|
+
/**
|
|
27
|
+
* Trigger the "Import history" job for a channel — fetch older messages
|
|
28
|
+
* the channel never saw at bootstrap (Spec B § Phase B6). Separate from
|
|
29
|
+
* `manage` so policy can gate bulk historical imports during quiet hours
|
|
30
|
+
* or cost-controlled rollouts while leaving normal channel CRUD open.
|
|
31
|
+
*/
|
|
32
|
+
{ id: 'communication_channels.channel.import_history', title: 'Import channel history', module: 'communication_channels' },
|
|
33
|
+
/**
|
|
34
|
+
* Manage provider push delivery (Spec C — Gmail Pub/Sub push
|
|
35
|
+
* subscriptions). Gates the "Re-register push" operator button and any
|
|
36
|
+
* future push-status manipulation. Granted to admin + superadmin only —
|
|
37
|
+
* regular users don't need to think about whether mail arrives via
|
|
38
|
+
* push or polling, the system handles it.
|
|
39
|
+
*/
|
|
40
|
+
{ id: 'communication_channels.channel.push.manage', title: 'Manage push delivery', module: 'communication_channels' },
|
|
41
|
+
] as const
|
|
42
|
+
|
|
43
|
+
export default features
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'
|
|
4
|
+
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
5
|
+
import type { CommandBus } from '@open-mercato/shared/lib/commands'
|
|
6
|
+
import type { EntityManager } from '@mikro-orm/postgresql'
|
|
7
|
+
import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
8
|
+
import { CommunicationChannel } from '../../../../data/entities'
|
|
9
|
+
import { ChannelAccessDeniedError, assertCanManageChannel } from '../../../../lib/access-control'
|
|
10
|
+
import {
|
|
11
|
+
COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,
|
|
12
|
+
type DeleteChannelInput,
|
|
13
|
+
type DeleteChannelResult,
|
|
14
|
+
} from '../../../../commands/delete-channel'
|
|
15
|
+
import { validateRouteMutationGuard } from '../../../../lib/route-mutation-guard'
|
|
16
|
+
|
|
17
|
+
type RbacServiceLike = {
|
|
18
|
+
loadAcl: (
|
|
19
|
+
userId: string,
|
|
20
|
+
scope: { tenantId: string | null; organizationId: string | null },
|
|
21
|
+
) => Promise<{ isSuperAdmin: boolean; features: string[]; organizations: string[] | null }>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Soft-delete (remove) a communication channel.
|
|
26
|
+
*
|
|
27
|
+
* Per-user access guard: only the channel owner — or an admin holding
|
|
28
|
+
* `communication_channels.admin` — may delete a channel. Non-owners get a 404
|
|
29
|
+
* (existence masking), consistent with the other channel routes. The declarative
|
|
30
|
+
* `communication_channels.manage` feature gates the route itself; deletion is a
|
|
31
|
+
* management operation alongside disconnect/set-primary.
|
|
32
|
+
*/
|
|
33
|
+
export const metadata = {
|
|
34
|
+
path: '/communication_channels/channels/[id]',
|
|
35
|
+
DELETE: {
|
|
36
|
+
// Owner self-service: a user may disconnect their OWN personal mailbox
|
|
37
|
+
// (gated by `connect_user_channel`). Deleting a shared/tenant-wide channel
|
|
38
|
+
// still requires `manage` — enforced per channel type by
|
|
39
|
+
// `assertCanManageChannel` in the handler.
|
|
40
|
+
requireAuth: true,
|
|
41
|
+
requireFeatures: ['communication_channels.connect_user_channel'],
|
|
42
|
+
},
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type RouteContext = {
|
|
46
|
+
params: Promise<{ id: string }> | { id: string }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function DELETE(req: Request, context: RouteContext): Promise<Response> {
|
|
50
|
+
const { id } = await context.params
|
|
51
|
+
if (!z.string().uuid().safeParse(id).success) {
|
|
52
|
+
return NextResponse.json({ error: 'Invalid channel id' }, { status: 400 })
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const auth = await getAuthFromRequest(req)
|
|
56
|
+
if (!auth?.sub || !auth?.tenantId) {
|
|
57
|
+
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const container = await createRequestContainer()
|
|
61
|
+
const em = (container.resolve('em') as EntityManager).fork()
|
|
62
|
+
const organizationId = (auth as { orgId?: string | null }).orgId ?? null
|
|
63
|
+
const dscope = { tenantId: auth.tenantId as string, organizationId }
|
|
64
|
+
|
|
65
|
+
const channel = await findOneWithDecryption(
|
|
66
|
+
em,
|
|
67
|
+
CommunicationChannel,
|
|
68
|
+
{
|
|
69
|
+
id,
|
|
70
|
+
tenantId: auth.tenantId as string,
|
|
71
|
+
organizationId,
|
|
72
|
+
deletedAt: null,
|
|
73
|
+
},
|
|
74
|
+
undefined,
|
|
75
|
+
dscope,
|
|
76
|
+
)
|
|
77
|
+
if (!channel) {
|
|
78
|
+
return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
let userFeatures: string[] = []
|
|
82
|
+
try {
|
|
83
|
+
const rbac = container.resolve('rbacService') as RbacServiceLike
|
|
84
|
+
const acl = await rbac.loadAcl(auth.sub as string, {
|
|
85
|
+
tenantId: auth.tenantId as string,
|
|
86
|
+
organizationId,
|
|
87
|
+
})
|
|
88
|
+
userFeatures = acl?.isSuperAdmin ? ['*'] : Array.isArray(acl?.features) ? acl.features : []
|
|
89
|
+
} catch {
|
|
90
|
+
userFeatures = []
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
assertCanManageChannel(
|
|
94
|
+
{ userId: (channel as { userId?: string | null }).userId },
|
|
95
|
+
auth.sub as string,
|
|
96
|
+
userFeatures,
|
|
97
|
+
'communication_channels.manage',
|
|
98
|
+
)
|
|
99
|
+
} catch (err) {
|
|
100
|
+
if (err instanceof ChannelAccessDeniedError) {
|
|
101
|
+
return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
|
|
102
|
+
}
|
|
103
|
+
throw err
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const guard = await validateRouteMutationGuard({
|
|
107
|
+
container,
|
|
108
|
+
req,
|
|
109
|
+
auth,
|
|
110
|
+
input: {
|
|
111
|
+
resourceKind: 'communication_channels.channel',
|
|
112
|
+
resourceId: id,
|
|
113
|
+
operation: 'delete',
|
|
114
|
+
},
|
|
115
|
+
})
|
|
116
|
+
if ('response' in guard) return guard.response
|
|
117
|
+
|
|
118
|
+
const commandBus = container.resolve('commandBus') as CommandBus
|
|
119
|
+
const input: DeleteChannelInput = {
|
|
120
|
+
channelId: id,
|
|
121
|
+
userId: auth.sub as string,
|
|
122
|
+
scope: { tenantId: auth.tenantId as string, organizationId },
|
|
123
|
+
}
|
|
124
|
+
const { result } = await commandBus.execute<DeleteChannelInput, DeleteChannelResult>(
|
|
125
|
+
COMMUNICATION_CHANNELS_DELETE_CHANNEL_COMMAND_ID,
|
|
126
|
+
{
|
|
127
|
+
input,
|
|
128
|
+
ctx: {
|
|
129
|
+
container,
|
|
130
|
+
auth: auth as never,
|
|
131
|
+
organizationScope: null,
|
|
132
|
+
selectedOrganizationId: organizationId,
|
|
133
|
+
organizationIds: organizationId ? [organizationId] : null,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
// 'noop' (channel vanished between the load and the command) and 'not_owner'
|
|
139
|
+
// both map to 404 to avoid leaking ownership/existence.
|
|
140
|
+
if (result.status !== 'deleted') {
|
|
141
|
+
return NextResponse.json({ error: 'Channel not found' }, { status: 404 })
|
|
142
|
+
}
|
|
143
|
+
await guard.afterSuccess()
|
|
144
|
+
return new NextResponse(null, { status: 204 })
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const openApi = {
|
|
148
|
+
tags: ['CommunicationChannels'],
|
|
149
|
+
methods: {
|
|
150
|
+
DELETE: {
|
|
151
|
+
summary: 'Delete (soft-delete) a communication channel',
|
|
152
|
+
tags: ['CommunicationChannels'],
|
|
153
|
+
responses: [
|
|
154
|
+
{ status: 204, description: 'Channel deleted' },
|
|
155
|
+
{ status: 400, description: 'Invalid channel id' },
|
|
156
|
+
{ status: 401, description: 'Unauthorized' },
|
|
157
|
+
{ status: 404, description: 'Channel not found or not owned by current user' },
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export default DELETE
|