@open-mercato/core 0.4.2-canary-15c0b23a3a → 0.4.2-canary-da2b080494
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.ids.generated.js +1 -5
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +0 -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/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 +2 -4
- package/dist/modules/auth/data/validators.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 +0 -1
- package/dist/modules/auth/lib/setup-app.js.map +2 -2
- package/dist/modules/auth/services/authService.js +3 -3
- package/dist/modules/auth/services/authService.js.map +2 -2
- 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/lib/rule-engine.js +3 -33
- 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/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/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 -132
- package/dist/modules/dashboards/services/widgetDataService.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/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/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/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/commands/documents.js +0 -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/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/backend/definitions/page.js +0 -5
- package/dist/modules/workflows/backend/definitions/page.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/page.js +0 -3
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/lib/transition-handler.js +6 -14
- package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
- package/generated/entities.ids.generated.ts +1 -5
- package/generated/entity-fields-registry.ts +0 -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/admin/nav.ts +6 -10
- 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 -5
- package/src/modules/auth/frontend/reset/[token]/page.tsx +11 -24
- package/src/modules/auth/i18n/de.json +1 -43
- package/src/modules/auth/i18n/en.json +1 -43
- package/src/modules/auth/i18n/es.json +1 -43
- package/src/modules/auth/i18n/pl.json +1 -43
- package/src/modules/auth/lib/setup-app.ts +0 -1
- package/src/modules/auth/services/authService.ts +4 -4
- 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/i18n/en.json +1 -3
- package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -51
- package/src/modules/business_rules/lib/rule-engine.ts +3 -57
- 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/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/i18n/en.json +1 -5
- 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 -157
- 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/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/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/backend/sales/channels/offers/page.tsx +0 -2
- package/src/modules/sales/backend/sales/channels/page.tsx +0 -2
- package/src/modules/sales/commands/documents.ts +0 -65
- 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/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/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/backend/definitions/page.tsx +0 -5
- package/src/modules/workflows/backend/instances/page.tsx +1 -4
- package/src/modules/workflows/backend/tasks/page.tsx +1 -4
- package/src/modules/workflows/i18n/en.json +1 -3
- package/src/modules/workflows/lib/transition-handler.ts +6 -18
- 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/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/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/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 -300
- package/src/modules/notifications/migrations/Migration20260123000001.ts +0 -73
- package/src/modules/notifications/migrations/Migration20260126150000.ts +0 -39
- 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
|
@@ -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
|
|
@@ -27,10 +27,6 @@ import {
|
|
|
27
27
|
import { normalizeTenantId } from '@open-mercato/core/modules/auth/lib/tenantAccess'
|
|
28
28
|
import { computeEmailHash } from '@open-mercato/core/modules/auth/lib/emailHash'
|
|
29
29
|
import { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
30
|
-
import { buildNotificationFromType } from '@open-mercato/core/modules/notifications/lib/notificationBuilder'
|
|
31
|
-
import { resolveNotificationService } from '@open-mercato/core/modules/notifications/lib/notificationService'
|
|
32
|
-
import notificationTypes from '@open-mercato/core/modules/auth/notifications'
|
|
33
|
-
import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
34
30
|
|
|
35
31
|
type SerializedUser = {
|
|
36
32
|
email: string
|
|
@@ -67,11 +63,9 @@ type UserSnapshots = {
|
|
|
67
63
|
undo: UserUndoSnapshot
|
|
68
64
|
}
|
|
69
65
|
|
|
70
|
-
const passwordSchema = buildPasswordSchema()
|
|
71
|
-
|
|
72
66
|
const createSchema = z.object({
|
|
73
67
|
email: z.string().email(),
|
|
74
|
-
password:
|
|
68
|
+
password: z.string().min(6),
|
|
75
69
|
organizationId: z.string().uuid(),
|
|
76
70
|
roles: z.array(z.string()).optional(),
|
|
77
71
|
})
|
|
@@ -79,7 +73,7 @@ const createSchema = z.object({
|
|
|
79
73
|
const updateSchema = z.object({
|
|
80
74
|
id: z.string().uuid(),
|
|
81
75
|
email: z.string().email().optional(),
|
|
82
|
-
password:
|
|
76
|
+
password: z.string().min(6).optional(),
|
|
83
77
|
organizationId: z.string().uuid().optional(),
|
|
84
78
|
roles: z.array(z.string()).optional(),
|
|
85
79
|
})
|
|
@@ -111,46 +105,6 @@ export const userCrudIndexer: CrudIndexerConfig = {
|
|
|
111
105
|
}),
|
|
112
106
|
}
|
|
113
107
|
|
|
114
|
-
async function notifyRoleChanges(
|
|
115
|
-
ctx: CommandRuntimeContext,
|
|
116
|
-
user: User,
|
|
117
|
-
assignedRoles: string[],
|
|
118
|
-
revokedRoles: string[],
|
|
119
|
-
): Promise<void> {
|
|
120
|
-
const tenantId = user.tenantId ? String(user.tenantId) : null
|
|
121
|
-
if (!tenantId) return
|
|
122
|
-
const organizationId = user.organizationId ? String(user.organizationId) : null
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
const notificationService = resolveNotificationService(ctx.container)
|
|
126
|
-
if (assignedRoles.length) {
|
|
127
|
-
const assignedType = notificationTypes.find((type) => type.type === 'auth.role.assigned')
|
|
128
|
-
if (assignedType) {
|
|
129
|
-
const notificationInput = buildNotificationFromType(assignedType, {
|
|
130
|
-
recipientUserId: String(user.id),
|
|
131
|
-
sourceEntityType: 'auth:user',
|
|
132
|
-
sourceEntityId: String(user.id),
|
|
133
|
-
})
|
|
134
|
-
await notificationService.create(notificationInput, { tenantId, organizationId })
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (revokedRoles.length) {
|
|
139
|
-
const revokedType = notificationTypes.find((type) => type.type === 'auth.role.revoked')
|
|
140
|
-
if (revokedType) {
|
|
141
|
-
const notificationInput = buildNotificationFromType(revokedType, {
|
|
142
|
-
recipientUserId: String(user.id),
|
|
143
|
-
sourceEntityType: 'auth:user',
|
|
144
|
-
sourceEntityId: String(user.id),
|
|
145
|
-
})
|
|
146
|
-
await notificationService.create(notificationInput, { tenantId, organizationId })
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
console.error('[auth.users.roles] Failed to create notification:', err)
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
108
|
const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
|
|
155
109
|
id: 'auth.users.create',
|
|
156
110
|
async execute(rawInput, ctx) {
|
|
@@ -193,10 +147,8 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
|
|
|
193
147
|
throw error
|
|
194
148
|
}
|
|
195
149
|
|
|
196
|
-
let assignedRoles: string[] = []
|
|
197
150
|
if (Array.isArray(parsed.roles) && parsed.roles.length) {
|
|
198
151
|
await syncUserRoles(em, user, parsed.roles, tenantId)
|
|
199
|
-
assignedRoles = await loadUserRoleNames(em, String(user.id))
|
|
200
152
|
}
|
|
201
153
|
|
|
202
154
|
await setCustomFieldsIfAny({
|
|
@@ -221,10 +173,6 @@ const createUserCommand: CommandHandler<Record<string, unknown>, User> = {
|
|
|
221
173
|
indexer: userCrudIndexer,
|
|
222
174
|
})
|
|
223
175
|
|
|
224
|
-
if (assignedRoles.length) {
|
|
225
|
-
await notifyRoleChanges(ctx, user, assignedRoles, [])
|
|
226
|
-
}
|
|
227
|
-
|
|
228
176
|
return user
|
|
229
177
|
},
|
|
230
178
|
captureAfter: async (_input, result, ctx) => {
|
|
@@ -340,9 +288,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
|
|
|
340
288
|
async execute(rawInput, ctx) {
|
|
341
289
|
const { parsed, custom } = parseWithCustomFields(updateSchema, rawInput)
|
|
342
290
|
const em = (ctx.container.resolve('em') as EntityManager)
|
|
343
|
-
const rolesBefore = Array.isArray(parsed.roles)
|
|
344
|
-
? await loadUserRoleNames(em, parsed.id)
|
|
345
|
-
: null
|
|
346
291
|
|
|
347
292
|
if (parsed.email !== undefined) {
|
|
348
293
|
const emailHash = computeEmailHash(parsed.email)
|
|
@@ -432,14 +377,6 @@ const updateUserCommand: CommandHandler<Record<string, unknown>, User> = {
|
|
|
432
377
|
indexer: userCrudIndexer,
|
|
433
378
|
})
|
|
434
379
|
|
|
435
|
-
if (Array.isArray(parsed.roles) && rolesBefore) {
|
|
436
|
-
const rolesAfter = await loadUserRoleNames(em, String(user.id))
|
|
437
|
-
const { assigned, revoked } = diffRoleChanges(rolesBefore, rolesAfter)
|
|
438
|
-
if (assigned.length || revoked.length) {
|
|
439
|
-
await notifyRoleChanges(ctx, user, assigned, revoked)
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
380
|
await invalidateUserCache(ctx, parsed.id)
|
|
444
381
|
|
|
445
382
|
return user
|
|
@@ -835,14 +772,6 @@ async function invalidateUserCache(ctx: CommandRuntimeContext, userId: string) {
|
|
|
835
772
|
}
|
|
836
773
|
}
|
|
837
774
|
|
|
838
|
-
function diffRoleChanges(before: string[], after: string[]) {
|
|
839
|
-
const beforeSet = new Set(before)
|
|
840
|
-
const afterSet = new Set(after)
|
|
841
|
-
const assigned = after.filter((role) => !beforeSet.has(role))
|
|
842
|
-
const revoked = before.filter((role) => !afterSet.has(role))
|
|
843
|
-
return { assigned, revoked }
|
|
844
|
-
}
|
|
845
|
-
|
|
846
775
|
function arrayEquals(left: string[] | undefined, right: string[]): boolean {
|
|
847
776
|
if (!left) return false
|
|
848
777
|
if (left.length !== right.length) return false
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { z } from 'zod'
|
|
2
|
-
import { buildPasswordSchema } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
3
|
-
|
|
4
|
-
const passwordSchema = buildPasswordSchema()
|
|
5
2
|
|
|
6
3
|
// Core auth validators
|
|
7
4
|
export const userLoginSchema = z.object({
|
|
@@ -16,7 +13,7 @@ export const requestPasswordResetSchema = z.object({
|
|
|
16
13
|
|
|
17
14
|
export const confirmPasswordResetSchema = z.object({
|
|
18
15
|
token: z.string().min(10),
|
|
19
|
-
password:
|
|
16
|
+
password: z.string().min(6),
|
|
20
17
|
})
|
|
21
18
|
|
|
22
19
|
export const sidebarPreferencesInputSchema = z.object({
|
|
@@ -32,7 +29,7 @@ export const sidebarPreferencesInputSchema = z.object({
|
|
|
32
29
|
// Optional helpers for CLI or admin forms
|
|
33
30
|
export const userCreateSchema = z.object({
|
|
34
31
|
email: z.string().email(),
|
|
35
|
-
password:
|
|
32
|
+
password: z.string().min(6),
|
|
36
33
|
tenantId: z.string().uuid().optional(),
|
|
37
34
|
organizationId: z.string().uuid(),
|
|
38
35
|
rolesCsv: z.string().optional(),
|
|
@@ -4,20 +4,11 @@ import { Input } from '@open-mercato/ui/primitives/input'
|
|
|
4
4
|
import { Label } from '@open-mercato/ui/primitives/label'
|
|
5
5
|
import { useState } from 'react'
|
|
6
6
|
import { useRouter } from 'next/navigation'
|
|
7
|
-
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
8
|
-
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
9
|
-
import { formatPasswordRequirements, getPasswordPolicy } from '@open-mercato/shared/lib/auth/passwordPolicy'
|
|
10
7
|
|
|
11
8
|
export default function ResetWithTokenPage({ params }: { params: { token: string } }) {
|
|
12
9
|
const router = useRouter()
|
|
13
|
-
const t = useT()
|
|
14
10
|
const [error, setError] = useState<string | null>(null)
|
|
15
11
|
const [submitting, setSubmitting] = useState(false)
|
|
16
|
-
const passwordPolicy = getPasswordPolicy()
|
|
17
|
-
const passwordRequirements = formatPasswordRequirements(passwordPolicy, t)
|
|
18
|
-
const passwordDescription = passwordRequirements
|
|
19
|
-
? t('auth.password.requirements.help', 'Password requirements: {requirements}', { requirements: passwordRequirements })
|
|
20
|
-
: ''
|
|
21
12
|
|
|
22
13
|
async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
|
|
23
14
|
e.preventDefault()
|
|
@@ -26,15 +17,13 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
|
|
|
26
17
|
try {
|
|
27
18
|
const form = new FormData(e.currentTarget)
|
|
28
19
|
form.set('token', params.token)
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (!ok || result?.ok === false) {
|
|
34
|
-
setError(result?.error || t('auth.reset.errors.failed', 'Unable to reset password'))
|
|
20
|
+
const res = await fetch('/api/auth/reset/confirm', { method: 'POST', body: form })
|
|
21
|
+
const data = await res.json().catch(() => null)
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
setError(data?.error || 'Unable to reset password')
|
|
35
24
|
return
|
|
36
25
|
}
|
|
37
|
-
router.replace(
|
|
26
|
+
router.replace(data?.redirect || '/login')
|
|
38
27
|
} finally {
|
|
39
28
|
setSubmitting(false)
|
|
40
29
|
}
|
|
@@ -44,21 +33,18 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
|
|
|
44
33
|
<div className="min-h-svh flex items-center justify-center p-4">
|
|
45
34
|
<Card className="w-full max-w-sm">
|
|
46
35
|
<CardHeader>
|
|
47
|
-
<CardTitle>
|
|
48
|
-
<CardDescription>
|
|
36
|
+
<CardTitle>Set a new password</CardTitle>
|
|
37
|
+
<CardDescription>Choose a strong password for your account.</CardDescription>
|
|
49
38
|
</CardHeader>
|
|
50
39
|
<CardContent>
|
|
51
40
|
<form className="grid gap-3" onSubmit={onSubmit}>
|
|
52
41
|
{error && <div className="text-sm text-red-600">{error}</div>}
|
|
53
42
|
<div className="grid gap-1">
|
|
54
|
-
<Label htmlFor="password">
|
|
55
|
-
<Input id="password" name="password" type="password" required minLength={
|
|
56
|
-
{passwordDescription ? (
|
|
57
|
-
<p className="text-xs text-muted-foreground">{passwordDescription}</p>
|
|
58
|
-
) : null}
|
|
43
|
+
<Label htmlFor="password">New password</Label>
|
|
44
|
+
<Input id="password" name="password" type="password" required minLength={6} />
|
|
59
45
|
</div>
|
|
60
46
|
<button disabled={submitting} className="h-10 rounded-md bg-foreground text-background mt-2 hover:opacity-90 transition disabled:opacity-60">
|
|
61
|
-
{submitting ?
|
|
47
|
+
{submitting ? '...' : 'Update password'}
|
|
62
48
|
</button>
|
|
63
49
|
</form>
|
|
64
50
|
</CardContent>
|
|
@@ -66,3 +52,4 @@ export default function ResetWithTokenPage({ params }: { params: { token: string
|
|
|
66
52
|
</div>
|
|
67
53
|
)
|
|
68
54
|
}
|
|
55
|
+
|