@open-mercato/core 0.4.2-canary-c71ef83148 → 0.4.2-canary-f821f89ef6
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/dist/generated/entities/workflow_event_trigger/index.js +33 -0
- package/dist/generated/entities/workflow_event_trigger/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +2 -5
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2 -2
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/page.js +2 -3
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/api_keys/backend/api-keys/page.js +1 -1
- package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentLibrary.js +0 -4
- package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +0 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/auth/api/admin/nav.js +3 -4
- package/dist/modules/auth/api/admin/nav.js.map +2 -2
- package/dist/modules/auth/api/login.js +6 -25
- package/dist/modules/auth/api/login.js.map +2 -2
- package/dist/modules/auth/api/reset/confirm.js +2 -25
- package/dist/modules/auth/api/reset/confirm.js.map +2 -2
- package/dist/modules/auth/api/reset.js +0 -23
- package/dist/modules/auth/api/reset.js.map +2 -2
- package/dist/modules/auth/api/sidebar/preferences/route.js +9 -14
- package/dist/modules/auth/api/sidebar/preferences/route.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +2 -4
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/roles/[id]/edit/page.js +1 -4
- package/dist/modules/auth/backend/roles/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/roles/page.js +3 -3
- package/dist/modules/auth/backend/roles/page.js.map +2 -2
- package/dist/modules/auth/backend/users/[id]/edit/page.js +3 -18
- package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +2 -15
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/auth/backend/users/page.js +3 -3
- package/dist/modules/auth/backend/users/page.js.map +2 -2
- package/dist/modules/auth/cli.js +11 -25
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/commands/users.js +2 -59
- package/dist/modules/auth/commands/users.js.map +2 -2
- package/dist/modules/auth/data/validators.js +3 -6
- package/dist/modules/auth/data/validators.js.map +2 -2
- package/dist/modules/auth/events.js +30 -0
- package/dist/modules/auth/events.js.map +7 -0
- package/dist/modules/auth/frontend/login.js +3 -105
- package/dist/modules/auth/frontend/login.js.map +2 -2
- package/dist/modules/auth/frontend/reset/[token]/page.js +10 -20
- package/dist/modules/auth/frontend/reset/[token]/page.js.map +2 -2
- package/dist/modules/auth/lib/setup-app.js +8 -42
- package/dist/modules/auth/lib/setup-app.js.map +2 -2
- package/dist/modules/auth/services/authService.js +3 -24
- package/dist/modules/auth/services/authService.js.map +2 -2
- package/dist/modules/business_rules/api/execute/[ruleId]/route.js +145 -0
- package/dist/modules/business_rules/api/execute/[ruleId]/route.js.map +7 -0
- package/dist/modules/business_rules/api/execute/route.js +1 -7
- package/dist/modules/business_rules/api/execute/route.js.map +2 -2
- package/dist/modules/business_rules/backend/rules/page.js +0 -4
- package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
- package/dist/modules/business_rules/backend/sets/page.js +0 -3
- package/dist/modules/business_rules/backend/sets/page.js.map +2 -2
- package/dist/modules/business_rules/cli.js +1 -2
- package/dist/modules/business_rules/cli.js.map +2 -2
- package/dist/modules/business_rules/data/validators.js +34 -0
- package/dist/modules/business_rules/data/validators.js.map +2 -2
- package/dist/modules/business_rules/index.js +21 -1
- package/dist/modules/business_rules/index.js.map +2 -2
- package/dist/modules/business_rules/lib/rule-engine.js +185 -34
- package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +0 -2
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -2
- package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js +0 -2
- package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
- package/dist/modules/catalog/events.js +34 -0
- package/dist/modules/catalog/events.js.map +7 -0
- package/dist/modules/configs/cli.js +0 -6
- package/dist/modules/configs/cli.js.map +2 -2
- package/dist/modules/configs/components/CachePanel.js +4 -4
- package/dist/modules/configs/components/CachePanel.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +1 -48
- package/dist/modules/configs/lib/system-status.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +0 -18
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/currencies/backend/currencies/page.js +0 -3
- package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js +0 -2
- package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +0 -3
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/page.js +0 -3
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +0 -3
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +0 -31
- package/dist/modules/customers/commands/deals.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/events.js +49 -0
- package/dist/modules/customers/events.js.map +7 -0
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js +1 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.js +1 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.js +1 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js +1 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.js.map +2 -2
- package/dist/modules/dashboards/cli.js +5 -44
- package/dist/modules/dashboards/cli.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +11 -16
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +3 -3
- package/dist/modules/dashboards/services/widgetDataService.js +3 -139
- package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js +1 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryTable.js +0 -2
- package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js +2 -2
- package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js +2 -2
- package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
- package/dist/modules/directory/events.js +23 -0
- package/dist/modules/directory/events.js.map +7 -0
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
- package/dist/modules/entities/components/SystemEntitiesTable.js +1 -1
- package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js +2 -2
- package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js +3 -3
- package/dist/modules/feature_toggles/components/FeatureTogglesTable.js.map +2 -2
- package/dist/modules/feature_toggles/components/OverridesTable.js +1 -1
- package/dist/modules/feature_toggles/components/OverridesTable.js.map +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js +2 -2
- package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
- package/dist/modules/query_index/cli.js +7 -63
- package/dist/modules/query_index/cli.js.map +2 -2
- package/dist/modules/query_index/components/QueryIndexesTable.js +1 -7
- package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js +2 -2
- package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js +2 -2
- package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
- package/dist/modules/sales/acl.js +1 -0
- package/dist/modules/sales/acl.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js +0 -2
- package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/channels/page.js +0 -2
- package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +12 -0
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/commands/documents.js +62 -53
- package/dist/modules/sales/commands/documents.js.map +2 -2
- package/dist/modules/sales/commands/payments.js +0 -26
- package/dist/modules/sales/commands/payments.js.map +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js +2 -2
- package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js +2 -2
- package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js +2 -2
- package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +0 -2
- package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js +0 -2
- package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js +1 -2
- package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js +0 -2
- package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
- package/dist/modules/sales/events.js +63 -0
- package/dist/modules/sales/events.js.map +7 -0
- package/dist/modules/sales/lib/dictionaries.js +3 -0
- package/dist/modules/sales/lib/dictionaries.js.map +2 -2
- package/dist/modules/sales/lib/frontend/documentDataEvents.js +25 -0
- package/dist/modules/sales/lib/frontend/documentDataEvents.js.map +7 -0
- package/dist/modules/staff/backend/staff/team-members/page.js +1 -1
- package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js +2 -2
- package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js +2 -2
- package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
- package/dist/modules/staff/commands/leave-requests.js +0 -79
- package/dist/modules/staff/commands/leave-requests.js.map +2 -2
- package/dist/modules/workflows/acl.js +2 -0
- package/dist/modules/workflows/acl.js.map +2 -2
- package/dist/modules/workflows/api/instances/route.js +18 -6
- package/dist/modules/workflows/api/instances/route.js.map +2 -2
- package/dist/modules/workflows/api/tasks/route.js +6 -1
- package/dist/modules/workflows/api/tasks/route.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.js +9 -1
- package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/[id]/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.js +24 -15
- package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/page.js +0 -5
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +150 -132
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js +1 -1
- package/dist/modules/workflows/backend/definitions/visual-editor/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.js +1 -1
- package/dist/modules/workflows/backend/events/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/events/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +0 -3
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.js +1 -1
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.meta.js +2 -2
- package/dist/modules/workflows/backend/tasks/[id]/page.meta.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +5 -9
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/cli.js +93 -15
- package/dist/modules/workflows/cli.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +481 -0
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +7 -0
- package/dist/modules/workflows/components/EventTriggersEditor.js +553 -0
- package/dist/modules/workflows/components/EventTriggersEditor.js.map +7 -0
- package/dist/modules/workflows/data/entities.js +64 -1
- package/dist/modules/workflows/data/entities.js.map +2 -2
- package/dist/modules/workflows/data/validators.js +115 -0
- package/dist/modules/workflows/data/validators.js.map +2 -2
- package/dist/modules/workflows/events.js +38 -0
- package/dist/modules/workflows/events.js.map +7 -0
- package/dist/modules/workflows/examples/checkout-demo-definition.json +1 -5
- package/dist/modules/workflows/examples/order-approval-definition.json +257 -0
- package/dist/modules/workflows/examples/order-approval-guard-rules.json +32 -0
- package/dist/modules/workflows/lib/activity-executor.js +75 -13
- package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
- package/dist/modules/workflows/lib/event-trigger-service.js +308 -0
- package/dist/modules/workflows/lib/event-trigger-service.js.map +7 -0
- package/dist/modules/workflows/lib/graph-utils.js +71 -2
- package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
- package/dist/modules/workflows/lib/seeds.js +22 -5
- package/dist/modules/workflows/lib/seeds.js.map +2 -2
- package/dist/modules/workflows/lib/start-validator.js +33 -23
- package/dist/modules/workflows/lib/start-validator.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +161 -57
- package/dist/modules/workflows/lib/transition-handler.js.map +3 -3
- package/dist/modules/workflows/migrations/Migration20260123143500.js +36 -0
- package/dist/modules/workflows/migrations/Migration20260123143500.js.map +7 -0
- package/dist/modules/workflows/subscribers/event-trigger.js +78 -0
- package/dist/modules/workflows/subscribers/event-trigger.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +323 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +7 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.js +17 -0
- package/dist/modules/workflows/widgets/injection/order-approval/widget.js.map +7 -0
- package/dist/modules/workflows/widgets/injection-table.js +19 -0
- package/dist/modules/workflows/widgets/injection-table.js.map +7 -0
- package/generated/entities/workflow_event_trigger/index.ts +15 -0
- package/generated/entities.ids.generated.ts +2 -5
- package/generated/entity-fields-registry.ts +2 -2
- package/package.json +2 -2
- package/src/modules/api_docs/frontend/docs/api/page.tsx +2 -3
- package/src/modules/api_keys/backend/api-keys/page.tsx +1 -1
- package/src/modules/attachments/components/AttachmentLibrary.tsx +0 -4
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +0 -2
- package/src/modules/auth/README.md +1 -1
- package/src/modules/auth/__tests__/cli-setup-acl.test.ts +1 -1
- package/src/modules/auth/api/__tests__/login.test.ts +0 -2
- package/src/modules/auth/api/admin/nav.ts +6 -10
- package/src/modules/auth/api/login.ts +7 -26
- package/src/modules/auth/api/reset/confirm.ts +2 -25
- package/src/modules/auth/api/reset.ts +0 -23
- package/src/modules/auth/api/sidebar/preferences/route.ts +12 -21
- package/src/modules/auth/api/users/route.ts +2 -5
- package/src/modules/auth/backend/roles/[id]/edit/page.tsx +1 -4
- package/src/modules/auth/backend/roles/page.tsx +3 -3
- package/src/modules/auth/backend/users/[id]/edit/page.tsx +3 -22
- package/src/modules/auth/backend/users/create/page.tsx +2 -19
- package/src/modules/auth/backend/users/page.tsx +3 -3
- package/src/modules/auth/cli.ts +11 -38
- package/src/modules/auth/commands/users.ts +2 -73
- package/src/modules/auth/data/validators.ts +2 -6
- package/src/modules/auth/events.ts +39 -0
- package/src/modules/auth/frontend/login.tsx +5 -131
- package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
- package/src/modules/auth/i18n/de.json +1 -48
- package/src/modules/auth/i18n/en.json +1 -48
- package/src/modules/auth/i18n/es.json +1 -48
- package/src/modules/auth/i18n/pl.json +1 -48
- package/src/modules/auth/lib/setup-app.ts +9 -58
- package/src/modules/auth/services/authService.ts +4 -27
- package/src/modules/business_rules/api/execute/[ruleId]/route.ts +163 -0
- package/src/modules/business_rules/api/execute/route.ts +1 -8
- package/src/modules/business_rules/backend/rules/page.tsx +0 -4
- package/src/modules/business_rules/backend/sets/page.tsx +0 -3
- package/src/modules/business_rules/cli.ts +1 -2
- package/src/modules/business_rules/data/validators.ts +40 -0
- package/src/modules/business_rules/i18n/en.json +1 -3
- package/src/modules/business_rules/index.ts +25 -0
- package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
- package/src/modules/business_rules/lib/rule-engine.ts +277 -51
- package/src/modules/catalog/components/PriceKindSettings.tsx +0 -2
- package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -2
- package/src/modules/catalog/components/products/ProductsDataTable.tsx +0 -2
- package/src/modules/catalog/events.ts +45 -0
- package/src/modules/catalog/i18n/en.json +1 -3
- package/src/modules/configs/cli.ts +0 -6
- package/src/modules/configs/components/CachePanel.tsx +4 -4
- package/src/modules/configs/i18n/en.json +2 -12
- package/src/modules/configs/i18n/pl.json +2 -12
- package/src/modules/configs/lib/system-status.ts +1 -48
- package/src/modules/configs/lib/system-status.types.ts +0 -1
- package/src/modules/configs/lib/upgrade-actions.ts +0 -18
- package/src/modules/currencies/backend/currencies/page.tsx +0 -3
- package/src/modules/currencies/backend/exchange-rates/page.tsx +0 -2
- package/src/modules/customers/backend/customers/companies/page.tsx +0 -3
- package/src/modules/customers/backend/customers/deals/page.tsx +0 -3
- package/src/modules/customers/backend/customers/people/page.tsx +0 -3
- package/src/modules/customers/commands/deals.ts +0 -39
- package/src/modules/customers/components/CustomerTodosTable.tsx +0 -1
- package/src/modules/customers/events.ts +63 -0
- package/src/modules/customers/i18n/en.json +1 -5
- package/src/modules/customers/widgets/dashboard/customer-todos/widget.ts +2 -2
- package/src/modules/customers/widgets/dashboard/new-customers/widget.ts +2 -2
- package/src/modules/customers/widgets/dashboard/new-deals/widget.ts +2 -2
- package/src/modules/customers/widgets/dashboard/next-interactions/widget.ts +2 -2
- package/src/modules/dashboards/cli.ts +5 -55
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +11 -22
- package/src/modules/dashboards/services/widgetDataService.ts +4 -164
- package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.ts +2 -2
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.ts +2 -2
- package/src/modules/dictionaries/components/DictionaryTable.tsx +0 -2
- package/src/modules/directory/backend/directory/organizations/page.tsx +2 -2
- package/src/modules/directory/backend/directory/tenants/page.tsx +2 -2
- package/src/modules/directory/events.ts +31 -0
- package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +2 -2
- package/src/modules/entities/components/SystemEntitiesTable.tsx +1 -1
- package/src/modules/entities/components/UserEntitiesTable.tsx +2 -2
- package/src/modules/feature_toggles/components/FeatureTogglesTable.tsx +4 -3
- package/src/modules/feature_toggles/components/OverridesTable.tsx +1 -1
- package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +2 -2
- package/src/modules/query_index/cli.ts +13 -82
- package/src/modules/query_index/components/QueryIndexesTable.tsx +2 -8
- package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -2
- package/src/modules/resources/backend/resources/resources/page.tsx +2 -2
- package/src/modules/sales/acl.ts +1 -0
- package/src/modules/sales/backend/sales/channels/offers/page.tsx +0 -2
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +16 -0
- package/src/modules/sales/commands/documents.ts +70 -62
- package/src/modules/sales/commands/payments.ts +0 -33
- package/src/modules/sales/components/AdjustmentKindSettings.tsx +2 -2
- package/src/modules/sales/components/PaymentMethodsSettings.tsx +2 -2
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +2 -2
- package/src/modules/sales/components/TaxRatesSettings.tsx +2 -2
- package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +0 -2
- package/src/modules/sales/components/documents/AdjustmentsSection.tsx +0 -2
- package/src/modules/sales/components/documents/PaymentsSection.tsx +1 -2
- package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +0 -2
- package/src/modules/sales/events.ts +82 -0
- package/src/modules/sales/i18n/de.json +0 -20
- package/src/modules/sales/i18n/en.json +1 -25
- package/src/modules/sales/i18n/es.json +0 -20
- package/src/modules/sales/i18n/pl.json +0 -20
- package/src/modules/sales/lib/dictionaries.ts +3 -0
- package/src/modules/sales/lib/frontend/documentDataEvents.ts +28 -0
- package/src/modules/staff/backend/staff/team-members/page.tsx +1 -1
- package/src/modules/staff/backend/staff/team-roles/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +2 -2
- package/src/modules/staff/backend/staff/teams/page.tsx +2 -2
- package/src/modules/staff/commands/leave-requests.ts +0 -94
- package/src/modules/staff/i18n/de.json +0 -4
- package/src/modules/staff/i18n/en.json +1 -9
- package/src/modules/staff/i18n/es.json +0 -4
- package/src/modules/staff/i18n/pl.json +0 -4
- package/src/modules/workflows/acl.ts +2 -0
- package/src/modules/workflows/api/__tests__/instances.route.test.ts +5 -2
- package/src/modules/workflows/api/instances/route.ts +21 -7
- package/src/modules/workflows/api/tasks/route.ts +7 -1
- package/src/modules/workflows/backend/definitions/[id]/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/[id]/page.tsx +9 -0
- package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/create/page.tsx +9 -0
- package/src/modules/workflows/backend/definitions/page.tsx +0 -5
- package/src/modules/workflows/backend/definitions/visual-editor/page.meta.ts +1 -1
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +21 -3
- package/src/modules/workflows/backend/events/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/events/[id]/page.tsx +1 -1
- package/src/modules/workflows/backend/instances/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/[id]/page.meta.ts +2 -2
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +1 -1
- package/src/modules/workflows/backend/tasks/page.tsx +6 -10
- package/src/modules/workflows/cli.ts +123 -12
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +581 -0
- package/src/modules/workflows/components/EventTriggersEditor.tsx +664 -0
- package/src/modules/workflows/data/entities.ts +124 -0
- package/src/modules/workflows/data/validators.ts +138 -0
- package/src/modules/workflows/events.ts +49 -0
- package/src/modules/workflows/examples/checkout-demo-definition.json +1 -5
- package/src/modules/workflows/examples/order-approval-definition.json +257 -0
- package/src/modules/workflows/examples/order-approval-guard-rules.json +32 -0
- package/src/modules/workflows/i18n/en.json +72 -3
- package/src/modules/workflows/lib/__tests__/activity-executor.test.ts +43 -36
- package/src/modules/workflows/lib/__tests__/transition-handler.test.ts +170 -90
- package/src/modules/workflows/lib/activity-executor.ts +129 -16
- package/src/modules/workflows/lib/event-trigger-service.ts +557 -0
- package/src/modules/workflows/lib/graph-utils.ts +117 -2
- package/src/modules/workflows/lib/seeds.ts +34 -8
- package/src/modules/workflows/lib/start-validator.ts +38 -28
- package/src/modules/workflows/lib/transition-handler.ts +212 -71
- package/src/modules/workflows/migrations/Migration20260123143500.ts +38 -0
- package/src/modules/workflows/subscribers/event-trigger.ts +109 -0
- package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +446 -0
- package/src/modules/workflows/widgets/injection/order-approval/widget.ts +16 -0
- package/src/modules/workflows/widgets/injection-table.ts +21 -0
- package/dist/generated/entities/notification/index.js +0 -57
- package/dist/generated/entities/notification/index.js.map +0 -7
- package/dist/modules/auth/api/profile/route.js +0 -157
- package/dist/modules/auth/api/profile/route.js.map +0 -7
- package/dist/modules/auth/backend/auth/profile/page.js +0 -141
- package/dist/modules/auth/backend/auth/profile/page.js.map +0 -7
- package/dist/modules/auth/backend/auth/profile/page.meta.js +0 -13
- package/dist/modules/auth/backend/auth/profile/page.meta.js.map +0 -7
- package/dist/modules/auth/notifications.js +0 -112
- package/dist/modules/auth/notifications.js.map +0 -7
- package/dist/modules/business_rules/notifications.js +0 -28
- package/dist/modules/business_rules/notifications.js.map +0 -7
- package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +0 -37
- package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +0 -7
- package/dist/modules/catalog/notifications.js +0 -28
- package/dist/modules/catalog/notifications.js.map +0 -7
- package/dist/modules/catalog/subscribers/low-stock-notification.js +0 -38
- package/dist/modules/catalog/subscribers/low-stock-notification.js.map +0 -7
- package/dist/modules/customers/notifications.js +0 -48
- package/dist/modules/customers/notifications.js.map +0 -7
- package/dist/modules/dashboards/lib/role-widgets.js +0 -58
- package/dist/modules/dashboards/lib/role-widgets.js.map +0 -7
- package/dist/modules/directory/api/get/tenants/lookup.js +0 -70
- package/dist/modules/directory/api/get/tenants/lookup.js.map +0 -7
- package/dist/modules/notifications/acl.js +0 -11
- package/dist/modules/notifications/acl.js.map +0 -7
- package/dist/modules/notifications/api/[id]/action/route.js +0 -74
- package/dist/modules/notifications/api/[id]/action/route.js.map +0 -7
- package/dist/modules/notifications/api/[id]/dismiss/route.js +0 -15
- package/dist/modules/notifications/api/[id]/dismiss/route.js.map +0 -7
- package/dist/modules/notifications/api/[id]/read/route.js +0 -15
- package/dist/modules/notifications/api/[id]/read/route.js.map +0 -7
- package/dist/modules/notifications/api/[id]/restore/route.js +0 -53
- package/dist/modules/notifications/api/[id]/restore/route.js.map +0 -7
- package/dist/modules/notifications/api/batch/route.js +0 -17
- package/dist/modules/notifications/api/batch/route.js.map +0 -7
- package/dist/modules/notifications/api/feature/route.js +0 -17
- package/dist/modules/notifications/api/feature/route.js.map +0 -7
- package/dist/modules/notifications/api/mark-all-read/route.js +0 -35
- package/dist/modules/notifications/api/mark-all-read/route.js.map +0 -7
- package/dist/modules/notifications/api/openapi.js +0 -76
- package/dist/modules/notifications/api/openapi.js.map +0 -7
- package/dist/modules/notifications/api/role/route.js +0 -17
- package/dist/modules/notifications/api/role/route.js.map +0 -7
- package/dist/modules/notifications/api/route.js +0 -85
- package/dist/modules/notifications/api/route.js.map +0 -7
- package/dist/modules/notifications/api/settings/route.js +0 -155
- package/dist/modules/notifications/api/settings/route.js.map +0 -7
- package/dist/modules/notifications/api/unread-count/route.js +0 -38
- package/dist/modules/notifications/api/unread-count/route.js.map +0 -7
- package/dist/modules/notifications/backend/config/notifications/page.js +0 -10
- package/dist/modules/notifications/backend/config/notifications/page.js.map +0 -7
- package/dist/modules/notifications/backend/config/notifications/page.meta.js +0 -24
- package/dist/modules/notifications/backend/config/notifications/page.meta.js.map +0 -7
- package/dist/modules/notifications/cli.js +0 -16
- package/dist/modules/notifications/cli.js.map +0 -7
- package/dist/modules/notifications/data/entities.js +0 -112
- package/dist/modules/notifications/data/entities.js.map +0 -7
- package/dist/modules/notifications/data/validators.js +0 -98
- package/dist/modules/notifications/data/validators.js.map +0 -7
- package/dist/modules/notifications/di.js +0 -13
- package/dist/modules/notifications/di.js.map +0 -7
- package/dist/modules/notifications/emails/NotificationEmail.js +0 -58
- package/dist/modules/notifications/emails/NotificationEmail.js.map +0 -7
- package/dist/modules/notifications/frontend/NotificationInboxPageClient.js +0 -44
- package/dist/modules/notifications/frontend/NotificationInboxPageClient.js.map +0 -7
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +0 -220
- package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +0 -7
- package/dist/modules/notifications/index.js +0 -14
- package/dist/modules/notifications/index.js.map +0 -7
- package/dist/modules/notifications/lib/deliveryConfig.js +0 -107
- package/dist/modules/notifications/lib/deliveryConfig.js.map +0 -7
- package/dist/modules/notifications/lib/deliveryStrategies.js +0 -14
- package/dist/modules/notifications/lib/deliveryStrategies.js.map +0 -7
- package/dist/modules/notifications/lib/events.js +0 -12
- package/dist/modules/notifications/lib/events.js.map +0 -7
- package/dist/modules/notifications/lib/notificationBuilder.js +0 -66
- package/dist/modules/notifications/lib/notificationBuilder.js.map +0 -7
- package/dist/modules/notifications/lib/notificationFactory.js +0 -54
- package/dist/modules/notifications/lib/notificationFactory.js.map +0 -7
- package/dist/modules/notifications/lib/notificationMapper.js +0 -34
- package/dist/modules/notifications/lib/notificationMapper.js.map +0 -7
- package/dist/modules/notifications/lib/notificationRecipients.js +0 -35
- package/dist/modules/notifications/lib/notificationRecipients.js.map +0 -7
- package/dist/modules/notifications/lib/notificationService.js +0 -279
- package/dist/modules/notifications/lib/notificationService.js.map +0 -7
- package/dist/modules/notifications/lib/routeHelpers.js +0 -101
- package/dist/modules/notifications/lib/routeHelpers.js.map +0 -7
- package/dist/modules/notifications/lib/safeHref.js +0 -24
- package/dist/modules/notifications/lib/safeHref.js.map +0 -7
- package/dist/modules/notifications/migrations/Migration20260123000001.js +0 -70
- package/dist/modules/notifications/migrations/Migration20260123000001.js.map +0 -7
- package/dist/modules/notifications/migrations/Migration20260126150000.js +0 -37
- package/dist/modules/notifications/migrations/Migration20260126150000.js.map +0 -7
- package/dist/modules/notifications/migrations/Migration20260129082610.js +0 -13
- package/dist/modules/notifications/migrations/Migration20260129082610.js.map +0 -7
- package/dist/modules/notifications/subscribers/deliver-notification.js +0 -165
- package/dist/modules/notifications/subscribers/deliver-notification.js.map +0 -7
- package/dist/modules/notifications/workers/create-notification.worker.js +0 -70
- package/dist/modules/notifications/workers/create-notification.worker.js.map +0 -7
- package/dist/modules/sales/notifications.client.js +0 -51
- package/dist/modules/sales/notifications.client.js.map +0 -7
- package/dist/modules/sales/notifications.js +0 -88
- package/dist/modules/sales/notifications.js.map +0 -7
- package/dist/modules/sales/subscribers/quote-expiring-notification.js +0 -38
- package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +0 -7
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +0 -137
- package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +0 -7
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +0 -137
- package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +0 -7
- package/dist/modules/sales/widgets/notifications/index.js +0 -7
- package/dist/modules/sales/widgets/notifications/index.js.map +0 -7
- package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js +0 -60
- package/dist/modules/sales/widgets/notifications/useSalesDocumentTotals.js.map +0 -7
- package/dist/modules/staff/notifications.js +0 -75
- package/dist/modules/staff/notifications.js.map +0 -7
- package/dist/modules/workflows/notifications.js +0 -28
- package/dist/modules/workflows/notifications.js.map +0 -7
- package/dist/modules/workflows/subscribers/task-assigned-notification.js +0 -38
- package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +0 -7
- package/generated/entities/notification/index.ts +0 -27
- package/src/modules/auth/api/profile/route.ts +0 -163
- package/src/modules/auth/backend/auth/profile/page.meta.ts +0 -9
- package/src/modules/auth/backend/auth/profile/page.tsx +0 -174
- package/src/modules/auth/notifications.ts +0 -109
- package/src/modules/business_rules/notifications.ts +0 -25
- package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +0 -50
- package/src/modules/catalog/notifications.ts +0 -25
- package/src/modules/catalog/subscribers/low-stock-notification.ts +0 -52
- package/src/modules/customers/notifications.ts +0 -44
- package/src/modules/dashboards/lib/role-widgets.ts +0 -80
- package/src/modules/directory/api/get/tenants/lookup.ts +0 -75
- package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -195
- package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
- package/src/modules/notifications/__tests__/notificationService.test.ts +0 -208
- package/src/modules/notifications/acl.ts +0 -7
- package/src/modules/notifications/api/[id]/action/route.ts +0 -75
- package/src/modules/notifications/api/[id]/dismiss/route.ts +0 -12
- package/src/modules/notifications/api/[id]/read/route.ts +0 -12
- package/src/modules/notifications/api/[id]/restore/route.ts +0 -53
- package/src/modules/notifications/api/batch/route.ts +0 -14
- package/src/modules/notifications/api/feature/route.ts +0 -14
- package/src/modules/notifications/api/mark-all-read/route.ts +0 -34
- package/src/modules/notifications/api/openapi.ts +0 -76
- package/src/modules/notifications/api/role/route.ts +0 -14
- package/src/modules/notifications/api/route.ts +0 -92
- package/src/modules/notifications/api/settings/route.ts +0 -157
- package/src/modules/notifications/api/unread-count/route.ts +0 -38
- package/src/modules/notifications/backend/config/notifications/page.meta.ts +0 -22
- package/src/modules/notifications/backend/config/notifications/page.tsx +0 -12
- package/src/modules/notifications/cli.ts +0 -18
- package/src/modules/notifications/data/entities.ts +0 -99
- package/src/modules/notifications/data/validators.ts +0 -115
- package/src/modules/notifications/di.ts +0 -11
- package/src/modules/notifications/emails/NotificationEmail.tsx +0 -98
- package/src/modules/notifications/frontend/NotificationInboxPageClient.tsx +0 -42
- package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +0 -233
- package/src/modules/notifications/i18n/de.json +0 -50
- package/src/modules/notifications/i18n/en.json +0 -50
- package/src/modules/notifications/i18n/es.json +0 -50
- package/src/modules/notifications/i18n/pl.json +0 -50
- package/src/modules/notifications/index.ts +0 -12
- package/src/modules/notifications/lib/deliveryConfig.ts +0 -153
- package/src/modules/notifications/lib/deliveryStrategies.ts +0 -50
- package/src/modules/notifications/lib/events.ts +0 -48
- package/src/modules/notifications/lib/notificationBuilder.ts +0 -121
- package/src/modules/notifications/lib/notificationFactory.ts +0 -76
- package/src/modules/notifications/lib/notificationMapper.ts +0 -33
- package/src/modules/notifications/lib/notificationRecipients.ts +0 -83
- package/src/modules/notifications/lib/notificationService.ts +0 -414
- package/src/modules/notifications/lib/routeHelpers.ts +0 -151
- package/src/modules/notifications/lib/safeHref.ts +0 -29
- package/src/modules/notifications/migrations/.snapshot-open-mercato.json +0 -336
- package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
- package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
- package/src/modules/notifications/migrations/Migration20260129082610.ts +0 -13
- package/src/modules/notifications/subscribers/deliver-notification.ts +0 -204
- package/src/modules/notifications/workers/create-notification.worker.ts +0 -122
- package/src/modules/sales/notifications.client.ts +0 -65
- package/src/modules/sales/notifications.ts +0 -82
- package/src/modules/sales/subscribers/quote-expiring-notification.ts +0 -53
- package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +0 -156
- package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +0 -156
- package/src/modules/sales/widgets/notifications/index.ts +0 -2
- package/src/modules/sales/widgets/notifications/useSalesDocumentTotals.ts +0 -81
- package/src/modules/staff/notifications.ts +0 -71
- package/src/modules/workflows/notifications.ts +0 -25
- package/src/modules/workflows/subscribers/task-assigned-notification.ts +0 -53
|
@@ -15,8 +15,6 @@ jest.mock('@open-mercato/shared/lib/di/container', () => ({
|
|
|
15
15
|
createRequestContainer: async () => ({
|
|
16
16
|
resolve: (_: string) => ({
|
|
17
17
|
findUserByEmail: async (email: string) => ({ id: 1, email, passwordHash: 'hash', tenantId: tenantId, organizationId: orgId }),
|
|
18
|
-
findUsersByEmail: async (email: string) => ([{ id: 1, email, passwordHash: 'hash', tenantId: tenantId, organizationId: orgId }]),
|
|
19
|
-
findUserByEmailAndTenant: async (email: string) => ({ id: 1, email, passwordHash: 'hash', tenantId: tenantId, organizationId: orgId }),
|
|
20
18
|
verifyPassword: async () => true,
|
|
21
19
|
getUserRoles: async (_user: any, _tenant: string | null | undefined) => ['admin'],
|
|
22
20
|
updateLastLoginAt: async () => undefined,
|
|
@@ -297,16 +297,12 @@ export async function GET(req: Request) {
|
|
|
297
297
|
const groupsWithRole = rolePreference ? applySidebarPreference(groups, rolePreference) : groups
|
|
298
298
|
const baseForUser = adoptSidebarDefaults(groupsWithRole)
|
|
299
299
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
organizationId: auth.orgId ?? null,
|
|
307
|
-
locale,
|
|
308
|
-
})
|
|
309
|
-
: null
|
|
300
|
+
const preference = await loadSidebarPreference(em, {
|
|
301
|
+
userId: auth.sub,
|
|
302
|
+
tenantId: auth.tenantId ?? null,
|
|
303
|
+
organizationId: auth.orgId ?? null,
|
|
304
|
+
locale,
|
|
305
|
+
})
|
|
310
306
|
|
|
311
307
|
const withPreference = applySidebarPreference(baseForUser, preference)
|
|
312
308
|
|
|
@@ -17,33 +17,15 @@ export async function POST(req: Request) {
|
|
|
17
17
|
const email = String(form.get('email') ?? '')
|
|
18
18
|
const password = String(form.get('password') ?? '')
|
|
19
19
|
const remember = parseBooleanToken(form.get('remember')?.toString()) === true
|
|
20
|
-
const tenantIdRaw = String(form.get('tenantId') ?? form.get('tenant') ?? '').trim()
|
|
21
20
|
const requireRoleRaw = (String(form.get('requireRole') ?? form.get('role') ?? '')).trim()
|
|
22
21
|
const requiredRoles = requireRoleRaw ? requireRoleRaw.split(',').map((s) => s.trim()).filter(Boolean) : []
|
|
23
|
-
const parsed = userLoginSchema.pick({ email: true, password: true
|
|
24
|
-
email,
|
|
25
|
-
password,
|
|
26
|
-
tenantId: tenantIdRaw || undefined,
|
|
27
|
-
})
|
|
22
|
+
const parsed = userLoginSchema.pick({ email: true, password: true }).safeParse({ email, password })
|
|
28
23
|
if (!parsed.success) {
|
|
29
24
|
return NextResponse.json({ ok: false, error: translate('auth.login.errors.invalidCredentials', 'Invalid credentials') }, { status: 400 })
|
|
30
25
|
}
|
|
31
26
|
const container = await createRequestContainer()
|
|
32
27
|
const auth = (container.resolve('authService') as AuthService)
|
|
33
|
-
const
|
|
34
|
-
let user = null
|
|
35
|
-
if (tenantId) {
|
|
36
|
-
user = await auth.findUserByEmailAndTenant(parsed.data.email, tenantId)
|
|
37
|
-
} else {
|
|
38
|
-
const users = await auth.findUsersByEmail(parsed.data.email)
|
|
39
|
-
if (users.length > 1) {
|
|
40
|
-
return NextResponse.json({
|
|
41
|
-
ok: false,
|
|
42
|
-
error: translate('auth.login.errors.tenantRequired', 'Use the login link provided with your tenant activation to continue.'),
|
|
43
|
-
}, { status: 400 })
|
|
44
|
-
}
|
|
45
|
-
user = users[0] ?? null
|
|
46
|
-
}
|
|
28
|
+
const user = await auth.findUserByEmail(parsed.data.email)
|
|
47
29
|
if (!user || !user.passwordHash) {
|
|
48
30
|
return NextResponse.json({ ok: false, error: translate('auth.login.errors.invalidCredentials', 'Invalid email or password') }, { status: 401 })
|
|
49
31
|
}
|
|
@@ -53,27 +35,26 @@ export async function POST(req: Request) {
|
|
|
53
35
|
}
|
|
54
36
|
// Optional role requirement
|
|
55
37
|
if (requiredRoles.length) {
|
|
56
|
-
const userRoleNames = await auth.getUserRoles(user,
|
|
38
|
+
const userRoleNames = await auth.getUserRoles(user, user.tenantId ? String(user.tenantId) : null)
|
|
57
39
|
const authorized = requiredRoles.some(r => userRoleNames.includes(r))
|
|
58
40
|
if (!authorized) {
|
|
59
41
|
return NextResponse.json({ ok: false, error: translate('auth.login.errors.permissionDenied', 'Not authorized for this area') }, { status: 403 })
|
|
60
42
|
}
|
|
61
43
|
}
|
|
62
44
|
await auth.updateLastLoginAt(user)
|
|
63
|
-
const
|
|
64
|
-
const userRoleNames = await auth.getUserRoles(user, resolvedTenantId)
|
|
45
|
+
const userRoleNames = await auth.getUserRoles(user, user.tenantId ? String(user.tenantId) : null)
|
|
65
46
|
try {
|
|
66
47
|
const eventBus = (container.resolve('eventBus') as EventBus)
|
|
67
48
|
void eventBus.emitEvent('query_index.coverage.warmup', {
|
|
68
|
-
tenantId:
|
|
49
|
+
tenantId: user.tenantId ? String(user.tenantId) : null,
|
|
69
50
|
}).catch(() => undefined)
|
|
70
51
|
} catch {
|
|
71
52
|
// optional warmup
|
|
72
53
|
}
|
|
73
54
|
const token = signJwt({
|
|
74
55
|
sub: String(user.id),
|
|
75
|
-
tenantId:
|
|
76
|
-
orgId: user.organizationId ? String(user.organizationId) : null,
|
|
56
|
+
tenantId: user.tenantId ? String(user.tenantId) : null,
|
|
57
|
+
orgId: user.organizationId ? String(user.organizationId) : null,
|
|
77
58
|
email: user.email,
|
|
78
59
|
roles: userRoleNames
|
|
79
60
|
})
|
|
@@ -3,9 +3,6 @@ import { NextResponse } from 'next/server'
|
|
|
3
3
|
import type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'
|
|
4
4
|
import { createRequestContainer } from '@open-mercato/shared/lib/di/container'
|
|
5
5
|
import { AuthService } from '@open-mercato/core/modules/auth/services/authService'
|
|
6
|
-
import { buildNotificationFromType } from '@open-mercato/core/modules/notifications/lib/notificationBuilder'
|
|
7
|
-
import { resolveNotificationService } from '@open-mercato/core/modules/notifications/lib/notificationService'
|
|
8
|
-
import notificationTypes from '@open-mercato/core/modules/auth/notifications'
|
|
9
6
|
import { z } from 'zod'
|
|
10
7
|
|
|
11
8
|
// validation via confirmPasswordResetSchema
|
|
@@ -18,28 +15,8 @@ export async function POST(req: Request) {
|
|
|
18
15
|
if (!parsed.success) return NextResponse.json({ ok: false, error: 'Invalid request' }, { status: 400 })
|
|
19
16
|
const c = await createRequestContainer()
|
|
20
17
|
const auth = c.resolve<AuthService>('authService')
|
|
21
|
-
const
|
|
22
|
-
if (!
|
|
23
|
-
try {
|
|
24
|
-
const tenantId = user.tenantId ? String(user.tenantId) : null
|
|
25
|
-
if (tenantId) {
|
|
26
|
-
const notificationService = resolveNotificationService(c)
|
|
27
|
-
const typeDef = notificationTypes.find((type) => type.type === 'auth.password_reset.completed')
|
|
28
|
-
if (typeDef) {
|
|
29
|
-
const notificationInput = buildNotificationFromType(typeDef, {
|
|
30
|
-
recipientUserId: String(user.id),
|
|
31
|
-
sourceEntityType: 'auth:user',
|
|
32
|
-
sourceEntityId: String(user.id),
|
|
33
|
-
})
|
|
34
|
-
await notificationService.create(notificationInput, {
|
|
35
|
-
tenantId,
|
|
36
|
-
organizationId: user.organizationId ? String(user.organizationId) : null,
|
|
37
|
-
})
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
} catch (err) {
|
|
41
|
-
console.error('[auth.reset.confirm] Failed to create notification:', err)
|
|
42
|
-
}
|
|
18
|
+
const ok = await auth.confirmPasswordReset(parsed.data.token, parsed.data.password)
|
|
19
|
+
if (!ok) return NextResponse.json({ ok: false, error: 'Invalid or expired token' }, { status: 400 })
|
|
43
20
|
return NextResponse.json({ ok: true, redirect: '/login' })
|
|
44
21
|
}
|
|
45
22
|
|
|
@@ -6,9 +6,6 @@ import { AuthService } from '@open-mercato/core/modules/auth/services/authServic
|
|
|
6
6
|
import { sendEmail } from '@open-mercato/shared/lib/email/send'
|
|
7
7
|
import ResetPasswordEmail from '@open-mercato/core/modules/auth/emails/ResetPasswordEmail'
|
|
8
8
|
import { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'
|
|
9
|
-
import { buildNotificationFromType } from '@open-mercato/core/modules/notifications/lib/notificationBuilder'
|
|
10
|
-
import { resolveNotificationService } from '@open-mercato/core/modules/notifications/lib/notificationService'
|
|
11
|
-
import notificationTypes from '@open-mercato/core/modules/auth/notifications'
|
|
12
9
|
import { z } from 'zod'
|
|
13
10
|
|
|
14
11
|
// validation via requestPasswordResetSchema
|
|
@@ -38,26 +35,6 @@ export async function POST(req: Request) {
|
|
|
38
35
|
}
|
|
39
36
|
|
|
40
37
|
await sendEmail({ to: user.email, subject, react: ResetPasswordEmail({ resetUrl, copy }) })
|
|
41
|
-
try {
|
|
42
|
-
const tenantId = user.tenantId ? String(user.tenantId) : null
|
|
43
|
-
if (tenantId) {
|
|
44
|
-
const notificationService = resolveNotificationService(c)
|
|
45
|
-
const typeDef = notificationTypes.find((type) => type.type === 'auth.password_reset.requested')
|
|
46
|
-
if (typeDef) {
|
|
47
|
-
const notificationInput = buildNotificationFromType(typeDef, {
|
|
48
|
-
recipientUserId: String(user.id),
|
|
49
|
-
sourceEntityType: 'auth:user',
|
|
50
|
-
sourceEntityId: String(user.id),
|
|
51
|
-
})
|
|
52
|
-
await notificationService.create(notificationInput, {
|
|
53
|
-
tenantId,
|
|
54
|
-
organizationId: user.organizationId ? String(user.organizationId) : null,
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
} catch (err) {
|
|
59
|
-
console.error('[auth.reset] Failed to create notification:', err)
|
|
60
|
-
}
|
|
61
38
|
return NextResponse.json({ ok: true })
|
|
62
39
|
}
|
|
63
40
|
|
|
@@ -64,16 +64,12 @@ export async function GET(req: Request) {
|
|
|
64
64
|
{ tenantId: auth.tenantId ?? null, organizationId: auth.orgId ?? null },
|
|
65
65
|
) ?? false
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
organizationId: auth.orgId ?? null,
|
|
74
|
-
locale,
|
|
75
|
-
})
|
|
76
|
-
: null
|
|
67
|
+
const settings = await loadSidebarPreference(em, {
|
|
68
|
+
userId: auth.sub,
|
|
69
|
+
tenantId: auth.tenantId ?? null,
|
|
70
|
+
organizationId: auth.orgId ?? null,
|
|
71
|
+
locale,
|
|
72
|
+
})
|
|
77
73
|
|
|
78
74
|
let rolesPayload: Array<{ id: string; name: string; hasPreference: boolean }> = []
|
|
79
75
|
if (canApplyToRoles) {
|
|
@@ -96,11 +92,11 @@ export async function GET(req: Request) {
|
|
|
96
92
|
return NextResponse.json({
|
|
97
93
|
locale,
|
|
98
94
|
settings: {
|
|
99
|
-
version: settings
|
|
100
|
-
groupOrder: settings
|
|
101
|
-
groupLabels: settings
|
|
102
|
-
itemLabels: settings
|
|
103
|
-
hiddenItems: settings
|
|
95
|
+
version: settings.version ?? SIDEBAR_PREFERENCES_VERSION,
|
|
96
|
+
groupOrder: settings.groupOrder ?? [],
|
|
97
|
+
groupLabels: settings.groupLabels ?? {},
|
|
98
|
+
itemLabels: settings.itemLabels ?? {},
|
|
99
|
+
hiddenItems: settings.hiddenItems ?? [],
|
|
104
100
|
},
|
|
105
101
|
canApplyToRoles,
|
|
106
102
|
roles: rolesPayload,
|
|
@@ -110,11 +106,6 @@ export async function GET(req: Request) {
|
|
|
110
106
|
export async function PUT(req: Request) {
|
|
111
107
|
const auth = await getAuthFromRequest(req)
|
|
112
108
|
if (!auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
|
|
113
|
-
// For API key auth, use userId (the actual user) if available
|
|
114
|
-
const effectiveUserId = auth.isApiKey ? auth.userId : auth.sub
|
|
115
|
-
if (!effectiveUserId) {
|
|
116
|
-
return NextResponse.json({ error: 'Cannot save preferences: no user associated with this API key' }, { status: 403 })
|
|
117
|
-
}
|
|
118
109
|
|
|
119
110
|
let parsedBody: unknown
|
|
120
111
|
try {
|
|
@@ -191,7 +182,7 @@ export async function PUT(req: Request) {
|
|
|
191
182
|
}
|
|
192
183
|
|
|
193
184
|
const settings = await saveSidebarPreference(em, {
|
|
194
|
-
userId:
|
|
185
|
+
userId: auth.sub,
|
|
195
186
|
tenantId: auth.tenantId ?? null,
|
|
196
187
|
organizationId: auth.orgId ?? null,
|
|
197
188
|
locale,
|
|
@@ -15,7 +15,6 @@ import type { EntityManager } from '@mikro-orm/postgresql'
|
|
|
15
15
|
import { userCrudEvents, userCrudIndexer } from '@open-mercato/core/modules/auth/commands/users'
|
|
16
16
|
import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
17
17
|
import { escapeLikePattern } from '@open-mercato/shared/lib/db/escapeLikePattern'
|
|
18
|
-
import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
19
18
|
|
|
20
19
|
const querySchema = z.object({
|
|
21
20
|
id: z.string().uuid().optional(),
|
|
@@ -28,11 +27,9 @@ const querySchema = z.object({
|
|
|
28
27
|
|
|
29
28
|
const rawBodySchema = z.object({}).passthrough()
|
|
30
29
|
|
|
31
|
-
const passwordSchema = buildPasswordSchema()
|
|
32
|
-
|
|
33
30
|
const userCreateSchema = z.object({
|
|
34
31
|
email: z.string().email(),
|
|
35
|
-
password:
|
|
32
|
+
password: z.string().min(6),
|
|
36
33
|
organizationId: z.string().uuid(),
|
|
37
34
|
roles: z.array(z.string()).optional(),
|
|
38
35
|
})
|
|
@@ -40,7 +37,7 @@ const userCreateSchema = z.object({
|
|
|
40
37
|
const userUpdateSchema = z.object({
|
|
41
38
|
id: z.string().uuid(),
|
|
42
39
|
email: z.string().email().optional(),
|
|
43
|
-
password:
|
|
40
|
+
password: z.string().min(6).optional(),
|
|
44
41
|
organizationId: z.string().uuid().optional(),
|
|
45
42
|
roles: z.array(z.string()).optional(),
|
|
46
43
|
})
|
|
@@ -6,7 +6,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
|
6
6
|
import { deleteCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'
|
|
7
7
|
import { collectCustomFieldValues } from '@open-mercato/ui/backend/utils/customFieldValues'
|
|
8
8
|
import { AclEditor, type AclData } from '@open-mercato/core/modules/auth/components/AclEditor'
|
|
9
|
-
import { WidgetVisibilityEditor
|
|
9
|
+
import { WidgetVisibilityEditor } from '@open-mercato/core/modules/dashboards/components/WidgetVisibilityEditor'
|
|
10
10
|
import { E } from '#generated/entities.ids.generated'
|
|
11
11
|
import { TenantSelect } from '@open-mercato/core/modules/directory/components/TenantSelect'
|
|
12
12
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
@@ -37,7 +37,6 @@ export default function EditRolePage({ params }: { params?: { id?: string } }) {
|
|
|
37
37
|
const [aclData, setAclData] = React.useState<AclData>({ isSuperAdmin: false, features: [], organizations: null })
|
|
38
38
|
const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)
|
|
39
39
|
const [selectedTenantId, setSelectedTenantId] = React.useState<string | null>(null)
|
|
40
|
-
const widgetEditorRef = React.useRef<WidgetVisibilityEditorHandle | null>(null)
|
|
41
40
|
|
|
42
41
|
React.useEffect(() => {
|
|
43
42
|
if (!id) return
|
|
@@ -154,7 +153,6 @@ export default function EditRolePage({ params }: { params?: { id?: string } }) {
|
|
|
154
153
|
kind="role"
|
|
155
154
|
targetId={String(id)}
|
|
156
155
|
tenantId={selectedTenantId ?? (initial?.tenantId ?? null)}
|
|
157
|
-
ref={widgetEditorRef}
|
|
158
156
|
/>
|
|
159
157
|
)
|
|
160
158
|
: null),
|
|
@@ -193,7 +191,6 @@ export default function EditRolePage({ params }: { params?: { id?: string } }) {
|
|
|
193
191
|
await updateCrud('auth/roles/acl', { roleId: id, tenantId: effectiveTenantId, ...aclData }, {
|
|
194
192
|
errorMessage: t('auth.roles.form.errors.aclUpdate', 'Failed to update role access control'),
|
|
195
193
|
})
|
|
196
|
-
await widgetEditorRef.current?.save()
|
|
197
194
|
try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
|
|
198
195
|
}}
|
|
199
196
|
onDelete={async () => {
|
|
@@ -117,9 +117,9 @@ export default function RolesListPage() {
|
|
|
117
117
|
onSearchChange={(v) => { setSearch(v); setPage(1) }}
|
|
118
118
|
rowActions={(row) => (
|
|
119
119
|
<RowActions items={[
|
|
120
|
-
{
|
|
121
|
-
{
|
|
122
|
-
{
|
|
120
|
+
{ label: t('common.edit', 'Edit'), href: `/backend/roles/${row.id}/edit` },
|
|
121
|
+
{ label: t('auth.roles.list.actions.showUsers', 'Show users'), href: `/backend/users?roleId=${encodeURIComponent(row.id)}` },
|
|
122
|
+
{ label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
|
|
123
123
|
]} />
|
|
124
124
|
)}
|
|
125
125
|
sortable
|
|
@@ -10,9 +10,8 @@ import { AclEditor, type AclData } from '@open-mercato/core/modules/auth/compone
|
|
|
10
10
|
import { OrganizationSelect } from '@open-mercato/core/modules/directory/components/OrganizationSelect'
|
|
11
11
|
import { TenantSelect } from '@open-mercato/core/modules/directory/components/TenantSelect'
|
|
12
12
|
import { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'
|
|
13
|
-
import { WidgetVisibilityEditor
|
|
13
|
+
import { WidgetVisibilityEditor } from '@open-mercato/core/modules/dashboards/components/WidgetVisibilityEditor'
|
|
14
14
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
15
|
-
import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
16
15
|
|
|
17
16
|
type EditUserFormValues = {
|
|
18
17
|
email: string
|
|
@@ -109,17 +108,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
|
|
|
109
108
|
const [aclData, setAclData] = React.useState<AclData>({ isSuperAdmin: false, features: [], organizations: null })
|
|
110
109
|
const [customFieldValues, setCustomFieldValues] = React.useState<Record<string, unknown>>({})
|
|
111
110
|
const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)
|
|
112
|
-
const widgetEditorRef = React.useRef<WidgetVisibilityEditorHandle | null>(null)
|
|
113
|
-
const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])
|
|
114
|
-
const passwordRequirements = React.useMemo(
|
|
115
|
-
() => formatPasswordRequirements(passwordPolicy, t),
|
|
116
|
-
[passwordPolicy, t],
|
|
117
|
-
)
|
|
118
|
-
const passwordDescription = React.useMemo(() => (
|
|
119
|
-
passwordRequirements
|
|
120
|
-
? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
|
|
121
|
-
: undefined
|
|
122
|
-
), [passwordRequirements, t])
|
|
123
111
|
|
|
124
112
|
React.useEffect(() => {
|
|
125
113
|
if (!id) {
|
|
@@ -213,12 +201,7 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
|
|
|
213
201
|
const fields: CrudField[] = React.useMemo(() => {
|
|
214
202
|
const items: CrudField[] = [
|
|
215
203
|
{ id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },
|
|
216
|
-
{
|
|
217
|
-
id: 'password',
|
|
218
|
-
label: t('auth.users.form.field.password', 'Password'),
|
|
219
|
-
type: 'text',
|
|
220
|
-
description: passwordDescription,
|
|
221
|
-
},
|
|
204
|
+
{ id: 'password', label: t('auth.users.form.field.password', 'Password'), type: 'text' },
|
|
222
205
|
]
|
|
223
206
|
if (actorIsSuperAdmin) {
|
|
224
207
|
items.push({
|
|
@@ -268,7 +251,7 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
|
|
|
268
251
|
})
|
|
269
252
|
items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })
|
|
270
253
|
return items
|
|
271
|
-
}, [actorIsSuperAdmin, loadRoleOptions,
|
|
254
|
+
}, [actorIsSuperAdmin, loadRoleOptions, preloadedTenants, selectedOrgId, selectedTenantId, t])
|
|
272
255
|
|
|
273
256
|
const detailFieldIds = React.useMemo(() => {
|
|
274
257
|
const base: string[] = ['email', 'password', 'organizationId', 'roles']
|
|
@@ -309,7 +292,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
|
|
|
309
292
|
targetId={String(id)}
|
|
310
293
|
tenantId={selectedTenantId ?? null}
|
|
311
294
|
organizationId={initialUser?.organizationId ?? null}
|
|
312
|
-
ref={widgetEditorRef}
|
|
313
295
|
/>
|
|
314
296
|
) : null
|
|
315
297
|
),
|
|
@@ -372,7 +354,6 @@ export default function EditUserPage({ params }: { params?: { id?: string } }) {
|
|
|
372
354
|
await updateCrud('auth/users/acl', { userId: id, ...aclData }, {
|
|
373
355
|
errorMessage: t('auth.users.form.errors.aclUpdate', 'Failed to update user access control'),
|
|
374
356
|
})
|
|
375
|
-
await widgetEditorRef.current?.save()
|
|
376
357
|
try { window.dispatchEvent(new Event('om:refresh-sidebar')) } catch {}
|
|
377
358
|
}}
|
|
378
359
|
onDelete={async () => {
|
|
@@ -11,7 +11,6 @@ import { TenantSelect } from '@open-mercato/core/modules/directory/components/Te
|
|
|
11
11
|
import { fetchRoleOptions } from '@open-mercato/core/modules/auth/backend/users/roleOptions'
|
|
12
12
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
13
13
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
14
|
-
import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
15
14
|
|
|
16
15
|
type CreateUserFormValues = {
|
|
17
16
|
email: string
|
|
@@ -85,16 +84,6 @@ export default function CreateUserPage() {
|
|
|
85
84
|
const [selectedWidgets, setSelectedWidgets] = React.useState<string[]>([])
|
|
86
85
|
const [selectedTenantId, setSelectedTenantId] = React.useState<string | null>(null)
|
|
87
86
|
const [actorIsSuperAdmin, setActorIsSuperAdmin] = React.useState(false)
|
|
88
|
-
const passwordPolicy = React.useMemo(() => getPasswordPolicy(), [])
|
|
89
|
-
const passwordRequirements = React.useMemo(
|
|
90
|
-
() => formatPasswordRequirements(passwordPolicy, t),
|
|
91
|
-
[passwordPolicy, t],
|
|
92
|
-
)
|
|
93
|
-
const passwordDescription = React.useMemo(() => (
|
|
94
|
-
passwordRequirements
|
|
95
|
-
? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
|
|
96
|
-
: undefined
|
|
97
|
-
), [passwordRequirements, t])
|
|
98
87
|
|
|
99
88
|
React.useEffect(() => {
|
|
100
89
|
let cancelled = false
|
|
@@ -167,13 +156,7 @@ export default function CreateUserPage() {
|
|
|
167
156
|
const fields: CrudField[] = React.useMemo(() => {
|
|
168
157
|
const items: CrudField[] = [
|
|
169
158
|
{ id: 'email', label: t('auth.users.form.field.email', 'Email'), type: 'text', required: true },
|
|
170
|
-
{
|
|
171
|
-
id: 'password',
|
|
172
|
-
label: t('auth.users.form.field.password', 'Password'),
|
|
173
|
-
type: 'text',
|
|
174
|
-
required: true,
|
|
175
|
-
description: passwordDescription,
|
|
176
|
-
},
|
|
159
|
+
{ id: 'password', label: t('auth.users.form.field.password', 'Password'), type: 'text', required: true },
|
|
177
160
|
]
|
|
178
161
|
if (actorIsSuperAdmin) {
|
|
179
162
|
items.push({
|
|
@@ -220,7 +203,7 @@ export default function CreateUserPage() {
|
|
|
220
203
|
})
|
|
221
204
|
items.push({ id: 'roles', label: t('auth.users.form.field.roles', 'Roles'), type: 'tags', loadOptions: loadRoleOptions })
|
|
222
205
|
return items
|
|
223
|
-
}, [actorIsSuperAdmin, loadRoleOptions,
|
|
206
|
+
}, [actorIsSuperAdmin, loadRoleOptions, selectedTenantId, t])
|
|
224
207
|
|
|
225
208
|
const detailFieldIds = React.useMemo(() => {
|
|
226
209
|
const base: string[] = ['email', 'password', 'organizationId', 'roles']
|
|
@@ -383,9 +383,9 @@ export default function UsersListPage() {
|
|
|
383
383
|
perspective={{ tableId: 'auth.users.list' }}
|
|
384
384
|
rowActions={(row) => (
|
|
385
385
|
<RowActions items={[
|
|
386
|
-
{
|
|
387
|
-
{
|
|
388
|
-
{
|
|
386
|
+
{ label: t('common.edit', 'Edit'), href: `/backend/users/${row.id}/edit` },
|
|
387
|
+
{ label: t('auth.users.list.actions.showRoles', 'Show roles'), href: `/backend/roles?userId=${encodeURIComponent(row.id)}` },
|
|
388
|
+
{ label: t('common.delete', 'Delete'), destructive: true, onSelect: () => { void handleDelete(row) } },
|
|
389
389
|
]} />
|
|
390
390
|
)}
|
|
391
391
|
pagination={{ page, pageSize: 50, total, totalPages, onPageChange: setPage }}
|
package/src/modules/auth/cli.ts
CHANGED
|
@@ -16,8 +16,6 @@ import { decryptWithAesGcm } from '@open-mercato/shared/lib/encryption/aes'
|
|
|
16
16
|
import { env } from 'process'
|
|
17
17
|
import type { KmsService, TenantDek } from '@open-mercato/shared/lib/encryption/kms'
|
|
18
18
|
import crypto from 'node:crypto'
|
|
19
|
-
import { formatPasswordRequirements, getPasswordPolicy, validatePassword } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
20
|
-
import { parseBooleanToken } from '@open-mercato/shared/lib/boolean'
|
|
21
19
|
|
|
22
20
|
const addUser: ModuleCli = {
|
|
23
21
|
command: 'add-user',
|
|
@@ -36,7 +34,6 @@ const addUser: ModuleCli = {
|
|
|
36
34
|
console.error('Usage: mercato auth add-user --email <email> --password <password> --organizationId <id> [--roles customer,employee]')
|
|
37
35
|
return
|
|
38
36
|
}
|
|
39
|
-
if (!ensurePasswordPolicy(password)) return
|
|
40
37
|
const { resolve } = await createRequestContainer()
|
|
41
38
|
const em = resolve('em') as any
|
|
42
39
|
const org =
|
|
@@ -105,16 +102,6 @@ function hashSecret(value: string | null | undefined): string | null {
|
|
|
105
102
|
return crypto.createHash('sha256').update(normalizeKeyInput(value)).digest('hex').slice(0, 12)
|
|
106
103
|
}
|
|
107
104
|
|
|
108
|
-
function ensurePasswordPolicy(password: string): boolean {
|
|
109
|
-
const policy = getPasswordPolicy()
|
|
110
|
-
const result = validatePassword(password, policy)
|
|
111
|
-
if (result.ok) return true
|
|
112
|
-
const requirements = formatPasswordRequirements(policy, (_key, fallback) => fallback)
|
|
113
|
-
const suffix = requirements ? `: ${requirements}` : ''
|
|
114
|
-
console.error(`Password does not meet the requirements${suffix}.`)
|
|
115
|
-
return false
|
|
116
|
-
}
|
|
117
|
-
|
|
118
105
|
async function withEncryptionDebugDisabled<T>(fn: () => Promise<T>): Promise<T> {
|
|
119
106
|
const previous = process.env.TENANT_DATA_ENCRYPTION_DEBUG
|
|
120
107
|
process.env.TENANT_DATA_ENCRYPTION_DEBUG = 'no'
|
|
@@ -405,33 +392,20 @@ const addOrganization: ModuleCli = {
|
|
|
405
392
|
const setupApp: ModuleCli = {
|
|
406
393
|
command: 'setup',
|
|
407
394
|
async run(rest) {
|
|
408
|
-
const args =
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
const
|
|
415
|
-
const
|
|
416
|
-
const
|
|
417
|
-
|
|
418
|
-
: 'superadmin,admin,employee'
|
|
419
|
-
const skipPasswordPolicyRaw =
|
|
420
|
-
args['skip-password-policy'] ??
|
|
421
|
-
args.skipPasswordPolicy ??
|
|
422
|
-
args['allow-weak-password'] ??
|
|
423
|
-
args.allowWeakPassword
|
|
424
|
-
const skipPasswordPolicy = typeof skipPasswordPolicyRaw === 'boolean'
|
|
425
|
-
? skipPasswordPolicyRaw
|
|
426
|
-
: parseBooleanToken(typeof skipPasswordPolicyRaw === 'string' ? skipPasswordPolicyRaw : null) ?? false
|
|
395
|
+
const args: Record<string, string> = {}
|
|
396
|
+
for (let i = 0; i < rest.length; i += 2) {
|
|
397
|
+
const k = rest[i]?.replace(/^--/, '')
|
|
398
|
+
const v = rest[i + 1]
|
|
399
|
+
if (k) args[k] = v
|
|
400
|
+
}
|
|
401
|
+
const orgName = args.orgName || args.name
|
|
402
|
+
const email = args.email
|
|
403
|
+
const password = args.password
|
|
404
|
+
const rolesCsv = (args.roles ?? 'superadmin,admin,employee').trim()
|
|
427
405
|
if (!orgName || !email || !password) {
|
|
428
|
-
console.error('Usage: mercato auth setup --orgName <name> --email <email> --password <password> [--roles superadmin,admin,employee]
|
|
406
|
+
console.error('Usage: mercato auth setup --orgName <name> --email <email> --password <password> [--roles superadmin,admin,employee]')
|
|
429
407
|
return
|
|
430
408
|
}
|
|
431
|
-
if (!skipPasswordPolicy && !ensurePasswordPolicy(password)) return
|
|
432
|
-
if (skipPasswordPolicy) {
|
|
433
|
-
console.warn('⚠️ Password policy validation skipped for setup.')
|
|
434
|
-
}
|
|
435
409
|
const { resolve } = await createRequestContainer()
|
|
436
410
|
const em = resolve<EntityManager>('em')
|
|
437
411
|
const roleNames = rolesCsv
|
|
@@ -621,7 +595,6 @@ const setPassword: ModuleCli = {
|
|
|
621
595
|
console.error('Usage: mercato auth set-password --email <email> --password <newPassword>')
|
|
622
596
|
return
|
|
623
597
|
}
|
|
624
|
-
if (!ensurePasswordPolicy(password)) return
|
|
625
598
|
|
|
626
599
|
const { resolve } = await createRequestContainer()
|
|
627
600
|
const em = resolve('em') as any
|