@porulle/core 0.10.8 → 0.13.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/dist/auth/auth-schema-guard.d.ts +2444 -0
- package/dist/auth/auth-schema-guard.d.ts.map +1 -0
- package/dist/auth/auth-schema-guard.js +113 -0
- package/dist/auth/auth-schema.d.ts +228 -0
- package/dist/auth/auth-schema.d.ts.map +1 -1
- package/dist/auth/auth-schema.js +24 -2
- package/dist/auth/middleware.d.ts +1 -0
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +13 -5
- package/dist/auth/org.d.ts +8 -2
- package/dist/auth/org.d.ts.map +1 -1
- package/dist/auth/org.js +12 -4
- package/dist/auth/organization-guard.d.ts +5 -0
- package/dist/auth/organization-guard.d.ts.map +1 -0
- package/dist/auth/organization-guard.js +124 -0
- package/dist/auth/permissions.d.ts +10 -0
- package/dist/auth/permissions.d.ts.map +1 -1
- package/dist/auth/permissions.js +31 -7
- package/dist/auth/role-authority.d.ts +44 -0
- package/dist/auth/role-authority.d.ts.map +1 -0
- package/dist/auth/role-authority.js +85 -0
- package/dist/auth/setup.d.ts.map +1 -1
- package/dist/auth/setup.js +17 -0
- package/dist/auth/strict-org-resolution.d.ts.map +1 -1
- package/dist/auth/strict-org-resolution.js +9 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/types.d.ts +33 -4
- package/dist/config/types.d.ts.map +1 -1
- package/dist/hooks/checkout.d.ts.map +1 -1
- package/dist/hooks/checkout.js +10 -9
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/interfaces/rest/audit-middleware.d.ts.map +1 -1
- package/dist/interfaces/rest/audit-middleware.js +2 -0
- package/dist/interfaces/rest/customer-portal.d.ts.map +1 -1
- package/dist/interfaces/rest/customer-portal.js +9 -8
- package/dist/interfaces/rest/index.d.ts.map +1 -1
- package/dist/interfaces/rest/index.js +4 -0
- package/dist/interfaces/rest/route-coverage.d.ts +14 -0
- package/dist/interfaces/rest/route-coverage.d.ts.map +1 -0
- package/dist/interfaces/rest/route-coverage.js +81 -0
- package/dist/interfaces/rest/router.d.ts +7 -2
- package/dist/interfaces/rest/router.d.ts.map +1 -1
- package/dist/interfaces/rest/router.js +8 -4
- package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/compensation-failures.js +7 -5
- package/dist/interfaces/rest/routes/admin/custom-field-proposals.d.ts +5 -0
- package/dist/interfaces/rest/routes/admin/custom-field-proposals.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/admin/custom-field-proposals.js +22 -0
- package/dist/interfaces/rest/routes/admin/entity-field-definitions.d.ts +5 -0
- package/dist/interfaces/rest/routes/admin/entity-field-definitions.d.ts.map +1 -0
- package/dist/interfaces/rest/routes/admin/entity-field-definitions.js +39 -0
- package/dist/interfaces/rest/routes/admin/permissions.d.ts +1 -1
- package/dist/interfaces/rest/routes/admin/permissions.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/permissions.js +2 -0
- package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/staff.js +126 -66
- package/dist/interfaces/rest/routes/admin-jobs.js +3 -3
- package/dist/interfaces/rest/routes/audit.js +3 -3
- package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/carts.js +13 -10
- package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/catalog.js +47 -4
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/checkout.js +30 -35
- package/dist/interfaces/rest/routes/documents.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/documents.js +10 -5
- package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/inventory.js +2 -0
- package/dist/interfaces/rest/routes/media.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/media.js +7 -3
- package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/orders.js +26 -8
- package/dist/interfaces/rest/routes/pricing.js +2 -2
- package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/promotions.js +13 -10
- package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/search.js +14 -1
- package/dist/interfaces/rest/schemas/admin-custom-field-proposals.d.ts +134 -0
- package/dist/interfaces/rest/schemas/admin-custom-field-proposals.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/admin-custom-field-proposals.js +26 -0
- package/dist/interfaces/rest/schemas/admin-entity-field-definitions.d.ts +592 -0
- package/dist/interfaces/rest/schemas/admin-entity-field-definitions.d.ts.map +1 -0
- package/dist/interfaces/rest/schemas/admin-entity-field-definitions.js +109 -0
- package/dist/interfaces/rest/schemas/carts.d.ts +7 -0
- package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/catalog.d.ts +1364 -401
- package/dist/interfaces/rest/schemas/catalog.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/catalog.js +86 -0
- package/dist/interfaces/rest/schemas/customer-portal.d.ts +35 -0
- package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/orders.d.ts +204 -0
- package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/pricing.d.ts +1 -0
- package/dist/interfaces/rest/schemas/pricing.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/responses.d.ts +71 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/search.d.ts +1 -0
- package/dist/interfaces/rest/schemas/search.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/search.js +1 -0
- package/dist/interfaces/rest/utils.d.ts +15 -0
- package/dist/interfaces/rest/utils.d.ts.map +1 -1
- package/dist/interfaces/rest/utils.js +45 -2
- package/dist/kernel/compensation/executor.js +2 -2
- package/dist/kernel/database/tx-context.d.ts +8 -0
- package/dist/kernel/database/tx-context.d.ts.map +1 -1
- package/dist/kernel/database/tx-context.js +13 -0
- package/dist/kernel/hooks/create-context.d.ts +2 -0
- package/dist/kernel/hooks/create-context.d.ts.map +1 -1
- package/dist/kernel/hooks/create-context.js +1 -0
- package/dist/kernel/hooks/types.d.ts +2 -0
- package/dist/kernel/hooks/types.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.js +9 -5
- package/dist/modules/analytics/service.js +2 -2
- package/dist/modules/audit/service.js +3 -3
- package/dist/modules/cart/repository/index.d.ts +13 -7
- package/dist/modules/cart/repository/index.d.ts.map +1 -1
- package/dist/modules/cart/repository/index.js +16 -10
- package/dist/modules/cart/schema.d.ts +17 -0
- package/dist/modules/cart/schema.d.ts.map +1 -1
- package/dist/modules/cart/schema.js +4 -0
- package/dist/modules/cart/service.d.ts +22 -9
- package/dist/modules/cart/service.d.ts.map +1 -1
- package/dist/modules/cart/service.js +57 -33
- package/dist/modules/catalog/brand-service.js +7 -7
- package/dist/modules/catalog/category-service.js +7 -7
- package/dist/modules/catalog/entity-service.d.ts +19 -10
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +180 -51
- package/dist/modules/catalog/module.d.ts +6 -1
- package/dist/modules/catalog/module.d.ts.map +1 -1
- package/dist/modules/catalog/module.js +6 -1
- package/dist/modules/catalog/ownership.d.ts +5 -0
- package/dist/modules/catalog/ownership.d.ts.map +1 -0
- package/dist/modules/catalog/ownership.js +11 -0
- package/dist/modules/catalog/read-policy.d.ts +9 -0
- package/dist/modules/catalog/read-policy.d.ts.map +1 -0
- package/dist/modules/catalog/read-policy.js +8 -0
- package/dist/modules/catalog/repository/index.d.ts +55 -3
- package/dist/modules/catalog/repository/index.d.ts.map +1 -1
- package/dist/modules/catalog/repository/index.js +335 -6
- package/dist/modules/catalog/revision.d.ts +4 -0
- package/dist/modules/catalog/revision.d.ts.map +1 -0
- package/dist/modules/catalog/revision.js +33 -0
- package/dist/modules/catalog/schema.d.ts +979 -110
- package/dist/modules/catalog/schema.d.ts.map +1 -1
- package/dist/modules/catalog/schema.js +112 -2
- package/dist/modules/catalog/schemas.d.ts +2 -0
- package/dist/modules/catalog/schemas.d.ts.map +1 -1
- package/dist/modules/catalog/schemas.js +2 -0
- package/dist/modules/catalog/service.d.ts +80 -15
- package/dist/modules/catalog/service.d.ts.map +1 -1
- package/dist/modules/catalog/service.js +522 -14
- package/dist/modules/channels/adapter.d.ts +85 -0
- package/dist/modules/channels/adapter.d.ts.map +1 -1
- package/dist/modules/channels/adapter.js +9 -1
- package/dist/modules/customers/module.d.ts.map +1 -1
- package/dist/modules/customers/module.js +1 -0
- package/dist/modules/customers/service.d.ts +2 -0
- package/dist/modules/customers/service.d.ts.map +1 -1
- package/dist/modules/customers/service.js +21 -20
- package/dist/modules/documents/module.d.ts.map +1 -1
- package/dist/modules/documents/module.js +1 -0
- package/dist/modules/documents/service.d.ts +18 -4
- package/dist/modules/documents/service.d.ts.map +1 -1
- package/dist/modules/documents/service.js +54 -16
- package/dist/modules/fulfillment/module.d.ts.map +1 -1
- package/dist/modules/fulfillment/module.js +1 -0
- package/dist/modules/fulfillment/service.d.ts +2 -0
- package/dist/modules/fulfillment/service.d.ts.map +1 -1
- package/dist/modules/fulfillment/service.js +15 -6
- package/dist/modules/inventory/service.d.ts.map +1 -1
- package/dist/modules/inventory/service.js +15 -14
- package/dist/modules/media/module.d.ts +68 -0
- package/dist/modules/media/module.d.ts.map +1 -1
- package/dist/modules/media/module.js +2 -0
- package/dist/modules/media/schema.d.ts +70 -0
- package/dist/modules/media/schema.d.ts.map +1 -1
- package/dist/modules/media/schema.js +20 -2
- package/dist/modules/media/service.d.ts +8 -1
- package/dist/modules/media/service.d.ts.map +1 -1
- package/dist/modules/media/service.js +71 -23
- package/dist/modules/orders/guest-access.d.ts +27 -0
- package/dist/modules/orders/guest-access.d.ts.map +1 -0
- package/dist/modules/orders/guest-access.js +46 -0
- package/dist/modules/orders/module.d.ts.map +1 -1
- package/dist/modules/orders/module.js +1 -0
- package/dist/modules/orders/quote.d.ts.map +1 -1
- package/dist/modules/orders/quote.js +1 -0
- package/dist/modules/orders/repository/index.d.ts +1 -1
- package/dist/modules/orders/repository/index.d.ts.map +1 -1
- package/dist/modules/orders/repository/index.js +2 -2
- package/dist/modules/orders/schema.d.ts +17 -0
- package/dist/modules/orders/schema.d.ts.map +1 -1
- package/dist/modules/orders/schema.js +5 -3
- package/dist/modules/orders/service.d.ts +16 -7
- package/dist/modules/orders/service.d.ts.map +1 -1
- package/dist/modules/orders/service.js +184 -55
- package/dist/modules/pricing/module.d.ts.map +1 -1
- package/dist/modules/pricing/module.js +1 -0
- package/dist/modules/pricing/schema.d.ts +17 -0
- package/dist/modules/pricing/schema.d.ts.map +1 -1
- package/dist/modules/pricing/schema.js +1 -0
- package/dist/modules/pricing/schemas.d.ts +1 -0
- package/dist/modules/pricing/schemas.d.ts.map +1 -1
- package/dist/modules/pricing/schemas.js +1 -0
- package/dist/modules/pricing/service.d.ts +2 -0
- package/dist/modules/pricing/service.d.ts.map +1 -1
- package/dist/modules/pricing/service.js +18 -12
- package/dist/modules/promotions/module.d.ts.map +1 -1
- package/dist/modules/promotions/module.js +1 -0
- package/dist/modules/promotions/service.d.ts +3 -0
- package/dist/modules/promotions/service.d.ts.map +1 -1
- package/dist/modules/promotions/service.js +19 -11
- package/dist/modules/search/adapter.d.ts +8 -0
- package/dist/modules/search/adapter.d.ts.map +1 -1
- package/dist/modules/search/module.d.ts.map +1 -1
- package/dist/modules/search/module.js +3 -0
- package/dist/modules/search/service.d.ts +5 -0
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +131 -11
- package/dist/modules/settings/module.d.ts.map +1 -1
- package/dist/modules/settings/module.js +1 -0
- package/dist/modules/settings/service.d.ts +3 -0
- package/dist/modules/settings/service.d.ts.map +1 -1
- package/dist/modules/settings/service.js +6 -4
- package/dist/modules/shipping/service.js +9 -9
- package/dist/modules/tax/module.d.ts.map +1 -1
- package/dist/modules/tax/module.js +1 -0
- package/dist/modules/tax/service.d.ts +3 -0
- package/dist/modules/tax/service.d.ts.map +1 -1
- package/dist/modules/tax/service.js +11 -9
- package/dist/modules/webhooks/hook.js +2 -2
- package/dist/modules/webhooks/module.d.ts.map +1 -1
- package/dist/modules/webhooks/module.js +1 -0
- package/dist/modules/webhooks/service.d.ts +2 -0
- package/dist/modules/webhooks/service.d.ts.map +1 -1
- package/dist/modules/webhooks/service.js +4 -4
- package/dist/runtime/kernel-modules.d.ts +73 -0
- package/dist/runtime/kernel-modules.d.ts.map +1 -1
- package/dist/runtime/server.d.ts.map +1 -1
- package/dist/runtime/server.js +10 -2
- package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
- package/dist/test-utils/create-pglite-adapter.js +35 -13
- package/dist/test-utils/create-test-config.d.ts.map +1 -1
- package/dist/test-utils/create-test-config.js +4 -0
- package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
- package/dist/test-utils/rest-api-test-utils.js +2 -0
- package/dist/test-utils/test-actors.js +2 -2
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +11 -0
- package/package.json +6 -5
- package/src/auth/auth-schema-guard.ts +143 -0
- package/src/auth/auth-schema.ts +50 -19
- package/src/auth/middleware.ts +17 -5
- package/src/auth/org.ts +15 -3
- package/src/auth/organization-guard.ts +158 -0
- package/src/auth/permissions.ts +31 -8
- package/src/auth/role-authority.ts +107 -0
- package/src/auth/setup.ts +17 -0
- package/src/auth/strict-org-resolution.ts +7 -1
- package/src/auth/types.ts +1 -1
- package/src/config/defaults.ts +2 -0
- package/src/config/types.ts +32 -4
- package/src/hooks/checkout.ts +19 -12
- package/src/index.ts +30 -6
- package/src/interfaces/rest/audit-middleware.ts +2 -0
- package/src/interfaces/rest/customer-portal.ts +31 -24
- package/src/interfaces/rest/index.ts +4 -0
- package/src/interfaces/rest/route-coverage.ts +103 -0
- package/src/interfaces/rest/router.ts +16 -10
- package/src/interfaces/rest/routes/admin/compensation-failures.ts +8 -5
- package/src/interfaces/rest/routes/admin/custom-field-proposals.ts +37 -0
- package/src/interfaces/rest/routes/admin/entity-field-definitions.ts +89 -0
- package/src/interfaces/rest/routes/admin/permissions.ts +3 -1
- package/src/interfaces/rest/routes/admin/staff.ts +161 -72
- package/src/interfaces/rest/routes/admin-jobs.ts +3 -3
- package/src/interfaces/rest/routes/audit.ts +3 -3
- package/src/interfaces/rest/routes/carts.ts +17 -7
- package/src/interfaces/rest/routes/catalog.ts +96 -0
- package/src/interfaces/rest/routes/checkout.ts +41 -38
- package/src/interfaces/rest/routes/documents.ts +15 -1
- package/src/interfaces/rest/routes/inventory.ts +2 -0
- package/src/interfaces/rest/routes/media.ts +8 -3
- package/src/interfaces/rest/routes/orders.ts +27 -8
- package/src/interfaces/rest/routes/pricing.ts +2 -2
- package/src/interfaces/rest/routes/promotions.ts +12 -9
- package/src/interfaces/rest/routes/search.ts +19 -1
- package/src/interfaces/rest/schemas/admin-custom-field-proposals.ts +29 -0
- package/src/interfaces/rest/schemas/admin-entity-field-definitions.ts +120 -0
- package/src/interfaces/rest/schemas/catalog.ts +92 -0
- package/src/interfaces/rest/schemas/search.ts +2 -0
- package/src/interfaces/rest/utils.ts +61 -2
- package/src/kernel/compensation/executor.ts +2 -2
- package/src/kernel/database/tx-context.ts +25 -0
- package/src/kernel/hooks/create-context.ts +3 -0
- package/src/kernel/hooks/types.ts +2 -0
- package/src/kernel/plugin/manifest.ts +9 -5
- package/src/modules/analytics/service.ts +2 -2
- package/src/modules/audit/service.ts +3 -3
- package/src/modules/cart/repository/index.ts +22 -8
- package/src/modules/cart/schema.ts +4 -0
- package/src/modules/cart/service.ts +62 -27
- package/src/modules/catalog/brand-service.ts +7 -7
- package/src/modules/catalog/category-service.ts +7 -7
- package/src/modules/catalog/entity-service.ts +188 -53
- package/src/modules/catalog/module.ts +15 -0
- package/src/modules/catalog/ownership.ts +17 -0
- package/src/modules/catalog/read-policy.ts +16 -0
- package/src/modules/catalog/repository/index.ts +566 -4
- package/src/modules/catalog/revision.ts +35 -0
- package/src/modules/catalog/schema.ts +169 -1
- package/src/modules/catalog/schemas.ts +2 -0
- package/src/modules/catalog/service.ts +766 -26
- package/src/modules/channels/adapter.ts +107 -1
- package/src/modules/customers/module.ts +2 -0
- package/src/modules/customers/service.ts +23 -22
- package/src/modules/documents/module.ts +2 -0
- package/src/modules/documents/service.ts +74 -11
- package/src/modules/fulfillment/module.ts +2 -0
- package/src/modules/fulfillment/service.ts +17 -6
- package/src/modules/inventory/service.ts +15 -24
- package/src/modules/media/module.ts +2 -0
- package/src/modules/media/schema.ts +23 -2
- package/src/modules/media/service.ts +89 -28
- package/src/modules/orders/guest-access.ts +55 -0
- package/src/modules/orders/module.ts +1 -0
- package/src/modules/orders/quote.ts +1 -0
- package/src/modules/orders/repository/index.ts +2 -0
- package/src/modules/orders/schema.ts +5 -3
- package/src/modules/orders/service.ts +302 -52
- package/src/modules/pricing/module.ts +2 -0
- package/src/modules/pricing/schema.ts +1 -0
- package/src/modules/pricing/schemas.ts +1 -0
- package/src/modules/pricing/service.ts +21 -18
- package/src/modules/promotions/module.ts +2 -0
- package/src/modules/promotions/service.ts +25 -16
- package/src/modules/search/adapter.ts +8 -0
- package/src/modules/search/module.ts +3 -0
- package/src/modules/search/service.ts +142 -12
- package/src/modules/settings/module.ts +2 -0
- package/src/modules/settings/service.ts +8 -4
- package/src/modules/shipping/service.ts +9 -9
- package/src/modules/tax/module.ts +1 -0
- package/src/modules/tax/service.ts +13 -9
- package/src/modules/webhooks/hook.ts +2 -2
- package/src/modules/webhooks/module.ts +2 -0
- package/src/modules/webhooks/service.ts +6 -4
- package/src/runtime/server.ts +16 -2
- package/src/test-utils/create-pglite-adapter.ts +34 -12
- package/src/test-utils/create-test-config.ts +10 -6
- package/src/test-utils/rest-api-test-utils.ts +2 -0
- package/src/test-utils/test-actors.ts +2 -2
- package/src/utils/id.ts +20 -0
|
@@ -8,6 +8,7 @@ export interface ChannelConnectorCapabilities {
|
|
|
8
8
|
readonly importCatalog: boolean;
|
|
9
9
|
readonly importInventory: boolean;
|
|
10
10
|
readonly pushOrder: boolean;
|
|
11
|
+
readonly pushCatalog?: boolean;
|
|
11
12
|
readonly receiveWebhooks: boolean;
|
|
12
13
|
readonly reserve?: boolean;
|
|
13
14
|
}
|
|
@@ -20,11 +21,45 @@ export interface ChannelStore {
|
|
|
20
21
|
status: "connected" | "disconnected" | "error";
|
|
21
22
|
webhookSecret: string | null;
|
|
22
23
|
}
|
|
24
|
+
export interface ChannelCatalogLocalizedAttributes {
|
|
25
|
+
locale: string;
|
|
26
|
+
title: string;
|
|
27
|
+
subtitle?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
richDescription?: unknown;
|
|
30
|
+
seoTitle?: string;
|
|
31
|
+
seoDescription?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface ChannelCatalogImage {
|
|
34
|
+
externalId?: string;
|
|
35
|
+
url: string;
|
|
36
|
+
alt?: string;
|
|
37
|
+
role: "primary" | "gallery" | "thumbnail" | "video" | "document";
|
|
38
|
+
sortOrder?: number;
|
|
39
|
+
variantExternalIds?: string[];
|
|
40
|
+
}
|
|
41
|
+
export interface ChannelCatalogOptionType {
|
|
42
|
+
name: string;
|
|
43
|
+
displayName: string;
|
|
44
|
+
sortOrder?: number;
|
|
45
|
+
values: Array<{
|
|
46
|
+
value: string;
|
|
47
|
+
displayValue: string;
|
|
48
|
+
sortOrder?: number;
|
|
49
|
+
}>;
|
|
50
|
+
}
|
|
51
|
+
export interface ChannelCatalogPrice {
|
|
52
|
+
currency: string;
|
|
53
|
+
amount: number;
|
|
54
|
+
compareAtAmount?: number;
|
|
55
|
+
}
|
|
23
56
|
export interface ChannelCatalogVariant {
|
|
24
57
|
externalId: string;
|
|
25
58
|
sku?: string;
|
|
26
59
|
barcode?: string;
|
|
27
60
|
metadata?: Record<string, unknown>;
|
|
61
|
+
optionValues?: Record<string, string>;
|
|
62
|
+
prices?: ChannelCatalogPrice[];
|
|
28
63
|
}
|
|
29
64
|
export interface ChannelCatalogItem {
|
|
30
65
|
externalId: string;
|
|
@@ -33,6 +68,13 @@ export interface ChannelCatalogItem {
|
|
|
33
68
|
description?: string;
|
|
34
69
|
variants: ChannelCatalogVariant[];
|
|
35
70
|
metadata?: Record<string, unknown>;
|
|
71
|
+
attributes?: ChannelCatalogLocalizedAttributes[];
|
|
72
|
+
images?: ChannelCatalogImage[];
|
|
73
|
+
options?: ChannelCatalogOptionType[];
|
|
74
|
+
tags?: string[];
|
|
75
|
+
brand?: string;
|
|
76
|
+
categories?: string[];
|
|
77
|
+
status?: "draft" | "active" | "archived" | "discontinued";
|
|
36
78
|
}
|
|
37
79
|
export interface ChannelCatalogPage {
|
|
38
80
|
items: ChannelCatalogItem[];
|
|
@@ -65,6 +107,46 @@ export interface ChannelPushOrderResult {
|
|
|
65
107
|
remoteOrderId: string;
|
|
66
108
|
remoteUrl?: string;
|
|
67
109
|
}
|
|
110
|
+
export type ChannelPushCatalogIntent = "filterable" | "display" | "tag";
|
|
111
|
+
export interface ChannelPushCatalogField {
|
|
112
|
+
fieldPath: string;
|
|
113
|
+
intent: ChannelPushCatalogIntent;
|
|
114
|
+
value: unknown;
|
|
115
|
+
locale?: string;
|
|
116
|
+
remoteKey?: string;
|
|
117
|
+
}
|
|
118
|
+
export interface ChannelPushCatalogImage {
|
|
119
|
+
externalId?: string;
|
|
120
|
+
url: string;
|
|
121
|
+
alt?: string;
|
|
122
|
+
role: "primary" | "gallery" | "thumbnail" | "video" | "document";
|
|
123
|
+
sortOrder?: number;
|
|
124
|
+
variantExternalIds?: string[];
|
|
125
|
+
}
|
|
126
|
+
export interface ChannelPushCatalogVariant {
|
|
127
|
+
externalId: string;
|
|
128
|
+
fields: ChannelPushCatalogField[];
|
|
129
|
+
}
|
|
130
|
+
export interface ChannelPushCatalogItem {
|
|
131
|
+
externalId: string;
|
|
132
|
+
variants?: ChannelPushCatalogVariant[];
|
|
133
|
+
fields: ChannelPushCatalogField[];
|
|
134
|
+
images?: ChannelPushCatalogImage[];
|
|
135
|
+
}
|
|
136
|
+
export interface ChannelPushCatalogPreviousField {
|
|
137
|
+
fieldPath: string;
|
|
138
|
+
value: unknown;
|
|
139
|
+
}
|
|
140
|
+
export interface ChannelPushCatalogItemOutcome {
|
|
141
|
+
externalId: string;
|
|
142
|
+
ok: boolean;
|
|
143
|
+
error?: ChannelConnectorError;
|
|
144
|
+
remoteUpdatedAt?: string;
|
|
145
|
+
previousFields?: ChannelPushCatalogPreviousField[];
|
|
146
|
+
}
|
|
147
|
+
export interface ChannelPushCatalogResult {
|
|
148
|
+
outcomes: ChannelPushCatalogItemOutcome[];
|
|
149
|
+
}
|
|
68
150
|
export interface ChannelOrderStatus {
|
|
69
151
|
status: "pending" | "confirmed" | "failed" | "cancelled" | "fulfilled";
|
|
70
152
|
}
|
|
@@ -100,6 +182,9 @@ export interface ChannelConnector {
|
|
|
100
182
|
importCatalog(store: ChannelStore, cursor?: string): Promise<Result<ChannelCatalogPage>>;
|
|
101
183
|
fetchInventory(store: ChannelStore, ids?: string[]): Promise<Result<ChannelInventoryLevel[]>>;
|
|
102
184
|
pushOrder(store: ChannelStore, slice: ChannelOrderSlice): Promise<Result<ChannelPushOrderResult, ChannelConnectorError>>;
|
|
185
|
+
pushCatalog?(store: ChannelStore, items: ChannelPushCatalogItem[], opts?: {
|
|
186
|
+
dryRun?: boolean;
|
|
187
|
+
}): Promise<Result<ChannelPushCatalogResult, ChannelConnectorError>>;
|
|
103
188
|
fetchOrderStatus(store: ChannelStore, remoteId: string): Promise<Result<ChannelOrderStatus, ChannelConnectorError>>;
|
|
104
189
|
verifyWebhook(store: ChannelStore, request: Request): Promise<Result<ChannelWebhookEvent>>;
|
|
105
190
|
verifyAppWebhook?(request: Request): Promise<Result<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/channels/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC;IAC/C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/channels/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
export function defineChannelConnector(connector) {
|
|
2
|
-
|
|
2
|
+
if (connector.capabilities.pushCatalog !== undefined)
|
|
3
|
+
return connector;
|
|
4
|
+
return {
|
|
5
|
+
...connector,
|
|
6
|
+
capabilities: {
|
|
7
|
+
...connector.capabilities,
|
|
8
|
+
pushCatalog: false,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
3
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQ/C,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CAgB1B,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Actor } from "../../auth/types.js";
|
|
2
|
+
import type { CommerceConfig } from "../../config/types.js";
|
|
2
3
|
import type { HookRegistry } from "../../kernel/hooks/registry.js";
|
|
3
4
|
import { type Result } from "../../kernel/result.js";
|
|
4
5
|
import type { DatabaseAdapter } from "../../kernel/database/adapter.js";
|
|
@@ -7,6 +8,7 @@ import type { CustomersRepository, Customer, CustomerAddress, CustomerAddressIns
|
|
|
7
8
|
interface CustomerServiceDeps {
|
|
8
9
|
repository: CustomersRepository;
|
|
9
10
|
hooks: HookRegistry;
|
|
11
|
+
config: CommerceConfig;
|
|
10
12
|
services: Record<string, unknown>;
|
|
11
13
|
database: DatabaseAdapter;
|
|
12
14
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/customers/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
import { assertPermission } from "../../auth/permissions.js";
|
|
3
3
|
import { CommerceNotFoundError, toCommerceError } from "../../kernel/errors.js";
|
|
4
4
|
import { runAfterHooks } from "../../kernel/hooks/executor.js";
|
|
5
5
|
import { createHookContext } from "../../kernel/hooks/create-context.js";
|
|
6
6
|
import { Err, Ok } from "../../kernel/result.js";
|
|
7
7
|
import { createLogger } from "../../utils/logger.js";
|
|
8
|
-
function hookContext(actor, services, database, tx) {
|
|
8
|
+
function hookContext(actor, services, database, config, tx) {
|
|
9
9
|
return createHookContext({
|
|
10
10
|
actor,
|
|
11
11
|
tx,
|
|
@@ -13,6 +13,7 @@ function hookContext(actor, services, database, tx) {
|
|
|
13
13
|
services,
|
|
14
14
|
context: { moduleName: "customers" },
|
|
15
15
|
database: { db: database.db },
|
|
16
|
+
commerceConfig: config,
|
|
16
17
|
});
|
|
17
18
|
}
|
|
18
19
|
export class CustomerService {
|
|
@@ -35,7 +36,7 @@ export class CustomerService {
|
|
|
35
36
|
catch (error) {
|
|
36
37
|
return Err(toCommerceError(error));
|
|
37
38
|
}
|
|
38
|
-
const orgId =
|
|
39
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
39
40
|
const isWalkIn = input.userId === undefined;
|
|
40
41
|
const userId = input.userId ?? `anonymous_${crypto.randomUUID()}`;
|
|
41
42
|
const metadata = {
|
|
@@ -52,7 +53,7 @@ export class CustomerService {
|
|
|
52
53
|
...(input.email !== undefined ? { email: input.email } : {}),
|
|
53
54
|
}, ctx);
|
|
54
55
|
const afterHooks = this.deps.hooks.resolve("customers.afterCreate");
|
|
55
|
-
const hctx = hookContext(actor ?? null, this.deps.services, this.deps.database, ctx?.tx ?? null);
|
|
56
|
+
const hctx = hookContext(actor ?? null, this.deps.services, this.deps.database, this.deps.config, ctx?.tx ?? null);
|
|
56
57
|
await runAfterHooks(afterHooks, null, customer, "create", hctx);
|
|
57
58
|
return Ok(customer);
|
|
58
59
|
}
|
|
@@ -64,7 +65,7 @@ export class CustomerService {
|
|
|
64
65
|
catch (error) {
|
|
65
66
|
return Err(toCommerceError(error));
|
|
66
67
|
}
|
|
67
|
-
const orgId =
|
|
68
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
68
69
|
return Ok(await this.repo.listInteractions(orgId, customerId, ctx));
|
|
69
70
|
}
|
|
70
71
|
async createInteraction(customerId, input, actor, ctx) {
|
|
@@ -74,7 +75,7 @@ export class CustomerService {
|
|
|
74
75
|
catch (error) {
|
|
75
76
|
return Err(toCommerceError(error));
|
|
76
77
|
}
|
|
77
|
-
const orgId =
|
|
78
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
78
79
|
const customer = await this.repo.findById(orgId, customerId, ctx);
|
|
79
80
|
if (!customer)
|
|
80
81
|
return Err(new CommerceNotFoundError("Customer not found."));
|
|
@@ -96,7 +97,7 @@ export class CustomerService {
|
|
|
96
97
|
catch (error) {
|
|
97
98
|
return Err(toCommerceError(error));
|
|
98
99
|
}
|
|
99
|
-
const orgId =
|
|
100
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
100
101
|
const existing = await this.repo.findInteractionById(orgId, interactionId, ctx);
|
|
101
102
|
if (!existing || existing.customerId !== customerId)
|
|
102
103
|
return Err(new CommerceNotFoundError("Interaction not found."));
|
|
@@ -118,7 +119,7 @@ export class CustomerService {
|
|
|
118
119
|
catch (error) {
|
|
119
120
|
return Err(toCommerceError(error));
|
|
120
121
|
}
|
|
121
|
-
const orgId =
|
|
122
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
122
123
|
const existing = await this.repo.findInteractionById(orgId, interactionId, ctx);
|
|
123
124
|
if (!existing || existing.customerId !== customerId)
|
|
124
125
|
return Err(new CommerceNotFoundError("Interaction not found."));
|
|
@@ -136,24 +137,24 @@ export class CustomerService {
|
|
|
136
137
|
metadata: {},
|
|
137
138
|
}, ctx);
|
|
138
139
|
const afterHooks = this.deps.hooks.resolve("customers.afterCreate");
|
|
139
|
-
const hctx = hookContext(actor, this.deps.services, this.deps.database, ctx?.tx ?? null);
|
|
140
|
+
const hctx = hookContext(actor, this.deps.services, this.deps.database, this.deps.config, ctx?.tx ?? null);
|
|
140
141
|
await runAfterHooks(afterHooks, null, customer, "create", hctx);
|
|
141
142
|
return customer;
|
|
142
143
|
}
|
|
143
144
|
async list(actor, ctx) {
|
|
144
|
-
const orgId =
|
|
145
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
145
146
|
const customers = await this.repo.findAll(orgId, ctx);
|
|
146
147
|
return Ok(customers);
|
|
147
148
|
}
|
|
148
149
|
async getById(id, actor, ctx) {
|
|
149
|
-
const orgId =
|
|
150
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
150
151
|
const customer = await this.repo.findById(orgId, id, ctx);
|
|
151
152
|
if (!customer)
|
|
152
153
|
return Err(new CommerceNotFoundError("Customer not found."));
|
|
153
154
|
return Ok(customer);
|
|
154
155
|
}
|
|
155
156
|
async getByUserId(userId, actor, ctx) {
|
|
156
|
-
const orgId =
|
|
157
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
157
158
|
const resolvedActor = actor ?? ctx?.actor ?? null;
|
|
158
159
|
const customer = await this.getOrCreateByUserId(orgId, userId, resolvedActor, ctx);
|
|
159
160
|
return Ok(customer);
|
|
@@ -165,7 +166,7 @@ export class CustomerService {
|
|
|
165
166
|
catch (error) {
|
|
166
167
|
return Err(toCommerceError(error));
|
|
167
168
|
}
|
|
168
|
-
const orgId =
|
|
169
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
169
170
|
const existing = await this.repo.findById(orgId, id, ctx);
|
|
170
171
|
if (!existing)
|
|
171
172
|
return Err(new CommerceNotFoundError("Customer not found."));
|
|
@@ -185,12 +186,12 @@ export class CustomerService {
|
|
|
185
186
|
if (!updated)
|
|
186
187
|
return Err(new CommerceNotFoundError("Customer not found."));
|
|
187
188
|
const afterHooks = this.deps.hooks.resolve("customers.afterUpdate");
|
|
188
|
-
const hctx = hookContext(actor ?? ctx?.actor ?? null, this.deps.services, this.deps.database, ctx?.tx ?? null);
|
|
189
|
+
const hctx = hookContext(actor ?? ctx?.actor ?? null, this.deps.services, this.deps.database, this.deps.config, ctx?.tx ?? null);
|
|
189
190
|
await runAfterHooks(afterHooks, existing, updated, "update", hctx);
|
|
190
191
|
return Ok(updated);
|
|
191
192
|
}
|
|
192
193
|
async updateByUserId(userId, updates, actor, ctx) {
|
|
193
|
-
const orgId =
|
|
194
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
194
195
|
const resolvedActor = actor ?? ctx?.actor ?? null;
|
|
195
196
|
const customer = await this.getOrCreateByUserId(orgId, userId, resolvedActor, ctx);
|
|
196
197
|
const updated = await this.repo.update(customer.id, updates, ctx);
|
|
@@ -198,19 +199,19 @@ export class CustomerService {
|
|
|
198
199
|
return Err(new CommerceNotFoundError("Customer not found."));
|
|
199
200
|
}
|
|
200
201
|
const afterHooks = this.deps.hooks.resolve("customers.afterUpdate");
|
|
201
|
-
const hctx = hookContext(resolvedActor, this.deps.services, this.deps.database, ctx?.tx ?? null);
|
|
202
|
+
const hctx = hookContext(resolvedActor, this.deps.services, this.deps.database, this.deps.config, ctx?.tx ?? null);
|
|
202
203
|
await runAfterHooks(afterHooks, customer, updated, "update", hctx);
|
|
203
204
|
return Ok(updated);
|
|
204
205
|
}
|
|
205
206
|
async getAddresses(userId, actor, ctx) {
|
|
206
|
-
const orgId =
|
|
207
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
207
208
|
const resolvedActor = actor ?? ctx?.actor ?? null;
|
|
208
209
|
const customer = await this.getOrCreateByUserId(orgId, userId, resolvedActor, ctx);
|
|
209
210
|
const addresses = await this.repo.findAddressesByCustomerId(customer.id, ctx);
|
|
210
211
|
return Ok(addresses);
|
|
211
212
|
}
|
|
212
213
|
async addAddress(userId, input, actor, ctx) {
|
|
213
|
-
const orgId =
|
|
214
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
214
215
|
const resolvedActor = actor ?? ctx?.actor ?? null;
|
|
215
216
|
const customer = await this.getOrCreateByUserId(orgId, userId, resolvedActor, ctx);
|
|
216
217
|
if (input.isDefault) {
|
|
@@ -228,7 +229,7 @@ export class CustomerService {
|
|
|
228
229
|
return Ok(address);
|
|
229
230
|
}
|
|
230
231
|
async deleteAddress(userId, addressId, actor, ctx) {
|
|
231
|
-
const orgId =
|
|
232
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
232
233
|
const resolvedActor = actor ?? ctx?.actor ?? null;
|
|
233
234
|
const customer = await this.getOrCreateByUserId(orgId, userId, resolvedActor, ctx);
|
|
234
235
|
const addresses = await this.repo.findAddressesByCustomerId(customer.id, ctx);
|
|
@@ -240,7 +241,7 @@ export class CustomerService {
|
|
|
240
241
|
return Ok(undefined);
|
|
241
242
|
}
|
|
242
243
|
async findPOSOperatorByPin(hashedPin, actor, ctx) {
|
|
243
|
-
const orgId =
|
|
244
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
244
245
|
const user = await this.repo.findByPosPin(orgId, hashedPin, ctx);
|
|
245
246
|
if (!user)
|
|
246
247
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/documents/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/documents/module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,eAAO,MAAM,eAAe;sBACN,OAAO,gBAAgB;oBAAkB,OAAO,cAAc;2CAYlF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Actor } from "../../auth/types.js";
|
|
2
|
+
import type { CommerceConfig } from "../../config/types.js";
|
|
2
3
|
import type { TxContext } from "../../kernel/database/tx-context.js";
|
|
3
4
|
import { type Result } from "../../kernel/result.js";
|
|
4
5
|
import type { HydratedOrder } from "../orders/service.js";
|
|
@@ -6,6 +7,7 @@ import type { DocumentsRepository, OrderDocument } from "./repository/index.js";
|
|
|
6
7
|
interface DocumentsServiceDeps {
|
|
7
8
|
repository: DocumentsRepository;
|
|
8
9
|
services: Record<string, unknown>;
|
|
10
|
+
config: CommerceConfig;
|
|
9
11
|
}
|
|
10
12
|
/**
|
|
11
13
|
* Order document rendering + fiscal numbering (issue #47).
|
|
@@ -13,6 +15,7 @@ interface DocumentsServiceDeps {
|
|
|
13
15
|
export declare class DocumentsService {
|
|
14
16
|
private repository;
|
|
15
17
|
private services;
|
|
18
|
+
private config;
|
|
16
19
|
constructor(deps: DocumentsServiceDeps);
|
|
17
20
|
private get orders();
|
|
18
21
|
private get settings();
|
|
@@ -25,23 +28,34 @@ export declare class DocumentsService {
|
|
|
25
28
|
*/
|
|
26
29
|
issueInvoiceNumber(order: HydratedOrder, ctx?: TxContext): Promise<OrderDocument>;
|
|
27
30
|
private loadOrder;
|
|
28
|
-
renderInvoiceHtml(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
|
|
31
|
+
renderInvoiceHtml(orderId: string, actor: Actor | null, ctx?: TxContext, guestCredential?: string): Promise<Result<{
|
|
29
32
|
html: string;
|
|
30
33
|
invoiceNumber: string;
|
|
31
34
|
}>>;
|
|
32
|
-
renderInvoicePdf(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
|
|
35
|
+
renderInvoicePdf(orderId: string, actor: Actor | null, ctx?: TxContext, guestCredential?: string): Promise<Result<{
|
|
33
36
|
pdf: Uint8Array;
|
|
34
37
|
invoiceNumber: string;
|
|
35
38
|
}>>;
|
|
36
|
-
renderReceiptHtml(orderId: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
|
|
39
|
+
renderReceiptHtml(orderId: string, actor: Actor | null, ctx?: TxContext, guestCredential?: string): Promise<Result<{
|
|
37
40
|
html: string;
|
|
38
41
|
}>>;
|
|
42
|
+
/**
|
|
43
|
+
* The address that belongs to this order: its customer profile's email.
|
|
44
|
+
* A guest order has no customer profile and therefore no address of its own.
|
|
45
|
+
*/
|
|
46
|
+
private orderEmail;
|
|
39
47
|
/**
|
|
40
48
|
* Emails the invoice via the configured email adapter. The adapter's
|
|
41
49
|
* template contract is (template, to, data) — the rendered HTML and the
|
|
42
50
|
* fiscal number ride in `data` so template-based adapters can use either.
|
|
51
|
+
*
|
|
52
|
+
* The destination is the order's own address, not the caller's choice. A
|
|
53
|
+
* cart secret authorizes reading an order, and a caller-supplied `to` turned
|
|
54
|
+
* that read into delivery: items, totals and shipping address mailed to any
|
|
55
|
+
* address, with nothing left in the shopper's inbox. Only staff holding
|
|
56
|
+
* org-wide `orders:read` may name a different recipient.
|
|
43
57
|
*/
|
|
44
|
-
emailInvoice(orderId: string, to: string, actor: Actor | null, ctx?: TxContext): Promise<Result<{
|
|
58
|
+
emailInvoice(orderId: string, to: string, actor: Actor | null, ctx?: TxContext, guestCredential?: string): Promise<Result<{
|
|
45
59
|
sent: true;
|
|
46
60
|
invoiceNumber: string;
|
|
47
61
|
to: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/documents/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/documents/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAGrE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AASxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEhF,UAAU,oBAAoB;IAC5B,UAAU,EAAE,mBAAmB,CAAC;IAGhC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,cAAc,CAAC;CACxB;AAgBD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,MAAM,CAAiB;gBAEnB,IAAI,EAAE,oBAAoB;IAMtC,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,QAAQ,GAEnB;YAEa,WAAW;IAIzB;;;;;OAKG;IACG,kBAAkB,CACtB,KAAK,EAAE,aAAa,EACpB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,aAAa,CAAC;YA0BX,SAAS;IASjB,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,GAAG,CAAC,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAWrD,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,GAAG,CAAC,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAaxD,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,GAAG,CAAC,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAOpC;;;OAGG;YACW,UAAU;IAYxB;;;;;;;;;;OAUG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,GAAG,CAAC,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAiDtE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
|
+
import { hasPermission } from "../../auth/permissions.js";
|
|
3
|
+
import { CommerceForbiddenError, CommerceValidationError } from "../../kernel/errors.js";
|
|
3
4
|
import { Err, Ok } from "../../kernel/result.js";
|
|
4
5
|
import { buildPdf } from "./pdf.js";
|
|
5
6
|
import { invoiceHtml, invoicePdfOps, receiptHtml, } from "./render.js";
|
|
@@ -10,9 +11,11 @@ const DEFAULT_INVOICE_PREFIX = "INV-";
|
|
|
10
11
|
export class DocumentsService {
|
|
11
12
|
repository;
|
|
12
13
|
services;
|
|
14
|
+
config;
|
|
13
15
|
constructor(deps) {
|
|
14
16
|
this.repository = deps.repository;
|
|
15
17
|
this.services = deps.services;
|
|
18
|
+
this.config = deps.config;
|
|
16
19
|
}
|
|
17
20
|
get orders() {
|
|
18
21
|
return this.services.orders;
|
|
@@ -51,11 +54,11 @@ export class DocumentsService {
|
|
|
51
54
|
throw error;
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
|
-
async loadOrder(orderId, actor, ctx) {
|
|
55
|
-
return this.orders.getById(orderId, actor, ctx);
|
|
57
|
+
async loadOrder(orderId, actor, ctx, guestCredential) {
|
|
58
|
+
return this.orders.getById(orderId, actor, ctx, guestCredential);
|
|
56
59
|
}
|
|
57
|
-
async renderInvoiceHtml(orderId, actor, ctx) {
|
|
58
|
-
const order = await this.loadOrder(orderId, actor, ctx);
|
|
60
|
+
async renderInvoiceHtml(orderId, actor, ctx, guestCredential) {
|
|
61
|
+
const order = await this.loadOrder(orderId, actor, ctx, guestCredential);
|
|
59
62
|
if (!order.ok)
|
|
60
63
|
return order;
|
|
61
64
|
const branding = await this.brandingFor(order.value.organizationId, ctx);
|
|
@@ -65,8 +68,8 @@ export class DocumentsService {
|
|
|
65
68
|
invoiceNumber: doc.documentNumber,
|
|
66
69
|
});
|
|
67
70
|
}
|
|
68
|
-
async renderInvoicePdf(orderId, actor, ctx) {
|
|
69
|
-
const order = await this.loadOrder(orderId, actor, ctx);
|
|
71
|
+
async renderInvoicePdf(orderId, actor, ctx, guestCredential) {
|
|
72
|
+
const order = await this.loadOrder(orderId, actor, ctx, guestCredential);
|
|
70
73
|
if (!order.ok)
|
|
71
74
|
return order;
|
|
72
75
|
const branding = await this.brandingFor(order.value.organizationId, ctx);
|
|
@@ -78,34 +81,69 @@ export class DocumentsService {
|
|
|
78
81
|
});
|
|
79
82
|
return Ok({ pdf: buildPdf(pages), invoiceNumber: doc.documentNumber });
|
|
80
83
|
}
|
|
81
|
-
async renderReceiptHtml(orderId, actor, ctx) {
|
|
82
|
-
const order = await this.loadOrder(orderId, actor, ctx);
|
|
84
|
+
async renderReceiptHtml(orderId, actor, ctx, guestCredential) {
|
|
85
|
+
const order = await this.loadOrder(orderId, actor, ctx, guestCredential);
|
|
83
86
|
if (!order.ok)
|
|
84
87
|
return order;
|
|
85
88
|
const branding = await this.brandingFor(order.value.organizationId, ctx);
|
|
86
89
|
return Ok({ html: receiptHtml({ order: order.value, branding }) });
|
|
87
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* The address that belongs to this order: its customer profile's email.
|
|
93
|
+
* A guest order has no customer profile and therefore no address of its own.
|
|
94
|
+
*/
|
|
95
|
+
async orderEmail(order, actor, ctx) {
|
|
96
|
+
if (!order.customerId)
|
|
97
|
+
return null;
|
|
98
|
+
const customers = this.services.customers;
|
|
99
|
+
if (!customers)
|
|
100
|
+
return null;
|
|
101
|
+
const customer = await customers.getById(order.customerId, actor, ctx);
|
|
102
|
+
return customer.ok ? (customer.value.email ?? null) : null;
|
|
103
|
+
}
|
|
88
104
|
/**
|
|
89
105
|
* Emails the invoice via the configured email adapter. The adapter's
|
|
90
106
|
* template contract is (template, to, data) — the rendered HTML and the
|
|
91
107
|
* fiscal number ride in `data` so template-based adapters can use either.
|
|
108
|
+
*
|
|
109
|
+
* The destination is the order's own address, not the caller's choice. A
|
|
110
|
+
* cart secret authorizes reading an order, and a caller-supplied `to` turned
|
|
111
|
+
* that read into delivery: items, totals and shipping address mailed to any
|
|
112
|
+
* address, with nothing left in the shopper's inbox. Only staff holding
|
|
113
|
+
* org-wide `orders:read` may name a different recipient.
|
|
92
114
|
*/
|
|
93
|
-
async emailInvoice(orderId, to, actor, ctx) {
|
|
115
|
+
async emailInvoice(orderId, to, actor, ctx, guestCredential) {
|
|
94
116
|
const email = this.services.email;
|
|
95
117
|
if (!email) {
|
|
96
118
|
return Err(new CommerceValidationError("No email adapter is configured."));
|
|
97
119
|
}
|
|
98
|
-
const rendered = await this.renderInvoiceHtml(orderId, actor, ctx);
|
|
120
|
+
const rendered = await this.renderInvoiceHtml(orderId, actor, ctx, guestCredential);
|
|
99
121
|
if (!rendered.ok)
|
|
100
122
|
return rendered;
|
|
101
|
-
const order = await this.loadOrder(orderId, actor, ctx);
|
|
123
|
+
const order = await this.loadOrder(orderId, actor, ctx, guestCredential);
|
|
102
124
|
if (!order.ok)
|
|
103
125
|
return order;
|
|
126
|
+
const ownAddress = await this.orderEmail(order.value, actor, ctx);
|
|
127
|
+
const mayDirect = hasPermission(actor, "orders:read");
|
|
128
|
+
const requested = to.trim();
|
|
129
|
+
let destination;
|
|
130
|
+
if (mayDirect && requested.length > 0) {
|
|
131
|
+
destination = requested;
|
|
132
|
+
}
|
|
133
|
+
else if (ownAddress === null) {
|
|
134
|
+
return Err(new CommerceValidationError("This order has no email address of its own. Render the invoice instead, or send it as staff."));
|
|
135
|
+
}
|
|
136
|
+
else if (requested.length > 0 && requested.toLowerCase() !== ownAddress.toLowerCase()) {
|
|
137
|
+
return Err(new CommerceForbiddenError("An invoice can only be emailed to the address on the order."));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
destination = ownAddress;
|
|
141
|
+
}
|
|
104
142
|
await email.send({
|
|
105
143
|
template: "order-invoice",
|
|
106
|
-
to,
|
|
144
|
+
to: destination,
|
|
107
145
|
data: {
|
|
108
|
-
orgId:
|
|
146
|
+
orgId: resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config),
|
|
109
147
|
orderId,
|
|
110
148
|
orderNumber: order.value.orderNumber,
|
|
111
149
|
invoiceNumber: rendered.value.invoiceNumber,
|
|
@@ -114,6 +152,6 @@ export class DocumentsService {
|
|
|
114
152
|
html: rendered.value.html,
|
|
115
153
|
},
|
|
116
154
|
});
|
|
117
|
-
return Ok({ sent: true, invoiceNumber: rendered.value.invoiceNumber, to });
|
|
155
|
+
return Ok({ sent: true, invoiceNumber: rendered.value.invoiceNumber, to: destination });
|
|
118
156
|
}
|
|
119
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/fulfillment/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/fulfillment/module.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,KAAK,qBAAqB,GAAG;IAC3B,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,iBAAiB;wBAEN,OAAO,kBAAkB;0BACvB,OAAO,oBAAoB;uBAC9B,OAAO,iBAAiB;6CAsB7C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Actor } from "../../auth/types.js";
|
|
2
|
+
import type { CommerceConfig } from "../../config/types.js";
|
|
2
3
|
import type { DatabaseAdapter } from "../../kernel/database/adapter.js";
|
|
3
4
|
import type { TxContext } from "../../kernel/database/tx-context.js";
|
|
4
5
|
import type { HookRegistry } from "../../kernel/hooks/registry.js";
|
|
@@ -29,6 +30,7 @@ interface FulfillmentServiceDeps {
|
|
|
29
30
|
ordersRepository: OrdersRepository;
|
|
30
31
|
inventoryService?: InventoryServiceLike;
|
|
31
32
|
hooks: HookRegistry;
|
|
33
|
+
config: CommerceConfig;
|
|
32
34
|
services: Record<string, unknown>;
|
|
33
35
|
database: DatabaseAdapter;
|
|
34
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/fulfillment/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/fulfillment/service.ts"],"names":[],"mappings":"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"}
|