@endora-commerce/mod-catalog 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 +63 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts +12 -0
- package/dist/admin/components/PackagingUnitsEditor.d.ts.map +1 -0
- package/dist/admin/components/PackagingUnitsEditor.js +99 -0
- package/dist/admin/components/PackagingUnitsEditor.js.map +1 -0
- package/dist/admin/components/ProductAttributesTab.d.ts +13 -0
- package/dist/admin/components/ProductAttributesTab.d.ts.map +1 -0
- package/dist/admin/components/ProductAttributesTab.js +140 -0
- package/dist/admin/components/ProductAttributesTab.js.map +1 -0
- package/dist/admin/components/ProductInventoryTab.d.ts +14 -0
- package/dist/admin/components/ProductInventoryTab.d.ts.map +1 -0
- package/dist/admin/components/ProductInventoryTab.js +284 -0
- package/dist/admin/components/ProductInventoryTab.js.map +1 -0
- package/dist/admin/components/ProductScopeEditor.d.ts +94 -0
- package/dist/admin/components/ProductScopeEditor.d.ts.map +1 -0
- package/dist/admin/components/ProductScopeEditor.js +395 -0
- package/dist/admin/components/ProductScopeEditor.js.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts +11 -0
- package/dist/admin/components/ProductsBulkEditDialog.d.ts.map +1 -0
- package/dist/admin/components/ProductsBulkEditDialog.js +304 -0
- package/dist/admin/components/ProductsBulkEditDialog.js.map +1 -0
- package/dist/admin/index.d.ts +45 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +184 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/admin/lib/resolve-product-selection.d.ts +21 -0
- package/dist/admin/lib/resolve-product-selection.d.ts.map +1 -0
- package/dist/admin/lib/resolve-product-selection.js +25 -0
- package/dist/admin/lib/resolve-product-selection.js.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts +18 -0
- package/dist/admin/pages/AttachmentTypesPage.d.ts.map +1 -0
- package/dist/admin/pages/AttachmentTypesPage.js +92 -0
- package/dist/admin/pages/AttachmentTypesPage.js.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts +21 -0
- package/dist/admin/pages/AttributeSetsPage.d.ts.map +1 -0
- package/dist/admin/pages/AttributeSetsPage.js +158 -0
- package/dist/admin/pages/AttributeSetsPage.js.map +1 -0
- package/dist/admin/pages/AttributesManager.d.ts +9 -0
- package/dist/admin/pages/AttributesManager.d.ts.map +1 -0
- package/dist/admin/pages/AttributesManager.js +305 -0
- package/dist/admin/pages/AttributesManager.js.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationDetailPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationDetailPage.js +187 -0
- package/dist/admin/pages/BulkOperationDetailPage.js.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts +9 -0
- package/dist/admin/pages/BulkOperationsPage.d.ts.map +1 -0
- package/dist/admin/pages/BulkOperationsPage.js +98 -0
- package/dist/admin/pages/BulkOperationsPage.js.map +1 -0
- package/dist/admin/pages/CategoriesTree.d.ts +9 -0
- package/dist/admin/pages/CategoriesTree.d.ts.map +1 -0
- package/dist/admin/pages/CategoriesTree.js +176 -0
- package/dist/admin/pages/CategoriesTree.js.map +1 -0
- package/dist/admin/pages/ProductEditor.d.ts +13 -0
- package/dist/admin/pages/ProductEditor.d.ts.map +1 -0
- package/dist/admin/pages/ProductEditor.js +1050 -0
- package/dist/admin/pages/ProductEditor.js.map +1 -0
- package/dist/admin/pages/ProductsList.d.ts +9 -0
- package/dist/admin/pages/ProductsList.d.ts.map +1 -0
- package/dist/admin/pages/ProductsList.js +399 -0
- package/dist/admin/pages/ProductsList.js.map +1 -0
- package/dist/backend/commands/attribute-commands.d.ts +111 -0
- package/dist/backend/commands/attribute-commands.d.ts.map +1 -0
- package/dist/backend/commands/attribute-commands.js +482 -0
- package/dist/backend/commands/attribute-commands.js.map +1 -0
- package/dist/backend/demo/reset.d.ts +23 -0
- package/dist/backend/demo/reset.d.ts.map +1 -0
- package/dist/backend/demo/reset.js +41 -0
- package/dist/backend/demo/reset.js.map +1 -0
- package/dist/backend/demo/rows.d.ts +103 -0
- package/dist/backend/demo/rows.d.ts.map +1 -0
- package/dist/backend/demo/rows.js +162 -0
- package/dist/backend/demo/rows.js.map +1 -0
- package/dist/backend/demo/seed.d.ts +35 -0
- package/dist/backend/demo/seed.d.ts.map +1 -0
- package/dist/backend/demo/seed.js +177 -0
- package/dist/backend/demo/seed.js.map +1 -0
- package/dist/backend/entities/attachment-type.entity.d.ts +16 -0
- package/dist/backend/entities/attachment-type.entity.d.ts.map +1 -0
- package/dist/backend/entities/attachment-type.entity.js +57 -0
- package/dist/backend/entities/attachment-type.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts +26 -0
- package/dist/backend/entities/attribute-set-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js +55 -0
- package/dist/backend/entities/attribute-set-attribute.entity.js.map +1 -0
- package/dist/backend/entities/attribute-set.entity.d.ts +22 -0
- package/dist/backend/entities/attribute-set.entity.d.ts.map +1 -0
- package/dist/backend/entities/attribute-set.entity.js +67 -0
- package/dist/backend/entities/attribute-set.entity.js.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts +78 -0
- package/dist/backend/entities/bulk-operation.entity.d.ts.map +1 -0
- package/dist/backend/entities/bulk-operation.entity.js +138 -0
- package/dist/backend/entities/bulk-operation.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts +23 -0
- package/dist/backend/entities/bundle-slot-option.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot-option.entity.js +68 -0
- package/dist/backend/entities/bundle-slot-option.entity.js.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts +25 -0
- package/dist/backend/entities/bundle-slot.entity.d.ts.map +1 -0
- package/dist/backend/entities/bundle-slot.entity.js +74 -0
- package/dist/backend/entities/bundle-slot.entity.js.map +1 -0
- package/dist/backend/entities/category.entity.d.ts +26 -0
- package/dist/backend/entities/category.entity.d.ts.map +1 -0
- package/dist/backend/entities/category.entity.js +119 -0
- package/dist/backend/entities/category.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts +22 -0
- package/dist/backend/entities/gallery-item-label.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item-label.entity.js +50 -0
- package/dist/backend/entities/gallery-item-label.entity.js.map +1 -0
- package/dist/backend/entities/gallery-item.entity.d.ts +17 -0
- package/dist/backend/entities/gallery-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/gallery-item.entity.js +58 -0
- package/dist/backend/entities/gallery-item.entity.js.map +1 -0
- package/dist/backend/entities/grouped-item.entity.d.ts +23 -0
- package/dist/backend/entities/grouped-item.entity.d.ts.map +1 -0
- package/dist/backend/entities/grouped-item.entity.js +68 -0
- package/dist/backend/entities/grouped-item.entity.js.map +1 -0
- package/dist/backend/entities/product-attachment.entity.d.ts +23 -0
- package/dist/backend/entities/product-attachment.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attachment.entity.js +77 -0
- package/dist/backend/entities/product-attachment.entity.js.map +1 -0
- package/dist/backend/entities/product-attribute.entity.d.ts +72 -0
- package/dist/backend/entities/product-attribute.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-attribute.entity.js +161 -0
- package/dist/backend/entities/product-attribute.entity.js.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts +28 -0
- package/dist/backend/entities/product-editor-preference.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-editor-preference.entity.js +63 -0
- package/dist/backend/entities/product-editor-preference.entity.js.map +1 -0
- package/dist/backend/entities/product-link.entity.d.ts +25 -0
- package/dist/backend/entities/product-link.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-link.entity.js +70 -0
- package/dist/backend/entities/product-link.entity.js.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts +26 -0
- package/dist/backend/entities/product-packaging-unit.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-packaging-unit.entity.js +76 -0
- package/dist/backend/entities/product-packaging-unit.entity.js.map +1 -0
- package/dist/backend/entities/product-value-override.entity.d.ts +43 -0
- package/dist/backend/entities/product-value-override.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-value-override.entity.js +90 -0
- package/dist/backend/entities/product-value-override.entity.js.map +1 -0
- package/dist/backend/entities/product-variant.entity.d.ts +18 -0
- package/dist/backend/entities/product-variant.entity.d.ts.map +1 -0
- package/dist/backend/entities/product-variant.entity.js +68 -0
- package/dist/backend/entities/product-variant.entity.js.map +1 -0
- package/dist/backend/entities/product.entity.d.ts +108 -0
- package/dist/backend/entities/product.entity.d.ts.map +1 -0
- package/dist/backend/entities/product.entity.js +230 -0
- package/dist/backend/entities/product.entity.js.map +1 -0
- package/dist/backend/index.d.ts +262 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +642 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/plugin.d.ts +216 -0
- package/dist/backend/plugin.d.ts.map +1 -0
- package/dist/backend/plugin.js +223 -0
- package/dist/backend/plugin.js.map +1 -0
- package/dist/backend/prompt-tools.d.ts +47 -0
- package/dist/backend/prompt-tools.d.ts.map +1 -0
- package/dist/backend/prompt-tools.js +284 -0
- package/dist/backend/prompt-tools.js.map +1 -0
- package/dist/backend/routes.admin.d.ts +105 -0
- package/dist/backend/routes.admin.d.ts.map +1 -0
- package/dist/backend/routes.admin.js +1162 -0
- package/dist/backend/routes.admin.js.map +1 -0
- package/dist/backend/routes.api-key.d.ts +33 -0
- package/dist/backend/routes.api-key.d.ts.map +1 -0
- package/dist/backend/routes.api-key.js +43 -0
- package/dist/backend/routes.api-key.js.map +1 -0
- package/dist/backend/routes.external.d.ts +32 -0
- package/dist/backend/routes.external.d.ts.map +1 -0
- package/dist/backend/routes.external.js +115 -0
- package/dist/backend/routes.external.js.map +1 -0
- package/dist/backend/routes.public.d.ts +46 -0
- package/dist/backend/routes.public.d.ts.map +1 -0
- package/dist/backend/routes.public.js +318 -0
- package/dist/backend/routes.public.js.map +1 -0
- package/dist/backend/services/asset-references.d.ts +4 -0
- package/dist/backend/services/asset-references.d.ts.map +1 -0
- package/dist/backend/services/asset-references.js +104 -0
- package/dist/backend/services/asset-references.js.map +1 -0
- package/dist/backend/services/attachment.service.d.ts +45 -0
- package/dist/backend/services/attachment.service.d.ts.map +1 -0
- package/dist/backend/services/attachment.service.js +268 -0
- package/dist/backend/services/attachment.service.js.map +1 -0
- package/dist/backend/services/attribute-option-validator.d.ts +47 -0
- package/dist/backend/services/attribute-option-validator.d.ts.map +1 -0
- package/dist/backend/services/attribute-option-validator.js +69 -0
- package/dist/backend/services/attribute-option-validator.js.map +1 -0
- package/dist/backend/services/attribute-set-validations.d.ts +65 -0
- package/dist/backend/services/attribute-set-validations.d.ts.map +1 -0
- package/dist/backend/services/attribute-set-validations.js +89 -0
- package/dist/backend/services/attribute-set-validations.js.map +1 -0
- package/dist/backend/services/attribute-set.service.d.ts +50 -0
- package/dist/backend/services/attribute-set.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-set.service.js +401 -0
- package/dist/backend/services/attribute-set.service.js.map +1 -0
- package/dist/backend/services/attribute-type-mapping.d.ts +66 -0
- package/dist/backend/services/attribute-type-mapping.d.ts.map +1 -0
- package/dist/backend/services/attribute-type-mapping.js +121 -0
- package/dist/backend/services/attribute-type-mapping.js.map +1 -0
- package/dist/backend/services/attribute-value-key.service.d.ts +48 -0
- package/dist/backend/services/attribute-value-key.service.d.ts.map +1 -0
- package/dist/backend/services/attribute-value-key.service.js +118 -0
- package/dist/backend/services/attribute-value-key.service.js.map +1 -0
- package/dist/backend/services/audit-references.d.ts +13 -0
- package/dist/backend/services/audit-references.d.ts.map +1 -0
- package/dist/backend/services/audit-references.js +51 -0
- package/dist/backend/services/audit-references.js.map +1 -0
- package/dist/backend/services/bulk-operation-queue.d.ts +26 -0
- package/dist/backend/services/bulk-operation-queue.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation-queue.js +34 -0
- package/dist/backend/services/bulk-operation-queue.js.map +1 -0
- package/dist/backend/services/bulk-operation.service.d.ts +195 -0
- package/dist/backend/services/bulk-operation.service.d.ts.map +1 -0
- package/dist/backend/services/bulk-operation.service.js +510 -0
- package/dist/backend/services/bulk-operation.service.js.map +1 -0
- package/dist/backend/services/bundle.service.d.ts +87 -0
- package/dist/backend/services/bundle.service.d.ts.map +1 -0
- package/dist/backend/services/bundle.service.js +286 -0
- package/dist/backend/services/bundle.service.js.map +1 -0
- package/dist/backend/services/catalog-admin.service.d.ts +398 -0
- package/dist/backend/services/catalog-admin.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-admin.service.js +1516 -0
- package/dist/backend/services/catalog-admin.service.js.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts +78 -0
- package/dist/backend/services/catalog-attribute-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-attribute-read.service.js +216 -0
- package/dist/backend/services/catalog-attribute-read.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts +30 -0
- package/dist/backend/services/catalog-bulk-import.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-import.service.js +136 -0
- package/dist/backend/services/catalog-bulk-import.service.js.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts +91 -0
- package/dist/backend/services/catalog-bulk-update.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-bulk-update.service.js +330 -0
- package/dist/backend/services/catalog-bulk-update.service.js.map +1 -0
- package/dist/backend/services/catalog-category-read.service.d.ts +66 -0
- package/dist/backend/services/catalog-category-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-category-read.service.js +248 -0
- package/dist/backend/services/catalog-category-read.service.js.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts +90 -0
- package/dist/backend/services/catalog-org-price-decorator.d.ts.map +1 -0
- package/dist/backend/services/catalog-org-price-decorator.js +184 -0
- package/dist/backend/services/catalog-org-price-decorator.js.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts +82 -0
- package/dist/backend/services/catalog-product-filter.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-filter.service.js +275 -0
- package/dist/backend/services/catalog-product-filter.service.js.map +1 -0
- package/dist/backend/services/catalog-product-read.service.d.ts +46 -0
- package/dist/backend/services/catalog-product-read.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-product-read.service.js +197 -0
- package/dist/backend/services/catalog-product-read.service.js.map +1 -0
- package/dist/backend/services/catalog-query.service.d.ts +444 -0
- package/dist/backend/services/catalog-query.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-query.service.js +1633 -0
- package/dist/backend/services/catalog-query.service.js.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts +78 -0
- package/dist/backend/services/catalog-quick-search.service.d.ts.map +1 -0
- package/dist/backend/services/catalog-quick-search.service.js +159 -0
- package/dist/backend/services/catalog-quick-search.service.js.map +1 -0
- package/dist/backend/services/catalog-write-ports.d.ts +25 -0
- package/dist/backend/services/catalog-write-ports.d.ts.map +1 -0
- package/dist/backend/services/catalog-write-ports.js +63 -0
- package/dist/backend/services/catalog-write-ports.js.map +1 -0
- package/dist/backend/services/category-admin.service.d.ts +102 -0
- package/dist/backend/services/category-admin.service.d.ts.map +1 -0
- package/dist/backend/services/category-admin.service.js +271 -0
- package/dist/backend/services/category-admin.service.js.map +1 -0
- package/dist/backend/services/gallery.service.d.ts +85 -0
- package/dist/backend/services/gallery.service.d.ts.map +1 -0
- package/dist/backend/services/gallery.service.js +326 -0
- package/dist/backend/services/gallery.service.js.map +1 -0
- package/dist/backend/services/grouped.service.d.ts +39 -0
- package/dist/backend/services/grouped.service.d.ts.map +1 -0
- package/dist/backend/services/grouped.service.js +136 -0
- package/dist/backend/services/grouped.service.js.map +1 -0
- package/dist/backend/services/label-resolver.d.ts +16 -0
- package/dist/backend/services/label-resolver.d.ts.map +1 -0
- package/dist/backend/services/label-resolver.js +43 -0
- package/dist/backend/services/label-resolver.js.map +1 -0
- package/dist/backend/services/packaging-unit.service.d.ts +28 -0
- package/dist/backend/services/packaging-unit.service.d.ts.map +1 -0
- package/dist/backend/services/packaging-unit.service.js +197 -0
- package/dist/backend/services/packaging-unit.service.js.map +1 -0
- package/dist/backend/services/primary-asset-url.d.ts +4 -0
- package/dist/backend/services/primary-asset-url.d.ts.map +1 -0
- package/dist/backend/services/primary-asset-url.js +55 -0
- package/dist/backend/services/primary-asset-url.js.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts +20 -0
- package/dist/backend/services/product-editor-preferences.service.d.ts.map +1 -0
- package/dist/backend/services/product-editor-preferences.service.js +44 -0
- package/dist/backend/services/product-editor-preferences.service.js.map +1 -0
- package/dist/backend/services/product-link.service.d.ts +169 -0
- package/dist/backend/services/product-link.service.d.ts.map +1 -0
- package/dist/backend/services/product-link.service.js +297 -0
- package/dist/backend/services/product-link.service.js.map +1 -0
- package/dist/backend/services/product-overrides.service.d.ts +77 -0
- package/dist/backend/services/product-overrides.service.d.ts.map +1 -0
- package/dist/backend/services/product-overrides.service.js +204 -0
- package/dist/backend/services/product-overrides.service.js.map +1 -0
- package/dist/backend/services/product-scope-context.service.d.ts +36 -0
- package/dist/backend/services/product-scope-context.service.d.ts.map +1 -0
- package/dist/backend/services/product-scope-context.service.js +106 -0
- package/dist/backend/services/product-scope-context.service.js.map +1 -0
- package/dist/backend/services/product-type-validations.d.ts +42 -0
- package/dist/backend/services/product-type-validations.d.ts.map +1 -0
- package/dist/backend/services/product-type-validations.js +55 -0
- package/dist/backend/services/product-type-validations.js.map +1 -0
- package/dist/backend/services/product-value-resolver.service.d.ts +59 -0
- package/dist/backend/services/product-value-resolver.service.d.ts.map +1 -0
- package/dist/backend/services/product-value-resolver.service.js +111 -0
- package/dist/backend/services/product-value-resolver.service.js.map +1 -0
- package/dist/backend/services/system-attribute-scopes.d.ts +18 -0
- package/dist/backend/services/system-attribute-scopes.d.ts.map +1 -0
- package/dist/backend/services/system-attribute-scopes.js +18 -0
- package/dist/backend/services/system-attribute-scopes.js.map +1 -0
- package/dist/backend/services/viewer-organization.d.ts +25 -0
- package/dist/backend/services/viewer-organization.d.ts.map +1 -0
- package/dist/backend/services/viewer-organization.js +31 -0
- package/dist/backend/services/viewer-organization.js.map +1 -0
- package/dist/manifest.d.ts +204 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +686 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts +33 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.d.ts.map +1 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js +118 -0
- package/dist/migrations/20260429T064146_catalog_attribute_sets_init.js.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts +24 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.d.ts.map +1 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js +31 -0
- package/dist/migrations/20260429T070004_catalog_product_attribute_extensions.js.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts +32 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.d.ts.map +1 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js +58 -0
- package/dist/migrations/20260429T102322_catalog_product_type_and_virtual_fields.js.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts +22 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.d.ts.map +1 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js +66 -0
- package/dist/migrations/20260429T111839_catalog_gallery_items_and_labels.js.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts +18 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.d.ts.map +1 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js +73 -0
- package/dist/migrations/20260429T112543_catalog_product_attachments.js.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts +21 -0
- package/dist/migrations/20260429T123726_catalog_product_links.d.ts.map +1 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js +48 -0
- package/dist/migrations/20260429T123726_catalog_product_links.js.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts +23 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.d.ts.map +1 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js +94 -0
- package/dist/migrations/20260429T130803_catalog_grouped_and_bundle.js.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts +24 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.d.ts.map +1 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js +31 -0
- package/dist/migrations/20260501T185835_catalog_product_attribute_is_comparable.js.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts +31 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.d.ts.map +1 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js +133 -0
- package/dist/migrations/20260505T060113_catalog_attribute_options_and_flags.js.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts +16 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.d.ts.map +1 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js +23 -0
- package/dist/migrations/20260515T082629_catalog_attribute_mass_editable.js.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts +10 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.d.ts.map +1 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js +22 -0
- package/dist/migrations/20260526T124736_catalog_product_status_inactive.js.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts +38 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.d.ts.map +1 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js +98 -0
- package/dist/migrations/20260611T140346_catalog_product_value_overrides_init.js.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts +13 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.d.ts.map +1 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js +17 -0
- package/dist/migrations/20260611T140400_catalog_attribute_quick_searchable.js.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts +16 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.d.ts.map +1 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js +42 -0
- package/dist/migrations/20260611T140407_catalog_bulk_operations.js.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts +14 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.d.ts.map +1 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js +18 -0
- package/dist/migrations/20260611T140408_catalog_bulk_operation_logs.js.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts +11 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.d.ts.map +1 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js +29 -0
- package/dist/migrations/20260611T140412_catalog_product_packaging_units.js.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts +23 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.d.ts.map +1 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js +35 -0
- package/dist/migrations/20260718T060659_catalog_bulk_operation_revert_state.js.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts +12 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.d.ts.map +1 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js +16 -0
- package/dist/migrations/20260718T200343_catalog_category_custom_field_values.js.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts +32 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.d.ts.map +1 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js +286 -0
- package/dist/migrations/20260723T230401_catalog_attributes_on_custom_fields.js.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts +36 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.d.ts.map +1 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js +63 -0
- package/dist/migrations/20260804T152604_catalog_widen_product_sku.js.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts +18 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.d.ts.map +1 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js +22 -0
- package/dist/migrations/20260804T160244_catalog_category_activation.js.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts +27 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.d.ts.map +1 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js +44 -0
- package/dist/migrations/20260912T094557_catalog_sales_channel_products.js.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts +27 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.d.ts.map +1 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js +44 -0
- package/dist/migrations/20260912T094623_catalog_sales_channel_categories.js.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts +36 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.d.ts.map +1 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js +87 -0
- package/dist/migrations/20260925T125527_catalog_inventory_columns.js.map +1 -0
- package/dist/migrations/index.d.ts +55 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +80 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/ports/index.d.ts +96 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +2 -0
- package/dist/ports/index.js.map +1 -0
- package/docs/catalog/attachments.md +69 -0
- package/docs/catalog/attribute-sets.md +63 -0
- package/docs/catalog/attributes.md +244 -0
- package/docs/catalog/composite-products.md +115 -0
- package/docs/catalog/gallery-and-labels.md +73 -0
- package/docs/catalog/packaging-units.md +67 -0
- package/docs/catalog/per-channel-per-language-overrides.md +234 -0
- package/docs/catalog/product-links.md +79 -0
- package/docs/catalog.md +207 -0
- package/i18n/en.json +649 -0
- package/i18n/pl.json +649 -0
- package/package.json +109 -0
- package/tailwind.css +14 -0
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { Product } from '../entities/product.entity.js';
|
|
2
|
+
import { toCatalogProductRecord } from './catalog-product-read.service.js';
|
|
3
|
+
/**
|
|
4
|
+
* The sellable-product filter `catalog` publishes (feature 075).
|
|
5
|
+
*
|
|
6
|
+
* `product_feeds` compiles an operator's selection rule into a predicate and
|
|
7
|
+
* walks the catalogue with it. Until this port existed it did that by holding
|
|
8
|
+
* `Product` and handing MikroORM a `where` object of its own construction —
|
|
9
|
+
* the one demand Phase P declined to guess at, because a query object is the
|
|
10
|
+
* ORM rather than a contract.
|
|
11
|
+
*
|
|
12
|
+
* Three things move across the boundary with the translation, and each of them
|
|
13
|
+
* is why the port is worth more than the import it replaces:
|
|
14
|
+
*
|
|
15
|
+
* 1. **The floor is applied here.** Feature 067's FR-026 says an operator's
|
|
16
|
+
* rule may only ever narrow "active, visible to the feed's reader, not
|
|
17
|
+
* archived, not soft-deleted, in the feed's channel". On the caller's side
|
|
18
|
+
* that was a conjunction a future edit could spread into one object and
|
|
19
|
+
* lose; here it is one `$and` clause the caller cannot reach. Who "the
|
|
20
|
+
* feed's reader" is has one answer and it is not this file's to invent —
|
|
21
|
+
* see {@link ANONYMOUS_AUDIENCE_CLAUSE}.
|
|
22
|
+
* 2. **The cursor is applied here.** A keyset walk and the floor both
|
|
23
|
+
* constrain `id`, and so does a category criterion. Composing all three
|
|
24
|
+
* was the caller's problem and is now nobody's.
|
|
25
|
+
* 3. **Rows leave as records.** The caller reads six fields off each row and
|
|
26
|
+
* yields ids; it never needed a managed entity, and holding one made the
|
|
27
|
+
* identity map grow with the catalogue rather than with the page.
|
|
28
|
+
*
|
|
29
|
+
* ## What the translation may and may not do
|
|
30
|
+
*
|
|
31
|
+
* The filter grammar is deliberately narrower than MikroORM: six columns, the
|
|
32
|
+
* JSONB attribute bag, twelve operators, `and` / `or`, and the two constants.
|
|
33
|
+
* There is no node this function could translate into a join, a relation walk
|
|
34
|
+
* or a raw fragment, which is what stops the port becoming the general query
|
|
35
|
+
* surface publishing the DSL would have made it.
|
|
36
|
+
*
|
|
37
|
+
* `contains` and `startsWith` build their own patterns, so the caller never
|
|
38
|
+
* writes `LIKE` syntax and the escaping rule has exactly one home — this file.
|
|
39
|
+
* See {@link escapeLikeLiteral} for what that rule is and why the value has to
|
|
40
|
+
* go through it.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* The one place a `contains` / `startsWith` value becomes part of a pattern.
|
|
44
|
+
*
|
|
45
|
+
* Both operators name a **literal**: `contains "50%"` means the three
|
|
46
|
+
* characters `5`, `0`, `%`. `LIKE` reads `%` as "anything", `_` as "any one
|
|
47
|
+
* character" and — in PostgreSQL, absent an explicit `ESCAPE` clause — `\` as
|
|
48
|
+
* the escape character, so a value carrying any of the three used to mean
|
|
49
|
+
* something other than what the operator promises. Issue #181: an unescaped
|
|
50
|
+
* `contains "50%"` selected every product with "50" followed by anything.
|
|
51
|
+
*
|
|
52
|
+
* `\` is the escape character used here rather than an explicit `ESCAPE`
|
|
53
|
+
* clause, because there is nowhere to put one: MikroORM renders `$ilike` as
|
|
54
|
+
* `column ilike ?` with the pattern bound as a parameter, and reaching for a
|
|
55
|
+
* raw fragment to append `ESCAPE` would put SQL text back into a translation
|
|
56
|
+
* whose whole point is that it has no node for one. PostgreSQL's default escape
|
|
57
|
+
* character already *is* `\`, so escaping with it needs no clause — and it has
|
|
58
|
+
* to be escaped first in its own right, or a value ending in a backslash would
|
|
59
|
+
* escape the wildcard this function's callers append.
|
|
60
|
+
*
|
|
61
|
+
* Note the failure was not only over-matching: PostgreSQL degrades an escape
|
|
62
|
+
* sequence it does not recognise to the plain character, so the unescaped
|
|
63
|
+
* pattern for `C\D` also *missed* the row that actually holds the backslash.
|
|
64
|
+
*/
|
|
65
|
+
export function escapeLikeLiteral(value) {
|
|
66
|
+
return value.replace(/[\\%_]/g, (character) => `\\${character}`);
|
|
67
|
+
}
|
|
68
|
+
/** The page size the feed pipeline already walks in. */
|
|
69
|
+
const DEFAULT_PAGE_SIZE = 500;
|
|
70
|
+
/**
|
|
71
|
+
* A predicate that can never be satisfied — `id` is the primary key, so no row
|
|
72
|
+
* has a null one.
|
|
73
|
+
*/
|
|
74
|
+
const NEVER = { id: null };
|
|
75
|
+
/**
|
|
76
|
+
* An explicit tautology, for the one place emptiness is not neutral: a branch
|
|
77
|
+
* of `$or`, where an empty object collapses the branch instead of matching
|
|
78
|
+
* every row.
|
|
79
|
+
*/
|
|
80
|
+
const ALWAYS = { id: { $ne: null } };
|
|
81
|
+
export class CatalogProductFilterService {
|
|
82
|
+
emFactory;
|
|
83
|
+
constructor(emFactory) {
|
|
84
|
+
this.emFactory = emFactory;
|
|
85
|
+
}
|
|
86
|
+
async listSellable(query) {
|
|
87
|
+
if (query.productIds.length === 0)
|
|
88
|
+
return [];
|
|
89
|
+
const em = this.emFactory();
|
|
90
|
+
const rows = await em.find(Product, this.where(query), {
|
|
91
|
+
orderBy: { id: 'asc' },
|
|
92
|
+
limit: query.limit ?? DEFAULT_PAGE_SIZE,
|
|
93
|
+
});
|
|
94
|
+
const records = rows.map(toCatalogProductRecord);
|
|
95
|
+
// This manager is ours — `emFactory()` forks — and clearing it is what keeps
|
|
96
|
+
// a long walk O(page) rather than O(catalogue). Nothing survives the call
|
|
97
|
+
// but the records above, which are plain objects.
|
|
98
|
+
em.clear();
|
|
99
|
+
return records;
|
|
100
|
+
}
|
|
101
|
+
async countSellable(query) {
|
|
102
|
+
if (query.productIds.length === 0)
|
|
103
|
+
return 0;
|
|
104
|
+
return this.emFactory().count(Product, this.where({ ...query, afterId: null }));
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Floor AND filter AND cursor, as an explicit `$and`.
|
|
108
|
+
*
|
|
109
|
+
* Never an object spread: all three constrain `id`, and spreading them keeps
|
|
110
|
+
* only the last one — which for a category criterion would drop the channel
|
|
111
|
+
* scoping altogether.
|
|
112
|
+
*/
|
|
113
|
+
where(query) {
|
|
114
|
+
const clauses = [sellableFloor(query.productIds)];
|
|
115
|
+
const predicate = translateFilter(query.filter);
|
|
116
|
+
if (predicate !== null)
|
|
117
|
+
clauses.push(predicate);
|
|
118
|
+
if (query.afterId)
|
|
119
|
+
clauses.push({ id: { $gt: query.afterId } });
|
|
120
|
+
return { $and: clauses };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* `isProductVisibleTo(row, ANONYMOUS_PRODUCT_AUDIENCE)`, written as SQL.
|
|
125
|
+
*
|
|
126
|
+
* The only consumer of this port is a **product feed**, and a feed is read by
|
|
127
|
+
* Google: an anonymous, unauthenticated consumer with no organisation and no
|
|
128
|
+
* session. That is the same audience the sitemap answers for, and it is now
|
|
129
|
+
* answered with the same words — the platform has one predicate for "may this
|
|
130
|
+
* caller see this product" and this clause is its SQL half, not a second
|
|
131
|
+
* opinion (issue #259).
|
|
132
|
+
*
|
|
133
|
+
* The floor used to say `visibility: 'public'` and stop, which is not the whole
|
|
134
|
+
* answer: an operator can save `public` **with** a non-empty
|
|
135
|
+
* `allowed_organization_ids`, and the allow-list restricts whatever the
|
|
136
|
+
* visibility column says. A feed carrying such a row advertises a URL an
|
|
137
|
+
* anonymous visitor gets a 404 from, and advertises the existence of an
|
|
138
|
+
* assortment reserved for one distributor to everybody else's crawler.
|
|
139
|
+
*
|
|
140
|
+
* ## Why it collapses to two equalities
|
|
141
|
+
*
|
|
142
|
+
* The general SQL form of the predicate is the containment `catalog`'s
|
|
143
|
+
* quick-search applies — `allowed_organization_ids @> '[<buyer org>]'`, so the
|
|
144
|
+
* buyer's id is an *element* of the array rather than a substring of the
|
|
145
|
+
* serialised bag. For the **anonymous** audience there is no organisation to
|
|
146
|
+
* contain, so that branch can never match, and what is left is the predicate's
|
|
147
|
+
* second branch: an empty allow-list, decided by `visibility` alone, which for
|
|
148
|
+
* an unauthenticated caller means `public`.
|
|
149
|
+
*
|
|
150
|
+
* That difference is the point, not an omission (issue #262). The other SQL
|
|
151
|
+
* statement of this rule is in `catalog-quick-search.service.ts`, it answers
|
|
152
|
+
* for a **signed-in buyer** — `{ organizationId, authenticated: true }`, an
|
|
153
|
+
* audience that surface's port requires — and it therefore keeps the
|
|
154
|
+
* containment branch and admits `logged_in_only`. Neither clause may be
|
|
155
|
+
* aligned with the other: the containment branch would be dead weight here,
|
|
156
|
+
* and these two equalities over there would hide from a buyer every row his own
|
|
157
|
+
* organisation is named on. Each site has its own parity test instead, and both
|
|
158
|
+
* derive their expectations from `isProductVisibleTo`.
|
|
159
|
+
*
|
|
160
|
+
* ## Why the empty test is spelled `{ $eq: [] }`
|
|
161
|
+
*
|
|
162
|
+
* It renders `allowed_organization_ids = '[]'`, and `jsonb` equality is
|
|
163
|
+
* structural, so it matches the empty array and nothing else. Do **not**
|
|
164
|
+
* "simplify" it to a bare `allowedOrganizationIds: []`: MikroORM reads a bare
|
|
165
|
+
* array as an `$in` list, and an empty one matches no row at all — every
|
|
166
|
+
* product would silently leave every feed.
|
|
167
|
+
*
|
|
168
|
+
* A raw `jsonb_array_length(...) = 0` fragment was the other candidate and is
|
|
169
|
+
* refused for a sharper reason: as a `raw()` key it survives `em.find` and
|
|
170
|
+
* breaks in `em.count`, which re-quotes the fragment as an identifier. That is
|
|
171
|
+
* precisely the half this port must never differ on — `countSellable` is the
|
|
172
|
+
* number an operator is shown before saving and `listSellable` is what the run
|
|
173
|
+
* emits.
|
|
174
|
+
*
|
|
175
|
+
* ## How this stays in step with the TypeScript predicate
|
|
176
|
+
*
|
|
177
|
+
* `backend/test/integration/catalog/product-filter-port.test.ts` seeds every
|
|
178
|
+
* `productVisibilitySchema.options` × (empty, non-empty) state and derives its
|
|
179
|
+
* expectation from `isProductVisibleTo` itself, for `listSellable` and
|
|
180
|
+
* `countSellable` both. Neither side can drift without that file going red, and
|
|
181
|
+
* a fourth visibility value enters the sweep as soon as the enum grows.
|
|
182
|
+
*
|
|
183
|
+
* `backend/test/integration/catalog/quick-search-audience-parity.test.ts` is
|
|
184
|
+
* the same mechanism for the buyer-facing statement — the states this sweep
|
|
185
|
+
* cannot reach, an allow-list naming the viewer's own organisation among
|
|
186
|
+
* others, being exactly what an anonymous audience has no way to express.
|
|
187
|
+
*/
|
|
188
|
+
const ANONYMOUS_AUDIENCE_CLAUSE = {
|
|
189
|
+
visibility: 'public',
|
|
190
|
+
allowedOrganizationIds: { $eq: [] },
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* The non-overridable floor. One function so there is exactly one place a
|
|
194
|
+
* reviewer has to read to know what this port can return.
|
|
195
|
+
*
|
|
196
|
+
* The audience half of it — the two clauses over `visibility` and
|
|
197
|
+
* `allowed_organization_ids` — is {@link ANONYMOUS_AUDIENCE_CLAUSE}.
|
|
198
|
+
*/
|
|
199
|
+
function sellableFloor(productIds) {
|
|
200
|
+
return {
|
|
201
|
+
id: { $in: [...productIds] },
|
|
202
|
+
status: 'active',
|
|
203
|
+
// Two keys nothing else in this object names, so the spread cannot lose a
|
|
204
|
+
// clause the way `where()`'s comment warns an `id` spread would.
|
|
205
|
+
...ANONYMOUS_AUDIENCE_CLAUSE,
|
|
206
|
+
archivedAt: null,
|
|
207
|
+
deletedAt: null,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/** `null` when the node constrains nothing, so the caller can omit the clause. */
|
|
211
|
+
export function translateFilter(filter) {
|
|
212
|
+
if (filter.kind === 'all')
|
|
213
|
+
return null;
|
|
214
|
+
if (filter.kind === 'none')
|
|
215
|
+
return NEVER;
|
|
216
|
+
if (filter.kind === 'group') {
|
|
217
|
+
const children = filter.children.map((child) => translateFilter(child) ?? ALWAYS);
|
|
218
|
+
if (children.length === 0)
|
|
219
|
+
return null;
|
|
220
|
+
return { [filter.op === 'or' ? '$or' : '$and']: children };
|
|
221
|
+
}
|
|
222
|
+
return translateCondition(filter);
|
|
223
|
+
}
|
|
224
|
+
function translateCondition(condition) {
|
|
225
|
+
const comparison = comparisonFor(condition);
|
|
226
|
+
if (comparison === null)
|
|
227
|
+
return NEVER;
|
|
228
|
+
if (condition.field.kind === 'column') {
|
|
229
|
+
return { [condition.field.column]: comparison.value };
|
|
230
|
+
}
|
|
231
|
+
return { attributeValues: { [condition.field.key]: comparison.value } };
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* One operator, as the ORM spells it. `null` means the condition cannot be
|
|
235
|
+
* satisfied — an operator that needs a value and was given none, which is a
|
|
236
|
+
* half-filled criterion and must select nothing rather than everything.
|
|
237
|
+
*/
|
|
238
|
+
function comparisonFor(condition) {
|
|
239
|
+
const { op, values } = condition;
|
|
240
|
+
if (op === 'isNull')
|
|
241
|
+
return { value: null };
|
|
242
|
+
if (op === 'isNotNull')
|
|
243
|
+
return { value: { $ne: null } };
|
|
244
|
+
if (values.length === 0)
|
|
245
|
+
return null;
|
|
246
|
+
const first = values[0];
|
|
247
|
+
switch (op) {
|
|
248
|
+
case 'eq':
|
|
249
|
+
return { value: first };
|
|
250
|
+
case 'ne':
|
|
251
|
+
return { value: { $ne: first } };
|
|
252
|
+
case 'in':
|
|
253
|
+
return { value: { $in: [...values] } };
|
|
254
|
+
case 'nin':
|
|
255
|
+
return { value: { $nin: [...values] } };
|
|
256
|
+
case 'gt':
|
|
257
|
+
return { value: { $gt: first } };
|
|
258
|
+
case 'gte':
|
|
259
|
+
return { value: { $gte: first } };
|
|
260
|
+
case 'lt':
|
|
261
|
+
return { value: { $lt: first } };
|
|
262
|
+
case 'lte':
|
|
263
|
+
return { value: { $lte: first } };
|
|
264
|
+
case 'contains':
|
|
265
|
+
return { value: { $ilike: `%${escapeLikeLiteral(String(first))}%` } };
|
|
266
|
+
case 'startsWith':
|
|
267
|
+
return { value: { $ilike: `${escapeLikeLiteral(String(first))}%` } };
|
|
268
|
+
/* c8 ignore next 4 -- unreachable while the contract union and this switch
|
|
269
|
+
agree; a future operator with no branch selects nothing rather than
|
|
270
|
+
everything. */
|
|
271
|
+
default:
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=catalog-product-filter.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-product-filter.service.js","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-filter.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { EntityManager } from '@mikro-orm/postgresql';
|
|
2
|
+
import type { CatalogPackagingUnitRecord, CatalogProductLinkRow, CatalogProductLookupOptions, CatalogProductReadPort, CatalogProductRecord, CatalogProductValueOverrideRecord, CatalogProductVariantRecord, ProductLinkKind } from '@endora-commerce/contracts';
|
|
3
|
+
import { Product } from '../entities/product.entity.js';
|
|
4
|
+
import { ProductLink } from '../entities/product-link.entity.js';
|
|
5
|
+
import { ProductPackagingUnit } from '../entities/product-packaging-unit.entity.js';
|
|
6
|
+
import { ProductValueOverride } from '../entities/product-value-override.entity.js';
|
|
7
|
+
import { ProductVariant } from '../entities/product-variant.entity.js';
|
|
8
|
+
/**
|
|
9
|
+
* The row-level read model `catalog` publishes (feature 075, Phase P).
|
|
10
|
+
*
|
|
11
|
+
* Forty-six of this module's 107 inbound import sites are a read of the
|
|
12
|
+
* `Product` entity, and the sixty across `Product` and `Category` together are
|
|
13
|
+
* the largest single cluster in the sweep. They reduce to four questions — by
|
|
14
|
+
* id, by ids, by sku, by skus — differing only in which of the three
|
|
15
|
+
* soft-delete / status filters each caller happened to apply.
|
|
16
|
+
*
|
|
17
|
+
* That variation is the reason the filters are an **options object** rather
|
|
18
|
+
* than separate methods. Sixteen call sites pass `deletedAt: null`, four also
|
|
19
|
+
* pass `status: 'active'`, and the rest deliberately pass neither, because an
|
|
20
|
+
* inactive or soft-deleted product still has to resolve from a historical
|
|
21
|
+
* order, invoice, RFQ or shopping list. Naming the two narrowings is what
|
|
22
|
+
* makes each caller's choice visible; defaulting both to `false` keeps the
|
|
23
|
+
* wider read the default it already is.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CatalogProductReadService implements CatalogProductReadPort {
|
|
26
|
+
private readonly emFactory;
|
|
27
|
+
constructor(emFactory: () => EntityManager);
|
|
28
|
+
findById(id: string, options?: CatalogProductLookupOptions): Promise<CatalogProductRecord | null>;
|
|
29
|
+
findByIds(ids: readonly string[], options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
|
|
30
|
+
findBySku(sku: string, options?: CatalogProductLookupOptions): Promise<CatalogProductRecord | null>;
|
|
31
|
+
findBySkus(skus: readonly string[], options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
|
|
32
|
+
countByIds(ids: readonly string[]): Promise<number>;
|
|
33
|
+
listAll(options?: CatalogProductLookupOptions): Promise<CatalogProductRecord[]>;
|
|
34
|
+
listVariantsByProductIds(productIds: readonly string[]): Promise<CatalogProductVariantRecord[]>;
|
|
35
|
+
findVariantsBySkus(skus: readonly string[]): Promise<CatalogProductVariantRecord[]>;
|
|
36
|
+
findVariantInProduct(parentProductId: string, variantId: string): Promise<CatalogProductVariantRecord | null>;
|
|
37
|
+
findPackagingUnitInProduct(productId: string, packagingUnitId: string): Promise<CatalogPackagingUnitRecord | null>;
|
|
38
|
+
listLinksBySourceIds(sourceProductIds: readonly string[], kind?: ProductLinkKind): Promise<CatalogProductLinkRow[]>;
|
|
39
|
+
listValueOverridesByProductIds(productIds: readonly string[]): Promise<CatalogProductValueOverrideRecord[]>;
|
|
40
|
+
}
|
|
41
|
+
export declare function toCatalogProductRecord(product: Product): CatalogProductRecord;
|
|
42
|
+
export declare function toCatalogProductVariantRecord(variant: ProductVariant): CatalogProductVariantRecord;
|
|
43
|
+
export declare function toCatalogPackagingUnitRecord(unit: ProductPackagingUnit): CatalogPackagingUnitRecord;
|
|
44
|
+
export declare function toCatalogProductLinkRow(link: ProductLink): CatalogProductLinkRow;
|
|
45
|
+
export declare function toCatalogProductValueOverrideRecord(override: ProductValueOverride): CatalogProductValueOverrideRecord;
|
|
46
|
+
//# sourceMappingURL=catalog-product-read.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-product-read.service.d.ts","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-read.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EACV,0BAA0B,EAC1B,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,iCAAiC,EACjC,2BAA2B,EAC3B,eAAe,EAChB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,yBAA0B,YAAW,sBAAsB;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM,aAAa;IAErD,QAAQ,CACZ,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQjC,SAAS,CACb,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS5B,SAAS,CACb,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAQjC,UAAU,CACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS5B,UAAU,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnD,OAAO,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAS/E,wBAAwB,CAC5B,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAUnC,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAMnF,oBAAoB,CACxB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAQxC,0BAA0B,CAC9B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;IAQvC,oBAAoB,CACxB,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAa7B,8BAA8B,CAClC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,iCAAiC,EAAE,CAAC;CAOhD;AAgBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CA2B7E;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,cAAc,GACtB,2BAA2B,CAW7B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,oBAAoB,GACzB,0BAA0B,CAW5B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAQhF;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,oBAAoB,GAC7B,iCAAiC,CASnC"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { Product } from '../entities/product.entity.js';
|
|
2
|
+
import { ProductLink } from '../entities/product-link.entity.js';
|
|
3
|
+
import { ProductPackagingUnit } from '../entities/product-packaging-unit.entity.js';
|
|
4
|
+
import { ProductValueOverride } from '../entities/product-value-override.entity.js';
|
|
5
|
+
import { ProductVariant } from '../entities/product-variant.entity.js';
|
|
6
|
+
/**
|
|
7
|
+
* The row-level read model `catalog` publishes (feature 075, Phase P).
|
|
8
|
+
*
|
|
9
|
+
* Forty-six of this module's 107 inbound import sites are a read of the
|
|
10
|
+
* `Product` entity, and the sixty across `Product` and `Category` together are
|
|
11
|
+
* the largest single cluster in the sweep. They reduce to four questions — by
|
|
12
|
+
* id, by ids, by sku, by skus — differing only in which of the three
|
|
13
|
+
* soft-delete / status filters each caller happened to apply.
|
|
14
|
+
*
|
|
15
|
+
* That variation is the reason the filters are an **options object** rather
|
|
16
|
+
* than separate methods. Sixteen call sites pass `deletedAt: null`, four also
|
|
17
|
+
* pass `status: 'active'`, and the rest deliberately pass neither, because an
|
|
18
|
+
* inactive or soft-deleted product still has to resolve from a historical
|
|
19
|
+
* order, invoice, RFQ or shopping list. Naming the two narrowings is what
|
|
20
|
+
* makes each caller's choice visible; defaulting both to `false` keeps the
|
|
21
|
+
* wider read the default it already is.
|
|
22
|
+
*/
|
|
23
|
+
export class CatalogProductReadService {
|
|
24
|
+
emFactory;
|
|
25
|
+
constructor(emFactory) {
|
|
26
|
+
this.emFactory = emFactory;
|
|
27
|
+
}
|
|
28
|
+
async findById(id, options) {
|
|
29
|
+
const product = await this.emFactory().findOne(Product, {
|
|
30
|
+
id,
|
|
31
|
+
...productFilter(options),
|
|
32
|
+
});
|
|
33
|
+
return product ? toCatalogProductRecord(product) : null;
|
|
34
|
+
}
|
|
35
|
+
async findByIds(ids, options) {
|
|
36
|
+
if (ids.length === 0)
|
|
37
|
+
return [];
|
|
38
|
+
const products = await this.emFactory().find(Product, {
|
|
39
|
+
id: { $in: [...ids] },
|
|
40
|
+
...productFilter(options),
|
|
41
|
+
});
|
|
42
|
+
return products.map(toCatalogProductRecord);
|
|
43
|
+
}
|
|
44
|
+
async findBySku(sku, options) {
|
|
45
|
+
const product = await this.emFactory().findOne(Product, {
|
|
46
|
+
sku,
|
|
47
|
+
...productFilter(options),
|
|
48
|
+
});
|
|
49
|
+
return product ? toCatalogProductRecord(product) : null;
|
|
50
|
+
}
|
|
51
|
+
async findBySkus(skus, options) {
|
|
52
|
+
if (skus.length === 0)
|
|
53
|
+
return [];
|
|
54
|
+
const products = await this.emFactory().find(Product, {
|
|
55
|
+
sku: { $in: [...skus] },
|
|
56
|
+
...productFilter(options),
|
|
57
|
+
});
|
|
58
|
+
return products.map(toCatalogProductRecord);
|
|
59
|
+
}
|
|
60
|
+
async countByIds(ids) {
|
|
61
|
+
if (ids.length === 0)
|
|
62
|
+
return 0;
|
|
63
|
+
return this.emFactory().count(Product, { id: { $in: [...ids] } });
|
|
64
|
+
}
|
|
65
|
+
async listAll(options) {
|
|
66
|
+
const products = await this.emFactory().find(Product, productFilter(options), { orderBy: { sku: 'asc' } });
|
|
67
|
+
return products.map(toCatalogProductRecord);
|
|
68
|
+
}
|
|
69
|
+
async listVariantsByProductIds(productIds) {
|
|
70
|
+
if (productIds.length === 0)
|
|
71
|
+
return [];
|
|
72
|
+
const variants = await this.emFactory().find(ProductVariant, { parentProductId: { $in: [...productIds] } }, { orderBy: { sku: 'asc' } });
|
|
73
|
+
return variants.map(toCatalogProductVariantRecord);
|
|
74
|
+
}
|
|
75
|
+
async findVariantsBySkus(skus) {
|
|
76
|
+
if (skus.length === 0)
|
|
77
|
+
return [];
|
|
78
|
+
const variants = await this.emFactory().find(ProductVariant, { sku: { $in: [...skus] } });
|
|
79
|
+
return variants.map(toCatalogProductVariantRecord);
|
|
80
|
+
}
|
|
81
|
+
async findVariantInProduct(parentProductId, variantId) {
|
|
82
|
+
const variant = await this.emFactory().findOne(ProductVariant, {
|
|
83
|
+
id: variantId,
|
|
84
|
+
parentProductId,
|
|
85
|
+
});
|
|
86
|
+
return variant ? toCatalogProductVariantRecord(variant) : null;
|
|
87
|
+
}
|
|
88
|
+
async findPackagingUnitInProduct(productId, packagingUnitId) {
|
|
89
|
+
const unit = await this.emFactory().findOne(ProductPackagingUnit, {
|
|
90
|
+
id: packagingUnitId,
|
|
91
|
+
productId,
|
|
92
|
+
});
|
|
93
|
+
return unit ? toCatalogPackagingUnitRecord(unit) : null;
|
|
94
|
+
}
|
|
95
|
+
async listLinksBySourceIds(sourceProductIds, kind) {
|
|
96
|
+
if (sourceProductIds.length === 0)
|
|
97
|
+
return [];
|
|
98
|
+
const links = await this.emFactory().find(ProductLink, {
|
|
99
|
+
sourceProductId: { $in: [...sourceProductIds] },
|
|
100
|
+
...(kind === undefined ? {} : { kind }),
|
|
101
|
+
}, { orderBy: { position: 'asc', id: 'asc' } });
|
|
102
|
+
return links.map(toCatalogProductLinkRow);
|
|
103
|
+
}
|
|
104
|
+
async listValueOverridesByProductIds(productIds) {
|
|
105
|
+
if (productIds.length === 0)
|
|
106
|
+
return [];
|
|
107
|
+
const overrides = await this.emFactory().find(ProductValueOverride, {
|
|
108
|
+
productId: { $in: [...productIds] },
|
|
109
|
+
});
|
|
110
|
+
return overrides.map(toCatalogProductValueOverrideRecord);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* `{}` by default — the wider read. `liveOnly` drops soft-deleted rows,
|
|
115
|
+
* `activeOnly` implies it and narrows to `status === 'active'`; a caller
|
|
116
|
+
* asking for active rows never wants the deleted ones as well, and letting the
|
|
117
|
+
* two be set independently would publish a combination nobody means.
|
|
118
|
+
*/
|
|
119
|
+
function productFilter(options) {
|
|
120
|
+
if (options?.activeOnly)
|
|
121
|
+
return { deletedAt: null, status: 'active' };
|
|
122
|
+
if (options?.liveOnly)
|
|
123
|
+
return { deletedAt: null };
|
|
124
|
+
return {};
|
|
125
|
+
}
|
|
126
|
+
export function toCatalogProductRecord(product) {
|
|
127
|
+
return {
|
|
128
|
+
id: product.id,
|
|
129
|
+
sku: product.sku,
|
|
130
|
+
slug: product.slug,
|
|
131
|
+
type: product.type,
|
|
132
|
+
status: product.status,
|
|
133
|
+
name: product.name,
|
|
134
|
+
description: product.description,
|
|
135
|
+
stockMode: product.stockMode ?? null,
|
|
136
|
+
visibility: product.visibility,
|
|
137
|
+
attributeValues: product.attributeValues ?? {},
|
|
138
|
+
allowedOrganizationIds: product.allowedOrganizationIds ?? [],
|
|
139
|
+
attributeSetId: product.attributeSetId,
|
|
140
|
+
downloadAssetId: product.downloadAssetId ?? null,
|
|
141
|
+
downloadUrl: product.downloadUrl ?? null,
|
|
142
|
+
createdAt: product.createdAt,
|
|
143
|
+
updatedAt: product.updatedAt,
|
|
144
|
+
archivedAt: product.archivedAt ?? null,
|
|
145
|
+
deletedAt: product.deletedAt ?? null,
|
|
146
|
+
manageStock: product.manageStock,
|
|
147
|
+
backorderEnabled: product.backorderEnabled,
|
|
148
|
+
lowStockThreshold: product.lowStockThreshold ?? null,
|
|
149
|
+
lowStockThresholdMode: product.lowStockThresholdMode,
|
|
150
|
+
fulfilmentStrategy: product.fulfilmentStrategy ?? null,
|
|
151
|
+
fulfilmentStrategyWarehouseOrder: product.fulfilmentStrategyWarehouseOrder ?? null,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
export function toCatalogProductVariantRecord(variant) {
|
|
155
|
+
return {
|
|
156
|
+
id: variant.id,
|
|
157
|
+
parentProductId: variant.parentProductId,
|
|
158
|
+
sku: variant.sku,
|
|
159
|
+
variantAttributeValues: variant.variantAttributeValues ?? {},
|
|
160
|
+
priceOverride: variant.priceOverride ?? null,
|
|
161
|
+
stockLevel: variant.stockLevel ?? null,
|
|
162
|
+
createdAt: variant.createdAt,
|
|
163
|
+
updatedAt: variant.updatedAt,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export function toCatalogPackagingUnitRecord(unit) {
|
|
167
|
+
return {
|
|
168
|
+
id: unit.id,
|
|
169
|
+
productId: unit.productId,
|
|
170
|
+
name: unit.name,
|
|
171
|
+
baseQuantity: unit.baseQuantity,
|
|
172
|
+
position: unit.position,
|
|
173
|
+
isDefault: unit.isDefault,
|
|
174
|
+
createdAt: unit.createdAt,
|
|
175
|
+
updatedAt: unit.updatedAt,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function toCatalogProductLinkRow(link) {
|
|
179
|
+
return {
|
|
180
|
+
id: link.id,
|
|
181
|
+
sourceProductId: link.sourceProductId,
|
|
182
|
+
targetProductId: link.targetProductId,
|
|
183
|
+
kind: link.kind,
|
|
184
|
+
position: link.position,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export function toCatalogProductValueOverrideRecord(override) {
|
|
188
|
+
return {
|
|
189
|
+
id: override.id,
|
|
190
|
+
productId: override.productId,
|
|
191
|
+
attributeKey: override.attributeKey,
|
|
192
|
+
channelId: override.channelId,
|
|
193
|
+
languageCode: override.languageCode ?? null,
|
|
194
|
+
value: override.value,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=catalog-product-read.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-product-read.service.js","sourceRoot":"","sources":["../../../src/backend/services/catalog-product-read.service.ts"],"names":[],"mappings":"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"}
|