@endora-commerce/platform 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/cli/dispatch.d.ts +146 -0
- package/dist/cli/dispatch.d.ts.map +1 -0
- package/dist/cli/dispatch.js +259 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/index.d.ts +58 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/module-commands.d.ts +118 -0
- package/dist/cli/module-commands.d.ts.map +1 -0
- package/dist/cli/module-commands.js +120 -0
- package/dist/cli/module-commands.js.map +1 -0
- package/dist/commands/actor.d.ts +19 -0
- package/dist/commands/actor.d.ts.map +1 -0
- package/dist/commands/actor.js +45 -0
- package/dist/commands/actor.js.map +1 -0
- package/dist/commands/audit-from-context.d.ts +24 -0
- package/dist/commands/audit-from-context.d.ts.map +1 -0
- package/dist/commands/audit-from-context.js +28 -0
- package/dist/commands/audit-from-context.js.map +1 -0
- package/dist/commands/command-bus.d.ts +40 -0
- package/dist/commands/command-bus.d.ts.map +1 -0
- package/dist/commands/command-bus.js +46 -0
- package/dist/commands/command-bus.js.map +1 -0
- package/dist/commands/command.d.ts +76 -0
- package/dist/commands/command.d.ts.map +1 -0
- package/dist/commands/command.js +2 -0
- package/dist/commands/command.js.map +1 -0
- package/dist/commands/index.d.ts +65 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +57 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reversible.d.ts +66 -0
- package/dist/commands/reversible.d.ts.map +1 -0
- package/dist/commands/reversible.js +41 -0
- package/dist/commands/reversible.js.map +1 -0
- package/dist/composition/compose-app.d.ts +305 -0
- package/dist/composition/compose-app.d.ts.map +1 -0
- package/dist/composition/compose-app.js +939 -0
- package/dist/composition/compose-app.js.map +1 -0
- package/dist/composition/index.d.ts +92 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +175 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/newsletter-token-secret.d.ts +19 -0
- package/dist/composition/newsletter-token-secret.d.ts.map +1 -0
- package/dist/composition/newsletter-token-secret.js +24 -0
- package/dist/composition/newsletter-token-secret.js.map +1 -0
- package/dist/composition/process-runs-workers.d.ts +17 -0
- package/dist/composition/process-runs-workers.d.ts.map +1 -0
- package/dist/composition/process-runs-workers.js +19 -0
- package/dist/composition/process-runs-workers.js.map +1 -0
- package/dist/db/baseline-migration-inventory.d.ts +15 -0
- package/dist/db/baseline-migration-inventory.d.ts.map +1 -0
- package/dist/db/baseline-migration-inventory.js +115 -0
- package/dist/db/baseline-migration-inventory.js.map +1 -0
- package/dist/db/configured-entities.d.ts +74 -0
- package/dist/db/configured-entities.d.ts.map +1 -0
- package/dist/db/configured-entities.js +20 -0
- package/dist/db/configured-entities.js.map +1 -0
- package/dist/db/configured-migrations.d.ts +199 -0
- package/dist/db/configured-migrations.d.ts.map +1 -0
- package/dist/db/configured-migrations.js +181 -0
- package/dist/db/configured-migrations.js.map +1 -0
- package/dist/db/index.d.ts +54 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +54 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +21 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +48 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migration-order.d.ts +159 -0
- package/dist/db/migration-order.d.ts.map +1 -0
- package/dist/db/migration-order.js +273 -0
- package/dist/db/migration-order.js.map +1 -0
- package/dist/db/mikro-orm.config.d.ts +51 -0
- package/dist/db/mikro-orm.config.d.ts.map +1 -0
- package/dist/db/mikro-orm.config.js +64 -0
- package/dist/db/mikro-orm.config.js.map +1 -0
- package/dist/db/orm.d.ts +40 -0
- package/dist/db/orm.d.ts.map +1 -0
- package/dist/db/orm.js +25 -0
- package/dist/db/orm.js.map +1 -0
- package/dist/db/platform-schema.d.ts +102 -0
- package/dist/db/platform-schema.d.ts.map +1 -0
- package/dist/db/platform-schema.js +79 -0
- package/dist/db/platform-schema.js.map +1 -0
- package/dist/db/pluralizing-naming-strategy.d.ts +16 -0
- package/dist/db/pluralizing-naming-strategy.d.ts.map +1 -0
- package/dist/db/pluralizing-naming-strategy.js +66 -0
- package/dist/db/pluralizing-naming-strategy.js.map +1 -0
- package/dist/demo/guard.d.ts +101 -0
- package/dist/demo/guard.d.ts.map +1 -0
- package/dist/demo/guard.js +168 -0
- package/dist/demo/guard.js.map +1 -0
- package/dist/demo/host-command.d.ts +133 -0
- package/dist/demo/host-command.d.ts.map +1 -0
- package/dist/demo/host-command.js +113 -0
- package/dist/demo/host-command.js.map +1 -0
- package/dist/demo/index.d.ts +82 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +82 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/packages.d.ts +67 -0
- package/dist/demo/packages.d.ts.map +1 -0
- package/dist/demo/packages.js +132 -0
- package/dist/demo/packages.js.map +1 -0
- package/dist/demo/plan.d.ts +111 -0
- package/dist/demo/plan.d.ts.map +1 -0
- package/dist/demo/plan.js +74 -0
- package/dist/demo/plan.js.map +1 -0
- package/dist/demo/report.d.ts +17 -0
- package/dist/demo/report.d.ts.map +1 -0
- package/dist/demo/report.js +85 -0
- package/dist/demo/report.js.map +1 -0
- package/dist/demo/runner.d.ts +207 -0
- package/dist/demo/runner.d.ts.map +1 -0
- package/dist/demo/runner.js +169 -0
- package/dist/demo/runner.js.map +1 -0
- package/dist/demo/scope.d.ts +44 -0
- package/dist/demo/scope.d.ts.map +1 -0
- package/dist/demo/scope.js +44 -0
- package/dist/demo/scope.js.map +1 -0
- package/dist/env/index.d.ts +68 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +427 -0
- package/dist/env/index.js.map +1 -0
- package/dist/events/bus.d.ts +29 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +67 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +19 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +19 -0
- package/dist/events/index.js.map +1 -0
- package/dist/http/cursor.d.ts +10 -0
- package/dist/http/cursor.d.ts.map +1 -0
- package/dist/http/cursor.js +20 -0
- package/dist/http/cursor.js.map +1 -0
- package/dist/http/error-envelope.d.ts +127 -0
- package/dist/http/error-envelope.d.ts.map +1 -0
- package/dist/http/error-envelope.js +402 -0
- package/dist/http/error-envelope.js.map +1 -0
- package/dist/http/health.d.ts +88 -0
- package/dist/http/health.d.ts.map +1 -0
- package/dist/http/health.js +77 -0
- package/dist/http/health.js.map +1 -0
- package/dist/http/index.d.ts +50 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +50 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/interceptors/dispatch.d.ts +14 -0
- package/dist/http/interceptors/dispatch.d.ts.map +1 -0
- package/dist/http/interceptors/dispatch.js +113 -0
- package/dist/http/interceptors/dispatch.js.map +1 -0
- package/dist/http/interceptors/index.d.ts +6 -0
- package/dist/http/interceptors/index.d.ts.map +1 -0
- package/dist/http/interceptors/index.js +5 -0
- package/dist/http/interceptors/index.js.map +1 -0
- package/dist/http/interceptors/registry.d.ts +44 -0
- package/dist/http/interceptors/registry.d.ts.map +1 -0
- package/dist/http/interceptors/registry.js +123 -0
- package/dist/http/interceptors/registry.js.map +1 -0
- package/dist/http/interceptors/route-table.d.ts +33 -0
- package/dist/http/interceptors/route-table.d.ts.map +1 -0
- package/dist/http/interceptors/route-table.js +39 -0
- package/dist/http/interceptors/route-table.js.map +1 -0
- package/dist/http/interceptors/types.d.ts +101 -0
- package/dist/http/interceptors/types.d.ts.map +1 -0
- package/dist/http/interceptors/types.js +2 -0
- package/dist/http/interceptors/types.js.map +1 -0
- package/dist/http/interceptors/validation.d.ts +22 -0
- package/dist/http/interceptors/validation.d.ts.map +1 -0
- package/dist/http/interceptors/validation.js +39 -0
- package/dist/http/interceptors/validation.js.map +1 -0
- package/dist/http/logger.d.ts +9 -0
- package/dist/http/logger.d.ts.map +1 -0
- package/dist/http/logger.js +25 -0
- package/dist/http/logger.js.map +1 -0
- package/dist/http/openapi.d.ts +21 -0
- package/dist/http/openapi.d.ts.map +1 -0
- package/dist/http/openapi.js +114 -0
- package/dist/http/openapi.js.map +1 -0
- package/dist/http/product-audience.d.ts +78 -0
- package/dist/http/product-audience.d.ts.map +1 -0
- package/dist/http/product-audience.js +92 -0
- package/dist/http/product-audience.js.map +1 -0
- package/dist/http/request-actor.d.ts +82 -0
- package/dist/http/request-actor.d.ts.map +1 -0
- package/dist/http/request-actor.js +2 -0
- package/dist/http/request-actor.js.map +1 -0
- package/dist/http/server.d.ts +60 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +117 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/storefront-revalidator.d.ts +29 -0
- package/dist/http/storefront-revalidator.d.ts.map +1 -0
- package/dist/http/storefront-revalidator.js +34 -0
- package/dist/http/storefront-revalidator.js.map +1 -0
- package/dist/http/test-actor-carrier.d.ts +28 -0
- package/dist/http/test-actor-carrier.d.ts.map +1 -0
- package/dist/http/test-actor-carrier.js +10 -0
- package/dist/http/test-actor-carrier.js.map +1 -0
- package/dist/http/trusted-proxy.d.ts +48 -0
- package/dist/http/trusted-proxy.d.ts.map +1 -0
- package/dist/http/trusted-proxy.js +136 -0
- package/dist/http/trusted-proxy.js.map +1 -0
- package/dist/kernel/audit/audit-log-entry.entity.d.ts +33 -0
- package/dist/kernel/audit/audit-log-entry.entity.d.ts.map +1 -0
- package/dist/kernel/audit/audit-log-entry.entity.js +102 -0
- package/dist/kernel/audit/audit-log-entry.entity.js.map +1 -0
- package/dist/kernel/audit/audit-log-service.d.ts +63 -0
- package/dist/kernel/audit/audit-log-service.d.ts.map +1 -0
- package/dist/kernel/audit/audit-log-service.js +107 -0
- package/dist/kernel/audit/audit-log-service.js.map +1 -0
- package/dist/kernel/cache/in-process-cache-registry.d.ts +93 -0
- package/dist/kernel/cache/in-process-cache-registry.d.ts.map +1 -0
- package/dist/kernel/cache/in-process-cache-registry.js +78 -0
- package/dist/kernel/cache/in-process-cache-registry.js.map +1 -0
- package/dist/kernel/cache/shared-drop-marks.d.ts +39 -0
- package/dist/kernel/cache/shared-drop-marks.d.ts.map +1 -0
- package/dist/kernel/cache/shared-drop-marks.js +68 -0
- package/dist/kernel/cache/shared-drop-marks.js.map +1 -0
- package/dist/kernel/compose.d.ts +234 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +279 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/container.d.ts +95 -0
- package/dist/kernel/container.d.ts.map +1 -0
- package/dist/kernel/container.js +90 -0
- package/dist/kernel/container.js.map +1 -0
- package/dist/kernel/contribution-sinks.d.ts +106 -0
- package/dist/kernel/contribution-sinks.d.ts.map +1 -0
- package/dist/kernel/contribution-sinks.js +153 -0
- package/dist/kernel/contribution-sinks.js.map +1 -0
- package/dist/kernel/crypto/password-hasher.d.ts +3 -0
- package/dist/kernel/crypto/password-hasher.d.ts.map +1 -0
- package/dist/kernel/crypto/password-hasher.js +44 -0
- package/dist/kernel/crypto/password-hasher.js.map +1 -0
- package/dist/kernel/i18n/error-envelope-options.d.ts +56 -0
- package/dist/kernel/i18n/error-envelope-options.d.ts.map +1 -0
- package/dist/kernel/i18n/error-envelope-options.js +46 -0
- package/dist/kernel/i18n/error-envelope-options.js.map +1 -0
- package/dist/kernel/i18n/error-translation.d.ts +144 -0
- package/dist/kernel/i18n/error-translation.d.ts.map +1 -0
- package/dist/kernel/i18n/error-translation.js +84 -0
- package/dist/kernel/i18n/error-translation.js.map +1 -0
- package/dist/kernel/i18n/request-language.d.ts +80 -0
- package/dist/kernel/i18n/request-language.d.ts.map +1 -0
- package/dist/kernel/i18n/request-language.js +168 -0
- package/dist/kernel/i18n/request-language.js.map +1 -0
- package/dist/kernel/index.d.ts +142 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +160 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/lazy-port.d.ts +59 -0
- package/dist/kernel/lazy-port.d.ts.map +1 -0
- package/dist/kernel/lazy-port.js +78 -0
- package/dist/kernel/lazy-port.js.map +1 -0
- package/dist/kernel/lifecycle/activation-resolver.d.ts +63 -0
- package/dist/kernel/lifecycle/activation-resolver.d.ts.map +1 -0
- package/dist/kernel/lifecycle/activation-resolver.js +70 -0
- package/dist/kernel/lifecycle/activation-resolver.js.map +1 -0
- package/dist/kernel/lifecycle/capability-registry.d.ts +145 -0
- package/dist/kernel/lifecycle/capability-registry.d.ts.map +1 -0
- package/dist/kernel/lifecycle/capability-registry.js +170 -0
- package/dist/kernel/lifecycle/capability-registry.js.map +1 -0
- package/dist/kernel/lifecycle/effective-state.d.ts +126 -0
- package/dist/kernel/lifecycle/effective-state.d.ts.map +1 -0
- package/dist/kernel/lifecycle/effective-state.js +111 -0
- package/dist/kernel/lifecycle/effective-state.js.map +1 -0
- package/dist/kernel/lifecycle/module-registration.entity.d.ts +57 -0
- package/dist/kernel/lifecycle/module-registration.entity.d.ts.map +1 -0
- package/dist/kernel/lifecycle/module-registration.entity.js +111 -0
- package/dist/kernel/lifecycle/module-registration.entity.js.map +1 -0
- package/dist/kernel/lifecycle/plugin-helpers.d.ts +165 -0
- package/dist/kernel/lifecycle/plugin-helpers.d.ts.map +1 -0
- package/dist/kernel/lifecycle/plugin-helpers.js +395 -0
- package/dist/kernel/lifecycle/plugin-helpers.js.map +1 -0
- package/dist/kernel/lifecycle/registry-cache.d.ts +318 -0
- package/dist/kernel/lifecycle/registry-cache.d.ts.map +1 -0
- package/dist/kernel/lifecycle/registry-cache.js +509 -0
- package/dist/kernel/lifecycle/registry-cache.js.map +1 -0
- package/dist/kernel/lifecycle/required-modules.d.ts +137 -0
- package/dist/kernel/lifecycle/required-modules.d.ts.map +1 -0
- package/dist/kernel/lifecycle/required-modules.js +80 -0
- package/dist/kernel/lifecycle/required-modules.js.map +1 -0
- package/dist/kernel/lifecycle/unique-module-ids.d.ts +58 -0
- package/dist/kernel/lifecycle/unique-module-ids.d.ts.map +1 -0
- package/dist/kernel/lifecycle/unique-module-ids.js +82 -0
- package/dist/kernel/lifecycle/unique-module-ids.js.map +1 -0
- package/dist/kernel/logging.d.ts +116 -0
- package/dist/kernel/logging.d.ts.map +1 -0
- package/dist/kernel/logging.js +71 -0
- package/dist/kernel/logging.js.map +1 -0
- package/dist/kernel/module-context.d.ts +563 -0
- package/dist/kernel/module-context.d.ts.map +1 -0
- package/dist/kernel/module-context.js +670 -0
- package/dist/kernel/module-context.js.map +1 -0
- package/dist/kernel/ports/audit.d.ts +115 -0
- package/dist/kernel/ports/audit.d.ts.map +1 -0
- package/dist/kernel/ports/audit.js +2 -0
- package/dist/kernel/ports/audit.js.map +1 -0
- package/dist/kernel/ports/organizations.d.ts +56 -0
- package/dist/kernel/ports/organizations.d.ts.map +1 -0
- package/dist/kernel/ports/organizations.js +2 -0
- package/dist/kernel/ports/organizations.js.map +1 -0
- package/dist/kernel/ports/provide.d.ts +14 -0
- package/dist/kernel/ports/provide.d.ts.map +1 -0
- package/dist/kernel/ports/provide.js +50 -0
- package/dist/kernel/ports/provide.js.map +1 -0
- package/dist/kernel/ports/require-admin.d.ts +61 -0
- package/dist/kernel/ports/require-admin.d.ts.map +1 -0
- package/dist/kernel/ports/require-admin.js +2 -0
- package/dist/kernel/ports/require-admin.js.map +1 -0
- package/dist/kernel/ports/require-customer.d.ts +17 -0
- package/dist/kernel/ports/require-customer.d.ts.map +1 -0
- package/dist/kernel/ports/require-customer.js +2 -0
- package/dist/kernel/ports/require-customer.js.map +1 -0
- package/dist/kernel/ports/sales-channel.d.ts +84 -0
- package/dist/kernel/ports/sales-channel.d.ts.map +1 -0
- package/dist/kernel/ports/sales-channel.js +2 -0
- package/dist/kernel/ports/sales-channel.js.map +1 -0
- package/dist/kernel/ports/settings.d.ts +59 -0
- package/dist/kernel/ports/settings.d.ts.map +1 -0
- package/dist/kernel/ports/settings.js +2 -0
- package/dist/kernel/ports/settings.js.map +1 -0
- package/dist/kernel/public-api-base-url.d.ts +98 -0
- package/dist/kernel/public-api-base-url.d.ts.map +1 -0
- package/dist/kernel/public-api-base-url.js +144 -0
- package/dist/kernel/public-api-base-url.js.map +1 -0
- package/dist/kernel/request-scope-hook.d.ts +63 -0
- package/dist/kernel/request-scope-hook.d.ts.map +1 -0
- package/dist/kernel/request-scope-hook.js +67 -0
- package/dist/kernel/request-scope-hook.js.map +1 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.d.ts +109 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.d.ts.map +1 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.js +75 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.js.map +1 -0
- package/dist/kernel/sales-channels/compose.d.ts +69 -0
- package/dist/kernel/sales-channels/compose.d.ts.map +1 -0
- package/dist/kernel/sales-channels/compose.js +43 -0
- package/dist/kernel/sales-channels/compose.js.map +1 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.d.ts +66 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.d.ts.map +1 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.js +91 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.js.map +1 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts +28 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts.map +1 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.js +33 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.js.map +1 -0
- package/dist/kernel/sales-channels/request-channel-assortment.d.ts +72 -0
- package/dist/kernel/sales-channels/request-channel-assortment.d.ts.map +1 -0
- package/dist/kernel/sales-channels/request-channel-assortment.js +83 -0
- package/dist/kernel/sales-channels/request-channel-assortment.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts +157 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.js +302 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts +76 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js +184 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts +82 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.js +126 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel.entity.d.ts +50 -0
- package/dist/kernel/sales-channels/sales-channel.entity.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel.entity.js +132 -0
- package/dist/kernel/sales-channels/sales-channel.entity.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channels-cache.d.ts +170 -0
- package/dist/kernel/sales-channels/sales-channels-cache.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channels-cache.js +243 -0
- package/dist/kernel/sales-channels/sales-channels-cache.js.map +1 -0
- package/dist/kernel/scope.d.ts +153 -0
- package/dist/kernel/scope.d.ts.map +1 -0
- package/dist/kernel/scope.js +172 -0
- package/dist/kernel/scope.js.map +1 -0
- package/dist/kernel/settings/compose.d.ts +49 -0
- package/dist/kernel/settings/compose.d.ts.map +1 -0
- package/dist/kernel/settings/compose.js +21 -0
- package/dist/kernel/settings/compose.js.map +1 -0
- package/dist/kernel/settings/manifest-reconciler.d.ts +78 -0
- package/dist/kernel/settings/manifest-reconciler.d.ts.map +1 -0
- package/dist/kernel/settings/manifest-reconciler.js +343 -0
- package/dist/kernel/settings/manifest-reconciler.js.map +1 -0
- package/dist/kernel/settings/secret-value-codec.d.ts +52 -0
- package/dist/kernel/settings/secret-value-codec.d.ts.map +1 -0
- package/dist/kernel/settings/secret-value-codec.js +102 -0
- package/dist/kernel/settings/secret-value-codec.js.map +1 -0
- package/dist/kernel/settings/setting-group.entity.d.ts +25 -0
- package/dist/kernel/settings/setting-group.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting-group.entity.js +79 -0
- package/dist/kernel/settings/setting-group.entity.js.map +1 -0
- package/dist/kernel/settings/setting-value.entity.d.ts +23 -0
- package/dist/kernel/settings/setting-value.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting-value.entity.js +66 -0
- package/dist/kernel/settings/setting-value.entity.js.map +1 -0
- package/dist/kernel/settings/setting.entity.d.ts +56 -0
- package/dist/kernel/settings/setting.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting.entity.js +147 -0
- package/dist/kernel/settings/setting.entity.js.map +1 -0
- package/dist/kernel/settings/settings-cache.d.ts +158 -0
- package/dist/kernel/settings/settings-cache.d.ts.map +1 -0
- package/dist/kernel/settings/settings-cache.js +253 -0
- package/dist/kernel/settings/settings-cache.js.map +1 -0
- package/dist/kernel/settings/settings.service.d.ts +142 -0
- package/dist/kernel/settings/settings.service.d.ts.map +1 -0
- package/dist/kernel/settings/settings.service.js +294 -0
- package/dist/kernel/settings/settings.service.js.map +1 -0
- package/dist/lifecycle/backend.d.ts +51 -0
- package/dist/lifecycle/backend.d.ts.map +1 -0
- package/dist/lifecycle/backend.js +40 -0
- package/dist/lifecycle/backend.js.map +1 -0
- package/dist/lifecycle/commands/activation.commands.d.ts +97 -0
- package/dist/lifecycle/commands/activation.commands.d.ts.map +1 -0
- package/dist/lifecycle/commands/activation.commands.js +142 -0
- package/dist/lifecycle/commands/activation.commands.js.map +1 -0
- package/dist/lifecycle/commands/disable.d.ts +3 -0
- package/dist/lifecycle/commands/disable.d.ts.map +1 -0
- package/dist/lifecycle/commands/disable.js +126 -0
- package/dist/lifecycle/commands/disable.js.map +1 -0
- package/dist/lifecycle/commands/enable.d.ts +3 -0
- package/dist/lifecycle/commands/enable.d.ts.map +1 -0
- package/dist/lifecycle/commands/enable.js +102 -0
- package/dist/lifecycle/commands/enable.js.map +1 -0
- package/dist/lifecycle/commands/install.d.ts +3 -0
- package/dist/lifecycle/commands/install.d.ts.map +1 -0
- package/dist/lifecycle/commands/install.js +263 -0
- package/dist/lifecycle/commands/install.js.map +1 -0
- package/dist/lifecycle/commands/operator-entry.d.ts +104 -0
- package/dist/lifecycle/commands/operator-entry.d.ts.map +1 -0
- package/dist/lifecycle/commands/operator-entry.js +127 -0
- package/dist/lifecycle/commands/operator-entry.js.map +1 -0
- package/dist/lifecycle/commands/operator-runtime.d.ts +147 -0
- package/dist/lifecycle/commands/operator-runtime.d.ts.map +1 -0
- package/dist/lifecycle/commands/operator-runtime.js +40 -0
- package/dist/lifecycle/commands/operator-runtime.js.map +1 -0
- package/dist/lifecycle/commands/status.d.ts +3 -0
- package/dist/lifecycle/commands/status.d.ts.map +1 -0
- package/dist/lifecycle/commands/status.js +108 -0
- package/dist/lifecycle/commands/status.js.map +1 -0
- package/dist/lifecycle/commands/uninstall.d.ts +3 -0
- package/dist/lifecycle/commands/uninstall.d.ts.map +1 -0
- package/dist/lifecycle/commands/uninstall.js +223 -0
- package/dist/lifecycle/commands/uninstall.js.map +1 -0
- package/dist/lifecycle/divergence-declaration.d.ts +74 -0
- package/dist/lifecycle/divergence-declaration.d.ts.map +1 -0
- package/dist/lifecycle/divergence-declaration.js +92 -0
- package/dist/lifecycle/divergence-declaration.js.map +1 -0
- package/dist/lifecycle/i18n/en.json +4 -0
- package/dist/lifecycle/i18n/pl.json +4 -0
- package/dist/lifecycle/index.d.ts +110 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +189 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/manifest-registry.d.ts +244 -0
- package/dist/lifecycle/manifest-registry.d.ts.map +1 -0
- package/dist/lifecycle/manifest-registry.js +223 -0
- package/dist/lifecycle/manifest-registry.js.map +1 -0
- package/dist/lifecycle/manifest.d.ts +166 -0
- package/dist/lifecycle/manifest.d.ts.map +1 -0
- package/dist/lifecycle/manifest.js +121 -0
- package/dist/lifecycle/manifest.js.map +1 -0
- package/dist/lifecycle/plugin.d.ts +56 -0
- package/dist/lifecycle/plugin.d.ts.map +1 -0
- package/dist/lifecycle/plugin.js +59 -0
- package/dist/lifecycle/plugin.js.map +1 -0
- package/dist/lifecycle/resident.d.ts +16 -0
- package/dist/lifecycle/resident.d.ts.map +1 -0
- package/dist/lifecycle/resident.js +59 -0
- package/dist/lifecycle/resident.js.map +1 -0
- package/dist/lifecycle/routes.admin.d.ts +57 -0
- package/dist/lifecycle/routes.admin.d.ts.map +1 -0
- package/dist/lifecycle/routes.admin.js +162 -0
- package/dist/lifecycle/routes.admin.js.map +1 -0
- package/dist/lifecycle/routes.storefront.d.ts +26 -0
- package/dist/lifecycle/routes.storefront.d.ts.map +1 -0
- package/dist/lifecycle/routes.storefront.js +36 -0
- package/dist/lifecycle/routes.storefront.js.map +1 -0
- package/dist/lifecycle/services/deactivation-ledger.d.ts +216 -0
- package/dist/lifecycle/services/deactivation-ledger.d.ts.map +1 -0
- package/dist/lifecycle/services/deactivation-ledger.js +171 -0
- package/dist/lifecycle/services/deactivation-ledger.js.map +1 -0
- package/dist/lifecycle/services/dep-graph.d.ts +119 -0
- package/dist/lifecycle/services/dep-graph.d.ts.map +1 -0
- package/dist/lifecycle/services/dep-graph.js +334 -0
- package/dist/lifecycle/services/dep-graph.js.map +1 -0
- package/dist/lifecycle/services/gating-graph.d.ts +164 -0
- package/dist/lifecycle/services/gating-graph.d.ts.map +1 -0
- package/dist/lifecycle/services/gating-graph.js +203 -0
- package/dist/lifecycle/services/gating-graph.js.map +1 -0
- package/dist/lifecycle/services/lock.d.ts +27 -0
- package/dist/lifecycle/services/lock.d.ts.map +1 -0
- package/dist/lifecycle/services/lock.js +82 -0
- package/dist/lifecycle/services/lock.js.map +1 -0
- package/dist/lifecycle/services/manifest-loader.d.ts +125 -0
- package/dist/lifecycle/services/manifest-loader.d.ts.map +1 -0
- package/dist/lifecycle/services/manifest-loader.js +210 -0
- package/dist/lifecycle/services/manifest-loader.js.map +1 -0
- package/dist/lifecycle/services/migration-ownership.d.ts +36 -0
- package/dist/lifecycle/services/migration-ownership.d.ts.map +1 -0
- package/dist/lifecycle/services/migration-ownership.js +15 -0
- package/dist/lifecycle/services/migration-ownership.js.map +1 -0
- package/dist/lifecycle/services/module-id-claims.d.ts +38 -0
- package/dist/lifecycle/services/module-id-claims.d.ts.map +1 -0
- package/dist/lifecycle/services/module-id-claims.js +123 -0
- package/dist/lifecycle/services/module-id-claims.js.map +1 -0
- package/dist/lifecycle/services/module-origin.d.ts +55 -0
- package/dist/lifecycle/services/module-origin.d.ts.map +1 -0
- package/dist/lifecycle/services/module-origin.js +47 -0
- package/dist/lifecycle/services/module-origin.js.map +1 -0
- package/dist/lifecycle/services/orchestrator.d.ts +235 -0
- package/dist/lifecycle/services/orchestrator.d.ts.map +1 -0
- package/dist/lifecycle/services/orchestrator.js +954 -0
- package/dist/lifecycle/services/orchestrator.js.map +1 -0
- package/dist/lifecycle/services/presence-load.d.ts +281 -0
- package/dist/lifecycle/services/presence-load.d.ts.map +1 -0
- package/dist/lifecycle/services/presence-load.js +437 -0
- package/dist/lifecycle/services/presence-load.js.map +1 -0
- package/dist/lifecycle/services/static-registry.d.ts +47 -0
- package/dist/lifecycle/services/static-registry.d.ts.map +1 -0
- package/dist/lifecycle/services/static-registry.js +41 -0
- package/dist/lifecycle/services/static-registry.js.map +1 -0
- package/dist/migrations/20260424T165847_core_foundation_init.d.ts +25 -0
- package/dist/migrations/20260424T165847_core_foundation_init.d.ts.map +1 -0
- package/dist/migrations/20260424T165847_core_foundation_init.js +238 -0
- package/dist/migrations/20260424T165847_core_foundation_init.js.map +1 -0
- package/dist/migrations/20260425T050720_core_commerce_init.d.ts +19 -0
- package/dist/migrations/20260425T050720_core_commerce_init.d.ts.map +1 -0
- package/dist/migrations/20260425T050720_core_commerce_init.js +200 -0
- package/dist/migrations/20260425T050720_core_commerce_init.js.map +1 -0
- package/dist/migrations/20260430T101450_core_settings_init.d.ts +25 -0
- package/dist/migrations/20260430T101450_core_settings_init.d.ts.map +1 -0
- package/dist/migrations/20260430T101450_core_settings_init.js +113 -0
- package/dist/migrations/20260430T101450_core_settings_init.js.map +1 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts +67 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts.map +1 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.js +101 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.js.map +1 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts +21 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts.map +1 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.js +41 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.js.map +1 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.d.ts +30 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.d.ts.map +1 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.js +34 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.js.map +1 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts +26 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts.map +1 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.js +63 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.js.map +1 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts +19 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts.map +1 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.js +23 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.js.map +1 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts +20 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts.map +1 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.js +24 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.js.map +1 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts +27 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts.map +1 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js +32 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js.map +1 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts +24 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts.map +1 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js +57 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js.map +1 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts +39 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts.map +1 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js +59 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js.map +1 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts +34 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts.map +1 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js +38 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js.map +1 -0
- package/dist/migrations/baseline-migrations.generated.d.ts +2 -0
- package/dist/migrations/baseline-migrations.generated.d.ts.map +1 -0
- package/dist/migrations/baseline-migrations.generated.js +136 -0
- package/dist/migrations/baseline-migrations.generated.js.map +1 -0
- package/dist/migrations/index.d.ts +62 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +75 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/overlay/deployment-roots.d.ts +37 -0
- package/dist/overlay/deployment-roots.d.ts.map +1 -0
- package/dist/overlay/deployment-roots.js +90 -0
- package/dist/overlay/deployment-roots.js.map +1 -0
- package/dist/overlay/index.d.ts +62 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/dist/overlay/index.js +62 -0
- package/dist/overlay/index.js.map +1 -0
- package/dist/overlay/overlay-runtime.d.ts +173 -0
- package/dist/overlay/overlay-runtime.d.ts.map +1 -0
- package/dist/overlay/overlay-runtime.js +281 -0
- package/dist/overlay/overlay-runtime.js.map +1 -0
- package/dist/overlay/resolve-overlay.d.ts +41 -0
- package/dist/overlay/resolve-overlay.d.ts.map +1 -0
- package/dist/overlay/resolve-overlay.js +72 -0
- package/dist/overlay/resolve-overlay.js.map +1 -0
- package/dist/packages/index.d.ts +57 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +57 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/installed-packages.d.ts +79 -0
- package/dist/packages/installed-packages.d.ts.map +1 -0
- package/dist/packages/installed-packages.js +312 -0
- package/dist/packages/installed-packages.js.map +1 -0
- package/dist/packages/package-entity-lookup.d.ts +120 -0
- package/dist/packages/package-entity-lookup.d.ts.map +1 -0
- package/dist/packages/package-entity-lookup.js +17 -0
- package/dist/packages/package-entity-lookup.js.map +1 -0
- package/dist/packages/package-runtime.d.ts +177 -0
- package/dist/packages/package-runtime.d.ts.map +1 -0
- package/dist/packages/package-runtime.js +386 -0
- package/dist/packages/package-runtime.js.map +1 -0
- package/dist/tenancy/derived-scope.d.ts +43 -0
- package/dist/tenancy/derived-scope.d.ts.map +1 -0
- package/dist/tenancy/derived-scope.js +76 -0
- package/dist/tenancy/derived-scope.js.map +1 -0
- package/dist/tenancy/escape-hatch.d.ts +30 -0
- package/dist/tenancy/escape-hatch.d.ts.map +1 -0
- package/dist/tenancy/escape-hatch.js +50 -0
- package/dist/tenancy/escape-hatch.js.map +1 -0
- package/dist/tenancy/filters.d.ts +87 -0
- package/dist/tenancy/filters.d.ts.map +1 -0
- package/dist/tenancy/filters.js +126 -0
- package/dist/tenancy/filters.js.map +1 -0
- package/dist/tenancy/index.d.ts +63 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +61 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/org-scoped.decorator.d.ts +150 -0
- package/dist/tenancy/org-scoped.decorator.d.ts.map +1 -0
- package/dist/tenancy/org-scoped.decorator.js +339 -0
- package/dist/tenancy/org-scoped.decorator.js.map +1 -0
- package/dist/tenancy/org-write-guard.d.ts +106 -0
- package/dist/tenancy/org-write-guard.d.ts.map +1 -0
- package/dist/tenancy/org-write-guard.js +141 -0
- package/dist/tenancy/org-write-guard.js.map +1 -0
- package/dist/tenancy/resolve-tenant-context.d.ts +91 -0
- package/dist/tenancy/resolve-tenant-context.d.ts.map +1 -0
- package/dist/tenancy/resolve-tenant-context.js +85 -0
- package/dist/tenancy/resolve-tenant-context.js.map +1 -0
- package/dist/tenancy/scoped-em.d.ts +10 -0
- package/dist/tenancy/scoped-em.d.ts.map +1 -0
- package/dist/tenancy/scoped-em.js +11 -0
- package/dist/tenancy/scoped-em.js.map +1 -0
- package/dist/tenancy/tenant-context.d.ts +154 -0
- package/dist/tenancy/tenant-context.d.ts.map +1 -0
- package/dist/tenancy/tenant-context.js +109 -0
- package/dist/tenancy/tenant-context.js.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { ERROR_CODES } from '@endora-commerce/contracts';
|
|
2
|
+
import { HttpError } from '../../http/error-envelope.js';
|
|
3
|
+
import { getCurrentPlatformScope } from '../scope.js';
|
|
4
|
+
/**
|
|
5
|
+
* The bound api-key actor behind a request, or `null` (feature 062).
|
|
6
|
+
*
|
|
7
|
+
* This read went through a private `ApiKeyActorSlice` interface until T118b —
|
|
8
|
+
* *"kept structural so the middleware does not import the auth module's
|
|
9
|
+
* internals"*, which was D-52/D-53 stated in the middleware's own words. The
|
|
10
|
+
* shape is `@endora-commerce/contracts`' now and the augmentation is the
|
|
11
|
+
* platform's, so there is nothing left to restate.
|
|
12
|
+
*
|
|
13
|
+
* The **widening** is this site's own and stays: the middleware is an
|
|
14
|
+
* `onRequest` hook and a composition that mounts no auth plugin decorates
|
|
15
|
+
* nothing, so an absent actor is `null` — an unbound key, which is the
|
|
16
|
+
* unpinned path and what a request with no key already got.
|
|
17
|
+
*/
|
|
18
|
+
function boundApiKeyActor(request) {
|
|
19
|
+
const actor = request.actor;
|
|
20
|
+
if (actor?.kind !== 'api_key')
|
|
21
|
+
return null;
|
|
22
|
+
return actor.salesChannelId ? actor : null;
|
|
23
|
+
}
|
|
24
|
+
const HEADER_NAME = 'x-sales-channel';
|
|
25
|
+
const ECHO_HEADER = 'x-sales-channel';
|
|
26
|
+
const ADMIN_PATH_PREFIX = '/api/v1/admin/';
|
|
27
|
+
const API_PATH_PREFIX = '/api/v1/';
|
|
28
|
+
const HEALTH_PATH = '/api/v1/_health';
|
|
29
|
+
function shouldResolve(path) {
|
|
30
|
+
if (!path.startsWith(API_PATH_PREFIX))
|
|
31
|
+
return false;
|
|
32
|
+
if (path === HEALTH_PATH || path.startsWith(`${HEALTH_PATH}/`))
|
|
33
|
+
return false;
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
function isAdminPath(path) {
|
|
37
|
+
return path.startsWith(ADMIN_PATH_PREFIX);
|
|
38
|
+
}
|
|
39
|
+
export async function registerSalesChannelResolverMiddleware(app, options) {
|
|
40
|
+
const { resolver } = options;
|
|
41
|
+
const strictAdmin = options.strictAdmin ?? false;
|
|
42
|
+
app.addHook('onRequest', async (request, reply) => {
|
|
43
|
+
const url = request.url ?? '';
|
|
44
|
+
// Strip query string for path-prefix matching.
|
|
45
|
+
const path = url.split('?', 1)[0];
|
|
46
|
+
if (!shouldResolve(path))
|
|
47
|
+
return;
|
|
48
|
+
const headerValue = request.headers[HEADER_NAME];
|
|
49
|
+
const headerCode = Array.isArray(headerValue) ? headerValue[0] : headerValue;
|
|
50
|
+
const queryCode = !isAdminPath(path)
|
|
51
|
+
? readChannelCodeFromQuery(request.query)
|
|
52
|
+
: undefined;
|
|
53
|
+
const adminPath = isAdminPath(path);
|
|
54
|
+
const explicit = headerCode ?? queryCode;
|
|
55
|
+
// Step 0 (feature 062) — a bound api key derives its channel from the
|
|
56
|
+
// binding, fail closed: an explicit signal naming a different channel is
|
|
57
|
+
// a 403, an unknown/inactive bound channel refuses, never a fallback.
|
|
58
|
+
const boundActor = boundApiKeyActor(request);
|
|
59
|
+
if (boundActor) {
|
|
60
|
+
const bound = await resolver.getById(boundActor.salesChannelId);
|
|
61
|
+
if (bound === null) {
|
|
62
|
+
throw resolverErrorToHttp('unknown_sales_channel', boundActor.salesChannelId);
|
|
63
|
+
}
|
|
64
|
+
if (explicit && explicit.trim() !== '' && explicit !== bound.code) {
|
|
65
|
+
if (options.auditLogService) {
|
|
66
|
+
await options.auditLogService.record({
|
|
67
|
+
action: 'api_key.channel_mismatch',
|
|
68
|
+
objectType: 'api_key',
|
|
69
|
+
objectId: boundActor.apiKeyId,
|
|
70
|
+
stateBefore: null,
|
|
71
|
+
stateAfter: {
|
|
72
|
+
requestedChannel: explicit,
|
|
73
|
+
boundChannelId: bound.id,
|
|
74
|
+
boundChannelCode: bound.code,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
throw new HttpError(403, ERROR_CODES.API_KEY_CHANNEL_MISMATCH, 'API key is bound to a different sales channel.');
|
|
79
|
+
}
|
|
80
|
+
if (!bound.active) {
|
|
81
|
+
throw resolverErrorToHttp('inactive_sales_channel', bound.code);
|
|
82
|
+
}
|
|
83
|
+
setResolvedChannel(bound);
|
|
84
|
+
reply.header(ECHO_HEADER, bound.code);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Steps 1 + 2 — explicit signals always win, and an unknown / inactive
|
|
88
|
+
// signal always refuses (no silent fallback per FR-014).
|
|
89
|
+
if (explicit && explicit.trim() !== '') {
|
|
90
|
+
const result = await resolver.resolveActive(explicit);
|
|
91
|
+
if (!result.ok) {
|
|
92
|
+
throw resolverErrorToHttp(result.error, result.code);
|
|
93
|
+
}
|
|
94
|
+
setResolvedChannel(result.channel);
|
|
95
|
+
reply.header(ECHO_HEADER, result.channel.code);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Step 3 — host map.
|
|
99
|
+
const hostHeader = request.headers.host;
|
|
100
|
+
const hostBased = resolver.resolveHost(Array.isArray(hostHeader) ? hostHeader[0] : hostHeader);
|
|
101
|
+
if (hostBased) {
|
|
102
|
+
const result = await resolver.resolveActive(hostBased);
|
|
103
|
+
if (!result.ok) {
|
|
104
|
+
// If host map points at an unknown / inactive channel, refuse
|
|
105
|
+
// explicitly — this is operator misconfiguration, not a missing
|
|
106
|
+
// signal.
|
|
107
|
+
throw resolverErrorToHttp(result.error, result.code);
|
|
108
|
+
}
|
|
109
|
+
setResolvedChannel(result.channel);
|
|
110
|
+
reply.header(ECHO_HEADER, result.channel.code);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Step 4 — fallback. Storefront / integration always; admin only when
|
|
114
|
+
// `strictAdmin` is off (the default during the initial Phase 2 rollout —
|
|
115
|
+
// FR-014's strict refusal is enabled in T046's contract tests).
|
|
116
|
+
if (adminPath && strictAdmin) {
|
|
117
|
+
throw new HttpError(400, ERROR_CODES.MISSING_SALES_CHANNEL_CONTEXT, 'Admin requests must specify the sales channel via X-Sales-Channel header.');
|
|
118
|
+
}
|
|
119
|
+
// D-48 — the check that used to live here moved into the owner. A missing
|
|
120
|
+
// default is a platform fault, not a request one, and it now has a single
|
|
121
|
+
// spelling (`NoSystemDefaultChannel`, also a 500 `INTERNAL`) thrown by the
|
|
122
|
+
// resolver rather than one re-invented at each of the seventeen sites that
|
|
123
|
+
// asked. Not caught here on purpose: propagating is the whole point.
|
|
124
|
+
const fallback = await resolver.getSystemDefault();
|
|
125
|
+
setResolvedChannel(fallback);
|
|
126
|
+
reply.header(ECHO_HEADER, fallback.code);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function readChannelCodeFromQuery(query) {
|
|
130
|
+
if (typeof query !== 'object' || query === null)
|
|
131
|
+
return undefined;
|
|
132
|
+
const v = query['salesChannel'];
|
|
133
|
+
if (typeof v !== 'string')
|
|
134
|
+
return undefined;
|
|
135
|
+
return v;
|
|
136
|
+
}
|
|
137
|
+
function resolverErrorToHttp(kind, code) {
|
|
138
|
+
if (kind === 'unknown_sales_channel') {
|
|
139
|
+
return new HttpError(400, ERROR_CODES.UNKNOWN_SALES_CHANNEL, `Sales channel "${code}" is not registered.`);
|
|
140
|
+
}
|
|
141
|
+
return new HttpError(400, ERROR_CODES.INACTIVE_SALES_CHANNEL, `Sales channel "${code}" is not currently active.`);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Record the resolved channel on the current request scope (feature 072, T028).
|
|
145
|
+
*
|
|
146
|
+
* The scope is opened by the tenant hook, which runs *before* this one, so the
|
|
147
|
+
* slot is filled rather than passed in at construction — see `PlatformScope.setChannel`.
|
|
148
|
+
* No scope means the resolver was mounted without the request-scope hook, which
|
|
149
|
+
* is a composition error, not a request error: fail loudly here rather than let
|
|
150
|
+
* every downstream handler see "no channel".
|
|
151
|
+
*/
|
|
152
|
+
function setResolvedChannel(channel) {
|
|
153
|
+
const scope = getCurrentPlatformScope();
|
|
154
|
+
if (!scope) {
|
|
155
|
+
throw new HttpError(500, ERROR_CODES.INTERNAL, 'No request scope is open; the sales-channel resolver is mounted without the request-scope hook.');
|
|
156
|
+
}
|
|
157
|
+
scope.setChannel(channel);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The resolved channel for the current execution, or `null` when the resolver
|
|
161
|
+
* did not run on this path (`/api/v1/_health`, non-API routes) or there is no
|
|
162
|
+
* request scope at all.
|
|
163
|
+
*
|
|
164
|
+
* Takes no argument on purpose: the channel lives on the scope now, so a caller
|
|
165
|
+
* deep in a service no longer has to be threaded a `FastifyRequest` to read it.
|
|
166
|
+
*/
|
|
167
|
+
export function currentSalesChannel() {
|
|
168
|
+
return getCurrentPlatformScope()?.channel ?? null;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Helper used by route handlers downstream. Throws if not resolved.
|
|
172
|
+
*
|
|
173
|
+
* The `request` parameter is retained so the 49 existing call sites keep
|
|
174
|
+
* compiling unchanged; it is no longer read. New code calls
|
|
175
|
+
* `getResolvedChannel()` or `currentSalesChannel()`.
|
|
176
|
+
*/
|
|
177
|
+
export function getResolvedChannel(_request) {
|
|
178
|
+
const channel = currentSalesChannel();
|
|
179
|
+
if (!channel) {
|
|
180
|
+
throw new HttpError(500, ERROR_CODES.INTERNAL, 'Sales channel was not resolved; resolver middleware did not run on this path.');
|
|
181
|
+
}
|
|
182
|
+
return channel;
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=sales-channel-resolver.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-channel-resolver.middleware.js","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-resolver.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { SalesChannelsCache } from './sales-channels-cache.js';
|
|
3
|
+
import { type CachedChannel } from './sales-channels-cache.js';
|
|
4
|
+
/**
|
|
5
|
+
* SalesChannelResolverService — feature 005 / T014.
|
|
6
|
+
*
|
|
7
|
+
* Lookup helper used by the resolver Fastify middleware (T015) and by
|
|
8
|
+
* any other consumer that needs to map a code to a channel. Reads
|
|
9
|
+
* exclusively from {@link SalesChannelsCache}; on a miss, hits Postgres
|
|
10
|
+
* once and primes the cache (positive or "not found" sentinel).
|
|
11
|
+
*
|
|
12
|
+
* Also owns:
|
|
13
|
+
* - the host-based mapping parsed from `SALES_CHANNEL_HOST_MAP`
|
|
14
|
+
* - the system-default channel lookup (used as the storefront /
|
|
15
|
+
* integration fallback per FR-013)
|
|
16
|
+
*/
|
|
17
|
+
export interface ResolverError {
|
|
18
|
+
kind: 'unknown_sales_channel' | 'inactive_sales_channel';
|
|
19
|
+
code: string;
|
|
20
|
+
}
|
|
21
|
+
export declare class SalesChannelResolverService {
|
|
22
|
+
private readonly emFactory;
|
|
23
|
+
private readonly cache;
|
|
24
|
+
private readonly hostMap;
|
|
25
|
+
constructor(emFactory: () => EntityManager, cache: SalesChannelsCache);
|
|
26
|
+
/** Every channel, ordered by code. */
|
|
27
|
+
listAll(): Promise<CachedChannel[]>;
|
|
28
|
+
/** Lookup by code; returns null when the code is unknown. */
|
|
29
|
+
getByCode(code: string): Promise<CachedChannel | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Feature 062 — lookup by id (bound api keys pin their channel by id, not
|
|
32
|
+
* code). Primes the code-keyed cache on hit so subsequent explicit-signal
|
|
33
|
+
* resolutions of the same channel are warm. Returns null when unknown.
|
|
34
|
+
*/
|
|
35
|
+
getById(id: string): Promise<CachedChannel | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a code to an *active* channel. Returns one of:
|
|
38
|
+
* - { ok: true, channel }
|
|
39
|
+
* - { ok: false, error: 'unknown_sales_channel' }
|
|
40
|
+
* - { ok: false, error: 'inactive_sales_channel' }
|
|
41
|
+
*
|
|
42
|
+
* Used by the middleware after it has picked a code from the request.
|
|
43
|
+
*/
|
|
44
|
+
resolveActive(code: string): Promise<{
|
|
45
|
+
ok: true;
|
|
46
|
+
channel: CachedChannel;
|
|
47
|
+
} | {
|
|
48
|
+
ok: false;
|
|
49
|
+
error: ResolverError['kind'];
|
|
50
|
+
code: string;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* The system-default channel; the storefront / integration fallback, and the
|
|
54
|
+
* answer to "which channel, when nobody said".
|
|
55
|
+
*
|
|
56
|
+
* **Never `null`** (feature 072, D-48). Exactly one row holds the flag on any
|
|
57
|
+
* booted deployment: the boot reconciler inserts or promotes one on every
|
|
58
|
+
* serving path, a partial unique index forbids a second, and the CRUD service
|
|
59
|
+
* refuses every delete, deactivate and `active:false` that would take it
|
|
60
|
+
* away. The nullable signature this replaces described an unreachable state,
|
|
61
|
+
* and a branch that cannot be taken but is typed as if it can is a branch
|
|
62
|
+
* every author must invent a value for — four of them did, spelling it
|
|
63
|
+
* `'default'`, the nil UUID, a `randomUUID()` and a silent switch to the
|
|
64
|
+
* platform-wide settings tier.
|
|
65
|
+
*
|
|
66
|
+
* @throws NoSystemDefaultChannel when the registry has no flagged row, which
|
|
67
|
+
* means composition has not run the reconciler yet.
|
|
68
|
+
*/
|
|
69
|
+
getSystemDefault(): Promise<CachedChannel>;
|
|
70
|
+
/** Look up a channel code from the host header using the env-configured map. */
|
|
71
|
+
resolveHost(host: string | undefined): string | null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse `SALES_CHANNEL_HOST_MAP`. Format:
|
|
75
|
+
*
|
|
76
|
+
* "host=channelCode,host=channelCode"
|
|
77
|
+
*
|
|
78
|
+
* Whitespace and trailing commas are tolerated; empty input → empty map.
|
|
79
|
+
* Hosts are lowercased; unparseable entries are silently skipped.
|
|
80
|
+
*/
|
|
81
|
+
export declare function parseHostMap(raw: string): Map<string, string>;
|
|
82
|
+
//# sourceMappingURL=sales-channel-resolver.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-channel-resolver.service.d.ts","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-resolver.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,KAAK,EACV,kBAAkB,EAAC,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,uBAAuB,GAAG,wBAAwB,CAAC;IACzD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,2BAA2B;IAIpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAG3B,SAAS,EAAE,MAAM,aAAa,EAC9B,KAAK,EAAE,kBAAkB;IAK5C,sCAAsC;IAChC,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAMzC,6DAA6D;IACvD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAe5D;;;;OAIG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IASxD;;;;;;;OAOG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,GACX,OAAO,CACN;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GACpC;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAC5D;IAOD;;;;;;;;;;;;;;;;OAgBG;IACG,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC;IAUhD,gFAAgF;IAChF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI;CAMrD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAa7D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { NoSystemDefaultChannel } from './no-system-default-channel.error.js';
|
|
2
|
+
import { SalesChannel } from './sales-channel.entity.js';
|
|
3
|
+
import { toCachedChannel, } from './sales-channels-cache.js';
|
|
4
|
+
export class SalesChannelResolverService {
|
|
5
|
+
emFactory;
|
|
6
|
+
cache;
|
|
7
|
+
hostMap;
|
|
8
|
+
constructor(emFactory, cache) {
|
|
9
|
+
this.emFactory = emFactory;
|
|
10
|
+
this.cache = cache;
|
|
11
|
+
this.hostMap = parseHostMap(process.env['SALES_CHANNEL_HOST_MAP'] ?? '');
|
|
12
|
+
}
|
|
13
|
+
/** Every channel, ordered by code. */
|
|
14
|
+
async listAll() {
|
|
15
|
+
const em = this.emFactory();
|
|
16
|
+
const rows = await em.find(SalesChannel, {}, { orderBy: { code: 'ASC' } });
|
|
17
|
+
return rows.map((row) => toCachedChannel(row));
|
|
18
|
+
}
|
|
19
|
+
/** Lookup by code; returns null when the code is unknown. */
|
|
20
|
+
async getByCode(code) {
|
|
21
|
+
const cached = await this.cache.get(code);
|
|
22
|
+
if (cached.hit)
|
|
23
|
+
return cached.value;
|
|
24
|
+
const em = this.emFactory();
|
|
25
|
+
const channel = await em.findOne(SalesChannel, { code });
|
|
26
|
+
if (channel === null) {
|
|
27
|
+
await this.cache.setNotFound(code);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const view = toCachedChannel(channel);
|
|
31
|
+
await this.cache.set(code, view);
|
|
32
|
+
return view;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Feature 062 — lookup by id (bound api keys pin their channel by id, not
|
|
36
|
+
* code). Primes the code-keyed cache on hit so subsequent explicit-signal
|
|
37
|
+
* resolutions of the same channel are warm. Returns null when unknown.
|
|
38
|
+
*/
|
|
39
|
+
async getById(id) {
|
|
40
|
+
const em = this.emFactory();
|
|
41
|
+
const channel = await em.findOne(SalesChannel, { id });
|
|
42
|
+
if (channel === null)
|
|
43
|
+
return null;
|
|
44
|
+
const view = toCachedChannel(channel);
|
|
45
|
+
await this.cache.set(view.code, view);
|
|
46
|
+
return view;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve a code to an *active* channel. Returns one of:
|
|
50
|
+
* - { ok: true, channel }
|
|
51
|
+
* - { ok: false, error: 'unknown_sales_channel' }
|
|
52
|
+
* - { ok: false, error: 'inactive_sales_channel' }
|
|
53
|
+
*
|
|
54
|
+
* Used by the middleware after it has picked a code from the request.
|
|
55
|
+
*/
|
|
56
|
+
async resolveActive(code) {
|
|
57
|
+
const channel = await this.getByCode(code);
|
|
58
|
+
if (channel === null)
|
|
59
|
+
return { ok: false, error: 'unknown_sales_channel', code };
|
|
60
|
+
if (!channel.active)
|
|
61
|
+
return { ok: false, error: 'inactive_sales_channel', code };
|
|
62
|
+
return { ok: true, channel };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The system-default channel; the storefront / integration fallback, and the
|
|
66
|
+
* answer to "which channel, when nobody said".
|
|
67
|
+
*
|
|
68
|
+
* **Never `null`** (feature 072, D-48). Exactly one row holds the flag on any
|
|
69
|
+
* booted deployment: the boot reconciler inserts or promotes one on every
|
|
70
|
+
* serving path, a partial unique index forbids a second, and the CRUD service
|
|
71
|
+
* refuses every delete, deactivate and `active:false` that would take it
|
|
72
|
+
* away. The nullable signature this replaces described an unreachable state,
|
|
73
|
+
* and a branch that cannot be taken but is typed as if it can is a branch
|
|
74
|
+
* every author must invent a value for — four of them did, spelling it
|
|
75
|
+
* `'default'`, the nil UUID, a `randomUUID()` and a silent switch to the
|
|
76
|
+
* platform-wide settings tier.
|
|
77
|
+
*
|
|
78
|
+
* @throws NoSystemDefaultChannel when the registry has no flagged row, which
|
|
79
|
+
* means composition has not run the reconciler yet.
|
|
80
|
+
*/
|
|
81
|
+
async getSystemDefault() {
|
|
82
|
+
const em = this.emFactory();
|
|
83
|
+
const channel = await em.findOne(SalesChannel, { systemDefault: true });
|
|
84
|
+
if (channel === null)
|
|
85
|
+
throw new NoSystemDefaultChannel();
|
|
86
|
+
const view = toCachedChannel(channel);
|
|
87
|
+
// Make the system-default channel cheap to find on the next call too.
|
|
88
|
+
await this.cache.set(view.code, view);
|
|
89
|
+
return view;
|
|
90
|
+
}
|
|
91
|
+
/** Look up a channel code from the host header using the env-configured map. */
|
|
92
|
+
resolveHost(host) {
|
|
93
|
+
if (!host)
|
|
94
|
+
return null;
|
|
95
|
+
// Normalise — ioredis-style hosts may carry `:port`.
|
|
96
|
+
const bare = host.split(':')[0].toLowerCase();
|
|
97
|
+
return this.hostMap.get(bare) ?? null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Parse `SALES_CHANNEL_HOST_MAP`. Format:
|
|
102
|
+
*
|
|
103
|
+
* "host=channelCode,host=channelCode"
|
|
104
|
+
*
|
|
105
|
+
* Whitespace and trailing commas are tolerated; empty input → empty map.
|
|
106
|
+
* Hosts are lowercased; unparseable entries are silently skipped.
|
|
107
|
+
*/
|
|
108
|
+
export function parseHostMap(raw) {
|
|
109
|
+
const map = new Map();
|
|
110
|
+
if (!raw.trim())
|
|
111
|
+
return map;
|
|
112
|
+
for (const entry of raw.split(',')) {
|
|
113
|
+
const trimmed = entry.trim();
|
|
114
|
+
if (trimmed === '')
|
|
115
|
+
continue;
|
|
116
|
+
const eq = trimmed.indexOf('=');
|
|
117
|
+
if (eq <= 0 || eq === trimmed.length - 1)
|
|
118
|
+
continue;
|
|
119
|
+
const host = trimmed.slice(0, eq).trim().toLowerCase();
|
|
120
|
+
const code = trimmed.slice(eq + 1).trim();
|
|
121
|
+
if (host && code)
|
|
122
|
+
map.set(host, code);
|
|
123
|
+
}
|
|
124
|
+
return map;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=sales-channel-resolver.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-channel-resolver.service.js","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel-resolver.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
/**
|
|
3
|
+
* Sales Channel — feature 005.
|
|
4
|
+
*
|
|
5
|
+
* The platform-wide stable handle through which every other module scopes
|
|
6
|
+
* its data (FR-013/FR-015). One row carries `systemDefault = true`
|
|
7
|
+
* (enforced by a partial unique index — feature 005, migration 025); the
|
|
8
|
+
* boot-time reconciler is the single source of truth for that flag
|
|
9
|
+
* (research.md R-4).
|
|
10
|
+
*
|
|
11
|
+
* Legacy fields preserved for one release cycle (research.md R-12):
|
|
12
|
+
* - `isPublic` — anonymous-price visibility for the storefront. Will
|
|
13
|
+
* be folded into the new `active` flag's downstream effects later.
|
|
14
|
+
* - `status` — superseded by the boolean `active`. Keeping both for
|
|
15
|
+
* reversibility of migration 025; consumers should read `active`.
|
|
16
|
+
*
|
|
17
|
+
* Optimistic concurrency for identity edits (FR-005) is enforced by the
|
|
18
|
+
* `version` column. The service layer bumps `version` on every mutation
|
|
19
|
+
* and `PATCH` handlers gate on `If-Match: W/"<id>:<version>"` — same
|
|
20
|
+
* pattern as `quote_requests` and the settings module.
|
|
21
|
+
*
|
|
22
|
+
* Bridge tables (sales_channel_<entity>) are declared by their owning
|
|
23
|
+
* modules as separate entity classes; this class does not declare any
|
|
24
|
+
* MikroORM relation properties for them so that adding / removing
|
|
25
|
+
* bridges in later features stays a per-module concern.
|
|
26
|
+
*/
|
|
27
|
+
export declare class SalesChannel {
|
|
28
|
+
[OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'isPublic' | 'status' | 'logoAssetId' | 'themeCode' | 'languages' | 'currencies' | 'active' | 'systemDefault' | 'version';
|
|
29
|
+
id: string;
|
|
30
|
+
code: string;
|
|
31
|
+
name: Record<string, string>;
|
|
32
|
+
logoAssetId?: string | null;
|
|
33
|
+
themeCode?: string | null;
|
|
34
|
+
/** Ordered array of language codes; `defaultLanguage` MUST be one of these. */
|
|
35
|
+
languages: string[];
|
|
36
|
+
defaultLanguage: string;
|
|
37
|
+
/** Ordered array of ISO-4217 currency codes; `defaultCurrency` MUST be one of these. */
|
|
38
|
+
currencies: string[];
|
|
39
|
+
defaultCurrency: string;
|
|
40
|
+
active: boolean;
|
|
41
|
+
/** True for exactly one row platform-wide (partial unique index in migration 025). */
|
|
42
|
+
systemDefault: boolean;
|
|
43
|
+
/** Optimistic-concurrency guard for identity edits (FR-005); service-layer bump. */
|
|
44
|
+
version: number;
|
|
45
|
+
isPublic: boolean;
|
|
46
|
+
status: 'active' | 'inactive';
|
|
47
|
+
createdAt: Date;
|
|
48
|
+
updatedAt: Date;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=sales-channel.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-channel.entity.d.ts","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,aAAa,EAAgC,MAAM,iBAAiB,CAAC;AAItF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAEa,YAAY;IACvB,CAAC,aAAa,CAAC,CAAC,EACZ,IAAI,GACJ,WAAW,GACX,WAAW,GACX,UAAU,GACV,QAAQ,GACR,aAAa,GACb,WAAW,GACX,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,eAAe,GACf,SAAS,CAAC;IAGd,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAQ;IAGnC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEjC,+EAA+E;IAE/E,SAAS,EAAE,MAAM,EAAE,CAAM;IAGzB,eAAe,EAAG,MAAM,CAAC;IAEzB,wFAAwF;IAExF,UAAU,EAAE,MAAM,EAAE,CAAM;IAG1B,eAAe,EAAG,MAAM,CAAC;IAGzB,MAAM,EAAE,OAAO,CAAQ;IAEvB,sFAAsF;IAEtF,aAAa,EAAE,OAAO,CAAS;IAE/B,oFAAoF;IAEpF,OAAO,EAAE,MAAM,CAAK;IAKpB,QAAQ,EAAE,OAAO,CAAS;IAG1B,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAY;IAGzC,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Entity, OptionalProps, PrimaryKey, Property, Unique } from '@mikro-orm/core';
|
|
11
|
+
import { GlobalEntity } from '../../tenancy/org-scoped.decorator.js';
|
|
12
|
+
import { randomUUID } from 'crypto';
|
|
13
|
+
/**
|
|
14
|
+
* Sales Channel — feature 005.
|
|
15
|
+
*
|
|
16
|
+
* The platform-wide stable handle through which every other module scopes
|
|
17
|
+
* its data (FR-013/FR-015). One row carries `systemDefault = true`
|
|
18
|
+
* (enforced by a partial unique index — feature 005, migration 025); the
|
|
19
|
+
* boot-time reconciler is the single source of truth for that flag
|
|
20
|
+
* (research.md R-4).
|
|
21
|
+
*
|
|
22
|
+
* Legacy fields preserved for one release cycle (research.md R-12):
|
|
23
|
+
* - `isPublic` — anonymous-price visibility for the storefront. Will
|
|
24
|
+
* be folded into the new `active` flag's downstream effects later.
|
|
25
|
+
* - `status` — superseded by the boolean `active`. Keeping both for
|
|
26
|
+
* reversibility of migration 025; consumers should read `active`.
|
|
27
|
+
*
|
|
28
|
+
* Optimistic concurrency for identity edits (FR-005) is enforced by the
|
|
29
|
+
* `version` column. The service layer bumps `version` on every mutation
|
|
30
|
+
* and `PATCH` handlers gate on `If-Match: W/"<id>:<version>"` — same
|
|
31
|
+
* pattern as `quote_requests` and the settings module.
|
|
32
|
+
*
|
|
33
|
+
* Bridge tables (sales_channel_<entity>) are declared by their owning
|
|
34
|
+
* modules as separate entity classes; this class does not declare any
|
|
35
|
+
* MikroORM relation properties for them so that adding / removing
|
|
36
|
+
* bridges in later features stays a per-module concern.
|
|
37
|
+
*/
|
|
38
|
+
let SalesChannel = class SalesChannel {
|
|
39
|
+
[OptionalProps];
|
|
40
|
+
id = randomUUID();
|
|
41
|
+
code;
|
|
42
|
+
name;
|
|
43
|
+
logoAssetId = null;
|
|
44
|
+
themeCode = null;
|
|
45
|
+
/** Ordered array of language codes; `defaultLanguage` MUST be one of these. */
|
|
46
|
+
languages = [];
|
|
47
|
+
defaultLanguage;
|
|
48
|
+
/** Ordered array of ISO-4217 currency codes; `defaultCurrency` MUST be one of these. */
|
|
49
|
+
currencies = [];
|
|
50
|
+
defaultCurrency;
|
|
51
|
+
active = true;
|
|
52
|
+
/** True for exactly one row platform-wide (partial unique index in migration 025). */
|
|
53
|
+
systemDefault = false;
|
|
54
|
+
/** Optimistic-concurrency guard for identity edits (FR-005); service-layer bump. */
|
|
55
|
+
version = 1;
|
|
56
|
+
// -- Legacy columns (preserved for one release per research.md R-12) ------
|
|
57
|
+
isPublic = false;
|
|
58
|
+
status = 'active';
|
|
59
|
+
createdAt = new Date();
|
|
60
|
+
updatedAt = new Date();
|
|
61
|
+
};
|
|
62
|
+
__decorate([
|
|
63
|
+
PrimaryKey({ type: 'uuid' }),
|
|
64
|
+
__metadata("design:type", String)
|
|
65
|
+
], SalesChannel.prototype, "id", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
Property({ type: 'string', length: 32 }),
|
|
68
|
+
Unique(),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], SalesChannel.prototype, "code", void 0);
|
|
71
|
+
__decorate([
|
|
72
|
+
Property({ type: 'json' }),
|
|
73
|
+
__metadata("design:type", Object)
|
|
74
|
+
], SalesChannel.prototype, "name", void 0);
|
|
75
|
+
__decorate([
|
|
76
|
+
Property({ type: 'uuid', nullable: true }),
|
|
77
|
+
__metadata("design:type", Object)
|
|
78
|
+
], SalesChannel.prototype, "logoAssetId", void 0);
|
|
79
|
+
__decorate([
|
|
80
|
+
Property({ type: 'string', length: 64, nullable: true }),
|
|
81
|
+
__metadata("design:type", Object)
|
|
82
|
+
], SalesChannel.prototype, "themeCode", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
Property({ type: 'json' }),
|
|
85
|
+
__metadata("design:type", Array)
|
|
86
|
+
], SalesChannel.prototype, "languages", void 0);
|
|
87
|
+
__decorate([
|
|
88
|
+
Property({ type: 'string', length: 10 }),
|
|
89
|
+
__metadata("design:type", String)
|
|
90
|
+
], SalesChannel.prototype, "defaultLanguage", void 0);
|
|
91
|
+
__decorate([
|
|
92
|
+
Property({ type: 'json' }),
|
|
93
|
+
__metadata("design:type", Array)
|
|
94
|
+
], SalesChannel.prototype, "currencies", void 0);
|
|
95
|
+
__decorate([
|
|
96
|
+
Property({ type: 'string', length: 3 }),
|
|
97
|
+
__metadata("design:type", String)
|
|
98
|
+
], SalesChannel.prototype, "defaultCurrency", void 0);
|
|
99
|
+
__decorate([
|
|
100
|
+
Property({ type: 'boolean' }),
|
|
101
|
+
__metadata("design:type", Boolean)
|
|
102
|
+
], SalesChannel.prototype, "active", void 0);
|
|
103
|
+
__decorate([
|
|
104
|
+
Property({ type: 'boolean' }),
|
|
105
|
+
__metadata("design:type", Boolean)
|
|
106
|
+
], SalesChannel.prototype, "systemDefault", void 0);
|
|
107
|
+
__decorate([
|
|
108
|
+
Property({ type: 'integer' }),
|
|
109
|
+
__metadata("design:type", Number)
|
|
110
|
+
], SalesChannel.prototype, "version", void 0);
|
|
111
|
+
__decorate([
|
|
112
|
+
Property({ type: 'boolean' }),
|
|
113
|
+
__metadata("design:type", Boolean)
|
|
114
|
+
], SalesChannel.prototype, "isPublic", void 0);
|
|
115
|
+
__decorate([
|
|
116
|
+
Property({ type: 'string', length: 16 }),
|
|
117
|
+
__metadata("design:type", String)
|
|
118
|
+
], SalesChannel.prototype, "status", void 0);
|
|
119
|
+
__decorate([
|
|
120
|
+
Property({ type: 'datetime', onCreate: () => new Date() }),
|
|
121
|
+
__metadata("design:type", Date)
|
|
122
|
+
], SalesChannel.prototype, "createdAt", void 0);
|
|
123
|
+
__decorate([
|
|
124
|
+
Property({ type: 'datetime', onUpdate: () => new Date() }),
|
|
125
|
+
__metadata("design:type", Date)
|
|
126
|
+
], SalesChannel.prototype, "updatedAt", void 0);
|
|
127
|
+
SalesChannel = __decorate([
|
|
128
|
+
GlobalEntity(),
|
|
129
|
+
Entity({ tableName: 'sales_channels' })
|
|
130
|
+
], SalesChannel);
|
|
131
|
+
export { SalesChannel };
|
|
132
|
+
//# sourceMappingURL=sales-channel.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sales-channel.entity.js","sourceRoot":"","sources":["../../../src/kernel/sales-channels/sales-channel.entity.ts"],"names":[],"mappings":"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"}
|