@open-mercato/core 0.9.1-develop.7473.1.de5b22888f → 0.9.1-develop.7475.1.28ca93ed97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/catalog_price_history_entry/index.js +53 -0
- package/dist/generated/entities/catalog_price_history_entry/index.js.map +7 -0
- package/dist/generated/entities/customer_group_terms/index.js +2 -0
- package/dist/generated/entities/customer_group_terms/index.js.map +2 -2
- package/dist/generated/entities/ecommerce_store/index.js +33 -0
- package/dist/generated/entities/ecommerce_store/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js +29 -0
- package/dist/generated/entities/ecommerce_store_channel_binding/index.js.map +7 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js +23 -0
- package/dist/generated/entities/ecommerce_store_domain_binding/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +8 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +72 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/customerGroupsFixtures.js.map +2 -2
- package/dist/modules/catalog/acl.js +8 -1
- package/dist/modules/catalog/acl.js.map +2 -2
- package/dist/modules/catalog/api/config/omnibus/route.js +184 -0
- package/dist/modules/catalog/api/config/omnibus/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/history/route.js +131 -0
- package/dist/modules/catalog/api/prices/history/route.js.map +7 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js +184 -0
- package/dist/modules/catalog/api/prices/omnibus-preview/route.js.map +7 -0
- package/dist/modules/catalog/api/products/route.js +54 -245
- package/dist/modules/catalog/api/products/route.js.map +3 -3
- package/dist/modules/catalog/api/tags/route.js +6 -0
- package/dist/modules/catalog/api/tags/route.js.map +2 -2
- package/dist/modules/catalog/backend/config/catalog/page.js +3 -1
- package/dist/modules/catalog/backend/config/catalog/page.js.map +2 -2
- package/dist/modules/catalog/cli.js +80 -2
- package/dist/modules/catalog/cli.js.map +2 -2
- package/dist/modules/catalog/commands/categories.js +51 -2
- package/dist/modules/catalog/commands/categories.js.map +2 -2
- package/dist/modules/catalog/commands/prices.js +43 -1
- package/dist/modules/catalog/commands/prices.js.map +2 -2
- package/dist/modules/catalog/commands/products.js +71 -0
- package/dist/modules/catalog/commands/products.js.map +2 -2
- package/dist/modules/catalog/commands/variants.js +7 -0
- package/dist/modules/catalog/commands/variants.js.map +2 -2
- package/dist/modules/catalog/components/OmnibusSettings.js +703 -0
- package/dist/modules/catalog/components/OmnibusSettings.js.map +7 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js +152 -0
- package/dist/modules/catalog/components/PriceEditorOmnibusRow.js.map +7 -0
- package/dist/modules/catalog/components/lookupSources.js +31 -0
- package/dist/modules/catalog/components/lookupSources.js.map +7 -0
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +8 -2
- package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +11 -1
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/catalog/data/entities.js +122 -1
- package/dist/modules/catalog/data/entities.js.map +2 -2
- package/dist/modules/catalog/data/validators.js +78 -0
- package/dist/modules/catalog/data/validators.js.map +2 -2
- package/dist/modules/catalog/di.js +18 -0
- package/dist/modules/catalog/di.js.map +2 -2
- package/dist/modules/catalog/lib/omnibus.js +285 -0
- package/dist/modules/catalog/lib/omnibus.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js +146 -0
- package/dist/modules/catalog/lib/omnibusBackfill.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusCache.js +89 -0
- package/dist/modules/catalog/lib/omnibusCache.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusConfig.js +64 -0
- package/dist/modules/catalog/lib/omnibusConfig.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js +191 -0
- package/dist/modules/catalog/lib/omnibusHistoryQueries.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js +73 -0
- package/dist/modules/catalog/lib/omnibusPresentedEntry.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js +94 -0
- package/dist/modules/catalog/lib/omnibusProductListEnrichment.js.map +7 -0
- package/dist/modules/catalog/lib/omnibusTypes.js +115 -0
- package/dist/modules/catalog/lib/omnibusTypes.js.map +7 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js +55 -0
- package/dist/modules/catalog/lib/optionSchemaTranslations.js.map +7 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js +103 -0
- package/dist/modules/catalog/lib/priceHistoryQuery.js.map +7 -0
- package/dist/modules/catalog/lib/pricing.js +26 -2
- package/dist/modules/catalog/lib/pricing.js.map +2 -2
- package/dist/modules/catalog/lib/productFilters.js +273 -0
- package/dist/modules/catalog/lib/productFilters.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeKeys.js +105 -0
- package/dist/modules/catalog/lib/productScopeKeys.js.map +7 -0
- package/dist/modules/catalog/lib/productScopeReindex.js +73 -0
- package/dist/modules/catalog/lib/productScopeReindex.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005105352_catalog.js.map +7 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js +39 -0
- package/dist/modules/catalog/migrations/Migration20261005150824_catalog.js.map +7 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js +480 -0
- package/dist/modules/catalog/services/catalogOmnibusService.js.map +7 -0
- package/dist/modules/catalog/setup.js +3 -1
- package/dist/modules/catalog/setup.js.map +2 -2
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js +16 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-deleted.js.map +7 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js +17 -0
- package/dist/modules/catalog/subscribers/product-scope-keys-category-updated.js.map +7 -0
- package/dist/modules/catalog/translations.js +10 -0
- package/dist/modules/catalog/translations.js.map +2 -2
- package/dist/modules/configs/lib/upgrade-actions.js +28 -0
- package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +5 -0
- package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +2 -2
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +111 -3
- package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +2 -2
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js +43 -0
- package/dist/modules/customer_groups/components/customerGroupAssortmentScope.js.map +7 -0
- package/dist/modules/customer_groups/data/entities.js +3 -0
- package/dist/modules/customer_groups/data/entities.js.map +2 -2
- package/dist/modules/customer_groups/data/validators.js +9 -0
- package/dist/modules/customer_groups/data/validators.js.map +2 -2
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js +17 -0
- package/dist/modules/customer_groups/migrations/Migration20261005110250_customer_groups.js.map +7 -0
- package/dist/modules/customer_groups/services/customerGroupsService.js +62 -15
- package/dist/modules/customer_groups/services/customerGroupsService.js.map +2 -2
- package/dist/modules/ecommerce/acl.js +13 -0
- package/dist/modules/ecommerce/acl.js.map +7 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js +72 -0
- package/dist/modules/ecommerce/api/domain-mappings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/openapi.js +27 -0
- package/dist/modules/ecommerce/api/openapi.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js +109 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js +265 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js +67 -0
- package/dist/modules/ecommerce/api/store-channel-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js +296 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js +73 -0
- package/dist/modules/ecommerce/api/store-domain-bindings/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/categories/[slug]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js +50 -0
- package/dist/modules/ecommerce/api/storefront/categories/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/categories/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js +163 -0
- package/dist/modules/ecommerce/api/storefront/context/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js +87 -0
- package/dist/modules/ecommerce/api/storefront/products/[idOrHandle]/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js +177 -0
- package/dist/modules/ecommerce/api/storefront/products/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js +78 -0
- package/dist/modules/ecommerce/api/storefront/products/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js +25 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js +75 -0
- package/dist/modules/ecommerce/api/storefront/search/suggest/route.js.map +7 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js +58 -0
- package/dist/modules/ecommerce/api/storefront/storefrontRouteSupport.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js +183 -0
- package/dist/modules/ecommerce/api/stores/[id]/branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js +92 -0
- package/dist/modules/ecommerce/api/stores/[id]/preview-branding/route.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/crud.js +401 -0
- package/dist/modules/ecommerce/api/stores/crud.js.map +7 -0
- package/dist/modules/ecommerce/api/stores/route.js +64 -0
- package/dist/modules/ecommerce/api/stores/route.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js +9 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.js.map +7 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js +16 -0
- package/dist/modules/ecommerce/backend/config/ecommerce/page.meta.js.map +7 -0
- package/dist/modules/ecommerce/commands/stores.js +110 -0
- package/dist/modules/ecommerce/commands/stores.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js +90 -0
- package/dist/modules/ecommerce/components/ChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js +33 -0
- package/dist/modules/ecommerce/components/ChannelBindingFormSections.js.map +7 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js +11 -0
- package/dist/modules/ecommerce/components/ChannelLookupPicker.js.map +7 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js +24 -0
- package/dist/modules/ecommerce/components/DomainStatusWarning.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js +190 -0
- package/dist/modules/ecommerce/components/StoreAvailabilityDefaultsSection.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js +67 -0
- package/dist/modules/ecommerce/components/StoreBrandingControls.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js +69 -0
- package/dist/modules/ecommerce/components/StoreBrandingPreview.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js +218 -0
- package/dist/modules/ecommerce/components/StoreBrandingTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js +270 -0
- package/dist/modules/ecommerce/components/StoreChannelBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js +313 -0
- package/dist/modules/ecommerce/components/StoreChannelsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js +164 -0
- package/dist/modules/ecommerce/components/StoreCreateDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js +162 -0
- package/dist/modules/ecommerce/components/StoreDomainBindingDialog.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js +357 -0
- package/dist/modules/ecommerce/components/StoreDomainsTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js +155 -0
- package/dist/modules/ecommerce/components/StoreEditPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js +167 -0
- package/dist/modules/ecommerce/components/StoreGeneralTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreListPage.js +290 -0
- package/dist/modules/ecommerce/components/StoreListPage.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js +132 -0
- package/dist/modules/ecommerce/components/StoreSeoTab.js.map +7 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js +20 -0
- package/dist/modules/ecommerce/components/StoreStatusBadge.js.map +7 -0
- package/dist/modules/ecommerce/components/channelLookups.js +28 -0
- package/dist/modules/ecommerce/components/channelLookups.js.map +7 -0
- package/dist/modules/ecommerce/components/storeAdmin.js +41 -0
- package/dist/modules/ecommerce/components/storeAdmin.js.map +7 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js +197 -0
- package/dist/modules/ecommerce/components/storeBrandingForm.js.map +7 -0
- package/dist/modules/ecommerce/components/storeChannels.js +140 -0
- package/dist/modules/ecommerce/components/storeChannels.js.map +7 -0
- package/dist/modules/ecommerce/components/storeDomains.js +167 -0
- package/dist/modules/ecommerce/components/storeDomains.js.map +7 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js +62 -0
- package/dist/modules/ecommerce/components/storeEditTabs.js.map +7 -0
- package/dist/modules/ecommerce/components/storeGeneral.js +95 -0
- package/dist/modules/ecommerce/components/storeGeneral.js.map +7 -0
- package/dist/modules/ecommerce/components/storeSeo.js +69 -0
- package/dist/modules/ecommerce/components/storeSeo.js.map +7 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js +45 -0
- package/dist/modules/ecommerce/components/useChannelAssortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js +28 -0
- package/dist/modules/ecommerce/components/useStoreAccess.js.map +7 -0
- package/dist/modules/ecommerce/data/enrichers.js +157 -0
- package/dist/modules/ecommerce/data/enrichers.js.map +7 -0
- package/dist/modules/ecommerce/data/entities.js +197 -0
- package/dist/modules/ecommerce/data/entities.js.map +7 -0
- package/dist/modules/ecommerce/data/validators.js +406 -0
- package/dist/modules/ecommerce/data/validators.js.map +7 -0
- package/dist/modules/ecommerce/di.js +11 -0
- package/dist/modules/ecommerce/di.js.map +7 -0
- package/dist/modules/ecommerce/events.js +27 -0
- package/dist/modules/ecommerce/events.js.map +7 -0
- package/dist/modules/ecommerce/index.js +16 -0
- package/dist/modules/ecommerce/index.js.map +7 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js +112 -0
- package/dist/modules/ecommerce/lib/assortmentCount.js.map +7 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js +184 -0
- package/dist/modules/ecommerce/lib/brandingStyles.js.map +7 -0
- package/dist/modules/ecommerce/lib/buyerContext.js +284 -0
- package/dist/modules/ecommerce/lib/buyerContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js +186 -0
- package/dist/modules/ecommerce/lib/cacheInvalidation.js.map +7 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js +236 -0
- package/dist/modules/ecommerce/lib/cacheKeys.js.map +7 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js +29 -0
- package/dist/modules/ecommerce/lib/createConflictRecheck.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudEvents.js +94 -0
- package/dist/modules/ecommerce/lib/crudEvents.js.map +7 -0
- package/dist/modules/ecommerce/lib/crudSupport.js +64 -0
- package/dist/modules/ecommerce/lib/crudSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js +99 -0
- package/dist/modules/ecommerce/lib/domainBindingRebind.js.map +7 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js +39 -0
- package/dist/modules/ecommerce/lib/domainMappingSummaries.js.map +7 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js +57 -0
- package/dist/modules/ecommerce/lib/exclusiveFlag.js.map +7 -0
- package/dist/modules/ecommerce/lib/references.js +70 -0
- package/dist/modules/ecommerce/lib/references.js.map +7 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js +99 -0
- package/dist/modules/ecommerce/lib/seedDraftStore.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js +109 -0
- package/dist/modules/ecommerce/lib/storeBindingCascade.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBranding.js +40 -0
- package/dist/modules/ecommerce/lib/storeBranding.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js +76 -0
- package/dist/modules/ecommerce/lib/storeBrandingRoute.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContext.js +393 -0
- package/dist/modules/ecommerce/lib/storeContext.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeContextService.js +43 -0
- package/dist/modules/ecommerce/lib/storeContextService.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeLocale.js +60 -0
- package/dist/modules/ecommerce/lib/storeLocale.js.map +7 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js +41 -0
- package/dist/modules/ecommerce/lib/storeNotifications.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js +248 -0
- package/dist/modules/ecommerce/lib/storefrontCatalogSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js +241 -0
- package/dist/modules/ecommerce/lib/storefrontCategories.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js +71 -0
- package/dist/modules/ecommerce/lib/storefrontCategoryCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js +447 -0
- package/dist/modules/ecommerce/lib/storefrontDetail.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js +441 -0
- package/dist/modules/ecommerce/lib/storefrontFacets.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js +15 -0
- package/dist/modules/ecommerce/lib/storefrontOptionFilter.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js +393 -0
- package/dist/modules/ecommerce/lib/storefrontPricing.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js +90 -0
- package/dist/modules/ecommerce/lib/storefrontProductCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js +107 -0
- package/dist/modules/ecommerce/lib/storefrontProductScope.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js +670 -0
- package/dist/modules/ecommerce/lib/storefrontProducts.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js +156 -0
- package/dist/modules/ecommerce/lib/storefrontQuery.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js +99 -0
- package/dist/modules/ecommerce/lib/storefrontRateLimit.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js +303 -0
- package/dist/modules/ecommerce/lib/storefrontSearch.js.map +7 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js +35 -0
- package/dist/modules/ecommerce/lib/storefrontSearchCache.js.map +7 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js +33 -0
- package/dist/modules/ecommerce/lib/subscriberSupport.js.map +7 -0
- package/dist/modules/ecommerce/lib/types.js +1 -0
- package/dist/modules/ecommerce/lib/types.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js +32 -0
- package/dist/modules/ecommerce/migrations/Migration20261005113233_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js +17 -0
- package/dist/modules/ecommerce/migrations/Migration20261006112733_ecommerce.js.map +7 -0
- package/dist/modules/ecommerce/notifications.client.js +47 -0
- package/dist/modules/ecommerce/notifications.client.js.map +7 -0
- package/dist/modules/ecommerce/notifications.js +48 -0
- package/dist/modules/ecommerce/notifications.js.map +7 -0
- package/dist/modules/ecommerce/search.js +83 -0
- package/dist/modules/ecommerce/search.js.map +7 -0
- package/dist/modules/ecommerce/setup.js +17 -0
- package/dist/modules/ecommerce/setup.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/assortment-empty-notifications.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/availability-policy-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-category-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-price-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-product-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js +16 -0
- package/dist/modules/ecommerce/subscribers/domain-binding-rebind.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.js.map +7 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js +14 -0
- package/dist/modules/ecommerce/subscribers/store-notifications.js.map +7 -0
- package/dist/modules/query_index/lib/batch.js +23 -9
- package/dist/modules/query_index/lib/batch.js.map +2 -2
- package/dist/modules/query_index/lib/doc-enrichers.js +212 -0
- package/dist/modules/query_index/lib/doc-enrichers.js.map +7 -0
- package/dist/modules/query_index/lib/document.js +2 -0
- package/dist/modules/query_index/lib/document.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +68 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/query_index/lib/indexer.js +7 -0
- package/dist/modules/query_index/lib/indexer.js.map +2 -2
- package/dist/modules/query_index/lib/search-tokens.js +2 -0
- package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js +17 -0
- package/dist/modules/query_index/migrations/Migration20261005201500_query_index.js.map +7 -0
- package/dist/modules/translations/components/TranslationManager.js +3 -3
- package/dist/modules/translations/components/TranslationManager.js.map +2 -2
- package/dist/modules/translations/data/validators.js +1 -1
- package/dist/modules/translations/data/validators.js.map +1 -1
- package/dist/modules/translations/lib/batch.js +21 -1
- package/dist/modules/translations/lib/batch.js.map +2 -2
- package/dist/modules/translations/lib/helpers.js +3 -0
- package/dist/modules/translations/lib/helpers.js.map +2 -2
- package/dist/modules/translations/lib/resolve-field-list.js +14 -2
- package/dist/modules/translations/lib/resolve-field-list.js.map +2 -2
- package/generated/entities/catalog_price_history_entry/index.ts +25 -0
- package/generated/entities/customer_group_terms/index.ts +1 -0
- package/generated/entities/ecommerce_store/index.ts +15 -0
- package/generated/entities/ecommerce_store_channel_binding/index.ts +13 -0
- package/generated/entities/ecommerce_store_domain_binding/index.ts +10 -0
- package/generated/entities.ids.generated.ts +8 -1
- package/generated/entity-fields-registry.ts +72 -0
- package/package.json +7 -7
- package/src/helpers/integration/customerGroupsFixtures.ts +2 -0
- package/src/modules/auth/i18n/de.json +8 -0
- package/src/modules/auth/i18n/en.json +8 -0
- package/src/modules/auth/i18n/es.json +8 -0
- package/src/modules/auth/i18n/ko.json +8 -0
- package/src/modules/auth/i18n/pl.json +8 -0
- package/src/modules/catalog/AGENTS.md +5 -2
- package/src/modules/catalog/acl.ts +7 -0
- package/src/modules/catalog/api/config/omnibus/route.ts +204 -0
- package/src/modules/catalog/api/prices/history/route.ts +139 -0
- package/src/modules/catalog/api/prices/omnibus-preview/route.ts +202 -0
- package/src/modules/catalog/api/products/route.ts +53 -308
- package/src/modules/catalog/api/tags/route.ts +6 -0
- package/src/modules/catalog/backend/config/catalog/page.tsx +2 -0
- package/src/modules/catalog/cli.ts +84 -1
- package/src/modules/catalog/commands/categories.ts +54 -2
- package/src/modules/catalog/commands/prices.ts +43 -1
- package/src/modules/catalog/commands/products.ts +84 -1
- package/src/modules/catalog/commands/variants.ts +7 -0
- package/src/modules/catalog/components/OmnibusSettings.tsx +832 -0
- package/src/modules/catalog/components/PriceEditorOmnibusRow.tsx +219 -0
- package/src/modules/catalog/components/lookupSources.ts +29 -0
- package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +9 -0
- package/src/modules/catalog/components/products/VariantBuilder.tsx +9 -0
- package/src/modules/catalog/data/entities.ts +123 -1
- package/src/modules/catalog/data/validators.ts +118 -0
- package/src/modules/catalog/di.ts +23 -0
- package/src/modules/catalog/i18n/de.json +77 -0
- package/src/modules/catalog/i18n/en.json +77 -0
- package/src/modules/catalog/i18n/es.json +77 -0
- package/src/modules/catalog/i18n/ko.json +77 -0
- package/src/modules/catalog/i18n/pl.json +77 -0
- package/src/modules/catalog/lib/omnibus.ts +406 -0
- package/src/modules/catalog/lib/omnibusBackfill.ts +198 -0
- package/src/modules/catalog/lib/omnibusCache.ts +111 -0
- package/src/modules/catalog/lib/omnibusConfig.ts +73 -0
- package/src/modules/catalog/lib/omnibusHistoryQueries.ts +248 -0
- package/src/modules/catalog/lib/omnibusPresentedEntry.ts +76 -0
- package/src/modules/catalog/lib/omnibusProductListEnrichment.ts +125 -0
- package/src/modules/catalog/lib/omnibusTypes.ts +202 -0
- package/src/modules/catalog/lib/optionSchemaTranslations.ts +55 -0
- package/src/modules/catalog/lib/priceHistoryQuery.ts +155 -0
- package/src/modules/catalog/lib/pricing.ts +42 -4
- package/src/modules/catalog/lib/productFilters.ts +349 -0
- package/src/modules/catalog/lib/productScopeKeys.ts +162 -0
- package/src/modules/catalog/lib/productScopeReindex.ts +139 -0
- package/src/modules/catalog/migrations/.snapshot-open-mercato.json +572 -0
- package/src/modules/catalog/migrations/Migration20261005105352_catalog.ts +39 -0
- package/src/modules/catalog/migrations/Migration20261005150824_catalog.ts +39 -0
- package/src/modules/catalog/services/catalogOmnibusService.ts +642 -0
- package/src/modules/catalog/setup.ts +2 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-deleted.ts +18 -0
- package/src/modules/catalog/subscribers/product-scope-keys-category-updated.ts +19 -0
- package/src/modules/catalog/translations.ts +12 -0
- package/src/modules/configs/i18n/de.json +5 -1
- package/src/modules/configs/i18n/en.json +5 -1
- package/src/modules/configs/i18n/es.json +5 -1
- package/src/modules/configs/i18n/ko.json +5 -1
- package/src/modules/configs/i18n/pl.json +5 -1
- package/src/modules/configs/lib/upgrade-actions.ts +35 -0
- package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +7 -0
- package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +124 -2
- package/src/modules/customer_groups/components/customerGroupAssortmentScope.ts +46 -0
- package/src/modules/customer_groups/data/entities.ts +4 -0
- package/src/modules/customer_groups/data/validators.ts +14 -0
- package/src/modules/customer_groups/i18n/de.json +12 -0
- package/src/modules/customer_groups/i18n/en.json +12 -0
- package/src/modules/customer_groups/i18n/es.json +12 -0
- package/src/modules/customer_groups/i18n/ko.json +12 -0
- package/src/modules/customer_groups/i18n/pl.json +12 -0
- package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +17 -0
- package/src/modules/customer_groups/migrations/Migration20261005110250_customer_groups.ts +15 -0
- package/src/modules/customer_groups/services/customerGroupsService.ts +74 -23
- package/src/modules/ecommerce/acl.ts +9 -0
- package/src/modules/ecommerce/api/domain-mappings/route.ts +76 -0
- package/src/modules/ecommerce/api/openapi.ts +28 -0
- package/src/modules/ecommerce/api/store-channel-bindings/[id]/assortment-count/route.ts +141 -0
- package/src/modules/ecommerce/api/store-channel-bindings/crud.ts +283 -0
- package/src/modules/ecommerce/api/store-channel-bindings/route.ts +67 -0
- package/src/modules/ecommerce/api/store-domain-bindings/crud.ts +324 -0
- package/src/modules/ecommerce/api/store-domain-bindings/route.ts +73 -0
- package/src/modules/ecommerce/api/storefront/categories/[slug]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/categories/openapiSchemas.ts +63 -0
- package/src/modules/ecommerce/api/storefront/categories/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/context/route.ts +203 -0
- package/src/modules/ecommerce/api/storefront/products/[idOrHandle]/route.ts +94 -0
- package/src/modules/ecommerce/api/storefront/products/openapiSchemas.ts +193 -0
- package/src/modules/ecommerce/api/storefront/products/route.ts +81 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/openapiSchemas.ts +25 -0
- package/src/modules/ecommerce/api/storefront/search/suggest/route.ts +78 -0
- package/src/modules/ecommerce/api/storefront/storefrontRouteSupport.ts +68 -0
- package/src/modules/ecommerce/api/stores/[id]/branding/route.ts +205 -0
- package/src/modules/ecommerce/api/stores/[id]/preview-branding/route.ts +99 -0
- package/src/modules/ecommerce/api/stores/crud.ts +457 -0
- package/src/modules/ecommerce/api/stores/route.ts +66 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/[id]/page.tsx +5 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.meta.ts +12 -0
- package/src/modules/ecommerce/backend/config/ecommerce/page.tsx +5 -0
- package/src/modules/ecommerce/commands/stores.ts +154 -0
- package/src/modules/ecommerce/components/ChannelAssortmentCount.tsx +138 -0
- package/src/modules/ecommerce/components/ChannelBindingFormSections.tsx +40 -0
- package/src/modules/ecommerce/components/ChannelLookupPicker.tsx +5 -0
- package/src/modules/ecommerce/components/DomainStatusWarning.tsx +32 -0
- package/src/modules/ecommerce/components/StoreAvailabilityDefaultsSection.tsx +219 -0
- package/src/modules/ecommerce/components/StoreBrandingControls.tsx +73 -0
- package/src/modules/ecommerce/components/StoreBrandingPreview.tsx +77 -0
- package/src/modules/ecommerce/components/StoreBrandingTab.tsx +242 -0
- package/src/modules/ecommerce/components/StoreChannelBindingDialog.tsx +306 -0
- package/src/modules/ecommerce/components/StoreChannelsTab.tsx +375 -0
- package/src/modules/ecommerce/components/StoreCreateDialog.tsx +204 -0
- package/src/modules/ecommerce/components/StoreDomainBindingDialog.tsx +198 -0
- package/src/modules/ecommerce/components/StoreDomainsTab.tsx +426 -0
- package/src/modules/ecommerce/components/StoreEditPage.tsx +193 -0
- package/src/modules/ecommerce/components/StoreGeneralTab.tsx +189 -0
- package/src/modules/ecommerce/components/StoreListPage.tsx +326 -0
- package/src/modules/ecommerce/components/StoreSeoTab.tsx +152 -0
- package/src/modules/ecommerce/components/StoreStatusBadge.tsx +22 -0
- package/src/modules/ecommerce/components/channelLookups.ts +24 -0
- package/src/modules/ecommerce/components/storeAdmin.ts +56 -0
- package/src/modules/ecommerce/components/storeBrandingForm.ts +230 -0
- package/src/modules/ecommerce/components/storeChannels.ts +210 -0
- package/src/modules/ecommerce/components/storeDomains.ts +221 -0
- package/src/modules/ecommerce/components/storeEditTabs.tsx +76 -0
- package/src/modules/ecommerce/components/storeGeneral.ts +155 -0
- package/src/modules/ecommerce/components/storeSeo.ts +78 -0
- package/src/modules/ecommerce/components/useChannelAssortmentCount.ts +67 -0
- package/src/modules/ecommerce/components/useStoreAccess.ts +36 -0
- package/src/modules/ecommerce/data/enrichers.ts +213 -0
- package/src/modules/ecommerce/data/entities.ts +168 -0
- package/src/modules/ecommerce/data/validators.ts +587 -0
- package/src/modules/ecommerce/di.ts +9 -0
- package/src/modules/ecommerce/events.ts +27 -0
- package/src/modules/ecommerce/i18n/de.json +341 -0
- package/src/modules/ecommerce/i18n/en.json +341 -0
- package/src/modules/ecommerce/i18n/es.json +341 -0
- package/src/modules/ecommerce/i18n/ko.json +341 -0
- package/src/modules/ecommerce/i18n/pl.json +341 -0
- package/src/modules/ecommerce/index.ts +14 -0
- package/src/modules/ecommerce/lib/assortmentCount.ts +175 -0
- package/src/modules/ecommerce/lib/brandingStyles.ts +215 -0
- package/src/modules/ecommerce/lib/buyerContext.ts +401 -0
- package/src/modules/ecommerce/lib/cacheInvalidation.ts +302 -0
- package/src/modules/ecommerce/lib/cacheKeys.ts +340 -0
- package/src/modules/ecommerce/lib/createConflictRecheck.ts +31 -0
- package/src/modules/ecommerce/lib/crudEvents.ts +128 -0
- package/src/modules/ecommerce/lib/crudSupport.ts +85 -0
- package/src/modules/ecommerce/lib/domainBindingRebind.ts +138 -0
- package/src/modules/ecommerce/lib/domainMappingSummaries.ts +71 -0
- package/src/modules/ecommerce/lib/exclusiveFlag.ts +90 -0
- package/src/modules/ecommerce/lib/references.ts +93 -0
- package/src/modules/ecommerce/lib/seedDraftStore.ts +125 -0
- package/src/modules/ecommerce/lib/storeBindingCascade.ts +138 -0
- package/src/modules/ecommerce/lib/storeBranding.ts +48 -0
- package/src/modules/ecommerce/lib/storeBrandingRoute.ts +91 -0
- package/src/modules/ecommerce/lib/storeContext.ts +669 -0
- package/src/modules/ecommerce/lib/storeContextService.ts +71 -0
- package/src/modules/ecommerce/lib/storeLocale.ts +88 -0
- package/src/modules/ecommerce/lib/storeNotifications.ts +55 -0
- package/src/modules/ecommerce/lib/storefrontCatalogSupport.ts +427 -0
- package/src/modules/ecommerce/lib/storefrontCategories.ts +419 -0
- package/src/modules/ecommerce/lib/storefrontCategoryCache.ts +113 -0
- package/src/modules/ecommerce/lib/storefrontDetail.ts +654 -0
- package/src/modules/ecommerce/lib/storefrontFacets.ts +697 -0
- package/src/modules/ecommerce/lib/storefrontOptionFilter.ts +44 -0
- package/src/modules/ecommerce/lib/storefrontPricing.ts +583 -0
- package/src/modules/ecommerce/lib/storefrontProductCache.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontProductScope.ts +181 -0
- package/src/modules/ecommerce/lib/storefrontProducts.ts +963 -0
- package/src/modules/ecommerce/lib/storefrontQuery.ts +215 -0
- package/src/modules/ecommerce/lib/storefrontRateLimit.ts +126 -0
- package/src/modules/ecommerce/lib/storefrontSearch.ts +454 -0
- package/src/modules/ecommerce/lib/storefrontSearchCache.ts +49 -0
- package/src/modules/ecommerce/lib/subscriberSupport.ts +41 -0
- package/src/modules/ecommerce/lib/types.ts +69 -0
- package/src/modules/ecommerce/migrations/.snapshot-open-mercato.json +829 -0
- package/src/modules/ecommerce/migrations/Migration20261005113233_ecommerce.ts +32 -0
- package/src/modules/ecommerce/migrations/Migration20261006112733_ecommerce.ts +15 -0
- package/src/modules/ecommerce/notifications.client.ts +46 -0
- package/src/modules/ecommerce/notifications.ts +46 -0
- package/src/modules/ecommerce/search.ts +93 -0
- package/src/modules/ecommerce/setup.ts +15 -0
- package/src/modules/ecommerce/subscribers/assortment-empty-notifications.ts +12 -0
- package/src/modules/ecommerce/subscribers/availability-policy-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-category-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-price-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-product-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/catalog-variant-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-membership-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-group-terms-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-deleted-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/customer-user-updated-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/domain-binding-rebind.ts +14 -0
- package/src/modules/ecommerce/subscribers/domain-mapping-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-channel-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-domain-binding-cache-invalidation.ts +12 -0
- package/src/modules/ecommerce/subscribers/store-notifications.ts +12 -0
- package/src/modules/query_index/lib/batch.ts +25 -9
- package/src/modules/query_index/lib/doc-enrichers.ts +306 -0
- package/src/modules/query_index/lib/document.ts +2 -0
- package/src/modules/query_index/lib/engine.ts +58 -1
- package/src/modules/query_index/lib/indexer.ts +8 -0
- package/src/modules/query_index/lib/search-tokens.ts +2 -0
- package/src/modules/query_index/migrations/Migration20261005201500_query_index.ts +42 -0
- package/src/modules/translations/components/TranslationManager.tsx +3 -3
- package/src/modules/translations/data/validators.ts +1 -1
- package/src/modules/translations/lib/batch.ts +47 -0
- package/src/modules/translations/lib/helpers.ts +4 -0
- package/src/modules/translations/lib/resolve-field-list.ts +16 -2
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type * as React from 'react'
|
|
2
|
+
import { StoreBrandingTab } from './StoreBrandingTab'
|
|
3
|
+
import { StoreChannelsTab } from './StoreChannelsTab'
|
|
4
|
+
import { StoreDomainsTab } from './StoreDomainsTab'
|
|
5
|
+
import { StoreGeneralTab } from './StoreGeneralTab'
|
|
6
|
+
import { StoreSeoTab } from './StoreSeoTab'
|
|
7
|
+
import { STORE_LIST_HREF, type StoreAdminRecord } from './storeAdmin'
|
|
8
|
+
|
|
9
|
+
export const STORE_TAB_QUERY_PARAM = 'tab'
|
|
10
|
+
|
|
11
|
+
export const STORE_EDIT_TAB_IDS = ['general', 'branding', 'domains', 'channels', 'seo'] as const
|
|
12
|
+
|
|
13
|
+
export type StoreEditTabId = (typeof STORE_EDIT_TAB_IDS)[number]
|
|
14
|
+
|
|
15
|
+
export type StoreEditTabContext = {
|
|
16
|
+
store: StoreAdminRecord
|
|
17
|
+
reload: () => Promise<void>
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type StoreEditTabDefinition = {
|
|
21
|
+
id: StoreEditTabId
|
|
22
|
+
labelKey: string
|
|
23
|
+
fallbackLabel: string
|
|
24
|
+
render: (context: StoreEditTabContext) => React.ReactNode
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const STORE_EDIT_TABS: readonly StoreEditTabDefinition[] = [
|
|
28
|
+
{
|
|
29
|
+
id: 'general',
|
|
30
|
+
labelKey: 'ecommerce.backend.store.tabs.general',
|
|
31
|
+
fallbackLabel: 'General',
|
|
32
|
+
render: ({ store, reload }) => <StoreGeneralTab store={store} reload={reload} />,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'branding',
|
|
36
|
+
labelKey: 'ecommerce.backend.store.tabs.branding',
|
|
37
|
+
fallbackLabel: 'Branding',
|
|
38
|
+
render: ({ store, reload }) => <StoreBrandingTab store={store} reload={reload} />,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: 'domains',
|
|
42
|
+
labelKey: 'ecommerce.backend.store.tabs.domains',
|
|
43
|
+
fallbackLabel: 'Domains',
|
|
44
|
+
render: ({ store, reload }) => <StoreDomainsTab store={store} reload={reload} />,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'channels',
|
|
48
|
+
labelKey: 'ecommerce.backend.store.tabs.channels',
|
|
49
|
+
fallbackLabel: 'Channels',
|
|
50
|
+
render: ({ store, reload }) => <StoreChannelsTab store={store} reload={reload} />,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'seo',
|
|
54
|
+
labelKey: 'ecommerce.backend.store.tabs.seo',
|
|
55
|
+
fallbackLabel: 'SEO',
|
|
56
|
+
render: ({ store, reload }) => <StoreSeoTab store={store} reload={reload} />,
|
|
57
|
+
},
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
export function isStoreEditTabId(value: unknown): value is StoreEditTabId {
|
|
61
|
+
return typeof value === 'string' && (STORE_EDIT_TAB_IDS as readonly string[]).includes(value)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function buildStoreEditHref(storeId: string, tab?: StoreEditTabId): string {
|
|
65
|
+
const base = `${STORE_LIST_HREF}/${encodeURIComponent(storeId)}`
|
|
66
|
+
return tab ? `${base}?${STORE_TAB_QUERY_PARAM}=${tab}` : base
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function resolveActiveStoreTab(
|
|
70
|
+
requested: string | null | undefined,
|
|
71
|
+
tabs: readonly StoreEditTabDefinition[],
|
|
72
|
+
): StoreEditTabId | null {
|
|
73
|
+
if (!tabs.length) return null
|
|
74
|
+
const match = tabs.find((tab) => tab.id === requested)
|
|
75
|
+
return (match ?? tabs[0]).id
|
|
76
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { refineDefaultLocaleSupported, storeIdentityFormShape } from './StoreCreateDialog'
|
|
3
|
+
import { STORE_STATUSES, type StoreAdminRecord, type StoreStatus } from './storeAdmin'
|
|
4
|
+
|
|
5
|
+
export type StoreGeneralFormValues = {
|
|
6
|
+
name: string
|
|
7
|
+
code: string
|
|
8
|
+
slug: string
|
|
9
|
+
status: StoreStatus
|
|
10
|
+
defaultLocale: string
|
|
11
|
+
supportedLocales: string[]
|
|
12
|
+
defaultCurrencyCode: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const storeGeneralFormSchema = z
|
|
16
|
+
.object({ ...storeIdentityFormShape, status: z.enum(STORE_STATUSES) })
|
|
17
|
+
.superRefine(refineDefaultLocaleSupported)
|
|
18
|
+
|
|
19
|
+
export function buildStoreGeneralInitialValues(store: StoreAdminRecord): StoreGeneralFormValues {
|
|
20
|
+
return {
|
|
21
|
+
name: store.name,
|
|
22
|
+
code: store.code,
|
|
23
|
+
slug: store.slug,
|
|
24
|
+
status: store.status,
|
|
25
|
+
defaultLocale: store.defaultLocale,
|
|
26
|
+
supportedLocales: [...store.supportedLocales],
|
|
27
|
+
defaultCurrencyCode: store.defaultCurrencyCode,
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type StoreGeneralUpdatePayload = StoreGeneralFormValues & { id: string }
|
|
32
|
+
|
|
33
|
+
export function buildStoreGeneralPayload(storeId: string, values: StoreGeneralFormValues): StoreGeneralUpdatePayload {
|
|
34
|
+
return {
|
|
35
|
+
id: storeId,
|
|
36
|
+
name: values.name.trim(),
|
|
37
|
+
code: values.code.trim(),
|
|
38
|
+
slug: values.slug.trim(),
|
|
39
|
+
status: values.status,
|
|
40
|
+
defaultLocale: values.defaultLocale.trim(),
|
|
41
|
+
supportedLocales: values.supportedLocales.map((locale) => locale.trim()),
|
|
42
|
+
defaultCurrencyCode: values.defaultCurrencyCode.trim().toUpperCase(),
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type StoreDefaultPolicy = {
|
|
47
|
+
id: string
|
|
48
|
+
storeId: string | null
|
|
49
|
+
productId: string | null
|
|
50
|
+
variantId: string | null
|
|
51
|
+
allowBackorder: boolean
|
|
52
|
+
backorderLeadTimeDays: number | null
|
|
53
|
+
hideWhenOutOfStock: boolean
|
|
54
|
+
updatedAt: string | null
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type PolicyListResponse = {
|
|
58
|
+
items: StoreDefaultPolicy[]
|
|
59
|
+
total: number
|
|
60
|
+
totalPages: number
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function isStoreDefaultPolicy(policy: StoreDefaultPolicy, storeId: string): boolean {
|
|
64
|
+
return policy.storeId === storeId && !policy.productId && !policy.variantId
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export type AvailabilityDefaultsFormValues = {
|
|
68
|
+
hideWhenOutOfStock: boolean
|
|
69
|
+
allowBackorder: boolean
|
|
70
|
+
backorderLeadTimeDays?: number | string | null
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export const AVAILABILITY_LEAD_TIME_REQUIRED_MESSAGE = 'ecommerce.validation.backorderLeadTimeRequired'
|
|
74
|
+
|
|
75
|
+
function parseLeadTimeDays(value: number | string | null | undefined): number | null {
|
|
76
|
+
if (value === null || value === undefined) return null
|
|
77
|
+
if (typeof value === 'number') return Number.isInteger(value) && value >= 0 ? value : null
|
|
78
|
+
const trimmed = value.trim()
|
|
79
|
+
if (!/^\d+$/.test(trimmed)) return null
|
|
80
|
+
return Number.parseInt(trimmed, 10)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const availabilityDefaultsFormSchema = z
|
|
84
|
+
.object({
|
|
85
|
+
hideWhenOutOfStock: z.boolean(),
|
|
86
|
+
allowBackorder: z.boolean(),
|
|
87
|
+
backorderLeadTimeDays: z.union([z.number(), z.string(), z.null()]).optional(),
|
|
88
|
+
})
|
|
89
|
+
.superRefine((value, ctx) => {
|
|
90
|
+
if (!value.allowBackorder) return
|
|
91
|
+
if (parseLeadTimeDays(value.backorderLeadTimeDays) !== null) return
|
|
92
|
+
ctx.addIssue({
|
|
93
|
+
code: 'custom',
|
|
94
|
+
path: ['backorderLeadTimeDays'],
|
|
95
|
+
message: AVAILABILITY_LEAD_TIME_REQUIRED_MESSAGE,
|
|
96
|
+
})
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
export function buildAvailabilityInitialValues(policy: StoreDefaultPolicy | null): AvailabilityDefaultsFormValues {
|
|
100
|
+
return {
|
|
101
|
+
hideWhenOutOfStock: policy?.hideWhenOutOfStock ?? false,
|
|
102
|
+
allowBackorder: policy?.allowBackorder ?? false,
|
|
103
|
+
backorderLeadTimeDays: policy?.backorderLeadTimeDays ?? null,
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
type AvailabilityPolicyFields = {
|
|
108
|
+
hideWhenOutOfStock: boolean
|
|
109
|
+
allowBackorder: boolean
|
|
110
|
+
backorderLeadTimeDays?: number
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function buildAvailabilityFields(values: AvailabilityDefaultsFormValues): AvailabilityPolicyFields {
|
|
114
|
+
const fields: AvailabilityPolicyFields = {
|
|
115
|
+
hideWhenOutOfStock: values.hideWhenOutOfStock,
|
|
116
|
+
allowBackorder: values.allowBackorder,
|
|
117
|
+
}
|
|
118
|
+
if (values.allowBackorder) {
|
|
119
|
+
const leadTime = parseLeadTimeDays(values.backorderLeadTimeDays)
|
|
120
|
+
if (leadTime !== null) fields.backorderLeadTimeDays = leadTime
|
|
121
|
+
}
|
|
122
|
+
return fields
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export type AvailabilityCreatePayload = AvailabilityPolicyFields & {
|
|
126
|
+
organizationId: string
|
|
127
|
+
tenantId: string
|
|
128
|
+
storeId: string
|
|
129
|
+
productId: null
|
|
130
|
+
variantId: null
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function buildAvailabilityCreatePayload(
|
|
134
|
+
store: Pick<StoreAdminRecord, 'id' | 'organizationId' | 'tenantId'>,
|
|
135
|
+
values: AvailabilityDefaultsFormValues,
|
|
136
|
+
): AvailabilityCreatePayload | null {
|
|
137
|
+
if (!store.organizationId || !store.tenantId) return null
|
|
138
|
+
return {
|
|
139
|
+
organizationId: store.organizationId,
|
|
140
|
+
tenantId: store.tenantId,
|
|
141
|
+
storeId: store.id,
|
|
142
|
+
productId: null,
|
|
143
|
+
variantId: null,
|
|
144
|
+
...buildAvailabilityFields(values),
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export type AvailabilityUpdatePayload = AvailabilityPolicyFields & { id: string }
|
|
149
|
+
|
|
150
|
+
export function buildAvailabilityUpdatePayload(
|
|
151
|
+
policyId: string,
|
|
152
|
+
values: AvailabilityDefaultsFormValues,
|
|
153
|
+
): AvailabilityUpdatePayload {
|
|
154
|
+
return { id: policyId, ...buildAvailabilityFields(values) }
|
|
155
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import {
|
|
3
|
+
ECOMMERCE_SEO_GOOGLE_VERIFICATION_MAX,
|
|
4
|
+
ECOMMERCE_SEO_META_DESCRIPTION_MAX,
|
|
5
|
+
ECOMMERCE_SEO_ROBOTS_TXT_MAX,
|
|
6
|
+
ECOMMERCE_SEO_SITE_NAME_MAX,
|
|
7
|
+
ecommerceStoreSeoSchema,
|
|
8
|
+
} from '../data/validators'
|
|
9
|
+
import type { StoreAdminRecord } from './storeAdmin'
|
|
10
|
+
|
|
11
|
+
export const STORE_SEO_FIELD_KEYS = ['siteName', 'defaultMetaDescription', 'googleSiteVerification', 'robotsTxt'] as const
|
|
12
|
+
|
|
13
|
+
export type StoreSeoFieldKey = (typeof STORE_SEO_FIELD_KEYS)[number]
|
|
14
|
+
|
|
15
|
+
export type StoreSeoFormValues = Record<StoreSeoFieldKey, string>
|
|
16
|
+
|
|
17
|
+
export const STORE_SEO_FIELD_LIMITS: Record<StoreSeoFieldKey, number> = {
|
|
18
|
+
siteName: ECOMMERCE_SEO_SITE_NAME_MAX,
|
|
19
|
+
defaultMetaDescription: ECOMMERCE_SEO_META_DESCRIPTION_MAX,
|
|
20
|
+
googleSiteVerification: ECOMMERCE_SEO_GOOGLE_VERIFICATION_MAX,
|
|
21
|
+
robotsTxt: ECOMMERCE_SEO_ROBOTS_TXT_MAX,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const SEO_FIELD_ERROR_PREFIX = 'settings.seo.'
|
|
25
|
+
|
|
26
|
+
type StoreSeoPayloadInput = Partial<Record<StoreSeoFieldKey, string>>
|
|
27
|
+
|
|
28
|
+
function buildStoreSeoInput(values: Partial<Record<StoreSeoFieldKey, unknown>>): StoreSeoPayloadInput {
|
|
29
|
+
const input: StoreSeoPayloadInput = {}
|
|
30
|
+
for (const key of STORE_SEO_FIELD_KEYS) {
|
|
31
|
+
const value = values[key]
|
|
32
|
+
if (typeof value !== 'string') continue
|
|
33
|
+
if (value.trim().length === 0) continue
|
|
34
|
+
input[key] = value
|
|
35
|
+
}
|
|
36
|
+
return input
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const seoFormShape = {
|
|
40
|
+
siteName: z.string(),
|
|
41
|
+
defaultMetaDescription: z.string(),
|
|
42
|
+
googleSiteVerification: z.string(),
|
|
43
|
+
robotsTxt: z.string(),
|
|
44
|
+
} satisfies Record<StoreSeoFieldKey, z.ZodString>
|
|
45
|
+
|
|
46
|
+
export const storeSeoFormSchema = z.object(seoFormShape).superRefine((values, context) => {
|
|
47
|
+
const result = ecommerceStoreSeoSchema.safeParse(buildStoreSeoInput(values))
|
|
48
|
+
if (result.success) return
|
|
49
|
+
for (const issue of result.error.issues) {
|
|
50
|
+
context.addIssue({ code: 'custom', path: issue.path, message: issue.message })
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
export function buildStoreSeoInitialValues(store: Pick<StoreAdminRecord, 'settings'>): StoreSeoFormValues {
|
|
55
|
+
const parsed = ecommerceStoreSeoSchema.safeParse(store.settings?.seo ?? {})
|
|
56
|
+
const stored = parsed.success ? parsed.data : {}
|
|
57
|
+
return {
|
|
58
|
+
siteName: stored.siteName ?? '',
|
|
59
|
+
defaultMetaDescription: stored.defaultMetaDescription ?? '',
|
|
60
|
+
googleSiteVerification: stored.googleSiteVerification ?? '',
|
|
61
|
+
robotsTxt: stored.robotsTxt ?? '',
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export type StoreSeoUpdatePayload = { id: string; settings: { seo: StoreSeoPayloadInput } }
|
|
66
|
+
|
|
67
|
+
export function buildStoreSeoPayload(storeId: string, values: Partial<Record<StoreSeoFieldKey, unknown>>): StoreSeoUpdatePayload {
|
|
68
|
+
return { id: storeId, settings: { seo: buildStoreSeoInput(values) } }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function remapStoreSeoFieldErrors(fieldErrors: Record<string, string> | undefined): Record<string, string> | undefined {
|
|
72
|
+
if (!fieldErrors) return undefined
|
|
73
|
+
const mapped: Record<string, string> = {}
|
|
74
|
+
for (const [key, message] of Object.entries(fieldErrors)) {
|
|
75
|
+
mapped[key.startsWith(SEO_FIELD_ERROR_PREFIX) ? key.slice(SEO_FIELD_ERROR_PREFIX.length) : key] = message
|
|
76
|
+
}
|
|
77
|
+
return mapped
|
|
78
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
5
|
+
import {
|
|
6
|
+
ASSORTMENT_COUNT_DEBOUNCE_MS,
|
|
7
|
+
buildAssortmentCountUrl,
|
|
8
|
+
type AssortmentCountDraft,
|
|
9
|
+
type AssortmentCountResult,
|
|
10
|
+
} from './storeChannels'
|
|
11
|
+
|
|
12
|
+
export type AssortmentCountState =
|
|
13
|
+
| { status: 'idle' }
|
|
14
|
+
| { status: 'loading' }
|
|
15
|
+
| { status: 'error' }
|
|
16
|
+
| { status: 'ready'; result: AssortmentCountResult; refreshing: boolean }
|
|
17
|
+
|
|
18
|
+
function isCountResult(value: unknown): value is AssortmentCountResult {
|
|
19
|
+
if (!value || typeof value !== 'object') return false
|
|
20
|
+
const record = value as Record<string, unknown>
|
|
21
|
+
return typeof record.count === 'number' && typeof record.countWithoutAuthentication === 'number'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Live product count for one channel binding. With a draft it asks for the unsaved scope and
|
|
26
|
+
* require-authentication switch, debounced so typing in a picker sends one request per pause;
|
|
27
|
+
* without a binding id (an unsaved binding) it stays idle. A changed `refreshKey` (the binding's
|
|
28
|
+
* `updatedAt`) refetches the same URL, so a saved edit is reflected without a remount.
|
|
29
|
+
*/
|
|
30
|
+
export function useChannelAssortmentCount(
|
|
31
|
+
bindingId: string | null,
|
|
32
|
+
draft: AssortmentCountDraft | null,
|
|
33
|
+
delayMs: number = ASSORTMENT_COUNT_DEBOUNCE_MS,
|
|
34
|
+
refreshKey: string | null = null,
|
|
35
|
+
): AssortmentCountState {
|
|
36
|
+
const url = bindingId ? buildAssortmentCountUrl(bindingId, draft) : null
|
|
37
|
+
const [state, setState] = React.useState<AssortmentCountState>(() => (url ? { status: 'loading' } : { status: 'idle' }))
|
|
38
|
+
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
if (!url) {
|
|
41
|
+
setState({ status: 'idle' })
|
|
42
|
+
return
|
|
43
|
+
}
|
|
44
|
+
let cancelled = false
|
|
45
|
+
setState((previous) => (previous.status === 'ready' ? { ...previous, refreshing: true } : { status: 'loading' }))
|
|
46
|
+
const timer = setTimeout(() => {
|
|
47
|
+
void apiCall<AssortmentCountResult>(url, { cache: 'no-store' })
|
|
48
|
+
.then((call) => {
|
|
49
|
+
if (cancelled) return
|
|
50
|
+
if (call.ok && isCountResult(call.result)) {
|
|
51
|
+
setState({ status: 'ready', result: call.result, refreshing: false })
|
|
52
|
+
} else {
|
|
53
|
+
setState({ status: 'error' })
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
.catch(() => {
|
|
57
|
+
if (!cancelled) setState({ status: 'error' })
|
|
58
|
+
})
|
|
59
|
+
}, delayMs)
|
|
60
|
+
return () => {
|
|
61
|
+
cancelled = true
|
|
62
|
+
clearTimeout(timer)
|
|
63
|
+
}
|
|
64
|
+
}, [delayMs, url, refreshKey])
|
|
65
|
+
|
|
66
|
+
return state
|
|
67
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useBackendChrome } from '@open-mercato/ui/backend/BackendChromeProvider'
|
|
4
|
+
import { hasFeature } from '@open-mercato/shared/security/features'
|
|
5
|
+
import {
|
|
6
|
+
AVAILABILITY_MANAGE_FEATURE,
|
|
7
|
+
AVAILABILITY_VIEW_FEATURE,
|
|
8
|
+
BRANDING_MANAGE_FEATURE,
|
|
9
|
+
CHANNELS_MANAGE_FEATURE,
|
|
10
|
+
DOMAINS_MANAGE_FEATURE,
|
|
11
|
+
STORE_MANAGE_FEATURE,
|
|
12
|
+
} from './storeAdmin'
|
|
13
|
+
|
|
14
|
+
export type StoreAccess = {
|
|
15
|
+
isResolved: boolean
|
|
16
|
+
canManage: boolean
|
|
17
|
+
canManageBranding: boolean
|
|
18
|
+
canManageDomains: boolean
|
|
19
|
+
canManageChannels: boolean
|
|
20
|
+
canViewAvailability: boolean
|
|
21
|
+
canManageAvailability: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function useStoreAccess(): StoreAccess {
|
|
25
|
+
const { payload } = useBackendChrome()
|
|
26
|
+
const granted = payload?.grantedFeatures
|
|
27
|
+
return {
|
|
28
|
+
isResolved: Array.isArray(granted),
|
|
29
|
+
canManage: hasFeature(granted, STORE_MANAGE_FEATURE),
|
|
30
|
+
canManageBranding: hasFeature(granted, BRANDING_MANAGE_FEATURE),
|
|
31
|
+
canManageDomains: hasFeature(granted, DOMAINS_MANAGE_FEATURE),
|
|
32
|
+
canManageChannels: hasFeature(granted, CHANNELS_MANAGE_FEATURE),
|
|
33
|
+
canViewAvailability: hasFeature(granted, AVAILABILITY_VIEW_FEATURE),
|
|
34
|
+
canManageAvailability: hasFeature(granted, AVAILABILITY_MANAGE_FEATURE),
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'
|
|
2
|
+
import type { EnricherContext, ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'
|
|
3
|
+
import { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'
|
|
4
|
+
import { SalesChannel } from '@open-mercato/core/modules/sales/data/entities'
|
|
5
|
+
import { E } from '#generated/entities.ids.generated'
|
|
6
|
+
import { loadOrganizationDomainMappings, type DomainMappingSummary } from '../lib/domainMappingSummaries'
|
|
7
|
+
import { EcommerceStoreChannelBinding, EcommerceStoreDomainBinding } from './entities'
|
|
8
|
+
|
|
9
|
+
type StoreRecord = Record<string, unknown> & { id: string }
|
|
10
|
+
|
|
11
|
+
export type StoreListPrimaryDomain = {
|
|
12
|
+
hostname: string
|
|
13
|
+
pathPrefix: string | null
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type StoreListDefaultChannel = {
|
|
17
|
+
id: string
|
|
18
|
+
name: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type StoreListBindingSummary = {
|
|
22
|
+
primaryDomain: StoreListPrimaryDomain | null
|
|
23
|
+
defaultChannel: StoreListDefaultChannel | null
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
type StoreListEnrichment = {
|
|
27
|
+
_ecommerce: StoreListBindingSummary
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const EMPTY_SUMMARY: StoreListBindingSummary = { primaryDomain: null, defaultChannel: null }
|
|
31
|
+
|
|
32
|
+
function hasRecordId(record: Record<string, unknown>): record is StoreRecord {
|
|
33
|
+
return typeof record.id === 'string' && record.id.length > 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function loadPrimaryDomains(
|
|
37
|
+
em: EntityManager,
|
|
38
|
+
storeIds: string[],
|
|
39
|
+
context: EnricherContext,
|
|
40
|
+
): Promise<Map<string, StoreListPrimaryDomain>> {
|
|
41
|
+
const result = new Map<string, StoreListPrimaryDomain>()
|
|
42
|
+
const bindings = await findWithDecryption(
|
|
43
|
+
em,
|
|
44
|
+
EcommerceStoreDomainBinding,
|
|
45
|
+
{
|
|
46
|
+
storeId: { $in: storeIds },
|
|
47
|
+
tenantId: context.tenantId,
|
|
48
|
+
organizationId: context.organizationId,
|
|
49
|
+
isPrimary: true,
|
|
50
|
+
deletedAt: null,
|
|
51
|
+
} as FilterQuery<EcommerceStoreDomainBinding>,
|
|
52
|
+
undefined,
|
|
53
|
+
{ tenantId: context.tenantId, organizationId: context.organizationId },
|
|
54
|
+
)
|
|
55
|
+
if (!bindings.length) return result
|
|
56
|
+
const mappings = await loadOrganizationDomainMappings(context.container, {
|
|
57
|
+
organizationId: context.organizationId,
|
|
58
|
+
tenantId: context.tenantId,
|
|
59
|
+
})
|
|
60
|
+
if (!mappings) return result
|
|
61
|
+
const hostnameById = new Map<string, string>()
|
|
62
|
+
for (const mapping of mappings) hostnameById.set(mapping.id, mapping.hostname)
|
|
63
|
+
for (const binding of bindings) {
|
|
64
|
+
const hostname = hostnameById.get(binding.domainMappingId)
|
|
65
|
+
if (hostname) result.set(binding.storeId, { hostname, pathPrefix: binding.pathPrefix ?? null })
|
|
66
|
+
}
|
|
67
|
+
return result
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function loadDefaultChannels(
|
|
71
|
+
em: EntityManager,
|
|
72
|
+
storeIds: string[],
|
|
73
|
+
context: EnricherContext,
|
|
74
|
+
): Promise<Map<string, StoreListDefaultChannel>> {
|
|
75
|
+
const result = new Map<string, StoreListDefaultChannel>()
|
|
76
|
+
const bindings = await findWithDecryption(
|
|
77
|
+
em,
|
|
78
|
+
EcommerceStoreChannelBinding,
|
|
79
|
+
{
|
|
80
|
+
storeId: { $in: storeIds },
|
|
81
|
+
tenantId: context.tenantId,
|
|
82
|
+
organizationId: context.organizationId,
|
|
83
|
+
isDefault: true,
|
|
84
|
+
deletedAt: null,
|
|
85
|
+
} as FilterQuery<EcommerceStoreChannelBinding>,
|
|
86
|
+
undefined,
|
|
87
|
+
{ tenantId: context.tenantId, organizationId: context.organizationId },
|
|
88
|
+
)
|
|
89
|
+
if (!bindings.length) return result
|
|
90
|
+
const channelIds = Array.from(new Set(bindings.map((binding) => binding.salesChannelId)))
|
|
91
|
+
const channels = await findWithDecryption(
|
|
92
|
+
em,
|
|
93
|
+
SalesChannel,
|
|
94
|
+
{
|
|
95
|
+
id: { $in: channelIds },
|
|
96
|
+
tenantId: context.tenantId,
|
|
97
|
+
organizationId: context.organizationId,
|
|
98
|
+
deletedAt: null,
|
|
99
|
+
} as FilterQuery<SalesChannel>,
|
|
100
|
+
undefined,
|
|
101
|
+
{ tenantId: context.tenantId, organizationId: context.organizationId },
|
|
102
|
+
)
|
|
103
|
+
const nameById = new Map<string, string>()
|
|
104
|
+
for (const channel of channels) nameById.set(channel.id, channel.name)
|
|
105
|
+
for (const binding of bindings) {
|
|
106
|
+
const name = nameById.get(binding.salesChannelId)
|
|
107
|
+
if (name !== undefined) result.set(binding.storeId, { id: binding.salesChannelId, name })
|
|
108
|
+
}
|
|
109
|
+
return result
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function enrichStoreList(
|
|
113
|
+
records: StoreRecord[],
|
|
114
|
+
context: EnricherContext,
|
|
115
|
+
): Promise<Array<StoreRecord & StoreListEnrichment>> {
|
|
116
|
+
const storeIds = Array.from(new Set(records.filter(hasRecordId).map((record) => record.id)))
|
|
117
|
+
if (!storeIds.length) return records.map((record) => ({ ...record, _ecommerce: EMPTY_SUMMARY }))
|
|
118
|
+
const em = context.em as EntityManager
|
|
119
|
+
const [domains, channels] = await Promise.all([
|
|
120
|
+
loadPrimaryDomains(em, storeIds, context),
|
|
121
|
+
loadDefaultChannels(em, storeIds, context),
|
|
122
|
+
])
|
|
123
|
+
return records.map((record) => ({
|
|
124
|
+
...record,
|
|
125
|
+
_ecommerce: {
|
|
126
|
+
primaryDomain: domains.get(record.id) ?? null,
|
|
127
|
+
defaultChannel: channels.get(record.id) ?? null,
|
|
128
|
+
},
|
|
129
|
+
}))
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export const storeBindingSummaryEnricher: ResponseEnricher<StoreRecord, StoreListEnrichment> = {
|
|
133
|
+
id: 'ecommerce.store-binding-summary',
|
|
134
|
+
targetEntity: E.ecommerce.ecommerce_store,
|
|
135
|
+
features: ['ecommerce.stores.view'],
|
|
136
|
+
priority: 10,
|
|
137
|
+
timeout: 2000,
|
|
138
|
+
critical: false,
|
|
139
|
+
cacheableOnListHit: false,
|
|
140
|
+
fallback: { _ecommerce: EMPTY_SUMMARY },
|
|
141
|
+
|
|
142
|
+
async enrichOne(record, context) {
|
|
143
|
+
const enriched = await this.enrichMany!([record], context)
|
|
144
|
+
return enriched[0]
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
async enrichMany(records, context) {
|
|
148
|
+
return enrichStoreList(records, context)
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export type DomainBindingMappingState =
|
|
153
|
+
| ({ state: 'found' } & Omit<DomainMappingSummary, 'id'>)
|
|
154
|
+
| { state: 'removed' }
|
|
155
|
+
| { state: 'unavailable' }
|
|
156
|
+
|
|
157
|
+
type DomainBindingRecord = Record<string, unknown> & { id: string; domainMappingId?: unknown }
|
|
158
|
+
|
|
159
|
+
type DomainBindingMappingEnrichment = {
|
|
160
|
+
_domainMapping: DomainBindingMappingState
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const UNAVAILABLE_DOMAIN_MAPPING: DomainBindingMappingState = { state: 'unavailable' }
|
|
164
|
+
|
|
165
|
+
async function enrichDomainBindings(
|
|
166
|
+
records: DomainBindingRecord[],
|
|
167
|
+
context: EnricherContext,
|
|
168
|
+
): Promise<Array<DomainBindingRecord & DomainBindingMappingEnrichment>> {
|
|
169
|
+
const mappings = await loadOrganizationDomainMappings(context.container, {
|
|
170
|
+
organizationId: context.organizationId,
|
|
171
|
+
tenantId: context.tenantId,
|
|
172
|
+
})
|
|
173
|
+
const mappingById = new Map<string, DomainMappingSummary>()
|
|
174
|
+
for (const mapping of mappings ?? []) mappingById.set(mapping.id, mapping)
|
|
175
|
+
return records.map((record) => {
|
|
176
|
+
if (!mappings) return { ...record, _domainMapping: UNAVAILABLE_DOMAIN_MAPPING }
|
|
177
|
+
const mapping = typeof record.domainMappingId === 'string' ? mappingById.get(record.domainMappingId) : undefined
|
|
178
|
+
if (!mapping) return { ...record, _domainMapping: { state: 'removed' } }
|
|
179
|
+
return {
|
|
180
|
+
...record,
|
|
181
|
+
_domainMapping: {
|
|
182
|
+
state: 'found',
|
|
183
|
+
hostname: mapping.hostname,
|
|
184
|
+
status: mapping.status,
|
|
185
|
+
lastDnsCheckAt: mapping.lastDnsCheckAt,
|
|
186
|
+
dnsFailureReason: mapping.dnsFailureReason,
|
|
187
|
+
tlsFailureReason: mapping.tlsFailureReason,
|
|
188
|
+
},
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export const storeDomainBindingMappingEnricher: ResponseEnricher<DomainBindingRecord, DomainBindingMappingEnrichment> = {
|
|
194
|
+
id: 'ecommerce.store-domain-binding-mapping',
|
|
195
|
+
targetEntity: E.ecommerce.ecommerce_store_domain_binding,
|
|
196
|
+
features: ['ecommerce.stores.view'],
|
|
197
|
+
priority: 10,
|
|
198
|
+
timeout: 2000,
|
|
199
|
+
critical: false,
|
|
200
|
+
cacheableOnListHit: false,
|
|
201
|
+
fallback: { _domainMapping: UNAVAILABLE_DOMAIN_MAPPING },
|
|
202
|
+
|
|
203
|
+
async enrichOne(record, context) {
|
|
204
|
+
const enriched = await this.enrichMany!([record], context)
|
|
205
|
+
return enriched[0]
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
async enrichMany(records, context) {
|
|
209
|
+
return enrichDomainBindings(records, context)
|
|
210
|
+
},
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export const enrichers: ResponseEnricher[] = [storeBindingSummaryEnricher, storeDomainBindingMappingEnricher]
|