@open-mercato/core 0.6.8-develop.7100.1.fbf66fca35 → 0.7.0
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 +1 -13
- package/dist/helpers/integration/api.js.map +2 -2
- package/dist/helpers/integration/communicationChannelsFixtures.js +0 -19
- 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 +1 -3
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- 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 +0 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/di.js +1 -11
- package/dist/modules/attachments/di.js.map +2 -2
- package/dist/modules/attachments/index.js.map +1 -1
- package/dist/modules/attachments/lib/scoped-upload-service.js +2 -15
- package/dist/modules/attachments/lib/scoped-upload-service.js.map +2 -2
- package/dist/modules/attachments/lib/upload-limits.js +2 -6
- package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
- package/dist/modules/audit_logs/backend/audit-logs/page.js +0 -6
- package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
- package/dist/modules/audit_logs/lib/display-helpers.js +11 -19
- package/dist/modules/audit_logs/lib/display-helpers.js.map +2 -2
- package/dist/modules/audit_logs/services/actionLogService.js +12 -57
- package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
- package/dist/modules/auth/acl.js +5 -30
- package/dist/modules/auth/acl.js.map +2 -2
- package/dist/modules/auth/api/feature-check.js +2 -8
- package/dist/modules/auth/api/feature-check.js.map +2 -2
- package/dist/modules/auth/api/login.js +20 -4
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/roles/acl/route.js +33 -28
- package/dist/modules/auth/api/roles/acl/route.js.map +2 -2
- package/dist/modules/auth/api/routeError.js +11 -0
- package/dist/modules/auth/api/routeError.js.map +7 -0
- package/dist/modules/auth/api/session/refresh.js +1 -25
- package/dist/modules/auth/api/session/refresh.js.map +2 -2
- package/dist/modules/auth/api/users/acl/route.js +73 -102
- package/dist/modules/auth/api/users/acl/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +5 -13
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/roles/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +1 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js +1 -5
- package/dist/modules/auth/backend/users/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +1 -2
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/components/AclEditor.js +30 -39
- 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 +1 -5
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/di.js +9 -35
- package/dist/modules/auth/di.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +0 -46
- 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/services/authService.js +2 -16
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/auth/services/rbacService.js +24 -67
- package/dist/modules/auth/services/rbacService.js.map +3 -3
- package/dist/modules/business_rules/backend/logs/page.js +1 -3
- package/dist/modules/business_rules/backend/logs/page.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/rules/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/rules/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +1 -3
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js +6 -1
- package/dist/modules/business_rules/backend/sets/[id]/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/create/page.meta.js +5 -1
- package/dist/modules/business_rules/backend/sets/create/page.meta.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +1 -3
- 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 +9 -10
- 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 +2 -5
- package/dist/modules/catalog/backend/catalog/products/MerchandisingAssistantSheet.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +0 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +1 -7
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.js +0 -2
- 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 +1 -9
- 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 +10 -95
- 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 +0 -3
- package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js +1 -14
- package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
- package/dist/modules/communication_channels/di.js +1 -7
- package/dist/modules/communication_channels/di.js.map +2 -2
- package/dist/modules/communication_channels/lib/email-capabilities.js +1 -4
- package/dist/modules/communication_channels/lib/email-capabilities.js.map +2 -2
- package/dist/modules/communication_channels/lib/test-seed.js +2 -41
- package/dist/modules/communication_channels/lib/test-seed.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +0 -9
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +1 -3
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +1 -3
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js +0 -9
- package/dist/modules/customer_accounts/api/admin/domain-mappings.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +1 -3
- package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js +84 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js +7 -81
- package/dist/modules/customer_accounts/backend/customer_accounts/settings/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js +523 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js +731 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.js.map +7 -0
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +7 -727
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +7 -521
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/extension-points.js +1 -1
- package/dist/modules/customer_accounts/extension-points.js.map +2 -2
- package/dist/modules/customer_accounts/lib/portalUrl.js +69 -0
- package/dist/modules/customer_accounts/lib/portalUrl.js.map +7 -0
- package/dist/modules/customer_accounts/services/domainMappingService.js +0 -10
- package/dist/modules/customer_accounts/services/domainMappingService.js.map +2 -2
- package/dist/modules/customers/ai-tools/companies-pack.js +1 -4
- package/dist/modules/customers/ai-tools/companies-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js +2 -13
- package/dist/modules/customers/ai-tools/deal-analyzer-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/deals-pack.js +6 -52
- package/dist/modules/customers/ai-tools/deals-pack.js.map +2 -2
- package/dist/modules/customers/ai-tools/people-pack.js +1 -4
- package/dist/modules/customers/ai-tools/people-pack.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +6 -48
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/people/route.js +64 -20
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
- package/dist/modules/customers/api/companies/[id]/route.js +94 -17
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +5 -8
- 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 +25 -8
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +22 -3
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +2 -2
- package/dist/modules/customers/api/deals/aggregate/route.js +4 -11
- package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
- package/dist/modules/customers/api/deals/map/route.js +1 -2
- package/dist/modules/customers/api/deals/map/route.js.map +2 -2
- package/dist/modules/customers/api/deals/route.js +1 -38
- 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 +1 -3
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/interactions/tasks/route.js +4 -27
- package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +3 -4
- 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 +10 -11
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/check-phone/route.js +9 -51
- package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +5 -30
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +4 -6
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +1 -6
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +4 -7
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/components/Lane.js +13 -4
- 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 +14 -85
- package/dist/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +4 -6
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js +3 -9
- package/dist/modules/customers/backend/hooks/useEmailDuplicateCheck.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +34 -21
- 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 +2 -131
- package/dist/modules/customers/commands/personCompanyLinks.js.map +2 -2
- package/dist/modules/customers/components/CustomerTodosTable.js +0 -1
- package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
- package/dist/modules/customers/components/DealsKpiStrip.js +6 -7
- 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 +2 -3
- package/dist/modules/customers/components/calendar/EventPeekPopover.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/PeopleField.js +5 -40
- package/dist/modules/customers/components/calendar/editor/PeopleField.js.map +2 -2
- package/dist/modules/customers/components/calendar/editor/hooks.js +1 -2
- 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/AssignRoleDialog.js +33 -28
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +4 -5
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +1 -3
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +7 -19
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealsSection.js +5 -6
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +11 -35
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +1 -3
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/usePersonTasks.js +13 -19
- 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 +3 -32
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +0 -5
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/calendar/conflicts.js +2 -8
- package/dist/modules/customers/lib/calendar/conflicts.js.map +2 -2
- package/dist/modules/customers/lib/calendar/editorPayload.js +2 -3
- package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
- package/dist/modules/customers/lib/calendar/mapItem.js +3 -8
- package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
- package/dist/modules/customers/lib/dealStatus.js +0 -30
- package/dist/modules/customers/lib/dealStatus.js.map +2 -2
- package/dist/modules/customers/lib/findPeopleByAddresses.js +0 -1
- package/dist/modules/customers/lib/findPeopleByAddresses.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +2 -100
- package/dist/modules/customers/lib/personCompanies.js.map +2 -2
- package/dist/modules/customers/lib/todoCompatibility.js +0 -12
- package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
- package/dist/modules/dashboards/lib/widgetScope.js +1 -6
- package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +1 -3
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/sync-engine.js +6 -72
- package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-export.js +1 -5
- package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
- package/dist/modules/data_sync/workers/sync-import.js +1 -5
- package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
- package/dist/modules/devices/acl.js +1 -9
- package/dist/modules/devices/acl.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/[id]/route.js +32 -5
- package/dist/modules/devices/api/admin/devices/[id]/route.js.map +2 -2
- package/dist/modules/devices/api/admin/devices/route.js +1 -14
- package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
- package/dist/modules/devices/api/deviceList.js +12 -99
- package/dist/modules/devices/api/deviceList.js.map +2 -2
- package/dist/modules/devices/api/openapi.js +1 -3
- package/dist/modules/devices/api/openapi.js.map +2 -2
- package/dist/modules/devices/api/route.js +1 -9
- package/dist/modules/devices/api/route.js.map +2 -2
- package/dist/modules/devices/backend/devices/[id]/page.js +26 -10
- package/dist/modules/devices/backend/devices/[id]/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/create/page.js +1 -17
- package/dist/modules/devices/backend/devices/create/page.js.map +2 -2
- package/dist/modules/devices/backend/devices/page.js +34 -28
- package/dist/modules/devices/backend/devices/page.js.map +2 -2
- package/dist/modules/devices/setup.js +2 -6
- package/dist/modules/devices/setup.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +1 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +1 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/di.js +0 -9
- package/dist/modules/directory/di.js.map +2 -2
- package/dist/modules/directory/utils/organizationScope.js.map +2 -2
- package/dist/modules/entities/api/records.js +2 -4
- package/dist/modules/entities/api/records.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +1 -3
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/eudr/api/plots/route.js +1 -5
- package/dist/modules/eudr/api/plots/route.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/evidence-submissions/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js +2 -2
- package/dist/modules/eudr/backend/eudr/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/plots/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js +8 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/plots/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/plots/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/plots/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/product-mappings/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/product-mappings/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/product-mappings/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/risk-assessments/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js +0 -3
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/risk-assessments/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js +2 -0
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js +3 -1
- package/dist/modules/eudr/backend/eudr/statements/[id]/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js +1 -0
- package/dist/modules/eudr/backend/eudr/statements/create/page.meta.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.js +30 -28
- package/dist/modules/eudr/backend/eudr/statements/page.js.map +2 -2
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js +4 -1
- package/dist/modules/eudr/backend/eudr/statements/page.meta.js.map +2 -2
- package/dist/modules/eudr/commands/statements.js +8 -3
- package/dist/modules/eudr/commands/statements.js.map +2 -2
- package/dist/modules/eudr/components/crudErrorI18n.js +21 -1
- package/dist/modules/eudr/components/crudErrorI18n.js.map +2 -2
- package/dist/modules/eudr/components/formConfig.js +6 -2
- package/dist/modules/eudr/components/formConfig.js.map +2 -2
- package/dist/modules/eudr/data/validators.js +1 -4
- package/dist/modules/eudr/data/validators.js.map +2 -2
- package/dist/modules/eudr/lib/statement-lifecycle.js +9 -1
- package/dist/modules/eudr/lib/statement-lifecycle.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +0 -1
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +0 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/feature_toggles/defaults.json +8 -0
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js +0 -3
- package/dist/modules/inbox_ops/backend/inbox-ops/page.js.map +2 -2
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js +12 -1
- package/dist/modules/inbox_ops/lib/htmlToPlainText.js.map +2 -2
- package/dist/modules/integrations/api/[id]/credentials/route.js +1 -6
- package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +29 -38
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +9 -36
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/integrations/data/validators.js +3 -11
- package/dist/modules/integrations/data/validators.js.map +2 -2
- package/dist/modules/integrations/lib/credentials-masking.js +2 -6
- package/dist/modules/integrations/lib/credentials-masking.js.map +2 -2
- package/dist/modules/messages/api/[id]/route.js +1 -29
- package/dist/modules/messages/api/[id]/route.js.map +2 -2
- package/dist/modules/messages/api/openapi.js +2 -17
- package/dist/modules/messages/api/openapi.js.map +2 -2
- package/dist/modules/messages/api/route.js +2 -17
- package/dist/modules/messages/api/route.js.map +2 -2
- package/dist/modules/messages/components/MessagesInboxPageClient.js +14 -7
- package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
- package/dist/modules/messages/components/inboxFilters.js +0 -15
- package/dist/modules/messages/components/inboxFilters.js.map +2 -2
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js +1 -11
- package/dist/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js +1 -3
- package/dist/modules/messages/components/message-detail/panels/MessageHeader.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js +1 -2
- package/dist/modules/messages/components/message-detail/panels/thread-panel.js.map +2 -2
- package/dist/modules/messages/components/messageListLabels.js +2 -14
- package/dist/modules/messages/components/messageListLabels.js.map +2 -2
- package/dist/modules/messages/data/validators.js +4 -18
- package/dist/modules/messages/data/validators.js.map +2 -2
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +6 -4
- package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js +1 -3
- package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
- package/dist/modules/payment_gateways/lib/webhook-processor.js +0 -7
- package/dist/modules/payment_gateways/lib/webhook-processor.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +0 -3
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/push_notifications/backend/push_notifications/page.js +1 -3
- 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 +51 -150
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +3 -79
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +1 -3
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +1 -3
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +0 -3
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +8 -10
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +1 -79
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/components/PriceWithCurrency.js +5 -7
- package/dist/modules/sales/components/PriceWithCurrency.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -3
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ItemsSection.js +22 -51
- package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/LineItemDialog.js +19 -84
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +9 -23
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/ReturnsSection.js +6 -8
- package/dist/modules/sales/components/documents/ReturnsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +14 -68
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +5 -6
- package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentDialog.js +4 -5
- package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/ShipmentsSection.js +6 -8
- package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
- 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 +2 -8
- package/dist/modules/sales/data/entities.js.map +2 -2
- package/dist/modules/sales/extension-points.js +0 -1
- package/dist/modules/sales/extension-points.js.map +2 -2
- package/dist/modules/sales/setup.js +0 -2
- package/dist/modules/sales/setup.js.map +2 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js +44 -2
- package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +2 -10
- package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +7 -4
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/dist/modules/staff/backend/staff/leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js +0 -3
- package/dist/modules/staff/backend/staff/my-leave-requests/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-members/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +0 -3
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +0 -3
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.js +18 -29
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +0 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/sync_excel/lib/adapters/customers.js +0 -1
- 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 +9 -12
- package/dist/modules/warranty_claims/api/portal/claims/route.js.map +2 -2
- package/dist/modules/warranty_claims/backend/page.js +0 -3
- package/dist/modules/warranty_claims/backend/page.js.map +2 -2
- package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +0 -3
- 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 +0 -3
- 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 +0 -3
- 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 +0 -3
- package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +2 -2
- package/dist/modules/wms/api/warehouses/route.js +9 -13
- package/dist/modules/wms/api/warehouses/route.js.map +2 -2
- package/dist/modules/wms/api/zones/route.js +2 -15
- package/dist/modules/wms/api/zones/route.js.map +2 -2
- package/dist/modules/wms/commands/configuration.js +9 -121
- package/dist/modules/wms/commands/configuration.js.map +2 -2
- package/dist/modules/wms/commands/inventory-actions.js +0 -3
- package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
- package/dist/modules/wms/commands/shared.js +1 -9
- package/dist/modules/wms/commands/shared.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js +111 -76
- package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +3 -3
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +0 -1
- package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +20 -16
- package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsLotsListPage.js +0 -1
- package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js +11 -7
- package/dist/modules/wms/components/backend/WmsOperationalDashboardPage.js.map +2 -2
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +10 -6
- package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js +20 -27
- package/dist/modules/wms/components/backend/inventoryMutationLoaders.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +1 -3
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/page.js +1 -3
- package/dist/modules/workflows/backend/events/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +1 -3
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +1 -3
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/activity-executor.js +0 -4
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/package.json +10 -9
- package/src/helpers/integration/api.ts +1 -33
- package/src/helpers/integration/communicationChannelsFixtures.ts +1 -69
- package/src/modules/api_keys/api/keys/route.ts +1 -3
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -4
- package/src/modules/attachments/AGENTS.md +0 -15
- package/src/modules/attachments/api/route.ts +2 -2
- package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -3
- package/src/modules/attachments/di.ts +0 -16
- package/src/modules/attachments/i18n/de.json +0 -5
- package/src/modules/attachments/i18n/en.json +0 -5
- package/src/modules/attachments/i18n/es.json +0 -5
- package/src/modules/attachments/i18n/ko.json +0 -5
- package/src/modules/attachments/i18n/pl.json +0 -5
- package/src/modules/attachments/index.ts +0 -10
- package/src/modules/attachments/lib/scoped-upload-service.ts +0 -46
- package/src/modules/attachments/lib/upload-limits.ts +2 -6
- package/src/modules/audit_logs/backend/audit-logs/page.tsx +0 -8
- package/src/modules/audit_logs/lib/display-helpers.tsx +32 -42
- package/src/modules/audit_logs/services/actionLogService.ts +11 -74
- package/src/modules/auth/acl.ts +6 -30
- package/src/modules/auth/api/feature-check.ts +3 -10
- package/src/modules/auth/api/login.ts +24 -9
- package/src/modules/auth/api/roles/acl/route.ts +39 -42
- package/src/modules/auth/api/routeError.ts +30 -0
- package/src/modules/auth/api/session/refresh.ts +1 -32
- package/src/modules/auth/api/users/acl/route.ts +101 -185
- package/src/modules/auth/api/users/route.ts +5 -18
- package/src/modules/auth/backend/roles/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/roles/page.tsx +2 -4
- package/src/modules/auth/backend/users/[id]/edit/page.meta.ts +2 -5
- package/src/modules/auth/backend/users/page.tsx +2 -3
- package/src/modules/auth/components/AclEditor.tsx +33 -63
- package/src/modules/auth/data/entities.ts +1 -4
- package/src/modules/auth/data/validators.ts +0 -5
- package/src/modules/auth/di.ts +16 -46
- package/src/modules/auth/frontend/reset/[token]/page.tsx +0 -74
- package/src/modules/auth/i18n/de.json +0 -389
- package/src/modules/auth/i18n/en.json +0 -389
- package/src/modules/auth/i18n/es.json +0 -389
- package/src/modules/auth/i18n/ko.json +0 -389
- package/src/modules/auth/i18n/pl.json +2 -391
- package/src/modules/auth/lib/grantChecks.ts +0 -6
- package/src/modules/auth/services/authService.ts +2 -18
- package/src/modules/auth/services/rbacService.ts +24 -110
- package/src/modules/business_rules/backend/logs/page.tsx +1 -4
- package/src/modules/business_rules/backend/rules/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/rules/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/rules/page.tsx +1 -4
- package/src/modules/business_rules/backend/sets/[id]/page.meta.ts +5 -0
- package/src/modules/business_rules/backend/sets/create/page.meta.ts +5 -1
- package/src/modules/business_rules/backend/sets/page.tsx +1 -4
- package/src/modules/business_rules/lib/expression-evaluator.ts +9 -9
- package/src/modules/business_rules/lib/rule-evaluator.ts +9 -10
- 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 +5 -12
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +0 -3
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -7
- package/src/modules/catalog/i18n/de.json +0 -1
- package/src/modules/catalog/i18n/en.json +0 -1
- package/src/modules/catalog/i18n/es.json +0 -1
- package/src/modules/catalog/i18n/ko.json +0 -1
- package/src/modules/catalog/i18n/pl.json +0 -1
- package/src/modules/catalog/widgets/injection/merchandising-assistant-trigger/widget.client.tsx +0 -4
- package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +1 -17
- package/src/modules/communication_channels/api/post/test-seed/route.ts +16 -155
- package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +0 -4
- package/src/modules/communication_channels/commands/ingest-inbound-message.ts +1 -38
- package/src/modules/communication_channels/di.ts +0 -7
- package/src/modules/communication_channels/lib/adapter.ts +0 -14
- package/src/modules/communication_channels/lib/email-capabilities.ts +0 -4
- package/src/modules/communication_channels/lib/test-seed.ts +4 -64
- package/src/modules/configs/i18n/de.json +0 -2
- package/src/modules/configs/i18n/en.json +0 -2
- package/src/modules/configs/i18n/es.json +0 -2
- package/src/modules/configs/i18n/ko.json +0 -2
- package/src/modules/configs/i18n/pl.json +0 -2
- package/src/modules/configs/lib/system-status.ts +0 -9
- package/src/modules/currencies/backend/currencies/page.tsx +1 -4
- package/src/modules/currencies/backend/exchange-rates/page.tsx +1 -4
- package/src/modules/customer_accounts/api/admin/domain-mappings.ts +0 -7
- package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +1 -4
- package/src/modules/customer_accounts/backend/customer_accounts/settings/CustomerAccountsSettingsPageClient.tsx +138 -0
- package/src/modules/customer_accounts/backend/customer_accounts/settings/page.tsx +8 -132
- package/src/modules/customer_accounts/backend/customer_accounts/users/PortalUsersPageClient.tsx +598 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/PortalUserDetailPageClient.tsx +838 -0
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +6 -838
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +6 -590
- package/src/modules/customer_accounts/extension-points.ts +1 -1
- package/src/modules/customer_accounts/lib/portalUrl.ts +112 -0
- package/src/modules/customer_accounts/services/domainMappingService.ts +0 -10
- package/src/modules/customers/ai-tools/companies-pack.ts +1 -4
- package/src/modules/customers/ai-tools/deal-analyzer-pack.ts +2 -17
- package/src/modules/customers/ai-tools/deals-pack.ts +1 -66
- package/src/modules/customers/ai-tools/people-pack.ts +1 -4
- package/src/modules/customers/api/activities/route.ts +0 -45
- package/src/modules/customers/api/companies/[id]/people/route.ts +73 -24
- package/src/modules/customers/api/companies/[id]/route.ts +107 -24
- package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +8 -16
- package/src/modules/customers/api/deals/[id]/companies/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/people/route.ts +1 -4
- package/src/modules/customers/api/deals/[id]/route.ts +28 -17
- package/src/modules/customers/api/deals/[id]/stats/route.ts +25 -10
- package/src/modules/customers/api/deals/aggregate/route.ts +4 -14
- package/src/modules/customers/api/deals/map/route.ts +0 -1
- package/src/modules/customers/api/deals/route.ts +1 -50
- package/src/modules/customers/api/entity-roles-factory.ts +4 -8
- package/src/modules/customers/api/interactions/route.ts +2 -8
- package/src/modules/customers/api/interactions/tasks/route.ts +1 -24
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +4 -12
- package/src/modules/customers/api/people/[id]/companies/context.ts +1 -4
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +1 -4
- package/src/modules/customers/api/people/[id]/route.ts +11 -16
- package/src/modules/customers/api/people/check-phone/route.ts +10 -75
- package/src/modules/customers/api/todos/route.ts +2 -27
- package/src/modules/customers/backend/customers/companies/page.tsx +4 -7
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +2 -7
- package/src/modules/customers/backend/customers/deals/page.tsx +4 -10
- package/src/modules/customers/backend/customers/deals/pipeline/components/Lane.tsx +14 -5
- package/src/modules/customers/backend/customers/deals/pipeline/components/StatusFilterPopover.tsx +27 -109
- package/src/modules/customers/backend/customers/people/page.tsx +4 -7
- package/src/modules/customers/backend/hooks/useEmailDuplicateCheck.ts +4 -12
- package/src/modules/customers/commands/deals.ts +59 -34
- package/src/modules/customers/commands/interactions.ts +1 -1
- package/src/modules/customers/commands/personCompanyLinks.ts +8 -224
- package/src/modules/customers/components/CustomerTodosTable.tsx +0 -2
- 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 +2 -4
- package/src/modules/customers/components/calendar/editor/PeopleField.tsx +5 -61
- package/src/modules/customers/components/calendar/editor/hooks.ts +1 -7
- package/src/modules/customers/components/calendar/types.ts +2 -2
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +12 -7
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +4 -5
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +1 -8
- package/src/modules/customers/components/detail/DealForm.tsx +2 -22
- package/src/modules/customers/components/detail/DealsSection.tsx +5 -11
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +12 -58
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +1 -8
- package/src/modules/customers/components/detail/hooks/usePersonTasks.ts +14 -23
- 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 +5 -15
- package/src/modules/customers/data/entities.ts +1 -1
- package/src/modules/customers/data/validators.ts +9 -50
- package/src/modules/customers/events.ts +0 -5
- package/src/modules/customers/i18n/de.json +1 -9
- package/src/modules/customers/i18n/en.json +1 -9
- package/src/modules/customers/i18n/es.json +1 -9
- package/src/modules/customers/i18n/ko.json +1 -9
- package/src/modules/customers/i18n/pl.json +1 -9
- package/src/modules/customers/lib/calendar/conflicts.ts +2 -10
- package/src/modules/customers/lib/calendar/editorPayload.ts +3 -4
- package/src/modules/customers/lib/calendar/mapItem.ts +3 -8
- package/src/modules/customers/lib/dealStatus.ts +0 -42
- package/src/modules/customers/lib/findPeopleByAddresses.ts +6 -8
- package/src/modules/customers/lib/personCompanies.ts +1 -136
- package/src/modules/customers/lib/todoCompatibility.ts +1 -19
- 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 +0 -6
- package/src/modules/data_sync/AGENTS.md +1 -1
- package/src/modules/data_sync/backend/data-sync/page.tsx +1 -4
- package/src/modules/data_sync/lib/adapter.ts +0 -36
- package/src/modules/data_sync/lib/sync-engine.ts +5 -113
- package/src/modules/data_sync/workers/sync-export.ts +0 -4
- package/src/modules/data_sync/workers/sync-import.ts +0 -4
- package/src/modules/devices/AGENTS.md +1 -20
- package/src/modules/devices/acl.ts +1 -9
- package/src/modules/devices/api/admin/devices/[id]/route.ts +34 -5
- package/src/modules/devices/api/admin/devices/route.ts +1 -14
- package/src/modules/devices/api/deviceList.ts +11 -135
- package/src/modules/devices/api/openapi.ts +1 -9
- package/src/modules/devices/api/route.ts +1 -9
- package/src/modules/devices/backend/devices/[id]/page.tsx +32 -18
- package/src/modules/devices/backend/devices/create/page.tsx +1 -17
- package/src/modules/devices/backend/devices/page.tsx +45 -44
- package/src/modules/devices/i18n/de.json +2 -3
- package/src/modules/devices/i18n/en.json +2 -3
- package/src/modules/devices/i18n/es.json +2 -3
- package/src/modules/devices/i18n/ko.json +2 -3
- package/src/modules/devices/i18n/pl.json +2 -3
- package/src/modules/devices/setup.ts +2 -6
- package/src/modules/directory/backend/directory/organizations/page.tsx +1 -3
- package/src/modules/directory/backend/directory/tenants/page.tsx +1 -3
- package/src/modules/directory/di.ts +2 -14
- package/src/modules/directory/utils/organizationScope.ts +15 -4
- package/src/modules/entities/api/records.ts +0 -2
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +1 -4
- package/src/modules/eudr/api/plots/route.ts +0 -4
- package/src/modules/eudr/backend/eudr/evidence-submissions/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/evidence-submissions/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/page.meta.ts +2 -2
- package/src/modules/eudr/backend/eudr/plots/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/plots/[id]/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/plots/create/page.tsx +8 -2
- package/src/modules/eudr/backend/eudr/plots/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/plots/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/product-mappings/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/product-mappings/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/product-mappings/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/product-mappings/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/risk-assessments/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/risk-assessments/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/risk-assessments/page.tsx +0 -4
- package/src/modules/eudr/backend/eudr/statements/[id]/page.meta.ts +2 -0
- package/src/modules/eudr/backend/eudr/statements/[id]/page.tsx +2 -0
- package/src/modules/eudr/backend/eudr/statements/create/page.meta.ts +1 -0
- package/src/modules/eudr/backend/eudr/statements/page.meta.ts +4 -1
- package/src/modules/eudr/backend/eudr/statements/page.tsx +32 -30
- package/src/modules/eudr/commands/statements.ts +7 -2
- package/src/modules/eudr/components/crudErrorI18n.ts +31 -0
- package/src/modules/eudr/components/formConfig.tsx +9 -1
- package/src/modules/eudr/data/validators.ts +1 -16
- package/src/modules/eudr/i18n/de.json +3 -2
- package/src/modules/eudr/i18n/en.json +3 -2
- package/src/modules/eudr/i18n/es.json +3 -2
- package/src/modules/eudr/i18n/ko.json +3 -2
- package/src/modules/eudr/i18n/pl.json +3 -2
- package/src/modules/eudr/lib/statement-lifecycle.ts +8 -0
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +1 -2
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -2
- package/src/modules/feature_toggles/defaults.json +8 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +0 -4
- package/src/modules/inbox_ops/backend/inbox-ops/page.tsx +0 -4
- package/src/modules/inbox_ops/lib/htmlToPlainText.ts +17 -1
- package/src/modules/integrations/api/[id]/credentials/route.ts +4 -6
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +31 -61
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +9 -44
- package/src/modules/integrations/data/validators.ts +2 -12
- package/src/modules/integrations/i18n/de.json +0 -1
- package/src/modules/integrations/i18n/en.json +0 -1
- package/src/modules/integrations/i18n/es.json +0 -1
- package/src/modules/integrations/i18n/ko.json +0 -1
- package/src/modules/integrations/i18n/pl.json +0 -1
- package/src/modules/integrations/lib/credentials-masking.ts +6 -10
- package/src/modules/messages/api/[id]/route.ts +1 -55
- package/src/modules/messages/api/openapi.ts +0 -20
- package/src/modules/messages/api/route.ts +2 -31
- package/src/modules/messages/components/MessagesInboxPageClient.tsx +16 -9
- package/src/modules/messages/components/inboxFilters.ts +0 -36
- package/src/modules/messages/components/message-detail/hooks/useMessageDetailsConversation.ts +1 -14
- package/src/modules/messages/components/message-detail/panels/MessageHeader.tsx +1 -3
- package/src/modules/messages/components/message-detail/panels/thread-panel.tsx +1 -2
- package/src/modules/messages/components/message-detail/types.ts +0 -3
- package/src/modules/messages/components/messageListLabels.ts +3 -52
- package/src/modules/messages/data/validators.ts +4 -43
- package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +6 -4
- package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +1 -4
- package/src/modules/payment_gateways/lib/webhook-processor.ts +0 -11
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +0 -4
- package/src/modules/push_notifications/backend/push_notifications/page.tsx +1 -4
- package/src/modules/push_notifications/backend/push_notifications/send/page.tsx +4 -4
- package/src/modules/query_index/lib/engine.ts +61 -249
- package/src/modules/query_index/lib/search-tokens.ts +3 -135
- package/src/modules/resources/backend/resources/resource-types/page.tsx +1 -4
- package/src/modules/resources/backend/resources/resources/page.tsx +1 -4
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -4
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -4
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +8 -14
- package/src/modules/sales/commands/documents.ts +0 -93
- package/src/modules/sales/components/PriceWithCurrency.tsx +5 -17
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -4
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/ItemsSection.tsx +18 -56
- package/src/modules/sales/components/documents/LineItemDialog.tsx +21 -138
- package/src/modules/sales/components/documents/PaymentsSection.tsx +9 -20
- package/src/modules/sales/components/documents/ReturnsSection.tsx +5 -6
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +14 -106
- package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +5 -6
- package/src/modules/sales/components/documents/ShipmentDialog.tsx +4 -5
- package/src/modules/sales/components/documents/ShipmentsSection.tsx +5 -6
- package/src/modules/sales/components/documents/lineItemUtils.ts +2 -7
- package/src/modules/sales/data/entities.ts +0 -6
- package/src/modules/sales/extension-points.ts +0 -1
- package/src/modules/sales/i18n/de.json +37 -8
- package/src/modules/sales/i18n/en.json +37 -8
- package/src/modules/sales/i18n/es.json +37 -8
- package/src/modules/sales/i18n/ko.json +37 -8
- package/src/modules/sales/i18n/pl.json +37 -8
- package/src/modules/sales/migrations/.snapshot-open-mercato.json +0 -60
- package/src/modules/sales/setup.ts +0 -2
- package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +42 -2
- package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +1 -9
- package/src/modules/sales/widgets/injection-table.ts +7 -4
- package/src/modules/staff/backend/staff/leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/my-leave-requests/page.tsx +0 -4
- package/src/modules/staff/backend/staff/team-members/page.tsx +0 -6
- package/src/modules/staff/backend/staff/team-roles/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +0 -4
- package/src/modules/staff/backend/staff/teams/page.tsx +0 -4
- package/src/modules/staff/backend/staff/timesheets/page.tsx +1 -12
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +0 -4
- package/src/modules/sync_excel/lib/adapters/customers.ts +0 -5
- 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 +9 -12
- package/src/modules/warranty_claims/backend/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +0 -4
- package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +0 -4
- package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +0 -4
- package/src/modules/wms/api/warehouses/route.ts +9 -13
- package/src/modules/wms/api/zones/route.ts +0 -16
- package/src/modules/wms/commands/configuration.ts +10 -159
- package/src/modules/wms/commands/inventory-actions.ts +0 -3
- package/src/modules/wms/commands/shared.ts +0 -17
- package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +141 -95
- package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +30 -26
- package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +21 -17
- package/src/modules/wms/components/backend/WmsLotsListPage.tsx +0 -2
- package/src/modules/wms/components/backend/WmsOperationalDashboardPage.tsx +17 -13
- package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +16 -12
- package/src/modules/wms/components/backend/inventoryMutationLoaders.ts +20 -36
- package/src/modules/wms/i18n/de.json +0 -2
- package/src/modules/wms/i18n/en.json +0 -2
- package/src/modules/wms/i18n/es.json +0 -2
- package/src/modules/wms/i18n/ko.json +0 -2
- package/src/modules/wms/i18n/pl.json +0 -2
- package/src/modules/workflows/backend/definitions/page.tsx +1 -4
- package/src/modules/workflows/backend/events/page.tsx +1 -4
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/page.tsx +1 -4
- package/src/modules/workflows/lib/activity-executor.ts +0 -9
- package/dist/modules/api_keys/di.js +0 -9
- package/dist/modules/api_keys/di.js.map +0 -7
- package/dist/modules/api_keys/services/principalService.js +0 -31
- package/dist/modules/api_keys/services/principalService.js.map +0 -7
- package/dist/modules/attachments/lib/attachment-service.js +0 -313
- package/dist/modules/attachments/lib/attachment-service.js.map +0 -7
- package/dist/modules/auth/api/reset/validate.js +0 -55
- package/dist/modules/auth/api/reset/validate.js.map +0 -7
- package/dist/modules/auth/commands/acl.js +0 -254
- package/dist/modules/auth/commands/acl.js.map +0 -7
- package/dist/modules/auth/lib/userIdFilter.js +0 -16
- package/dist/modules/auth/lib/userIdFilter.js.map +0 -7
- package/dist/modules/auth/services/principalService.js +0 -200
- package/dist/modules/auth/services/principalService.js.map +0 -7
- package/dist/modules/auth/services/roleOrganizationScope.js +0 -41
- package/dist/modules/auth/services/roleOrganizationScope.js.map +0 -7
- package/dist/modules/communication_channels/lib/outbound-recipient.js +0 -33
- package/dist/modules/communication_channels/lib/outbound-recipient.js.map +0 -7
- package/dist/modules/communication_channels/lib/resolve-channel-type.js +0 -51
- package/dist/modules/communication_channels/lib/resolve-channel-type.js.map +0 -7
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js +0 -18
- package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map +0 -7
- package/dist/modules/customers/lib/calendar/participantIdentity.js +0 -9
- package/dist/modules/customers/lib/calendar/participantIdentity.js.map +0 -7
- package/dist/modules/customers/lib/closureStage.js +0 -45
- package/dist/modules/customers/lib/closureStage.js.map +0 -7
- package/dist/modules/customers/lib/detailReadAccess.js +0 -12
- package/dist/modules/customers/lib/detailReadAccess.js.map +0 -7
- package/dist/modules/data_sync/lib/abandoned-run.js +0 -19
- package/dist/modules/data_sync/lib/abandoned-run.js.map +0 -7
- package/dist/modules/devices/api/deviceSerialization.js +0 -46
- package/dist/modules/devices/api/deviceSerialization.js.map +0 -7
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js +0 -34
- package/dist/modules/devices/backend/devices/useDeviceUserLabels.js.map +0 -7
- package/dist/modules/devices/backend/devices/userOptions.js +0 -52
- package/dist/modules/devices/backend/devices/userOptions.js.map +0 -7
- package/dist/modules/directory/services/organizationHierarchyService.js +0 -29
- package/dist/modules/directory/services/organizationHierarchyService.js.map +0 -7
- package/dist/modules/directory/services/organizationScopeService.js +0 -56
- package/dist/modules/directory/services/organizationScopeService.js.map +0 -7
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js +0 -55
- package/dist/modules/integrations/backend/integrations/credential-secret-fields.js.map +0 -7
- package/dist/modules/messages/lib/channel-sender-identity.js +0 -26
- package/dist/modules/messages/lib/channel-sender-identity.js.map +0 -7
- package/dist/modules/messages/lib/composeSourceChannelType.js +0 -41
- package/dist/modules/messages/lib/composeSourceChannelType.js.map +0 -7
- package/dist/modules/query_index/lib/search-entity-policy.js +0 -14
- package/dist/modules/query_index/lib/search-entity-policy.js.map +0 -7
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js +0 -54
- package/dist/modules/sales/components/documents/lineItemShipmentLock.js.map +0 -7
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js +0 -33
- package/dist/modules/sales/lib/salesChannelsToggleSeed.js.map +0 -7
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js +0 -32
- package/dist/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.js.map +0 -7
- package/dist/modules/wms/api/warehouseSearch.js +0 -21
- package/dist/modules/wms/api/warehouseSearch.js.map +0 -7
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js +0 -158
- package/dist/modules/wms/components/backend/WarehouseEditDialog.js.map +0 -7
- package/dist/modules/wms/components/backend/warehouseFormOptions.js +0 -66
- package/dist/modules/wms/components/backend/warehouseFormOptions.js.map +0 -7
- package/src/modules/api_keys/di.ts +0 -7
- package/src/modules/api_keys/services/principalService.ts +0 -33
- package/src/modules/attachments/lib/attachment-service.ts +0 -468
- package/src/modules/auth/api/reset/validate.ts +0 -57
- package/src/modules/auth/commands/acl.ts +0 -495
- package/src/modules/auth/lib/userIdFilter.ts +0 -31
- package/src/modules/auth/services/principalService.ts +0 -266
- package/src/modules/auth/services/roleOrganizationScope.ts +0 -70
- package/src/modules/communication_channels/lib/outbound-recipient.ts +0 -71
- package/src/modules/communication_channels/lib/resolve-channel-type.ts +0 -99
- package/src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts +0 -21
- package/src/modules/customers/lib/calendar/participantIdentity.ts +0 -17
- package/src/modules/customers/lib/closureStage.ts +0 -76
- package/src/modules/customers/lib/detailReadAccess.ts +0 -35
- package/src/modules/data_sync/lib/abandoned-run.ts +0 -56
- package/src/modules/devices/api/deviceSerialization.ts +0 -50
- package/src/modules/devices/backend/devices/useDeviceUserLabels.ts +0 -45
- package/src/modules/devices/backend/devices/userOptions.ts +0 -99
- package/src/modules/directory/services/organizationHierarchyService.ts +0 -34
- package/src/modules/directory/services/organizationScopeService.ts +0 -85
- package/src/modules/integrations/backend/integrations/credential-secret-fields.ts +0 -84
- package/src/modules/messages/lib/channel-sender-identity.ts +0 -55
- package/src/modules/messages/lib/composeSourceChannelType.ts +0 -95
- package/src/modules/query_index/lib/search-entity-policy.ts +0 -46
- package/src/modules/sales/components/documents/lineItemShipmentLock.ts +0 -74
- package/src/modules/sales/lib/salesChannelsToggleSeed.ts +0 -42
- package/src/modules/sales/migrations/Migration20260821120000_sales_notes_addresses_context_idx.ts +0 -87
- package/src/modules/wms/api/warehouseSearch.ts +0 -23
- package/src/modules/wms/components/backend/WarehouseEditDialog.tsx +0 -216
- package/src/modules/wms/components/backend/warehouseFormOptions.ts +0 -72
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
const MAX_OUTBOUND_RECIPIENT_LENGTH = 320;
|
|
3
|
-
const emailRecipientSchema = z.string().email();
|
|
4
|
-
const PROVIDER_NATIVE_ALLOWED = /^[A-Za-z0-9._:@+-]+$/;
|
|
5
|
-
function validateOutboundRecipient(recipient, capabilities) {
|
|
6
|
-
if (typeof recipient !== "string" || recipient.length === 0) {
|
|
7
|
-
return { ok: false, error: "Recipient is required" };
|
|
8
|
-
}
|
|
9
|
-
if (recipient.length > MAX_OUTBOUND_RECIPIENT_LENGTH) {
|
|
10
|
-
return {
|
|
11
|
-
ok: false,
|
|
12
|
-
error: `Recipient must be at most ${MAX_OUTBOUND_RECIPIENT_LENGTH} characters`
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
if (capabilities?.recipientFormat !== "provider-native") {
|
|
16
|
-
return emailRecipientSchema.safeParse(recipient).success ? { ok: true } : { ok: false, error: "Recipient must be a valid email address" };
|
|
17
|
-
}
|
|
18
|
-
if (!PROVIDER_NATIVE_ALLOWED.test(recipient)) {
|
|
19
|
-
return {
|
|
20
|
-
ok: false,
|
|
21
|
-
error: "Recipient may only contain letters, digits, and the characters . _ : @ + -"
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
if (recipient.includes("..")) {
|
|
25
|
-
return { ok: false, error: 'Recipient must not contain ".."' };
|
|
26
|
-
}
|
|
27
|
-
return { ok: true };
|
|
28
|
-
}
|
|
29
|
-
export {
|
|
30
|
-
MAX_OUTBOUND_RECIPIENT_LENGTH,
|
|
31
|
-
validateOutboundRecipient
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=outbound-recipient.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/communication_channels/lib/outbound-recipient.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport type { ChannelCapabilities } from './adapter'\n\n/**\n * Upper bound shared by both recipient shapes. 320 is the RFC 5321 maximum for\n * an email address (64 local + `@` + 255 domain); provider-native identifiers\n * are far shorter, so one ceiling covers both.\n */\nexport const MAX_OUTBOUND_RECIPIENT_LENGTH = 320\n\nconst emailRecipientSchema = z.string().email()\n\n/**\n * Characters a provider-native recipient may contain. This is an allowlist, not a\n * denylist, because the recipient reaches adapters that interpolate it into a REST\n * path (Discord posts to `/channels/{recipient}/messages`), and a denylist fails\n * open on every character nobody thought of \u2014 percent-encoded separators\n * (`%2F`, `%2e%2e%2f`) and control bytes (NUL, DEL) all walked through the\n * previous `[\\r\\n\\s/\\\\?#]` class. An allowlist fails closed instead: the worst\n * case is a provider whose identifier alphabet needs widening, which is a\n * reviewable one-line change rather than a silent path-steering primitive.\n *\n * The set covers every provider-native identifier shape the hub has to carry\n * today \u2014 Discord snowflakes (digits), Slack-style ids (alphanumerics), and email\n * addresses, since `'provider-native'` must never narrow what `'email'` accepts.\n */\nconst PROVIDER_NATIVE_ALLOWED = /^[A-Za-z0-9._:@+-]+$/\n\nexport type OutboundRecipientCheck = { ok: true } | { ok: false; error: string }\n\n/**\n * Validate an outbound recipient against the provider's declared recipient\n * shape.\n *\n * The hub used to hard-wire `z.string().email()` on every outbound endpoint,\n * which left providers whose recipients are not email addresses with no product\n * path to send at all (#4976). Validation now follows the adapter's\n * `capabilities.recipientFormat`, defaulting to `'email'` so every existing\n * provider keeps byte-identical behavior.\n */\nexport function validateOutboundRecipient(\n recipient: unknown,\n capabilities: Pick<ChannelCapabilities, 'recipientFormat'> | null | undefined,\n): OutboundRecipientCheck {\n if (typeof recipient !== 'string' || recipient.length === 0) {\n return { ok: false, error: 'Recipient is required' }\n }\n if (recipient.length > MAX_OUTBOUND_RECIPIENT_LENGTH) {\n return {\n ok: false,\n error: `Recipient must be at most ${MAX_OUTBOUND_RECIPIENT_LENGTH} characters`,\n }\n }\n if (capabilities?.recipientFormat !== 'provider-native') {\n return emailRecipientSchema.safeParse(recipient).success\n ? { ok: true }\n : { ok: false, error: 'Recipient must be a valid email address' }\n }\n if (!PROVIDER_NATIVE_ALLOWED.test(recipient)) {\n return {\n ok: false,\n error: 'Recipient may only contain letters, digits, and the characters . _ : @ + -',\n }\n }\n // `.` is allowed (email addresses need it), so traversal still has to be\n // rejected explicitly even though the separators it would need are not.\n if (recipient.includes('..')) {\n return { ok: false, error: 'Recipient must not contain \"..\"' }\n }\n return { ok: true }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAQX,MAAM,gCAAgC;AAE7C,MAAM,uBAAuB,EAAE,OAAO,EAAE,MAAM;AAgB9C,MAAM,0BAA0B;AAczB,SAAS,0BACd,WACA,cACwB;AACxB,MAAI,OAAO,cAAc,YAAY,UAAU,WAAW,GAAG;AAC3D,WAAO,EAAE,IAAI,OAAO,OAAO,wBAAwB;AAAA,EACrD;AACA,MAAI,UAAU,SAAS,+BAA+B;AACpD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,6BAA6B,6BAA6B;AAAA,IACnE;AAAA,EACF;AACA,MAAI,cAAc,oBAAoB,mBAAmB;AACvD,WAAO,qBAAqB,UAAU,SAAS,EAAE,UAC7C,EAAE,IAAI,KAAK,IACX,EAAE,IAAI,OAAO,OAAO,0CAA0C;AAAA,EACpE;AACA,MAAI,CAAC,wBAAwB,KAAK,SAAS,GAAG;AAC5C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,UAAU,SAAS,IAAI,GAAG;AAC5B,WAAO,EAAE,IAAI,OAAO,OAAO,kCAAkC;AAAA,EAC/D;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
2
|
-
import { createLogger } from "@open-mercato/shared/lib/logger";
|
|
3
|
-
import { CommunicationChannel, ExternalConversation, MessageChannelLink } from "../data/entities.js";
|
|
4
|
-
const logger = createLogger("communication_channels").child({ component: "resolve-channel-type" });
|
|
5
|
-
async function resolveChannelType(container, scope, reference) {
|
|
6
|
-
const em = container.resolve("em").fork();
|
|
7
|
-
const dscope = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null };
|
|
8
|
-
const baseFilter = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null };
|
|
9
|
-
let externalConversationId = reference.externalConversationId ?? null;
|
|
10
|
-
if (!externalConversationId && reference.messageId) {
|
|
11
|
-
const link = await findOneWithDecryption(
|
|
12
|
-
em,
|
|
13
|
-
MessageChannelLink,
|
|
14
|
-
{ messageId: reference.messageId, ...baseFilter },
|
|
15
|
-
void 0,
|
|
16
|
-
dscope
|
|
17
|
-
);
|
|
18
|
-
if (link?.channelType) return link.channelType;
|
|
19
|
-
externalConversationId = link?.externalConversationId ?? null;
|
|
20
|
-
}
|
|
21
|
-
if (!externalConversationId) return null;
|
|
22
|
-
const conversation = await findOneWithDecryption(
|
|
23
|
-
em,
|
|
24
|
-
ExternalConversation,
|
|
25
|
-
{ id: externalConversationId, ...baseFilter },
|
|
26
|
-
void 0,
|
|
27
|
-
dscope
|
|
28
|
-
);
|
|
29
|
-
if (!conversation?.channelId) return null;
|
|
30
|
-
const channel = await findOneWithDecryption(
|
|
31
|
-
em,
|
|
32
|
-
CommunicationChannel,
|
|
33
|
-
{ id: conversation.channelId, ...baseFilter, deletedAt: null },
|
|
34
|
-
void 0,
|
|
35
|
-
dscope
|
|
36
|
-
);
|
|
37
|
-
return channel?.channelType ?? null;
|
|
38
|
-
}
|
|
39
|
-
async function resolveChannelTypeSafely(container, scope, reference) {
|
|
40
|
-
try {
|
|
41
|
-
return await resolveChannelType(container, scope, reference);
|
|
42
|
-
} catch (err) {
|
|
43
|
-
logger.warn("channel type resolution failed, treating the channel as unknown", { err });
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export {
|
|
48
|
-
resolveChannelType,
|
|
49
|
-
resolveChannelTypeSafely
|
|
50
|
-
};
|
|
51
|
-
//# sourceMappingURL=resolve-channel-type.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/communication_channels/lib/resolve-channel-type.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AppContainer } from '@open-mercato/shared/lib/di/container'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { CommunicationChannel, ExternalConversation, MessageChannelLink } from '../data/entities'\n\nconst logger = createLogger('communication_channels').child({ component: 'resolve-channel-type' })\n\nexport type ChannelTypeScope = {\n tenantId: string\n organizationId: string | null\n}\n\nexport type ChannelTypeReference = {\n /** `ExternalConversation.id`, as carried by a message's `sourceEntityId`. */\n externalConversationId?: string | null\n /** A platform `messages.message` id that may be linked to a channel. */\n messageId?: string | null\n}\n\n/**\n * Resolve the channel type behind a platform message or conversation (#4975).\n *\n * Cross-module callers (the `messages` compose route) need to know whether an\n * external correspondent is reachable by email before validating a compose\n * payload, but `messages` may not reach into this module's entities. They\n * resolve this facade from DI instead \u2014 mirroring `communicationChannelsSendAsUser`\n * \u2014 and treat a `null` result as \"unknown\", which the messages validator\n * handles fail-closed.\n *\n * Always tenant/organization scoped: a reference that does not resolve inside\n * the caller's scope is reported as unknown rather than looked up globally.\n */\nexport async function resolveChannelType(\n container: AppContainer,\n scope: ChannelTypeScope,\n reference: ChannelTypeReference,\n): Promise<string | null> {\n const em = (container.resolve('em') as EntityManager).fork()\n const dscope = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null }\n const baseFilter = { tenantId: scope.tenantId, organizationId: scope.organizationId ?? null }\n\n let externalConversationId = reference.externalConversationId ?? null\n\n if (!externalConversationId && reference.messageId) {\n // The message is linked to a channel directly \u2014 `MessageChannelLink` carries\n // a denormalized channel type, so this is the cheapest hop when it exists.\n const link = await findOneWithDecryption(\n em,\n MessageChannelLink,\n { messageId: reference.messageId, ...baseFilter },\n undefined,\n dscope,\n )\n if (link?.channelType) return link.channelType\n externalConversationId = link?.externalConversationId ?? null\n }\n\n if (!externalConversationId) return null\n\n const conversation = await findOneWithDecryption(\n em,\n ExternalConversation,\n { id: externalConversationId, ...baseFilter },\n undefined,\n dscope,\n )\n if (!conversation?.channelId) return null\n\n const channel = await findOneWithDecryption(\n em,\n CommunicationChannel,\n { id: conversation.channelId, ...baseFilter, deletedAt: null },\n undefined,\n dscope,\n )\n return channel?.channelType ?? null\n}\n\n/**\n * Same contract, but never throws: a lookup failure degrades to \"unknown\" so a\n * transient database error cannot turn into a 500 on an otherwise valid compose.\n * Unknown is the safe answer \u2014 the messages validator fails closed on it.\n */\nexport async function resolveChannelTypeSafely(\n container: AppContainer,\n scope: ChannelTypeScope,\n reference: ChannelTypeReference,\n): Promise<string | null> {\n try {\n return await resolveChannelType(container, scope, reference)\n } catch (err) {\n logger.warn('channel type resolution failed, treating the channel as unknown', { err })\n return null\n }\n}\n\n/** DI service type for cross-module callers (resolve `communicationChannelsResolveChannelType`). */\nexport type ResolveChannelTypeService = typeof resolveChannelTypeSafely\n"],
|
|
5
|
-
"mappings": "AAEA,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB,sBAAsB,0BAA0B;AAE/E,MAAM,SAAS,aAAa,wBAAwB,EAAE,MAAM,EAAE,WAAW,uBAAuB,CAAC;AA2BjG,eAAsB,mBACpB,WACA,OACA,WACwB;AACxB,QAAM,KAAM,UAAU,QAAQ,IAAI,EAAoB,KAAK;AAC3D,QAAM,SAAS,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,kBAAkB,KAAK;AACxF,QAAM,aAAa,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,kBAAkB,KAAK;AAE5F,MAAI,yBAAyB,UAAU,0BAA0B;AAEjE,MAAI,CAAC,0BAA0B,UAAU,WAAW;AAGlD,UAAM,OAAO,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA,EAAE,WAAW,UAAU,WAAW,GAAG,WAAW;AAAA,MAChD;AAAA,MACA;AAAA,IACF;AACA,QAAI,MAAM,YAAa,QAAO,KAAK;AACnC,6BAAyB,MAAM,0BAA0B;AAAA,EAC3D;AAEA,MAAI,CAAC,uBAAwB,QAAO;AAEpC,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,IACA,EAAE,IAAI,wBAAwB,GAAG,WAAW;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,cAAc,UAAW,QAAO;AAErC,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA,EAAE,IAAI,aAAa,WAAW,GAAG,YAAY,WAAW,KAAK;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AACA,SAAO,SAAS,eAAe;AACjC;AAOA,eAAsB,yBACpB,WACA,OACA,WACwB;AACxB,MAAI;AACF,WAAO,MAAM,mBAAmB,WAAW,OAAO,SAAS;AAAA,EAC7D,SAAS,KAAK;AACZ,WAAO,KAAK,mEAAmE,EAAE,IAAI,CAAC;AACtF,WAAO;AAAA,EACT;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
const TONE_DOT_CLASS = {
|
|
2
|
-
success: "bg-status-success-icon",
|
|
3
|
-
error: "bg-status-error-icon",
|
|
4
|
-
warning: "bg-status-warning-icon",
|
|
5
|
-
info: "bg-status-info-icon",
|
|
6
|
-
neutral: "bg-status-neutral-icon",
|
|
7
|
-
brand: "bg-brand-violet",
|
|
8
|
-
pink: "bg-status-pink-icon"
|
|
9
|
-
};
|
|
10
|
-
function toneToDotClass(tone, fallback = "bg-status-neutral-icon") {
|
|
11
|
-
if (tone && tone in TONE_DOT_CLASS) return TONE_DOT_CLASS[tone];
|
|
12
|
-
return fallback;
|
|
13
|
-
}
|
|
14
|
-
export {
|
|
15
|
-
TONE_DOT_CLASS,
|
|
16
|
-
toneToDotClass
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=toneClasses.js.map
|
package/dist/modules/customers/backend/customers/deals/pipeline/components/toneClasses.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../../src/modules/customers/backend/customers/deals/pipeline/components/toneClasses.ts"],
|
|
4
|
-
"sourcesContent": ["import type { FilterOptionTone } from '@open-mercato/shared/lib/query/advanced-filter'\n\n// Saturated icon tokens shared by the kanban lane accent bar and the status filter\n// pills, so both surfaces render the same tone identically (#5107 review).\nexport const TONE_DOT_CLASS: Record<FilterOptionTone, string> = {\n success: 'bg-status-success-icon',\n error: 'bg-status-error-icon',\n warning: 'bg-status-warning-icon',\n info: 'bg-status-info-icon',\n neutral: 'bg-status-neutral-icon',\n brand: 'bg-brand-violet',\n pink: 'bg-status-pink-icon',\n}\n\nexport function toneToDotClass(\n tone: FilterOptionTone | null | undefined,\n fallback = 'bg-status-neutral-icon',\n): string {\n if (tone && tone in TONE_DOT_CLASS) return TONE_DOT_CLASS[tone]\n return fallback\n}\n"],
|
|
5
|
-
"mappings": "AAIO,MAAM,iBAAmD;AAAA,EAC9D,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AACR;AAEO,SAAS,eACd,MACA,WAAW,0BACH;AACR,MAAI,QAAQ,QAAQ,eAAgB,QAAO,eAAe,IAAI;AAC9D,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
function participantActorKey(participant) {
|
|
2
|
-
if (participant.userId) return `user:${participant.userId}`;
|
|
3
|
-
const email = participant.email?.trim().toLowerCase();
|
|
4
|
-
return email ? `email:${email}` : null;
|
|
5
|
-
}
|
|
6
|
-
export {
|
|
7
|
-
participantActorKey
|
|
8
|
-
};
|
|
9
|
-
//# sourceMappingURL=participantIdentity.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/customers/lib/calendar/participantIdentity.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * The one canonical actor key for a calendar participant.\n *\n * A staff/customer attendee is identified by `userId`. An external guest has no\n * record in the system, so the normalized email is the only stable identity it\n * carries. Mapping, dedupe, conflict detection and the editor's conflict-probe\n * dependency key all derive their key from here, so a guest is treated as the\n * same actor across events instead of dropping out of actor comparisons.\n *\n * Returns `null` for a participant with neither \u2014 such a participant cannot be\n * compared to any other and must never collide with one that can.\n */\nexport function participantActorKey(participant: { userId?: string; email?: string }): string | null {\n if (participant.userId) return `user:${participant.userId}`\n const email = participant.email?.trim().toLowerCase()\n return email ? `email:${email}` : null\n}\n"],
|
|
5
|
-
"mappings": "AAYO,SAAS,oBAAoB,aAAiE;AACnG,MAAI,YAAY,OAAQ,QAAO,QAAQ,YAAY,MAAM;AACzD,QAAM,QAAQ,YAAY,OAAO,KAAK,EAAE,YAAY;AACpD,SAAO,QAAQ,SAAS,KAAK,KAAK;AACpC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
2
|
-
import { CustomerPipelineStage } from "../data/entities.js";
|
|
3
|
-
const TERMINAL_PIPELINE_STAGE_LABELS = {
|
|
4
|
-
won: /* @__PURE__ */ new Set(["won", "win", "closed won", "closed win"]),
|
|
5
|
-
lost: /* @__PURE__ */ new Set(["lost", "loose", "closed lost", "closed loose"])
|
|
6
|
-
};
|
|
7
|
-
function dealClosureOutcomeFromStatus(status) {
|
|
8
|
-
const normalized = typeof status === "string" ? status.trim().toLowerCase() : status;
|
|
9
|
-
if (normalized === "win" || normalized === "won") return "won";
|
|
10
|
-
if (normalized === "loose" || normalized === "lost") return "lost";
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
function normalizePipelineStageLabel(value) {
|
|
14
|
-
return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
15
|
-
}
|
|
16
|
-
async function loadClosurePipelineStageSnapshot(em, input) {
|
|
17
|
-
if (!input.pipelineId) return null;
|
|
18
|
-
const stages = await findWithDecryption(
|
|
19
|
-
em,
|
|
20
|
-
CustomerPipelineStage,
|
|
21
|
-
{
|
|
22
|
-
pipelineId: input.pipelineId,
|
|
23
|
-
tenantId: input.tenantId,
|
|
24
|
-
organizationId: input.organizationId
|
|
25
|
-
},
|
|
26
|
-
{ orderBy: { order: "ASC" } },
|
|
27
|
-
{ tenantId: input.tenantId, organizationId: input.organizationId }
|
|
28
|
-
);
|
|
29
|
-
const aliases = TERMINAL_PIPELINE_STAGE_LABELS[input.closureOutcome];
|
|
30
|
-
const stage = stages.find((candidate) => aliases.has(normalizePipelineStageLabel(candidate.label)));
|
|
31
|
-
if (!stage) return null;
|
|
32
|
-
return {
|
|
33
|
-
id: stage.id,
|
|
34
|
-
pipelineId: stage.pipelineId,
|
|
35
|
-
label: stage.label,
|
|
36
|
-
order: stage.order
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export {
|
|
40
|
-
TERMINAL_PIPELINE_STAGE_LABELS,
|
|
41
|
-
dealClosureOutcomeFromStatus,
|
|
42
|
-
loadClosurePipelineStageSnapshot,
|
|
43
|
-
normalizePipelineStageLabel
|
|
44
|
-
};
|
|
45
|
-
//# sourceMappingURL=closureStage.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/customers/lib/closureStage.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { CustomerPipelineStage } from '../data/entities'\n\nexport type DealClosureOutcome = 'won' | 'lost'\n\nexport type PipelineStageSnapshot = {\n id: string\n pipelineId: string\n label: string\n order: number\n}\n\n// Stage labels that mark a pipeline as terminal for a given closure outcome. Matching is\n// label-based because stages are tenant-configurable rows; see #5107.\nexport const TERMINAL_PIPELINE_STAGE_LABELS: Record<DealClosureOutcome, ReadonlySet<string>> = {\n won: new Set(['won', 'win', 'closed won', 'closed win']),\n lost: new Set(['lost', 'loose', 'closed lost', 'closed loose']),\n}\n\n/**\n * Map a deal status spelling (UI `win`/`loose` or AI `won`/`lost`) to its closure\n * outcome. Case-insensitive because callers such as the AI tool pass free-form model\n * text through, while every persisted status is lower-case.\n */\nexport function dealClosureOutcomeFromStatus(status: string | null | undefined): DealClosureOutcome | null {\n const normalized = typeof status === 'string' ? status.trim().toLowerCase() : status\n if (normalized === 'win' || normalized === 'won') return 'won'\n if (normalized === 'loose' || normalized === 'lost') return 'lost'\n return null\n}\n\nexport function normalizePipelineStageLabel(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, ' ')\n .trim()\n}\n\n/**\n * Resolve the terminal stage of the deal's pipeline for a closure outcome, so every\n * writer (command, AI tool preview) agrees on where a closed deal lands (#5107).\n */\nexport async function loadClosurePipelineStageSnapshot(\n em: EntityManager,\n input: {\n pipelineId: string | null\n closureOutcome: DealClosureOutcome\n tenantId: string\n organizationId: string\n },\n): Promise<PipelineStageSnapshot | null> {\n if (!input.pipelineId) return null\n\n const stages = await findWithDecryption(\n em,\n CustomerPipelineStage,\n {\n pipelineId: input.pipelineId,\n tenantId: input.tenantId,\n organizationId: input.organizationId,\n },\n { orderBy: { order: 'ASC' } },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n const aliases = TERMINAL_PIPELINE_STAGE_LABELS[input.closureOutcome]\n const stage = stages.find((candidate) => aliases.has(normalizePipelineStageLabel(candidate.label)))\n if (!stage) return null\n return {\n id: stage.id,\n pipelineId: stage.pipelineId,\n label: stage.label,\n order: stage.order,\n }\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AAa/B,MAAM,iCAAkF;AAAA,EAC7F,KAAK,oBAAI,IAAI,CAAC,OAAO,OAAO,cAAc,YAAY,CAAC;AAAA,EACvD,MAAM,oBAAI,IAAI,CAAC,QAAQ,SAAS,eAAe,cAAc,CAAC;AAChE;AAOO,SAAS,6BAA6B,QAA8D;AACzG,QAAM,aAAa,OAAO,WAAW,WAAW,OAAO,KAAK,EAAE,YAAY,IAAI;AAC9E,MAAI,eAAe,SAAS,eAAe,MAAO,QAAO;AACzD,MAAI,eAAe,WAAW,eAAe,OAAQ,QAAO;AAC5D,SAAO;AACT;AAEO,SAAS,4BAA4B,OAAuB;AACjE,SAAO,MACJ,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,KAAK;AACV;AAMA,eAAsB,iCACpB,IACA,OAMuC;AACvC,MAAI,CAAC,MAAM,WAAY,QAAO;AAE9B,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,IACxB;AAAA,IACA,EAAE,SAAS,EAAE,OAAO,MAAM,EAAE;AAAA,IAC5B,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe;AAAA,EACnE;AACA,QAAM,UAAU,+BAA+B,MAAM,cAAc;AACnE,QAAM,QAAQ,OAAO,KAAK,CAAC,cAAc,QAAQ,IAAI,4BAA4B,UAAU,KAAK,CAAC,CAAC;AAClG,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,YAAY,MAAM;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,EACf;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { NextResponse } from "next/server";
|
|
2
|
-
import {
|
|
3
|
-
isOrganizationReadAccessAllowed
|
|
4
|
-
} from "@open-mercato/core/modules/directory/utils/organizationScopeGuard";
|
|
5
|
-
function denyCustomerDetailReadAsNotFound(input, notFoundMessage) {
|
|
6
|
-
if (isOrganizationReadAccessAllowed(input)) return null;
|
|
7
|
-
return NextResponse.json({ error: notFoundMessage }, { status: 404 });
|
|
8
|
-
}
|
|
9
|
-
export {
|
|
10
|
-
denyCustomerDetailReadAsNotFound
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=detailReadAccess.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/customers/lib/detailReadAccess.ts"],
|
|
4
|
-
"sourcesContent": ["import { NextResponse } from 'next/server'\nimport {\n isOrganizationReadAccessAllowed,\n type OrganizationReadAccessInput,\n} from '@open-mercato/core/modules/directory/utils/organizationScopeGuard'\n\n/**\n * Single-record customers detail routes (person / company / deal) must not leak\n * whether a record exists through the organization-scope check.\n *\n * The API dispatcher already enforces each route's `metadata.requireFeatures`\n * before the handler runs, returning a uniform `403` for callers who lack the\n * grant \u2014 so that path never distinguishes an existing id from a missing one.\n * The only remaining existence signal is the *post-load* organization guard: a\n * caller who holds the feature but whose scope excludes the record's\n * organization previously received `403` (record exists in another org) while a\n * non-existent id received `404`. That 403-vs-404 split is an existence oracle\n * (issue #5504).\n *\n * Collapse the organization-scope denial into the route's own not-found\n * response so an out-of-scope caller cannot tell \"exists in an organization you\n * cannot see\" from \"does not exist\" \u2014 the shape the api_keys hardening\n * (#4033 / PR-4051) established. Sharing this decision keeps the three customers\n * detail routes from drifting apart again.\n *\n * @returns the `404` response to return when read access is denied, or `null`\n * when the caller may read the record.\n */\nexport function denyCustomerDetailReadAsNotFound(\n input: OrganizationReadAccessInput,\n notFoundMessage: string,\n): NextResponse | null {\n if (isOrganizationReadAccessAllowed(input)) return null\n return NextResponse.json({ error: notFoundMessage }, { status: 404 })\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,OAEK;AAwBA,SAAS,iCACd,OACA,iBACqB;AACrB,MAAI,gCAAgC,KAAK,EAAG,QAAO;AACnD,SAAO,aAAa,KAAK,EAAE,OAAO,gBAAgB,GAAG,EAAE,QAAQ,IAAI,CAAC;AACtE;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
async function failAbandonedRun(payload, info) {
|
|
2
|
-
const data = payload;
|
|
3
|
-
const runId = data?.payload?.runId;
|
|
4
|
-
const scope = data?.payload?.scope;
|
|
5
|
-
if (typeof runId !== "string" || typeof scope?.organizationId !== "string" || typeof scope?.tenantId !== "string") return;
|
|
6
|
-
const runScope = { organizationId: scope.organizationId, tenantId: scope.tenantId };
|
|
7
|
-
const errorMessage = `the queue abandoned this run's job without running it: ${info.reason}`;
|
|
8
|
-
const { createRequestContainer } = await import("@open-mercato/shared/lib/di/container");
|
|
9
|
-
const container = await createRequestContainer();
|
|
10
|
-
const runService = container.resolve("dataSyncRunService");
|
|
11
|
-
const run = await runService.markStatus(runId, "failed", runScope, errorMessage);
|
|
12
|
-
if (!run?.progressJobId) return;
|
|
13
|
-
const progressService = container.resolve("progressService");
|
|
14
|
-
await progressService.failJob(run.progressJobId, { errorMessage }, runScope);
|
|
15
|
-
}
|
|
16
|
-
export {
|
|
17
|
-
failAbandonedRun
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=abandoned-run.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/data_sync/lib/abandoned-run.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AbandonedJobInfo } from '@open-mercato/queue'\n\n/**\n * Fail the run behind a job the queue gave up on.\n *\n * A resumable data_sync job is ONE long-lived job for a whole run \u2014 `runImport` is entered once and\n * stays there for the duration, which for a full backfill is days. Every worker death (a deploy, an\n * OOM) therefore stalls that job, and BullMQ's stalled counter is cumulative for the job's life:\n * past `DATA_SYNC_MAX_STALLED_COUNT` it writes a deferred failure and the next worker fails the job\n * BEFORE calling the processor.\n *\n * So `runImport` never runs, never throws, and never finalizes \u2014 and `sync_runs` is left saying\n * `running` for a run nothing is running, forever. That is the residual state `queue-policy.ts`\n * describes as what remains after a job exhausts its stall budget; this repairs it.\n *\n * It only ever moves a non-terminal run: `markStatus` refuses to overwrite `completed` / `failed` /\n * `cancelled`, so a job abandoned after its run has ended is a no-op. `onJobAbandoned` may deliver\n * the same job more than once, which for the same reason is also a no-op.\n *\n * The run's progress job is failed alongside it, the way the worker's own catch path does in\n * `workers/sync-import.ts`. Without that the two halves disagree \u2014 the run reads `failed` while the\n * operation still shows as in flight in the top bar \u2014 until the progress staleness sweep eventually\n * fails it with a generic no-heartbeat message instead of the reason the queue recorded.\n */\nexport async function failAbandonedRun(payload: unknown, info: AbandonedJobInfo): Promise<void> {\n const data = payload as { payload?: { runId?: unknown; scope?: { organizationId?: unknown; tenantId?: unknown } } } | undefined\n const runId = data?.payload?.runId\n const scope = data?.payload?.scope\n // Nothing to repair without both: the run row is keyed by id AND tenant scope.\n if (typeof runId !== 'string' || typeof scope?.organizationId !== 'string' || typeof scope?.tenantId !== 'string') return\n\n const runScope = { organizationId: scope.organizationId, tenantId: scope.tenantId }\n const errorMessage = `the queue abandoned this run's job without running it: ${info.reason}`\n\n const { createRequestContainer } = await import('@open-mercato/shared/lib/di/container')\n const container = await createRequestContainer()\n const runService = container.resolve('dataSyncRunService') as {\n markStatus(\n runId: string,\n status: string,\n scope: { organizationId: string; tenantId: string },\n error?: string,\n ): Promise<{ progressJobId?: string | null } | null>\n }\n const run = await runService.markStatus(runId, 'failed', runScope, errorMessage)\n if (!run?.progressJobId) return\n\n const progressService = container.resolve('progressService') as {\n failJob(\n jobId: string,\n input: { errorMessage: string },\n ctx: { organizationId: string; tenantId: string },\n ): Promise<unknown>\n }\n await progressService.failJob(run.progressJobId, { errorMessage }, runScope)\n}\n"],
|
|
5
|
-
"mappings": "AAwBA,eAAsB,iBAAiB,SAAkB,MAAuC;AAC9F,QAAM,OAAO;AACb,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,QAAQ,MAAM,SAAS;AAE7B,MAAI,OAAO,UAAU,YAAY,OAAO,OAAO,mBAAmB,YAAY,OAAO,OAAO,aAAa,SAAU;AAEnH,QAAM,WAAW,EAAE,gBAAgB,MAAM,gBAAgB,UAAU,MAAM,SAAS;AAClF,QAAM,eAAe,0DAA0D,KAAK,MAAM;AAE1F,QAAM,EAAE,uBAAuB,IAAI,MAAM,OAAO,uCAAuC;AACvF,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,aAAa,UAAU,QAAQ,oBAAoB;AAQzD,QAAM,MAAM,MAAM,WAAW,WAAW,OAAO,UAAU,UAAU,YAAY;AAC/E,MAAI,CAAC,KAAK,cAAe;AAEzB,QAAM,kBAAkB,UAAU,QAAQ,iBAAiB;AAO3D,QAAM,gBAAgB,QAAQ,IAAI,eAAe,EAAE,aAAa,GAAG,QAAQ;AAC7E;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { toDeprecatedSnakeCaseAliases, toIso } from "./deviceList.js";
|
|
3
|
-
function serializeDeviceDetail(device) {
|
|
4
|
-
const camel = {
|
|
5
|
-
id: device.id,
|
|
6
|
-
userId: device.userId,
|
|
7
|
-
deviceId: device.deviceId,
|
|
8
|
-
platform: device.platform,
|
|
9
|
-
clientAppVersion: device.clientAppVersion ?? null,
|
|
10
|
-
osVersion: device.osVersion ?? null,
|
|
11
|
-
pushProvider: device.pushProvider ?? null,
|
|
12
|
-
pushTokenUpdatedAt: toIso(device.pushTokenUpdatedAt),
|
|
13
|
-
lastSeenAt: toIso(device.lastSeenAt),
|
|
14
|
-
createdAt: toIso(device.createdAt),
|
|
15
|
-
updatedAt: toIso(device.updatedAt)
|
|
16
|
-
};
|
|
17
|
-
return { ...camel, ...toDeprecatedSnakeCaseAliases(camel) };
|
|
18
|
-
}
|
|
19
|
-
const deprecatedAlias = (of) => `Deprecated alias for \`${of}\`; removed in the next minor release.`;
|
|
20
|
-
const deviceDetailItemSchema = z.object({
|
|
21
|
-
id: z.string().uuid(),
|
|
22
|
-
userId: z.string().uuid(),
|
|
23
|
-
deviceId: z.string(),
|
|
24
|
-
platform: z.enum(["ios", "android", "web"]),
|
|
25
|
-
clientAppVersion: z.string().nullable(),
|
|
26
|
-
osVersion: z.string().nullable(),
|
|
27
|
-
pushProvider: z.string().nullable(),
|
|
28
|
-
pushTokenUpdatedAt: z.string().nullable(),
|
|
29
|
-
lastSeenAt: z.string().nullable(),
|
|
30
|
-
createdAt: z.string().nullable(),
|
|
31
|
-
updatedAt: z.string().nullable(),
|
|
32
|
-
user_id: z.string().uuid().describe(deprecatedAlias("userId")),
|
|
33
|
-
device_id: z.string().describe(deprecatedAlias("deviceId")),
|
|
34
|
-
client_app_version: z.string().nullable().describe(deprecatedAlias("clientAppVersion")),
|
|
35
|
-
os_version: z.string().nullable().describe(deprecatedAlias("osVersion")),
|
|
36
|
-
push_provider: z.string().nullable().describe(deprecatedAlias("pushProvider")),
|
|
37
|
-
push_token_updated_at: z.string().nullable().describe(deprecatedAlias("pushTokenUpdatedAt")),
|
|
38
|
-
last_seen_at: z.string().nullable().describe(deprecatedAlias("lastSeenAt")),
|
|
39
|
-
created_at: z.string().nullable().describe(deprecatedAlias("createdAt")),
|
|
40
|
-
updated_at: z.string().nullable().describe(deprecatedAlias("updatedAt"))
|
|
41
|
-
});
|
|
42
|
-
export {
|
|
43
|
-
deviceDetailItemSchema,
|
|
44
|
-
serializeDeviceDetail
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=deviceSerialization.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/devices/api/deviceSerialization.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod'\nimport type { UserDevice } from '../data/entities'\nimport { toDeprecatedSnakeCaseAliases, toIso } from './deviceList'\n\n// Detail contract for `GET /api/devices/admin/devices/:id`. Keys are camelCase like every other\n// module's responses (#5513); the snake_case keys stay alongside as deprecated aliases for one minor\n// version, per the deprecation protocol in BACKWARD_COMPATIBILITY.md \u00A7 7.\n// push_token is a secret and is never returned.\nexport function serializeDeviceDetail(device: UserDevice): Record<string, unknown> {\n const camel = {\n id: device.id,\n userId: device.userId,\n deviceId: device.deviceId,\n platform: device.platform,\n clientAppVersion: device.clientAppVersion ?? null,\n osVersion: device.osVersion ?? null,\n pushProvider: device.pushProvider ?? null,\n pushTokenUpdatedAt: toIso(device.pushTokenUpdatedAt),\n lastSeenAt: toIso(device.lastSeenAt),\n createdAt: toIso(device.createdAt),\n updatedAt: toIso(device.updatedAt),\n }\n return { ...camel, ...toDeprecatedSnakeCaseAliases(camel) }\n}\n\n// See the note in ./deviceList \u2014 the rendered deprecation notice lives on the endpoint description.\nconst deprecatedAlias = (of: string) => `Deprecated alias for \\`${of}\\`; removed in the next minor release.`\n\nexport const deviceDetailItemSchema = z.object({\n id: z.string().uuid(),\n userId: z.string().uuid(),\n deviceId: z.string(),\n platform: z.enum(['ios', 'android', 'web']),\n clientAppVersion: z.string().nullable(),\n osVersion: z.string().nullable(),\n pushProvider: z.string().nullable(),\n pushTokenUpdatedAt: z.string().nullable(),\n lastSeenAt: z.string().nullable(),\n createdAt: z.string().nullable(),\n updatedAt: z.string().nullable(),\n user_id: z.string().uuid().describe(deprecatedAlias('userId')),\n device_id: z.string().describe(deprecatedAlias('deviceId')),\n client_app_version: z.string().nullable().describe(deprecatedAlias('clientAppVersion')),\n os_version: z.string().nullable().describe(deprecatedAlias('osVersion')),\n push_provider: z.string().nullable().describe(deprecatedAlias('pushProvider')),\n push_token_updated_at: z.string().nullable().describe(deprecatedAlias('pushTokenUpdatedAt')),\n last_seen_at: z.string().nullable().describe(deprecatedAlias('lastSeenAt')),\n created_at: z.string().nullable().describe(deprecatedAlias('createdAt')),\n updated_at: z.string().nullable().describe(deprecatedAlias('updatedAt')),\n})\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,SAAS;AAElB,SAAS,8BAA8B,aAAa;AAM7C,SAAS,sBAAsB,QAA6C;AACjF,QAAM,QAAQ;AAAA,IACZ,IAAI,OAAO;AAAA,IACX,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO,oBAAoB;AAAA,IAC7C,WAAW,OAAO,aAAa;AAAA,IAC/B,cAAc,OAAO,gBAAgB;AAAA,IACrC,oBAAoB,MAAM,OAAO,kBAAkB;AAAA,IACnD,YAAY,MAAM,OAAO,UAAU;AAAA,IACnC,WAAW,MAAM,OAAO,SAAS;AAAA,IACjC,WAAW,MAAM,OAAO,SAAS;AAAA,EACnC;AACA,SAAO,EAAE,GAAG,OAAO,GAAG,6BAA6B,KAAK,EAAE;AAC5D;AAGA,MAAM,kBAAkB,CAAC,OAAe,0BAA0B,EAAE;AAE7D,MAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,QAAQ,EAAE,OAAO,EAAE,KAAK;AAAA,EACxB,UAAU,EAAE,OAAO;AAAA,EACnB,UAAU,EAAE,KAAK,CAAC,OAAO,WAAW,KAAK,CAAC;AAAA,EAC1C,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,QAAQ,CAAC;AAAA,EAC7D,WAAW,EAAE,OAAO,EAAE,SAAS,gBAAgB,UAAU,CAAC;AAAA,EAC1D,oBAAoB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,kBAAkB,CAAC;AAAA,EACtF,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,WAAW,CAAC;AAAA,EACvE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,cAAc,CAAC;AAAA,EAC7E,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,oBAAoB,CAAC;AAAA,EAC3F,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,YAAY,CAAC;AAAA,EAC1E,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,WAAW,CAAC;AAAA,EACvE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,WAAW,CAAC;AACzE,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import * as React from "react";
|
|
3
|
-
import { resolveDeviceUserOptions } from "./userOptions.js";
|
|
4
|
-
function useDeviceUserLabels(userIds) {
|
|
5
|
-
const [labels, setLabels] = React.useState({});
|
|
6
|
-
const resolvedIdsRef = React.useRef(/* @__PURE__ */ new Set());
|
|
7
|
-
const idsKey = React.useMemo(() => {
|
|
8
|
-
const normalized = /* @__PURE__ */ new Set();
|
|
9
|
-
for (const userId of userIds) {
|
|
10
|
-
if (typeof userId === "string" && userId.trim()) normalized.add(userId.trim());
|
|
11
|
-
}
|
|
12
|
-
return Array.from(normalized).sort((left, right) => left < right ? -1 : left > right ? 1 : 0).join(",");
|
|
13
|
-
}, [userIds]);
|
|
14
|
-
React.useEffect(() => {
|
|
15
|
-
if (!idsKey) return;
|
|
16
|
-
const unresolved = idsKey.split(",").filter((userId) => !resolvedIdsRef.current.has(userId));
|
|
17
|
-
if (unresolved.length === 0) return;
|
|
18
|
-
const controller = new AbortController();
|
|
19
|
-
void resolveDeviceUserOptions(unresolved, controller.signal).then(({ options, resolvedIds }) => {
|
|
20
|
-
if (controller.signal.aborted) return;
|
|
21
|
-
for (const userId of resolvedIds) resolvedIdsRef.current.add(userId);
|
|
22
|
-
const next = {};
|
|
23
|
-
for (const option of options) next[option.value] = option.label;
|
|
24
|
-
if (Object.keys(next).length) setLabels((current) => ({ ...current, ...next }));
|
|
25
|
-
}).catch(() => {
|
|
26
|
-
});
|
|
27
|
-
return () => controller.abort();
|
|
28
|
-
}, [idsKey]);
|
|
29
|
-
return labels;
|
|
30
|
-
}
|
|
31
|
-
export {
|
|
32
|
-
useDeviceUserLabels
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=useDeviceUserLabels.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/devices/backend/devices/useDeviceUserLabels.ts"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { resolveDeviceUserOptions } from './userOptions'\n\n// Resolves owner ids that are on screen into display labels. Modelled on\n// warranty_claims/backend/components/useUserDisplayNames, but every failure degrades to an empty\n// map instead of throwing: a devices admin without `auth.users.list` must still see the page.\nexport function useDeviceUserLabels(userIds: readonly (string | null | undefined)[]): Record<string, string> {\n const [labels, setLabels] = React.useState<Record<string, string>>({})\n const resolvedIdsRef = React.useRef<Set<string>>(new Set())\n\n const idsKey = React.useMemo(() => {\n const normalized = new Set<string>()\n for (const userId of userIds) {\n if (typeof userId === 'string' && userId.trim()) normalized.add(userId.trim())\n }\n return Array.from(normalized)\n .sort((left, right) => (left < right ? -1 : left > right ? 1 : 0))\n .join(',')\n }, [userIds])\n\n React.useEffect(() => {\n if (!idsKey) return\n const unresolved = idsKey.split(',').filter((userId) => !resolvedIdsRef.current.has(userId))\n if (unresolved.length === 0) return\n\n const controller = new AbortController()\n void resolveDeviceUserOptions(unresolved, controller.signal)\n .then(({ options, resolvedIds }) => {\n if (controller.signal.aborted) return\n // Only ids the server actually answered for are remembered. Marking an id whose request\n // failed would keep its row showing a bare UUID for the life of the component, even though\n // the next attempt would have worked.\n for (const userId of resolvedIds) resolvedIdsRef.current.add(userId)\n const next: Record<string, string> = {}\n for (const option of options) next[option.value] = option.label\n if (Object.keys(next).length) setLabels((current) => ({ ...current, ...next }))\n })\n .catch(() => {})\n return () => controller.abort()\n }, [idsKey])\n\n return labels\n}\n"],
|
|
5
|
-
"mappings": ";AAEA,YAAY,WAAW;AACvB,SAAS,gCAAgC;AAKlC,SAAS,oBAAoB,SAAyE;AAC3G,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAiC,CAAC,CAAC;AACrE,QAAM,iBAAiB,MAAM,OAAoB,oBAAI,IAAI,CAAC;AAE1D,QAAM,SAAS,MAAM,QAAQ,MAAM;AACjC,UAAM,aAAa,oBAAI,IAAY;AACnC,eAAW,UAAU,SAAS;AAC5B,UAAI,OAAO,WAAW,YAAY,OAAO,KAAK,EAAG,YAAW,IAAI,OAAO,KAAK,CAAC;AAAA,IAC/E;AACA,WAAO,MAAM,KAAK,UAAU,EACzB,KAAK,CAAC,MAAM,UAAW,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAE,EAChE,KAAK,GAAG;AAAA,EACb,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,OAAQ;AACb,UAAM,aAAa,OAAO,MAAM,GAAG,EAAE,OAAO,CAAC,WAAW,CAAC,eAAe,QAAQ,IAAI,MAAM,CAAC;AAC3F,QAAI,WAAW,WAAW,EAAG;AAE7B,UAAM,aAAa,IAAI,gBAAgB;AACvC,SAAK,yBAAyB,YAAY,WAAW,MAAM,EACxD,KAAK,CAAC,EAAE,SAAS,YAAY,MAAM;AAClC,UAAI,WAAW,OAAO,QAAS;AAI/B,iBAAW,UAAU,YAAa,gBAAe,QAAQ,IAAI,MAAM;AACnE,YAAM,OAA+B,CAAC;AACtC,iBAAW,UAAU,QAAS,MAAK,OAAO,KAAK,IAAI,OAAO;AAC1D,UAAI,OAAO,KAAK,IAAI,EAAE,OAAQ,WAAU,CAAC,aAAa,EAAE,GAAG,SAAS,GAAG,KAAK,EAAE;AAAA,IAChF,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,WAAO,MAAM,WAAW,MAAM;AAAA,EAChC,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { apiCall } from "@open-mercato/ui/backend/utils/apiCall";
|
|
2
|
-
import { MAX_USER_LOOKUP_IDS } from "@open-mercato/core/modules/auth/lib/userIdFilter";
|
|
3
|
-
const SEARCH_PAGE_SIZE = 20;
|
|
4
|
-
const MAX_IDS_PER_LOOKUP = MAX_USER_LOOKUP_IDS;
|
|
5
|
-
function toOption(item, style) {
|
|
6
|
-
if (!item || typeof item.id !== "string" || !item.id.trim()) return [];
|
|
7
|
-
const id = item.id.trim();
|
|
8
|
-
const name = typeof item.name === "string" && item.name.trim() ? item.name.trim() : null;
|
|
9
|
-
const email = typeof item.email === "string" && item.email.trim() ? item.email.trim() : null;
|
|
10
|
-
const label = style === "search" && name && email ? `${name} \u2014 ${email}` : name ?? email ?? id;
|
|
11
|
-
return [{ value: id, label }];
|
|
12
|
-
}
|
|
13
|
-
async function fetchUsers(params, style, signal) {
|
|
14
|
-
const call = await apiCall(
|
|
15
|
-
`/api/auth/users?${params.toString()}`,
|
|
16
|
-
{ headers: { "x-om-forbidden-redirect": "0" }, signal },
|
|
17
|
-
{ fallback: null }
|
|
18
|
-
).catch(() => null);
|
|
19
|
-
if (!call || !call.ok) return null;
|
|
20
|
-
return (call.result?.items ?? []).flatMap((item) => toOption(item, style));
|
|
21
|
-
}
|
|
22
|
-
async function loadDeviceUserOptions(query) {
|
|
23
|
-
const params = new URLSearchParams();
|
|
24
|
-
params.set("page", "1");
|
|
25
|
-
params.set("pageSize", String(SEARCH_PAGE_SIZE));
|
|
26
|
-
const trimmed = query?.trim();
|
|
27
|
-
if (trimmed) params.set("search", trimmed);
|
|
28
|
-
return await fetchUsers(params, "search") ?? [];
|
|
29
|
-
}
|
|
30
|
-
async function resolveDeviceUserOptions(ids, signal) {
|
|
31
|
-
const unique = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));
|
|
32
|
-
if (unique.length === 0) return { options: [], resolvedIds: [] };
|
|
33
|
-
const options = [];
|
|
34
|
-
const resolvedIds = [];
|
|
35
|
-
for (let offset = 0; offset < unique.length; offset += MAX_IDS_PER_LOOKUP) {
|
|
36
|
-
const batch = unique.slice(offset, offset + MAX_IDS_PER_LOOKUP);
|
|
37
|
-
const params = new URLSearchParams();
|
|
38
|
-
params.set("page", "1");
|
|
39
|
-
params.set("pageSize", String(batch.length));
|
|
40
|
-
params.set("ids", batch.join(","));
|
|
41
|
-
const batchOptions = await fetchUsers(params, "compact", signal);
|
|
42
|
-
if (batchOptions === null) continue;
|
|
43
|
-
options.push(...batchOptions);
|
|
44
|
-
resolvedIds.push(...batch);
|
|
45
|
-
}
|
|
46
|
-
return { options, resolvedIds };
|
|
47
|
-
}
|
|
48
|
-
export {
|
|
49
|
-
loadDeviceUserOptions,
|
|
50
|
-
resolveDeviceUserOptions
|
|
51
|
-
};
|
|
52
|
-
//# sourceMappingURL=userOptions.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/devices/backend/devices/userOptions.ts"],
|
|
4
|
-
"sourcesContent": ["import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'\nimport { MAX_USER_LOOKUP_IDS } from '@open-mercato/core/modules/auth/lib/userIdFilter'\n\nexport type DeviceUserOption = {\n value: string\n label: string\n}\n\ntype AuthUserItem = {\n id?: unknown\n name?: unknown\n email?: unknown\n}\n\nconst SEARCH_PAGE_SIZE = 20\n// Imported rather than restated: `parseIdsParam` slices past the route's cap without complaining,\n// so a client batch larger than the server accepts loses the overflow ids silently.\nconst MAX_IDS_PER_LOOKUP = MAX_USER_LOOKUP_IDS\n\n/**\n * Two label styles on purpose. A picker suggestion has to disambiguate two people with the same\n * display name, and neither `CrudForm`'s combobox nor `FilterBar` renders anything but the label \u2014\n * so the email has to live in the label there. A resolved column label is read next to a device,\n * where the email is noise.\n */\ntype LabelStyle = 'search' | 'compact'\n\nfunction toOption(item: AuthUserItem | null | undefined, style: LabelStyle): DeviceUserOption[] {\n if (!item || typeof item.id !== 'string' || !item.id.trim()) return []\n const id = item.id.trim()\n const name = typeof item.name === 'string' && item.name.trim() ? item.name.trim() : null\n const email = typeof item.email === 'string' && item.email.trim() ? item.email.trim() : null\n const label = style === 'search' && name && email ? `${name} \u2014 ${email}` : name ?? email ?? id\n return [{ value: id, label }]\n}\n\n// `devices.admin` declares `dependsOn: ['auth.users.list']`, but dependsOn only diagnoses \u2014 a\n// hand-built role can still reach these screens without it until the ACL editor or\n// `sync-role-acls` fixes it. `x-om-forbidden-redirect: 0` keeps that 403 from bouncing the whole\n// page to /login. `null` means the call itself failed, which callers must not\n// confuse with a successful call that matched nobody \u2014 a caller caching \"already resolved\" would\n// otherwise remember a transient network error forever.\nasync function fetchUsers(\n params: URLSearchParams,\n style: LabelStyle,\n signal?: AbortSignal,\n): Promise<DeviceUserOption[] | null> {\n const call = await apiCall<{ items?: AuthUserItem[] }>(\n `/api/auth/users?${params.toString()}`,\n { headers: { 'x-om-forbidden-redirect': '0' }, signal },\n { fallback: null },\n ).catch(() => null)\n if (!call || !call.ok) return null\n return (call.result?.items ?? []).flatMap((item) => toOption(item, style))\n}\n\nexport async function loadDeviceUserOptions(query?: string): Promise<DeviceUserOption[]> {\n const params = new URLSearchParams()\n params.set('page', '1')\n params.set('pageSize', String(SEARCH_PAGE_SIZE))\n const trimmed = query?.trim()\n if (trimmed) params.set('search', trimmed)\n // A picker has nothing to cache, so a failed lookup is just an empty suggestion list.\n return (await fetchUsers(params, 'search')) ?? []\n}\n\n/**\n * The outcome of a batch lookup. `resolvedIds` lists the ids the server actually answered for \u2014\n * an id that came back without a row (deleted user) still counts as resolved, an id whose request\n * failed does not. Callers cache on `resolvedIds`, so a transient failure is retried rather than\n * remembered as a permanent blank.\n */\nexport type DeviceUserLookup = {\n options: DeviceUserOption[]\n resolvedIds: string[]\n}\n\n// Batch id \u2192 label resolution for rows already on screen, so a device whose owner never appeared in\n// a search result still renders a name instead of a bare UUID.\nexport async function resolveDeviceUserOptions(ids: string[], signal?: AbortSignal): Promise<DeviceUserLookup> {\n const unique = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)))\n if (unique.length === 0) return { options: [], resolvedIds: [] }\n const options: DeviceUserOption[] = []\n const resolvedIds: string[] = []\n for (let offset = 0; offset < unique.length; offset += MAX_IDS_PER_LOOKUP) {\n const batch = unique.slice(offset, offset + MAX_IDS_PER_LOOKUP)\n const params = new URLSearchParams()\n params.set('page', '1')\n params.set('pageSize', String(batch.length))\n // URLSearchParams encodes on toString(); pre-encoding here would double-escape the commas.\n params.set('ids', batch.join(','))\n const batchOptions = await fetchUsers(params, 'compact', signal)\n // One failed batch must not cost the batches that did answer.\n if (batchOptions === null) continue\n options.push(...batchOptions)\n resolvedIds.push(...batch)\n }\n return { options, resolvedIds }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,eAAe;AACxB,SAAS,2BAA2B;AAapC,MAAM,mBAAmB;AAGzB,MAAM,qBAAqB;AAU3B,SAAS,SAAS,MAAuC,OAAuC;AAC9F,MAAI,CAAC,QAAQ,OAAO,KAAK,OAAO,YAAY,CAAC,KAAK,GAAG,KAAK,EAAG,QAAO,CAAC;AACrE,QAAM,KAAK,KAAK,GAAG,KAAK;AACxB,QAAM,OAAO,OAAO,KAAK,SAAS,YAAY,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI;AACpF,QAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI;AACxF,QAAM,QAAQ,UAAU,YAAY,QAAQ,QAAQ,GAAG,IAAI,WAAM,KAAK,KAAK,QAAQ,SAAS;AAC5F,SAAO,CAAC,EAAE,OAAO,IAAI,MAAM,CAAC;AAC9B;AAQA,eAAe,WACb,QACA,OACA,QACoC;AACpC,QAAM,OAAO,MAAM;AAAA,IACjB,mBAAmB,OAAO,SAAS,CAAC;AAAA,IACpC,EAAE,SAAS,EAAE,2BAA2B,IAAI,GAAG,OAAO;AAAA,IACtD,EAAE,UAAU,KAAK;AAAA,EACnB,EAAE,MAAM,MAAM,IAAI;AAClB,MAAI,CAAC,QAAQ,CAAC,KAAK,GAAI,QAAO;AAC9B,UAAQ,KAAK,QAAQ,SAAS,CAAC,GAAG,QAAQ,CAAC,SAAS,SAAS,MAAM,KAAK,CAAC;AAC3E;AAEA,eAAsB,sBAAsB,OAA6C;AACvF,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO,IAAI,QAAQ,GAAG;AACtB,SAAO,IAAI,YAAY,OAAO,gBAAgB,CAAC;AAC/C,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,QAAS,QAAO,IAAI,UAAU,OAAO;AAEzC,SAAQ,MAAM,WAAW,QAAQ,QAAQ,KAAM,CAAC;AAClD;AAeA,eAAsB,yBAAyB,KAAe,QAAiD;AAC7G,QAAM,SAAS,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC7E,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,aAAa,CAAC,EAAE;AAC/D,QAAM,UAA8B,CAAC;AACrC,QAAM,cAAwB,CAAC;AAC/B,WAAS,SAAS,GAAG,SAAS,OAAO,QAAQ,UAAU,oBAAoB;AACzE,UAAM,QAAQ,OAAO,MAAM,QAAQ,SAAS,kBAAkB;AAC9D,UAAM,SAAS,IAAI,gBAAgB;AACnC,WAAO,IAAI,QAAQ,GAAG;AACtB,WAAO,IAAI,YAAY,OAAO,MAAM,MAAM,CAAC;AAE3C,WAAO,IAAI,OAAO,MAAM,KAAK,GAAG,CAAC;AACjC,UAAM,eAAe,MAAM,WAAW,QAAQ,WAAW,MAAM;AAE/D,QAAI,iBAAiB,KAAM;AAC3B,YAAQ,KAAK,GAAG,YAAY;AAC5B,gBAAY,KAAK,GAAG,KAAK;AAAA,EAC3B;AACA,SAAO,EAAE,SAAS,YAAY;AAChC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { findOneWithDecryption } from "@open-mercato/shared/lib/encryption/find";
|
|
2
|
-
import { Organization } from "../data/entities.js";
|
|
3
|
-
function normalizeIds(values) {
|
|
4
|
-
if (!Array.isArray(values)) return [];
|
|
5
|
-
return Array.from(new Set(values.map((value) => typeof value === "string" ? value.trim() : "").filter(Boolean)));
|
|
6
|
-
}
|
|
7
|
-
class DefaultOrganizationHierarchyService {
|
|
8
|
-
constructor(em) {
|
|
9
|
-
this.em = em;
|
|
10
|
-
}
|
|
11
|
-
async resolveAncestorIds(input) {
|
|
12
|
-
const organization = await findOneWithDecryption(
|
|
13
|
-
this.em,
|
|
14
|
-
Organization,
|
|
15
|
-
{
|
|
16
|
-
id: input.organizationId,
|
|
17
|
-
tenant: input.tenantId,
|
|
18
|
-
deletedAt: null
|
|
19
|
-
},
|
|
20
|
-
{ fields: ["id", "ancestorIds"] },
|
|
21
|
-
{ tenantId: input.tenantId, organizationId: input.organizationId }
|
|
22
|
-
);
|
|
23
|
-
return organization ? normalizeIds(organization.ancestorIds) : null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export {
|
|
27
|
-
DefaultOrganizationHierarchyService
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=organizationHierarchyService.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/directory/services/organizationHierarchyService.ts"],
|
|
4
|
-
"sourcesContent": ["import type { FilterQuery } from '@mikro-orm/core'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { OrganizationHierarchyService } from '@open-mercato/shared/lib/auth/principal-service'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { Organization } from '../data/entities'\n\nfunction normalizeIds(values: unknown): string[] {\n if (!Array.isArray(values)) return []\n return Array.from(new Set(values\n .map((value) => typeof value === 'string' ? value.trim() : '')\n .filter(Boolean)))\n}\n\nexport class DefaultOrganizationHierarchyService implements OrganizationHierarchyService {\n constructor(private readonly em: EntityManager) {}\n\n async resolveAncestorIds(input: {\n tenantId: string\n organizationId: string\n }): Promise<string[] | null> {\n const organization = await findOneWithDecryption(\n this.em,\n Organization,\n {\n id: input.organizationId,\n tenant: input.tenantId,\n deletedAt: null,\n } as FilterQuery<Organization>,\n { fields: ['id', 'ancestorIds'] },\n { tenantId: input.tenantId, organizationId: input.organizationId },\n )\n return organization ? normalizeIds(organization.ancestorIds) : null\n }\n}\n"],
|
|
5
|
-
"mappings": "AAGA,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAE7B,SAAS,aAAa,QAA2B;AAC/C,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,SAAO,MAAM,KAAK,IAAI,IAAI,OACvB,IAAI,CAAC,UAAU,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,EAAE,EAC5D,OAAO,OAAO,CAAC,CAAC;AACrB;AAEO,MAAM,oCAA4E;AAAA,EACvF,YAA6B,IAAmB;AAAnB;AAAA,EAAoB;AAAA,EAEjD,MAAM,mBAAmB,OAGI;AAC3B,UAAM,eAAe,MAAM;AAAA,MACzB,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACE,IAAI,MAAM;AAAA,QACV,QAAQ,MAAM;AAAA,QACd,WAAW;AAAA,MACb;AAAA,MACA,EAAE,QAAQ,CAAC,MAAM,aAAa,EAAE;AAAA,MAChC,EAAE,UAAU,MAAM,UAAU,gBAAgB,MAAM,eAAe;AAAA,IACnE;AACA,WAAO,eAAe,aAAa,aAAa,WAAW,IAAI;AAAA,EACjE;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { resolveOrganizationScope, resolveOrganizationScopeForRequest } from "../utils/organizationScope.js";
|
|
2
|
-
class DefaultOrganizationScopeService {
|
|
3
|
-
constructor(em, rbac, container) {
|
|
4
|
-
this.em = em;
|
|
5
|
-
this.rbac = rbac;
|
|
6
|
-
this.container = container;
|
|
7
|
-
}
|
|
8
|
-
resolve(input) {
|
|
9
|
-
const auth = input.auth;
|
|
10
|
-
if (input.freshAcl && auth?.sub) {
|
|
11
|
-
return this.resolveFresh({
|
|
12
|
-
auth,
|
|
13
|
-
selectedId: input.selectedId,
|
|
14
|
-
tenantId: input.tenantId
|
|
15
|
-
}).then((result) => result.scope);
|
|
16
|
-
}
|
|
17
|
-
return resolveOrganizationScope({
|
|
18
|
-
em: this.em,
|
|
19
|
-
rbac: this.rbac,
|
|
20
|
-
auth: input.auth,
|
|
21
|
-
selectedId: input.selectedId,
|
|
22
|
-
tenantId: input.tenantId
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
async resolveFresh(input) {
|
|
26
|
-
await this.rbac.invalidateUserCache(input.auth.sub);
|
|
27
|
-
const acl = await this.rbac.loadAcl(input.auth.sub, {
|
|
28
|
-
tenantId: input.tenantId ?? input.auth.tenantId ?? null,
|
|
29
|
-
organizationId: input.selectedId ?? input.auth.orgId ?? null
|
|
30
|
-
});
|
|
31
|
-
const freshRbac = {
|
|
32
|
-
loadAcl: async () => acl
|
|
33
|
-
};
|
|
34
|
-
const scope = await resolveOrganizationScope({
|
|
35
|
-
em: this.em,
|
|
36
|
-
rbac: freshRbac,
|
|
37
|
-
auth: input.auth,
|
|
38
|
-
selectedId: input.selectedId,
|
|
39
|
-
tenantId: input.tenantId
|
|
40
|
-
});
|
|
41
|
-
return { scope, acl };
|
|
42
|
-
}
|
|
43
|
-
resolveForRequest(input) {
|
|
44
|
-
return resolveOrganizationScopeForRequest({
|
|
45
|
-
container: this.container,
|
|
46
|
-
auth: input.auth,
|
|
47
|
-
request: input.request,
|
|
48
|
-
selectedId: input.selectedId,
|
|
49
|
-
tenantId: input.tenantId
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export {
|
|
54
|
-
DefaultOrganizationScopeService
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=organizationScopeService.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/directory/services/organizationScopeService.ts"],
|
|
4
|
-
"sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport type {\n OrganizationScopeService,\n OrganizationScopeRequest,\n} from '@open-mercato/shared/lib/auth/principal-service'\nimport type { AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport { resolveOrganizationScope, resolveOrganizationScopeForRequest } from '../utils/organizationScope'\n\ntype OrganizationScopeRbac = {\n invalidateUserCache(userId: string): Promise<void>\n loadAcl(\n userId: string,\n scope: { tenantId: string | null; organizationId: string | null },\n ): Promise<{ isSuperAdmin: boolean; features: string[]; organizations: string[] | null }>\n}\n\nexport class DefaultOrganizationScopeService implements OrganizationScopeService {\n constructor(\n private readonly em: EntityManager,\n private readonly rbac: OrganizationScopeRbac,\n private readonly container: AwilixContainer,\n ) {}\n\n resolve(input: {\n auth: AuthContext | null | undefined\n selectedId?: string | null\n tenantId?: string | null\n freshAcl?: boolean\n }) {\n const auth = input.auth\n if (input.freshAcl && auth?.sub) {\n return this.resolveFresh({\n auth,\n selectedId: input.selectedId,\n tenantId: input.tenantId,\n }).then((result) => result.scope)\n }\n return resolveOrganizationScope({\n em: this.em,\n rbac: this.rbac as Parameters<typeof resolveOrganizationScope>[0]['rbac'],\n auth: input.auth,\n selectedId: input.selectedId,\n tenantId: input.tenantId,\n })\n }\n\n async resolveFresh(input: {\n auth: NonNullable<AuthContext>\n selectedId?: string | null\n tenantId?: string | null\n }) {\n await this.rbac.invalidateUserCache(input.auth.sub)\n const acl = await this.rbac.loadAcl(input.auth.sub, {\n tenantId: input.tenantId ?? input.auth.tenantId ?? null,\n organizationId: input.selectedId ?? input.auth.orgId ?? null,\n })\n const freshRbac: Parameters<typeof resolveOrganizationScope>[0]['rbac'] = {\n loadAcl: async () => acl,\n }\n const scope = await resolveOrganizationScope({\n em: this.em,\n rbac: freshRbac,\n auth: input.auth,\n selectedId: input.selectedId,\n tenantId: input.tenantId,\n })\n return { scope, acl }\n }\n\n resolveForRequest(input: {\n auth: AuthContext | null | undefined\n request?: OrganizationScopeRequest\n selectedId?: string | null\n tenantId?: string | null\n }) {\n return resolveOrganizationScopeForRequest({\n container: this.container,\n auth: input.auth,\n request: input.request,\n selectedId: input.selectedId,\n tenantId: input.tenantId,\n })\n }\n}\n"],
|
|
5
|
-
"mappings": "AAOA,SAAS,0BAA0B,0CAA0C;AAUtE,MAAM,gCAAoE;AAAA,EAC/E,YACmB,IACA,MACA,WACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAEH,QAAQ,OAKL;AACD,UAAM,OAAO,MAAM;AACnB,QAAI,MAAM,YAAY,MAAM,KAAK;AAC/B,aAAO,KAAK,aAAa;AAAA,QACvB;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,MAClB,CAAC,EAAE,KAAK,CAAC,WAAW,OAAO,KAAK;AAAA,IAClC;AACA,WAAO,yBAAyB;AAAA,MAC9B,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAIhB;AACD,UAAM,KAAK,KAAK,oBAAoB,MAAM,KAAK,GAAG;AAClD,UAAM,MAAM,MAAM,KAAK,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,MAClD,UAAU,MAAM,YAAY,MAAM,KAAK,YAAY;AAAA,MACnD,gBAAgB,MAAM,cAAc,MAAM,KAAK,SAAS;AAAA,IAC1D,CAAC;AACD,UAAM,YAAoE;AAAA,MACxE,SAAS,YAAY;AAAA,IACvB;AACA,UAAM,QAAQ,MAAM,yBAAyB;AAAA,MAC3C,IAAI,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB,CAAC;AACD,WAAO,EAAE,OAAO,IAAI;AAAA,EACtB;AAAA,EAEA,kBAAkB,OAKf;AACD,WAAO,mCAAmC;AAAA,MACxC,WAAW,KAAK;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|