@open-mercato/core 0.7.0 → 0.7.1-develop.7102.1.b41f7e3e51
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 +1 -1
- package/dist/helpers/integration/api.js +13 -1
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +19 -0
- package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
- package/dist/modules/api_keys/api/keys/route.js +1 -1
- package/dist/modules/api_keys/api/keys/route.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +3 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/api_keys/di.js +9 -0
- package/dist/modules/api_keys/di.js.map +7 -0
- package/dist/modules/api_keys/services/principalService.js +31 -0
- package/dist/modules/api_keys/services/principalService.js.map +7 -0
- package/dist/modules/attachments/api/route.js +2 -2
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +2 -0
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +11 -1
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/attachment-service.js +313 -0
- package/dist/modules/attachments/lib/attachment-service.js.map +7 -0
- package/dist/modules/attachments/lib/scoped-upload-service.js +15 -2
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +6 -2
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +6 -0
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +19 -11
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +57 -12
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +30 -5
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +8 -2
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +4 -1
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/validate.js +55 -0
- package/dist/modules/auth/api/reset/validate.js.map +7 -0
- package/dist/modules/auth/api/roles/acl/route.js +28 -33
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/session/refresh.js +25 -1
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +96 -51
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +13 -5
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -1
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +5 -1
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +2 -1
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/commands/acl.js +254 -0
- package/dist/modules/auth/commands/acl.js.map +7 -0
- package/dist/modules/auth/components/AclEditor.js +39 -30
- package/dist/modules/auth/components/AclEditor.js.map +2 -2
- package/dist/modules/auth/data/entities.js.map +2 -2
- package/dist/modules/auth/data/validators.js +5 -1
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +35 -9
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +46 -0
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/grantChecks.js.map +2 -2
- package/dist/modules/auth/lib/userIdFilter.js +16 -0
- package/dist/modules/auth/lib/userIdFilter.js.map +7 -0
- package/dist/modules/auth/services/authService.js +16 -2
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/principalService.js +200 -0
- package/dist/modules/auth/services/principalService.js.map +7 -0
- package/dist/modules/auth/services/rbacService.js +67 -24
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/auth/services/roleOrganizationScope.js +41 -0
- package/dist/modules/auth/services/roleOrganizationScope.js.map +7 -0
- package/dist/modules/business_rules/backend/logs/page.js +3 -1
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +3 -1
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +3 -1
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/lib/expression-evaluator.js +9 -9
- package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-evaluator.js +10 -9
- package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
- package/dist/modules/catalog/ai-agents.js +1 -1
- package/dist/modules/catalog/ai-agents.js.map +1 -1
- package/dist/modules/catalog/ai-tools/merchandising-pack.js +2 -2
- package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js +5 -2
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -0
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +7 -1
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +2 -0
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js.map +2 -2
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +9 -1
- package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
- package/dist/modules/communication_channels/api/post/test-seed/route.js +95 -10
- package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +3 -0
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +14 -1
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +7 -1
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +4 -1
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/outbound-recipient.js +33 -0
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +7 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +51 -0
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +7 -0
- package/dist/modules/communication_channels/lib/test-seed.js +41 -2
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +9 -0
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +3 -1
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +3 -1
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/currencies/services/rateFetchingService.js +6 -1
- package/dist/modules/currencies/services/rateFetchingService.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +9 -0
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +3 -1
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +2 -2
- package/dist/modules/customer_accounts/services/domainMappingService.js +10 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +4 -1
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +13 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +52 -6
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +4 -1
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +48 -6
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +20 -64
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +17 -94
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +8 -5
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/people/route.js +1 -1
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/route.js +8 -25
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +3 -22
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +11 -4
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +2 -1
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +38 -1
- package/dist/modules/customers/api/deals/route.js.map +2 -2
- package/dist/modules/customers/api/entity-roles-factory.js +4 -4
- package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
- package/dist/modules/customers/api/interactions/route.js +3 -1
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +27 -4
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +4 -3
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/context.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +1 -1
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/route.js +11 -10
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +51 -9
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +30 -5
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -2
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +5 -2
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +4 -13
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js +85 -14
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +18 -0
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +7 -0
- package/dist/modules/customers/backend/customers/people/page.js +4 -2
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +9 -3
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +21 -34
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js.map +1 -1
- package/dist/modules/customers/commands/personCompanyLinks.js +131 -2
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +1 -0
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +7 -6
- package/dist/modules/customers/components/DealsKpiStrip.js.map +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js +2 -2
- package/dist/modules/customers/components/calendar/AgendaList.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarScreen.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarScreen.js.map +2 -2
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js +1 -1
- package/dist/modules/customers/components/calendar/CalendarSettingsModal.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventBlock.js +1 -1
- package/dist/modules/customers/components/calendar/EventBlock.js.map +2 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js +3 -2
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +40 -5
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +2 -1
- package/dist/modules/customers/components/calendar/editor/hooks.js.map +2 -2
- package/dist/modules/customers/components/calendar/types.js +1 -1
- package/dist/modules/customers/components/calendar/types.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +5 -4
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -1
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -7
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +6 -5
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +35 -11
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +3 -1
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +19 -13
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +4 -4
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +2 -2
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +3 -3
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
- package/dist/modules/customers/components/detail/utils.js +5 -5
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/data/entities.js.map +1 -1
- package/dist/modules/customers/data/validators.js +32 -3
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +5 -0
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +8 -2
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +3 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +8 -3
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/calendar/participantIdentity.js +9 -0
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +7 -0
- package/dist/modules/customers/lib/closureStage.js +45 -0
- package/dist/modules/customers/lib/closureStage.js.map +7 -0
- package/dist/modules/customers/lib/dealStatus.js +30 -0
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/detailReadAccess.js +12 -0
- package/dist/modules/customers/lib/detailReadAccess.js.map +7 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js +1 -0
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +100 -2
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +12 -0
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +6 -1
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +3 -1
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/abandoned-run.js +19 -0
- package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
- package/dist/modules/data_sync/lib/sync-engine.js +72 -6
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +5 -1
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +5 -1
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +9 -1
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +5 -32
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +14 -1
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +99 -12
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/deviceSerialization.js +46 -0
- package/dist/modules/devices/api/deviceSerialization.js.map +7 -0
- package/dist/modules/devices/api/openapi.js +3 -1
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +9 -1
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +10 -26
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +17 -1
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +28 -34
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +34 -0
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +7 -0
- package/dist/modules/devices/backend/devices/userOptions.js +52 -0
- package/dist/modules/devices/backend/devices/userOptions.js.map +7 -0
- package/dist/modules/devices/setup.js +6 -2
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +9 -0
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/services/organizationHierarchyService.js +29 -0
- package/dist/modules/directory/services/organizationHierarchyService.js.map +7 -0
- package/dist/modules/directory/services/organizationScopeService.js +56 -0
- package/dist/modules/directory/services/organizationScopeService.js.map +7 -0
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +4 -2
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +3 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +5 -1
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +3 -0
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +0 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +4 -1
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +1 -0
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -0
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +0 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +3 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +1 -12
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +6 -1
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +38 -29
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +36 -9
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +55 -0
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +7 -0
- package/dist/modules/integrations/data/validators.js +11 -3
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +6 -2
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +29 -1
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +17 -2
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +17 -2
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +7 -14
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +15 -0
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +11 -1
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +3 -1
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +2 -1
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +14 -2
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +18 -4
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/messages/lib/channel-sender-identity.js +26 -0
- package/dist/modules/messages/lib/channel-sender-identity.js.map +7 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js +41 -0
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +7 -0
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +4 -6
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -1
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +7 -0
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +3 -0
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +3 -1
- package/dist/modules/push_notifications/backend/push_notifications/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js +1 -1
- package/dist/modules/push_notifications/backend/push_notifications/send/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +150 -51
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-entity-policy.js +14 -0
- package/dist/modules/query_index/lib/search-entity-policy.js.map +7 -0
- package/dist/modules/query_index/lib/search-tokens.js +79 -3
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +3 -1
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +3 -1
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +3 -0
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +10 -8
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +79 -1
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +7 -5
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +3 -0
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +51 -22
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +83 -18
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +23 -9
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +8 -6
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +68 -14
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +6 -5
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +5 -4
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +8 -6
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +54 -0
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +7 -0
- package/dist/modules/sales/components/documents/lineItemUtils.js +2 -2
- package/dist/modules/sales/components/documents/lineItemUtils.js.map +2 -2
- package/dist/modules/sales/data/entities.js +8 -2
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +1 -0
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +33 -0
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +7 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +32 -0
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +7 -0
- package/dist/modules/sales/setup.js +2 -0
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +10 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +4 -7
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +3 -0
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +3 -0
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +3 -0
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +29 -18
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +3 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +1 -0
- package/dist/modules/sync_excel/lib/adapters/customers.js.map +2 -2
- package/dist/modules/warranty_claims/api/assignees/route.js +3 -3
- package/dist/modules/warranty_claims/api/assignees/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js +2 -2
- package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +2 -2
- package/dist/modules/warranty_claims/api/portal/claims/route.js +12 -9
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +3 -0
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +3 -0
- package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +2 -2
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +3 -0
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouseSearch.js +21 -0
- package/dist/modules/wms/api/warehouseSearch.js.map +7 -0
- package/dist/modules/wms/api/warehouses/route.js +13 -9
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +15 -2
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +121 -9
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +3 -0
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +9 -1
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +158 -0
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +7 -0
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +76 -111
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +1 -0
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +1 -0
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +27 -20
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +66 -0
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +7 -0
- package/dist/modules/workflows/backend/definitions/page.js +3 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +3 -1
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +3 -1
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +3 -1
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +4 -0
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +9 -10
- package/src/helpers/integration/api.ts +33 -1
- package/src/helpers/integration/communicationChannelsFixtures.ts +69 -1
- package/src/modules/api_keys/api/keys/route.ts +3 -1
- package/src/modules/api_keys/backend/api-keys/page.tsx +4 -1
- package/src/modules/api_keys/di.ts +7 -0
- package/src/modules/api_keys/services/principalService.ts +33 -0
- package/src/modules/attachments/AGENTS.md +15 -0
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +3 -0
- package/src/modules/attachments/di.ts +16 -0
- package/src/modules/attachments/i18n/de.json +5 -0
- package/src/modules/attachments/i18n/en.json +5 -0
- package/src/modules/attachments/i18n/es.json +5 -0
- package/src/modules/attachments/i18n/ko.json +5 -0
- package/src/modules/attachments/i18n/pl.json +5 -0
- package/src/modules/attachments/index.ts +10 -0
- package/src/modules/attachments/lib/attachment-service.ts +468 -0
- package/src/modules/attachments/lib/scoped-upload-service.ts +46 -0
- package/src/modules/attachments/lib/upload-limits.ts +6 -2
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +8 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +42 -32
- package/src/modules/audit_logs/services/actionLogService.ts +74 -11
- package/src/modules/auth/acl.ts +30 -6
- package/src/modules/auth/api/feature-check.ts +10 -3
- package/src/modules/auth/api/login.ts +9 -1
- package/src/modules/auth/api/reset/validate.ts +57 -0
- package/src/modules/auth/api/roles/acl/route.ts +42 -39
- package/src/modules/auth/api/session/refresh.ts +32 -1
- package/src/modules/auth/api/users/acl/route.ts +177 -53
- package/src/modules/auth/api/users/route.ts +18 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/roles/page.tsx +4 -2
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +5 -2
- package/src/modules/auth/backend/users/page.tsx +3 -2
- package/src/modules/auth/commands/acl.ts +495 -0
- package/src/modules/auth/components/AclEditor.tsx +63 -33
- package/src/modules/auth/data/entities.ts +4 -1
- package/src/modules/auth/data/validators.ts +5 -0
- package/src/modules/auth/di.ts +46 -16
- package/src/modules/auth/frontend/reset/[token]/page.tsx +74 -0
- package/src/modules/auth/i18n/de.json +389 -0
- package/src/modules/auth/i18n/en.json +389 -0
- package/src/modules/auth/i18n/es.json +389 -0
- package/src/modules/auth/i18n/ko.json +389 -0
- package/src/modules/auth/i18n/pl.json +391 -2
- package/src/modules/auth/lib/grantChecks.ts +6 -0
- package/src/modules/auth/lib/userIdFilter.ts +31 -0
- package/src/modules/auth/services/authService.ts +18 -2
- package/src/modules/auth/services/principalService.ts +266 -0
- package/src/modules/auth/services/rbacService.ts +110 -24
- package/src/modules/auth/services/roleOrganizationScope.ts +70 -0
- package/src/modules/business_rules/backend/logs/page.tsx +4 -1
- package/src/modules/business_rules/backend/rules/page.tsx +4 -1
- package/src/modules/business_rules/backend/sets/page.tsx +4 -1
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +10 -9
- package/src/modules/catalog/ai-agents.ts +1 -1
- package/src/modules/catalog/ai-tools/merchandising-pack.ts +2 -2
- package/src/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.tsx +12 -5
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +3 -0
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +7 -0
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/ko.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +4 -0
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +17 -1
- package/src/modules/communication_channels/api/post/test-seed/route.ts +155 -16
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +4 -0
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +38 -1
- package/src/modules/communication_channels/di.ts +7 -0
- package/src/modules/communication_channels/lib/adapter.ts +14 -0
- package/src/modules/communication_channels/lib/email-capabilities.ts +4 -0
- package/src/modules/communication_channels/lib/outbound-recipient.ts +71 -0
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +99 -0
- package/src/modules/communication_channels/lib/test-seed.ts +64 -4
- package/src/modules/configs/i18n/de.json +2 -0
- package/src/modules/configs/i18n/en.json +2 -0
- package/src/modules/configs/i18n/es.json +2 -0
- package/src/modules/configs/i18n/ko.json +2 -0
- package/src/modules/configs/i18n/pl.json +2 -0
- package/src/modules/configs/lib/system-status.ts +9 -0
- package/src/modules/currencies/AGENTS.md +3 -0
- package/src/modules/currencies/backend/currencies/page.tsx +4 -1
- package/src/modules/currencies/backend/exchange-rates/page.tsx +4 -1
- package/src/modules/currencies/services/README.md +45 -0
- package/src/modules/currencies/services/rateFetchingService.ts +6 -1
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +7 -0
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +4 -1
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +4 -1
- package/src/modules/customer_accounts/services/domainMappingService.ts +10 -0
- package/src/modules/customers/ai-tools/companies-pack.ts +4 -1
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +17 -2
- package/src/modules/customers/ai-tools/deals-pack.ts +66 -1
- package/src/modules/customers/ai-tools/people-pack.ts +4 -1
- package/src/modules/customers/api/activities/route.ts +45 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +24 -73
- package/src/modules/customers/api/companies/[id]/route.ts +24 -107
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +16 -8
- package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
- package/src/modules/customers/api/deals/[id]/route.ts +17 -28
- package/src/modules/customers/api/deals/[id]/stats/route.ts +10 -25
- package/src/modules/customers/api/deals/aggregate/route.ts +14 -4
- package/src/modules/customers/api/deals/map/route.ts +1 -0
- package/src/modules/customers/api/deals/route.ts +50 -1
- package/src/modules/customers/api/entity-roles-factory.ts +8 -4
- package/src/modules/customers/api/interactions/route.ts +8 -2
- package/src/modules/customers/api/interactions/tasks/route.ts +24 -1
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +12 -4
- package/src/modules/customers/api/people/[id]/companies/context.ts +4 -1
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
- package/src/modules/customers/api/people/[id]/route.ts +16 -11
- package/src/modules/customers/api/people/check-phone/route.ts +75 -10
- package/src/modules/customers/api/todos/route.ts +27 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +5 -2
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +7 -2
- package/src/modules/customers/backend/customers/deals/page.tsx +8 -2
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +5 -14
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +109 -27
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +21 -0
- package/src/modules/customers/backend/customers/people/page.tsx +5 -2
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +12 -4
- package/src/modules/customers/commands/deals.ts +34 -59
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +224 -8
- package/src/modules/customers/components/CustomerTodosTable.tsx +2 -0
- package/src/modules/customers/components/DealsKpiStrip.tsx +7 -7
- package/src/modules/customers/components/calendar/AgendaList.tsx +3 -3
- package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarScreen.tsx +1 -1
- package/src/modules/customers/components/calendar/CalendarSettingsModal.tsx +1 -1
- package/src/modules/customers/components/calendar/EventBlock.tsx +2 -2
- package/src/modules/customers/components/calendar/EventPeekPopover.tsx +4 -2
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +61 -5
- package/src/modules/customers/components/calendar/editor/hooks.ts +7 -1
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +5 -4
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +8 -1
- package/src/modules/customers/components/detail/DealForm.tsx +22 -2
- package/src/modules/customers/components/detail/DealsSection.tsx +11 -5
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +58 -12
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +8 -1
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +23 -14
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +5 -5
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +5 -5
- package/src/modules/customers/components/detail/types.ts +1 -1
- package/src/modules/customers/components/detail/utils.ts +15 -5
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +50 -9
- package/src/modules/customers/events.ts +5 -0
- package/src/modules/customers/i18n/de.json +9 -1
- package/src/modules/customers/i18n/en.json +9 -1
- package/src/modules/customers/i18n/es.json +9 -1
- package/src/modules/customers/i18n/ko.json +9 -1
- package/src/modules/customers/i18n/pl.json +9 -1
- package/src/modules/customers/lib/calendar/conflicts.ts +10 -2
- package/src/modules/customers/lib/calendar/editorPayload.ts +4 -3
- package/src/modules/customers/lib/calendar/mapItem.ts +8 -3
- package/src/modules/customers/lib/calendar/participantIdentity.ts +17 -0
- package/src/modules/customers/lib/closureStage.ts +76 -0
- package/src/modules/customers/lib/dealStatus.ts +42 -0
- package/src/modules/customers/lib/detailReadAccess.ts +35 -0
- package/src/modules/customers/lib/findPeopleByAddresses.ts +8 -6
- package/src/modules/customers/lib/personCompanies.ts +136 -1
- package/src/modules/customers/lib/todoCompatibility.ts +19 -1
- package/src/modules/dashboards/i18n/es.json +4 -4
- package/src/modules/dashboards/i18n/pl.json +7 -7
- package/src/modules/dashboards/lib/widgetScope.ts +6 -0
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +4 -1
- package/src/modules/data_sync/lib/abandoned-run.ts +56 -0
- package/src/modules/data_sync/lib/adapter.ts +36 -0
- package/src/modules/data_sync/lib/sync-engine.ts +113 -5
- package/src/modules/data_sync/workers/sync-export.ts +4 -0
- package/src/modules/data_sync/workers/sync-import.ts +4 -0
- package/src/modules/devices/AGENTS.md +20 -1
- package/src/modules/devices/acl.ts +9 -1
- package/src/modules/devices/api/admin/devices/[id]/route.ts +5 -34
- package/src/modules/devices/api/admin/devices/route.ts +14 -1
- package/src/modules/devices/api/deviceList.ts +135 -11
- package/src/modules/devices/api/deviceSerialization.ts +50 -0
- package/src/modules/devices/api/openapi.ts +9 -1
- package/src/modules/devices/api/route.ts +9 -1
- package/src/modules/devices/backend/devices/[id]/page.tsx +18 -32
- package/src/modules/devices/backend/devices/create/page.tsx +17 -1
- package/src/modules/devices/backend/devices/page.tsx +44 -45
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +45 -0
- package/src/modules/devices/backend/devices/userOptions.ts +99 -0
- package/src/modules/devices/i18n/de.json +3 -2
- package/src/modules/devices/i18n/en.json +3 -2
- package/src/modules/devices/i18n/es.json +3 -2
- package/src/modules/devices/i18n/ko.json +3 -2
- package/src/modules/devices/i18n/pl.json +3 -2
- package/src/modules/devices/setup.ts +6 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +3 -1
- package/src/modules/directory/backend/directory/tenants/page.tsx +3 -1
- package/src/modules/directory/di.ts +14 -2
- package/src/modules/directory/services/organizationHierarchyService.ts +34 -0
- package/src/modules/directory/services/organizationScopeService.ts +85 -0
- package/src/modules/directory/utils/organizationScope.ts +4 -15
- package/src/modules/entities/api/records.ts +2 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +4 -1
- package/src/modules/eudr/api/plots/route.ts +4 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/plots/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +4 -0
- package/src/modules/eudr/backend/eudr/statements/page.tsx +4 -0
- package/src/modules/eudr/commands/statements.ts +0 -3
- package/src/modules/eudr/data/validators.ts +16 -1
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +2 -1
- package/src/modules/feature_toggles/components/OverridesTable.tsx +2 -1
- package/src/modules/feature_toggles/defaults.json +0 -8
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +4 -0
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +4 -0
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +1 -17
- package/src/modules/integrations/api/[id]/credentials/route.ts +6 -4
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +61 -31
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +44 -9
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +84 -0
- package/src/modules/integrations/data/validators.ts +12 -2
- package/src/modules/integrations/i18n/de.json +1 -0
- package/src/modules/integrations/i18n/en.json +1 -0
- package/src/modules/integrations/i18n/es.json +1 -0
- package/src/modules/integrations/i18n/ko.json +1 -0
- package/src/modules/integrations/i18n/pl.json +1 -0
- package/src/modules/integrations/lib/credentials-masking.ts +10 -6
- package/src/modules/messages/api/[id]/route.ts +55 -1
- package/src/modules/messages/api/openapi.ts +20 -0
- package/src/modules/messages/api/route.ts +31 -2
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +9 -16
- package/src/modules/messages/components/inboxFilters.ts +36 -0
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +14 -1
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +3 -1
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +2 -1
- package/src/modules/messages/components/message-detail/types.ts +3 -0
- package/src/modules/messages/components/messageListLabels.ts +52 -3
- package/src/modules/messages/data/validators.ts +43 -4
- package/src/modules/messages/lib/channel-sender-identity.ts +55 -0
- package/src/modules/messages/lib/composeSourceChannelType.ts +95 -0
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -6
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +4 -1
- package/src/modules/payment_gateways/lib/webhook-processor.ts +11 -0
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +4 -0
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +4 -1
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +249 -61
- package/src/modules/query_index/lib/search-entity-policy.ts +46 -0
- package/src/modules/query_index/lib/search-tokens.ts +135 -3
- package/src/modules/resources/backend/resources/resource-types/page.tsx +4 -1
- package/src/modules/resources/backend/resources/resources/page.tsx +4 -1
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +4 -0
- package/src/modules/sales/backend/sales/channels/page.tsx +4 -0
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +14 -8
- package/src/modules/sales/commands/documents.ts +93 -0
- package/src/modules/sales/components/PriceWithCurrency.tsx +17 -5
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +4 -0
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/ItemsSection.tsx +56 -18
- package/src/modules/sales/components/documents/LineItemDialog.tsx +137 -20
- package/src/modules/sales/components/documents/PaymentsSection.tsx +20 -9
- package/src/modules/sales/components/documents/ReturnsSection.tsx +6 -5
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +106 -14
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +6 -5
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +5 -4
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +6 -5
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +74 -0
- package/src/modules/sales/components/documents/lineItemUtils.ts +7 -2
- package/src/modules/sales/data/entities.ts +6 -0
- package/src/modules/sales/extension-points.ts +1 -0
- package/src/modules/sales/i18n/de.json +8 -0
- package/src/modules/sales/i18n/en.json +8 -0
- package/src/modules/sales/i18n/es.json +8 -0
- package/src/modules/sales/i18n/ko.json +8 -0
- package/src/modules/sales/i18n/pl.json +8 -0
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +42 -0
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +60 -0
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +87 -0
- package/src/modules/sales/setup.ts +2 -0
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +9 -1
- package/src/modules/sales/widgets/injection-table.ts +4 -7
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +4 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +6 -0
- package/src/modules/staff/backend/staff/team-roles/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +4 -0
- package/src/modules/staff/backend/staff/teams/page.tsx +4 -0
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +4 -0
- package/src/modules/sync_excel/lib/adapters/customers.ts +5 -0
- package/src/modules/warranty_claims/api/assignees/route.ts +3 -3
- package/src/modules/warranty_claims/api/portal/attachments/route.ts +2 -2
- package/src/modules/warranty_claims/api/portal/claims/route.ts +12 -9
- package/src/modules/warranty_claims/backend/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +4 -0
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +4 -0
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +4 -0
- package/src/modules/wms/api/warehouseSearch.ts +23 -0
- package/src/modules/wms/api/warehouses/route.ts +13 -9
- package/src/modules/wms/api/zones/route.ts +16 -0
- package/src/modules/wms/commands/configuration.ts +159 -10
- package/src/modules/wms/commands/inventory-actions.ts +3 -0
- package/src/modules/wms/commands/shared.ts +17 -0
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +216 -0
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +95 -141
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +2 -0
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -0
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +36 -20
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +72 -0
- package/src/modules/wms/i18n/de.json +2 -0
- package/src/modules/wms/i18n/en.json +2 -0
- package/src/modules/wms/i18n/es.json +2 -0
- package/src/modules/wms/i18n/ko.json +2 -0
- package/src/modules/wms/i18n/pl.json +2 -0
- package/src/modules/workflows/backend/definitions/page.tsx +4 -1
- package/src/modules/workflows/backend/events/page.tsx +4 -1
- package/src/modules/workflows/backend/instances/page.tsx +4 -1
- package/src/modules/workflows/backend/tasks/page.tsx +4 -1
- package/src/modules/workflows/lib/activity-executor.ts +9 -0
|
@@ -52,6 +52,11 @@ import {
|
|
|
52
52
|
refreshIntegrationDetailPanels,
|
|
53
53
|
refreshIntegrationRunActivityPanels,
|
|
54
54
|
} from '../detail-page-refresh'
|
|
55
|
+
import {
|
|
56
|
+
buildCredentialEditValues,
|
|
57
|
+
buildIntegrationCredentialSavePayload,
|
|
58
|
+
type SecretFieldsConfigured,
|
|
59
|
+
} from '../credential-secret-fields'
|
|
55
60
|
import { isValidCredentialUrl } from '../../../lib/credentials-field-validation'
|
|
56
61
|
|
|
57
62
|
type CredentialField = IntegrationCredentialField
|
|
@@ -290,19 +295,32 @@ function resolvePathnameId(pathname: string): string | undefined {
|
|
|
290
295
|
return decodeURIComponent(integrationId)
|
|
291
296
|
}
|
|
292
297
|
|
|
293
|
-
function buildCredentialFields(
|
|
298
|
+
function buildCredentialFields(
|
|
299
|
+
credFields: CredentialField[],
|
|
300
|
+
secretFieldsConfigured: SecretFieldsConfigured,
|
|
301
|
+
t: ReturnType<typeof useT>,
|
|
302
|
+
): CrudField[] {
|
|
294
303
|
return credFields.map((field) => {
|
|
304
|
+
const baseDescription = field.helpDetails ? (
|
|
305
|
+
<div className="space-y-1">
|
|
306
|
+
{field.helpText ? <div>{field.helpText}</div> : null}
|
|
307
|
+
<WebhookSetupGuide guide={field.helpDetails} />
|
|
308
|
+
</div>
|
|
309
|
+
) : field.helpText
|
|
310
|
+
const description = field.type === 'secret' && secretFieldsConfigured[field.key] ? (
|
|
311
|
+
<div className="space-y-1">
|
|
312
|
+
{baseDescription ? <div>{baseDescription}</div> : null}
|
|
313
|
+
<p className="text-xs text-muted-foreground">
|
|
314
|
+
{t('integrations.detail.credentials.secretConfigured')}
|
|
315
|
+
</p>
|
|
316
|
+
</div>
|
|
317
|
+
) : baseDescription
|
|
295
318
|
const shared = {
|
|
296
319
|
id: field.key,
|
|
297
320
|
label: field.label,
|
|
298
|
-
description
|
|
299
|
-
<div className="space-y-1">
|
|
300
|
-
{field.helpText ? <div>{field.helpText}</div> : null}
|
|
301
|
-
<WebhookSetupGuide guide={field.helpDetails} buttonLabel="Show details" />
|
|
302
|
-
</div>
|
|
303
|
-
) : field.helpText,
|
|
321
|
+
description,
|
|
304
322
|
placeholder: field.placeholder,
|
|
305
|
-
required: field.required,
|
|
323
|
+
required: field.required && !(field.type === 'secret' && secretFieldsConfigured[field.key]),
|
|
306
324
|
visibleWhen: field.visibleWhen,
|
|
307
325
|
}
|
|
308
326
|
|
|
@@ -317,6 +335,7 @@ function buildCredentialFields(credFields: CredentialField[]): CrudField[] {
|
|
|
317
335
|
value={typeof value === 'string' ? value : ''}
|
|
318
336
|
onChange={(event) => setValue(event.target.value)}
|
|
319
337
|
disabled={disabled}
|
|
338
|
+
autoComplete="new-password"
|
|
320
339
|
/>
|
|
321
340
|
),
|
|
322
341
|
}
|
|
@@ -426,6 +445,7 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
426
445
|
const [isNotFound, setIsNotFound] = React.useState(false)
|
|
427
446
|
|
|
428
447
|
const [credValues, setCredValues] = React.useState<Record<string, unknown>>({})
|
|
448
|
+
const [secretFieldsConfigured, setSecretFieldsConfigured] = React.useState<SecretFieldsConfigured>({})
|
|
429
449
|
const [credentialsUpdatedAt, setCredentialsUpdatedAt] = React.useState<string | null>(null)
|
|
430
450
|
const [credentialsFormKey, setCredentialsFormKey] = React.useState(0)
|
|
431
451
|
const [isSavingCredentials, setIsSavingCredentials] = React.useState(false)
|
|
@@ -490,13 +510,18 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
490
510
|
const loadCredentials = React.useCallback(async () => {
|
|
491
511
|
const currentIntegrationId = resolveCurrentIntegrationId()
|
|
492
512
|
if (!currentIntegrationId) return
|
|
493
|
-
const call = await apiCall<{
|
|
513
|
+
const call = await apiCall<{
|
|
514
|
+
credentials: Record<string, unknown>
|
|
515
|
+
secretFieldsConfigured?: SecretFieldsConfigured
|
|
516
|
+
updatedAt?: string | null
|
|
517
|
+
}>(
|
|
494
518
|
`/api/integrations/${encodeURIComponent(currentIntegrationId)}/credentials`,
|
|
495
519
|
undefined,
|
|
496
520
|
{ fallback: null },
|
|
497
521
|
)
|
|
498
522
|
if (call.ok && call.result) {
|
|
499
523
|
setCredentialsUpdatedAt(call.result.updatedAt ?? null)
|
|
524
|
+
setSecretFieldsConfigured(call.result.secretFieldsConfigured ?? {})
|
|
500
525
|
}
|
|
501
526
|
if (call.ok && call.result?.credentials) {
|
|
502
527
|
const next = { ...call.result.credentials }
|
|
@@ -713,35 +738,32 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
713
738
|
if (!currentIntegrationId) return
|
|
714
739
|
setIsSavingCredentials(true)
|
|
715
740
|
try {
|
|
716
|
-
const
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
}
|
|
728
|
-
}
|
|
741
|
+
const credentialFields = (
|
|
742
|
+
detail?.integration.credentials?.fields
|
|
743
|
+
?? detail?.bundle?.credentials?.fields
|
|
744
|
+
?? []
|
|
745
|
+
)
|
|
746
|
+
const savePayload = buildIntegrationCredentialSavePayload(
|
|
747
|
+
currentIntegrationId,
|
|
748
|
+
values,
|
|
749
|
+
credentialFields,
|
|
750
|
+
secretFieldsConfigured,
|
|
751
|
+
)
|
|
729
752
|
const call = await runMutationWithContext({
|
|
730
753
|
actionId: 'save-credentials',
|
|
731
754
|
tabId: 'credentials',
|
|
732
|
-
mutationPayload: { integrationId: currentIntegrationId,
|
|
755
|
+
mutationPayload: { integrationId: currentIntegrationId, ...savePayload },
|
|
733
756
|
operation: () => withScopedApiRequestHeaders(
|
|
734
757
|
buildOptimisticLockHeader(credentialsUpdatedAt),
|
|
735
758
|
() => apiCall(`/api/integrations/${encodeURIComponent(currentIntegrationId)}/credentials`, {
|
|
736
759
|
method: 'PUT',
|
|
737
760
|
headers: { 'Content-Type': 'application/json' },
|
|
738
|
-
body: JSON.stringify(
|
|
761
|
+
body: JSON.stringify(savePayload),
|
|
739
762
|
}, { fallback: null }),
|
|
740
763
|
),
|
|
741
764
|
})
|
|
742
765
|
|
|
743
766
|
if (call.ok) {
|
|
744
|
-
setCredValues(sanitizedValues)
|
|
745
767
|
setCredentialsFormKey((current) => current + 1)
|
|
746
768
|
flash(t('integrations.detail.credentials.saved'), 'success')
|
|
747
769
|
void loadCredentials()
|
|
@@ -759,7 +781,7 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
759
781
|
} finally {
|
|
760
782
|
setIsSavingCredentials(false)
|
|
761
783
|
}
|
|
762
|
-
}, [credentialsUpdatedAt, loadCredentials, resolveCurrentIntegrationId, runMutationWithContext, t])
|
|
784
|
+
}, [credentialsUpdatedAt, detail, loadCredentials, resolveCurrentIntegrationId, runMutationWithContext, secretFieldsConfigured, t])
|
|
763
785
|
|
|
764
786
|
const handleVersionChange = React.useCallback(async (version: string) => {
|
|
765
787
|
const currentIntegrationId = resolveCurrentIntegrationId()
|
|
@@ -837,8 +859,12 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
837
859
|
[detail?.bundle?.credentials?.fields, detail?.integration.credentials?.fields],
|
|
838
860
|
)
|
|
839
861
|
const credentialFormFields = React.useMemo(
|
|
840
|
-
() => buildCredentialFields(editableCredentialFields),
|
|
841
|
-
[editableCredentialFields],
|
|
862
|
+
() => buildCredentialFields(editableCredentialFields, secretFieldsConfigured, t),
|
|
863
|
+
[editableCredentialFields, secretFieldsConfigured, t],
|
|
864
|
+
)
|
|
865
|
+
const credentialFormValues = React.useMemo(
|
|
866
|
+
() => buildCredentialEditValues(credValues, secretFieldsConfigured),
|
|
867
|
+
[credValues, secretFieldsConfigured],
|
|
842
868
|
)
|
|
843
869
|
const credentialSchema = React.useMemo(() => (
|
|
844
870
|
z.object({}).passthrough().superRefine((rawValues, ctx) => {
|
|
@@ -880,7 +906,11 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
880
906
|
|
|
881
907
|
const normalizedValue = typeof value === 'string' ? value : ''
|
|
882
908
|
|
|
883
|
-
if (
|
|
909
|
+
if (
|
|
910
|
+
field.required
|
|
911
|
+
&& normalizedValue.trim().length === 0
|
|
912
|
+
&& !(field.type === 'secret' && secretFieldsConfigured[field.key])
|
|
913
|
+
) {
|
|
884
914
|
ctx.addIssue({
|
|
885
915
|
code: z.ZodIssueCode.custom,
|
|
886
916
|
path: [field.key],
|
|
@@ -922,7 +952,7 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
922
952
|
}
|
|
923
953
|
})
|
|
924
954
|
})
|
|
925
|
-
) as z.ZodType<Record<string, unknown>>, [editableCredentialFields, t])
|
|
955
|
+
) as z.ZodType<Record<string, unknown>>, [editableCredentialFields, secretFieldsConfigured, t])
|
|
926
956
|
const latestHealthLog = React.useMemo(() => logs.find(isHealthLog) ?? null, [logs])
|
|
927
957
|
const latestOperationalLog = React.useMemo(
|
|
928
958
|
() => logs.find((log) => (
|
|
@@ -1257,7 +1287,7 @@ export default function IntegrationDetailPage({ params }: IntegrationDetailPageP
|
|
|
1257
1287
|
entityId="integrations.integration"
|
|
1258
1288
|
schema={credentialSchema}
|
|
1259
1289
|
fields={credentialFormFields}
|
|
1260
|
-
initialValues={
|
|
1290
|
+
initialValues={credentialFormValues}
|
|
1261
1291
|
onSubmit={handleSaveCredentials}
|
|
1262
1292
|
embedded
|
|
1263
1293
|
hideFooterActions
|
|
@@ -8,6 +8,7 @@ import { Badge } from '@open-mercato/ui/primitives/badge'
|
|
|
8
8
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
9
9
|
import { Switch } from '@open-mercato/ui/primitives/switch'
|
|
10
10
|
import { Input } from '@open-mercato/ui/primitives/input'
|
|
11
|
+
import { PasswordInput } from '@open-mercato/ui/primitives/password-input'
|
|
11
12
|
import {
|
|
12
13
|
Select,
|
|
13
14
|
SelectContent,
|
|
@@ -23,6 +24,11 @@ import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
|
23
24
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
24
25
|
import type { CredentialFieldType, IntegrationCredentialField } from '@open-mercato/shared/modules/integrations/types'
|
|
25
26
|
import { LoadingMessage, ErrorMessage, RecordNotFoundState } from '@open-mercato/ui/backend/detail'
|
|
27
|
+
import {
|
|
28
|
+
buildCredentialEditValues,
|
|
29
|
+
buildCredentialSavePayload,
|
|
30
|
+
type SecretFieldsConfigured,
|
|
31
|
+
} from '../../credential-secret-fields'
|
|
26
32
|
|
|
27
33
|
type CredentialField = IntegrationCredentialField
|
|
28
34
|
|
|
@@ -88,6 +94,7 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
88
94
|
const [error, setError] = React.useState<string | null>(null)
|
|
89
95
|
const [isNotFound, setIsNotFound] = React.useState(false)
|
|
90
96
|
const [credValues, setCredValues] = React.useState<Record<string, unknown>>({})
|
|
97
|
+
const [secretFieldsConfigured, setSecretFieldsConfigured] = React.useState<SecretFieldsConfigured>({})
|
|
91
98
|
const [credentialsUpdatedAt, setCredentialsUpdatedAt] = React.useState<string | null>(null)
|
|
92
99
|
const [isSavingCreds, setIsSavingCreds] = React.useState(false)
|
|
93
100
|
const [togglingIds, setTogglingIds] = React.useState<Set<string>>(new Set())
|
|
@@ -134,13 +141,18 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
134
141
|
}
|
|
135
142
|
setDetail(call.result)
|
|
136
143
|
|
|
137
|
-
const credCall = await apiCall<{
|
|
144
|
+
const credCall = await apiCall<{
|
|
145
|
+
credentials: Record<string, unknown>
|
|
146
|
+
secretFieldsConfigured?: SecretFieldsConfigured
|
|
147
|
+
updatedAt?: string | null
|
|
148
|
+
}>(
|
|
138
149
|
`/api/integrations/${encodeURIComponent(currentBundleId)}/credentials`,
|
|
139
150
|
undefined,
|
|
140
151
|
{ fallback: null },
|
|
141
152
|
)
|
|
142
153
|
if (credCall.ok && credCall.result) {
|
|
143
154
|
setCredentialsUpdatedAt(credCall.result.updatedAt ?? null)
|
|
155
|
+
setSecretFieldsConfigured(credCall.result.secretFieldsConfigured ?? {})
|
|
144
156
|
}
|
|
145
157
|
if (credCall.ok && credCall.result?.credentials) {
|
|
146
158
|
const next = { ...credCall.result.credentials }
|
|
@@ -151,7 +163,10 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
151
163
|
next.authMode = hasKeys ? 'access_keys' : 'ambient'
|
|
152
164
|
}
|
|
153
165
|
}
|
|
154
|
-
setCredValues(
|
|
166
|
+
setCredValues(buildCredentialEditValues(
|
|
167
|
+
next,
|
|
168
|
+
credCall.result.secretFieldsConfigured ?? {},
|
|
169
|
+
))
|
|
155
170
|
}
|
|
156
171
|
setIsLoading(false)
|
|
157
172
|
}, [resolveCurrentBundleId, t])
|
|
@@ -163,8 +178,13 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
163
178
|
if (!currentBundleId) return
|
|
164
179
|
setIsSavingCreds(true)
|
|
165
180
|
try {
|
|
181
|
+
const savePayload = buildCredentialSavePayload(
|
|
182
|
+
credValues,
|
|
183
|
+
detail?.bundle?.credentials?.fields ?? [],
|
|
184
|
+
secretFieldsConfigured,
|
|
185
|
+
)
|
|
166
186
|
const call = await runMutation({
|
|
167
|
-
mutationPayload: { bundleId: currentBundleId,
|
|
187
|
+
mutationPayload: { bundleId: currentBundleId, ...savePayload },
|
|
168
188
|
context: {
|
|
169
189
|
formId: mutationContextId,
|
|
170
190
|
operation: 'update',
|
|
@@ -179,7 +199,7 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
179
199
|
() => apiCall(`/api/integrations/${encodeURIComponent(currentBundleId)}/credentials`, {
|
|
180
200
|
method: 'PUT',
|
|
181
201
|
headers: { 'Content-Type': 'application/json' },
|
|
182
|
-
body: JSON.stringify(
|
|
202
|
+
body: JSON.stringify(savePayload),
|
|
183
203
|
}, { fallback: null }),
|
|
184
204
|
),
|
|
185
205
|
})
|
|
@@ -194,7 +214,7 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
194
214
|
} finally {
|
|
195
215
|
setIsSavingCreds(false)
|
|
196
216
|
}
|
|
197
|
-
}, [resolveCurrentBundleId, runMutation, mutationContextId, retryLastMutation, credValues, credentialsUpdatedAt, load, t])
|
|
217
|
+
}, [resolveCurrentBundleId, runMutation, mutationContextId, retryLastMutation, credValues, credentialsUpdatedAt, detail?.bundle?.credentials?.fields, load, secretFieldsConfigured, t])
|
|
198
218
|
|
|
199
219
|
const handleToggle = React.useCallback(async (integrationId: string, enabled: boolean, updatedAt?: string | null) => {
|
|
200
220
|
setTogglingIds((prev) => new Set(prev).add(integrationId))
|
|
@@ -295,15 +315,15 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
295
315
|
<CardContent className="space-y-4">
|
|
296
316
|
{credFields.filter(isFieldVisible).map((field) => (
|
|
297
317
|
<div key={field.key} className="space-y-1.5">
|
|
298
|
-
<label className="text-sm font-medium">
|
|
299
|
-
{field.label}{field.required && <span className="
|
|
318
|
+
<label htmlFor={`bundle-credential-${field.key}`} className="text-sm font-medium">
|
|
319
|
+
{field.label}{field.required && <span className="ml-0.5 text-destructive">*</span>}
|
|
300
320
|
</label>
|
|
301
321
|
{field.type === 'select' && field.options ? (
|
|
302
322
|
<Select
|
|
303
323
|
value={(credValues[field.key] as string) || undefined}
|
|
304
324
|
onValueChange={(value) => setCredValues((prev) => ({ ...prev, [field.key]: value ?? '' }))}
|
|
305
325
|
>
|
|
306
|
-
<SelectTrigger>
|
|
326
|
+
<SelectTrigger id={`bundle-credential-${field.key}`}>
|
|
307
327
|
<SelectValue placeholder="—" />
|
|
308
328
|
</SelectTrigger>
|
|
309
329
|
<SelectContent>
|
|
@@ -314,17 +334,32 @@ export default function BundleConfigPage({ params }: BundleConfigPageProps) {
|
|
|
314
334
|
</Select>
|
|
315
335
|
) : field.type === 'boolean' ? (
|
|
316
336
|
<Switch
|
|
337
|
+
id={`bundle-credential-${field.key}`}
|
|
317
338
|
checked={Boolean(credValues[field.key])}
|
|
318
339
|
onCheckedChange={(checked) => setCredValues((prev) => ({ ...prev, [field.key]: checked }))}
|
|
319
340
|
/>
|
|
341
|
+
) : field.type === 'secret' ? (
|
|
342
|
+
<PasswordInput
|
|
343
|
+
id={`bundle-credential-${field.key}`}
|
|
344
|
+
placeholder={field.placeholder}
|
|
345
|
+
value={(credValues[field.key] as string) ?? ''}
|
|
346
|
+
onChange={(event) => setCredValues((prev) => ({ ...prev, [field.key]: event.target.value }))}
|
|
347
|
+
autoComplete="new-password"
|
|
348
|
+
/>
|
|
320
349
|
) : (
|
|
321
350
|
<Input
|
|
322
|
-
|
|
351
|
+
id={`bundle-credential-${field.key}`}
|
|
352
|
+
type="text"
|
|
323
353
|
placeholder={field.placeholder}
|
|
324
354
|
value={(credValues[field.key] as string) ?? ''}
|
|
325
355
|
onChange={(e) => setCredValues((prev) => ({ ...prev, [field.key]: e.target.value }))}
|
|
326
356
|
/>
|
|
327
357
|
)}
|
|
358
|
+
{field.type === 'secret' && secretFieldsConfigured[field.key] ? (
|
|
359
|
+
<p className="text-xs text-muted-foreground">
|
|
360
|
+
{t('integrations.detail.credentials.secretConfigured')}
|
|
361
|
+
</p>
|
|
362
|
+
) : null}
|
|
328
363
|
</div>
|
|
329
364
|
))}
|
|
330
365
|
<Button type="button" onClick={() => void handleSaveCredentials()} disabled={isSavingCreds}>
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { IntegrationCredentialField } from '@open-mercato/shared/modules/integrations/types'
|
|
2
|
+
import { SECRET_CREDENTIAL_FIELD_TYPES } from '../../lib/credentials-masking'
|
|
3
|
+
|
|
4
|
+
export type SecretFieldsConfigured = Record<string, boolean>
|
|
5
|
+
|
|
6
|
+
export type CredentialSavePayload = {
|
|
7
|
+
credentials: Record<string, unknown>
|
|
8
|
+
unchangedSecretFields?: string[]
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function buildCredentialEditValues(
|
|
12
|
+
credentials: Record<string, unknown>,
|
|
13
|
+
secretFieldsConfigured: SecretFieldsConfigured,
|
|
14
|
+
): Record<string, unknown> {
|
|
15
|
+
const editValues = { ...credentials }
|
|
16
|
+
|
|
17
|
+
for (const [fieldKey, configured] of Object.entries(secretFieldsConfigured)) {
|
|
18
|
+
if (configured) delete editValues[fieldKey]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return editValues
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function buildCredentialSavePayload(
|
|
25
|
+
values: Record<string, unknown>,
|
|
26
|
+
fields: readonly IntegrationCredentialField[],
|
|
27
|
+
secretFieldsConfigured: SecretFieldsConfigured,
|
|
28
|
+
deliberatelyClearedSecretFields: ReadonlySet<string> = new Set(),
|
|
29
|
+
): CredentialSavePayload {
|
|
30
|
+
const credentials = { ...values }
|
|
31
|
+
const unchangedSecretFields = new Set<string>()
|
|
32
|
+
|
|
33
|
+
for (const field of fields) {
|
|
34
|
+
if (!SECRET_CREDENTIAL_FIELD_TYPES.has(field.type)) continue
|
|
35
|
+
|
|
36
|
+
if (deliberatelyClearedSecretFields.has(field.key)) {
|
|
37
|
+
delete credentials[field.key]
|
|
38
|
+
continue
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (!secretFieldsConfigured[field.key]) continue
|
|
42
|
+
const value = credentials[field.key]
|
|
43
|
+
if (value !== undefined && value !== '') continue
|
|
44
|
+
|
|
45
|
+
delete credentials[field.key]
|
|
46
|
+
unchangedSecretFields.add(field.key)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return unchangedSecretFields.size > 0
|
|
50
|
+
? { credentials, unchangedSecretFields: [...unchangedSecretFields] }
|
|
51
|
+
: { credentials }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function buildIntegrationCredentialSavePayload(
|
|
55
|
+
integrationId: string,
|
|
56
|
+
values: Record<string, unknown>,
|
|
57
|
+
fields: readonly IntegrationCredentialField[],
|
|
58
|
+
secretFieldsConfigured: SecretFieldsConfigured,
|
|
59
|
+
): CredentialSavePayload {
|
|
60
|
+
const normalizedValues = { ...values }
|
|
61
|
+
const deliberatelyClearedSecretFields = new Set<string>()
|
|
62
|
+
|
|
63
|
+
if (integrationId === 'storage_s3') {
|
|
64
|
+
const authMode = normalizedValues.authMode
|
|
65
|
+
if (authMode !== 'access_keys' && authMode !== 'ambient') {
|
|
66
|
+
const hasKeys = Boolean(normalizedValues.accessKeyId || normalizedValues.secretAccessKey)
|
|
67
|
+
normalizedValues.authMode = hasKeys ? 'access_keys' : 'ambient'
|
|
68
|
+
}
|
|
69
|
+
if (normalizedValues.authMode === 'ambient') {
|
|
70
|
+
delete normalizedValues.accessKeyId
|
|
71
|
+
delete normalizedValues.secretAccessKey
|
|
72
|
+
delete normalizedValues.sessionToken
|
|
73
|
+
deliberatelyClearedSecretFields.add('secretAccessKey')
|
|
74
|
+
deliberatelyClearedSecretFields.add('sessionToken')
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return buildCredentialSavePayload(
|
|
79
|
+
normalizedValues,
|
|
80
|
+
fields,
|
|
81
|
+
secretFieldsConfigured,
|
|
82
|
+
deliberatelyClearedSecretFields,
|
|
83
|
+
)
|
|
84
|
+
}
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
2
|
|
|
3
|
+
const credentialFieldKeySchema = z.string().min(1).max(128)
|
|
4
|
+
|
|
3
5
|
export const saveCredentialsSchema = z.object({
|
|
4
6
|
credentials: z.record(
|
|
5
|
-
|
|
7
|
+
credentialFieldKeySchema,
|
|
6
8
|
z.union([z.string().max(20_000), z.number(), z.boolean(), z.null()]),
|
|
7
9
|
),
|
|
10
|
+
unchangedSecretFields: z.array(credentialFieldKeySchema).max(200).optional(),
|
|
8
11
|
}).refine((value) => Object.keys(value.credentials).length <= 200, {
|
|
9
12
|
message: 'At most 200 credential fields are allowed',
|
|
10
|
-
})
|
|
13
|
+
}).refine(
|
|
14
|
+
(value) => !value.unchangedSecretFields
|
|
15
|
+
|| new Set(value.unchangedSecretFields).size === value.unchangedSecretFields.length,
|
|
16
|
+
{
|
|
17
|
+
message: 'Unchanged secret field names must be unique',
|
|
18
|
+
path: ['unchangedSecretFields'],
|
|
19
|
+
},
|
|
20
|
+
)
|
|
11
21
|
|
|
12
22
|
export type SaveCredentialsInput = z.infer<typeof saveCredentialsSchema>
|
|
13
23
|
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"integrations.detail.credentials.save": "Zugangsdaten speichern",
|
|
16
16
|
"integrations.detail.credentials.saveError": "Zugangsdaten konnten nicht gespeichert werden",
|
|
17
17
|
"integrations.detail.credentials.saved": "Zugangsdaten gespeichert",
|
|
18
|
+
"integrations.detail.credentials.secretConfigured": "Konfiguriert. Geben Sie einen neuen Wert ein, um ihn zu ersetzen.",
|
|
18
19
|
"integrations.detail.credentials.validation.boolean": "Select a valid value.",
|
|
19
20
|
"integrations.detail.credentials.validation.option": "Select one of the available options.",
|
|
20
21
|
"integrations.detail.credentials.validation.required": "{field} is required.",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"integrations.detail.credentials.save": "Save Credentials",
|
|
16
16
|
"integrations.detail.credentials.saveError": "Failed to save credentials",
|
|
17
17
|
"integrations.detail.credentials.saved": "Credentials saved",
|
|
18
|
+
"integrations.detail.credentials.secretConfigured": "Configured. Enter a new value to replace it.",
|
|
18
19
|
"integrations.detail.credentials.validation.boolean": "Select a valid value.",
|
|
19
20
|
"integrations.detail.credentials.validation.option": "Select one of the available options.",
|
|
20
21
|
"integrations.detail.credentials.validation.required": "{field} is required.",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"integrations.detail.credentials.save": "Guardar credenciales",
|
|
16
16
|
"integrations.detail.credentials.saveError": "No se pudieron guardar las credenciales",
|
|
17
17
|
"integrations.detail.credentials.saved": "Credenciales guardadas",
|
|
18
|
+
"integrations.detail.credentials.secretConfigured": "Configurado. Introduce un valor nuevo para reemplazarlo.",
|
|
18
19
|
"integrations.detail.credentials.validation.boolean": "Select a valid value.",
|
|
19
20
|
"integrations.detail.credentials.validation.option": "Select one of the available options.",
|
|
20
21
|
"integrations.detail.credentials.validation.required": "{field} is required.",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"integrations.detail.credentials.save": "자격 증명 저장",
|
|
16
16
|
"integrations.detail.credentials.saveError": "자격 증명 저장에 실패했습니다",
|
|
17
17
|
"integrations.detail.credentials.saved": "자격 증명이 저장되었습니다",
|
|
18
|
+
"integrations.detail.credentials.secretConfigured": "구성됨. 바꾸려면 새 값을 입력하세요.",
|
|
18
19
|
"integrations.detail.credentials.validation.boolean": "유효한 값을 선택하세요.",
|
|
19
20
|
"integrations.detail.credentials.validation.option": "사용 가능한 옵션 중 하나를 선택하세요.",
|
|
20
21
|
"integrations.detail.credentials.validation.required": "{field}은(는) 필수입니다.",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"integrations.detail.credentials.save": "Zapisz dane",
|
|
16
16
|
"integrations.detail.credentials.saveError": "Nie udało się zapisać danych",
|
|
17
17
|
"integrations.detail.credentials.saved": "Dane zapisane",
|
|
18
|
+
"integrations.detail.credentials.secretConfigured": "Skonfigurowano. Wpisz nową wartość, aby ją zastąpić.",
|
|
18
19
|
"integrations.detail.credentials.validation.boolean": "Select a valid value.",
|
|
19
20
|
"integrations.detail.credentials.validation.option": "Select one of the available options.",
|
|
20
21
|
"integrations.detail.credentials.validation.required": "{field} is required.",
|
|
@@ -84,22 +84,26 @@ export function maskSecretCredentials(
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
|
-
* Reverse of {@link maskSecretCredentials} for the save path.
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* value (including an empty string, which clears the secret) is written as-is.
|
|
87
|
+
* Reverse of {@link maskSecretCredentials} for the save path. The exact mask
|
|
88
|
+
* sentinel and explicitly listed omitted secret fields mean "leave unchanged".
|
|
89
|
+
* Explicit values win over the list, including an empty string used to clear a
|
|
90
|
+
* secret, while plain omission retains the full-replacement contract.
|
|
92
91
|
*/
|
|
93
92
|
export function mergeMaskedSecretCredentials(
|
|
94
93
|
schema: IntegrationCredentialsSchema | undefined,
|
|
95
94
|
incoming: Record<string, unknown>,
|
|
96
95
|
existing: Record<string, unknown>,
|
|
96
|
+
unchangedSecretFields: readonly string[] = [],
|
|
97
97
|
): Record<string, unknown> {
|
|
98
98
|
const merged: Record<string, unknown> = { ...incoming }
|
|
99
|
+
const unchangedSecretFieldSet = new Set(unchangedSecretFields)
|
|
99
100
|
|
|
100
101
|
for (const field of schema?.fields ?? []) {
|
|
101
102
|
if (!isSecretField(field.type)) continue
|
|
102
|
-
|
|
103
|
+
const hasIncomingValue = Object.prototype.hasOwnProperty.call(merged, field.key)
|
|
104
|
+
const submittedMask = merged[field.key] === MASKED_SECRET_VALUE
|
|
105
|
+
const explicitlyUnchanged = !hasIncomingValue && unchangedSecretFieldSet.has(field.key)
|
|
106
|
+
if (!submittedMask && !explicitlyUnchanged) continue
|
|
103
107
|
|
|
104
108
|
if (hasPresentValue(existing[field.key])) {
|
|
105
109
|
merged[field.key] = existing[field.key]
|
|
@@ -2,6 +2,7 @@ import type { EntityManager } from '@mikro-orm/postgresql'
|
|
|
2
2
|
import type { CommandBus } from '@open-mercato/shared/lib/commands/command-bus'
|
|
3
3
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi/types'
|
|
4
4
|
import { isCrudHttpError } from '@open-mercato/shared/lib/crud/errors'
|
|
5
|
+
import { applyResponseEnricherToRecord } from '@open-mercato/shared/lib/crud/enricher-runner'
|
|
5
6
|
import { enforceCommandOptimisticLock } from '@open-mercato/shared/lib/crud/optimistic-lock-command'
|
|
6
7
|
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
7
8
|
import { User } from '../../../auth/data/entities'
|
|
@@ -38,6 +39,36 @@ type MessageObjectPreviewPayload = {
|
|
|
38
39
|
metadata?: Record<string, string>
|
|
39
40
|
} | null
|
|
40
41
|
|
|
42
|
+
type RbacServiceLike = {
|
|
43
|
+
getGrantedFeatures?: (
|
|
44
|
+
userId: string,
|
|
45
|
+
scope: { tenantId: string | null; organizationId: string | null },
|
|
46
|
+
) => Promise<string[]>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Feature list for the enricher ACL gate, resolved from RBAC.
|
|
51
|
+
*
|
|
52
|
+
* Mirrors `customers/api/interactions/route.ts`. Returning `undefined` on
|
|
53
|
+
* failure is deliberate — the runner then treats every feature-gated enricher
|
|
54
|
+
* as denied, which is the safe direction.
|
|
55
|
+
*/
|
|
56
|
+
async function resolveGrantedFeatures(
|
|
57
|
+
container: { resolve: (name: string) => unknown },
|
|
58
|
+
scope: { tenantId: string; organizationId: string | null; userId: string },
|
|
59
|
+
): Promise<string[] | undefined> {
|
|
60
|
+
try {
|
|
61
|
+
const rbac = container.resolve('rbacService') as RbacServiceLike | undefined
|
|
62
|
+
if (!rbac?.getGrantedFeatures) return undefined
|
|
63
|
+
return await rbac.getGrantedFeatures(scope.userId, {
|
|
64
|
+
tenantId: scope.tenantId,
|
|
65
|
+
organizationId: scope.organizationId,
|
|
66
|
+
})
|
|
67
|
+
} catch {
|
|
68
|
+
return undefined
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
41
72
|
export async function GET(req: Request, { params }: { params: { id: string } }) {
|
|
42
73
|
const { ctx, scope } = await resolveMessageContext(req)
|
|
43
74
|
const em = ctx.container.resolve('em') as EntityManager
|
|
@@ -190,7 +221,7 @@ export async function GET(req: Request, { params }: { params: { id: string } })
|
|
|
190
221
|
})
|
|
191
222
|
}
|
|
192
223
|
|
|
193
|
-
|
|
224
|
+
const detail: Record<string, unknown> = {
|
|
194
225
|
id: message.id,
|
|
195
226
|
updatedAt: message.updatedAt ?? null,
|
|
196
227
|
type: message.type,
|
|
@@ -257,6 +288,9 @@ export async function GET(req: Request, { params }: { params: { id: string } })
|
|
|
257
288
|
senderUserId: threadMessage.senderUserId,
|
|
258
289
|
senderName: threadSenderName,
|
|
259
290
|
senderEmail: sender?.email ?? null,
|
|
291
|
+
externalName: threadMessage.externalName ?? null,
|
|
292
|
+
externalEmail: threadMessage.externalEmail ?? null,
|
|
293
|
+
sourceEntityType: threadMessage.sourceEntityType ?? null,
|
|
260
294
|
body: threadMessage.body,
|
|
261
295
|
bodyFormat: threadMessage.bodyFormat,
|
|
262
296
|
sentAt: threadMessage.sentAt,
|
|
@@ -265,7 +299,27 @@ export async function GET(req: Request, { params }: { params: { id: string } })
|
|
|
265
299
|
isRead: recipient ? (autoMarkRead || recipient.status !== 'unread') : true,
|
|
266
300
|
conversationArchived,
|
|
267
301
|
conversationAllUnread,
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Mirrors `enrichSingleRecord` in `shared/lib/crud/factory.ts`, which every
|
|
305
|
+
// `makeCrudRoute` host gets for free: same `_meta` envelope, and no blanket
|
|
306
|
+
// catch so a `critical: true` enricher still surfaces as an HTTP error.
|
|
307
|
+
// Non-critical failures never escape the runner — it merges `fallback` and
|
|
308
|
+
// records the id in `_meta.enricherErrors`.
|
|
309
|
+
const enriched = await applyResponseEnricherToRecord(detail, 'messages.message', {
|
|
310
|
+
organizationId: scope.organizationId ?? '',
|
|
311
|
+
tenantId: scope.tenantId,
|
|
312
|
+
userId: scope.userId,
|
|
313
|
+
em,
|
|
314
|
+
container: ctx.container,
|
|
315
|
+
userFeatures: await resolveGrantedFeatures(ctx.container, scope),
|
|
268
316
|
})
|
|
317
|
+
|
|
318
|
+
if (enriched._meta.enrichedBy.length > 0 || enriched._meta.enricherErrors?.length) {
|
|
319
|
+
return Response.json({ ...enriched.record, _meta: enriched._meta })
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return Response.json(enriched.record)
|
|
269
323
|
}
|
|
270
324
|
|
|
271
325
|
export async function PATCH(req: Request, { params }: { params: { id: string } }) {
|