@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
|
@@ -263,6 +263,23 @@ export declare const OrderSchema: import("drizzle-zod").BuildSchema<"select", {
|
|
|
263
263
|
identity: undefined;
|
|
264
264
|
generated: undefined;
|
|
265
265
|
}, {}, {}>;
|
|
266
|
+
idempotencyScope: import("drizzle-orm/pg-core").PgColumn<{
|
|
267
|
+
name: "idempotency_scope";
|
|
268
|
+
tableName: "orders";
|
|
269
|
+
dataType: "string";
|
|
270
|
+
columnType: "PgText";
|
|
271
|
+
data: string;
|
|
272
|
+
driverParam: string;
|
|
273
|
+
notNull: false;
|
|
274
|
+
hasDefault: false;
|
|
275
|
+
isPrimaryKey: false;
|
|
276
|
+
isAutoincrement: false;
|
|
277
|
+
hasRuntimeDefault: false;
|
|
278
|
+
enumValues: [string, ...string[]];
|
|
279
|
+
baseColumn: never;
|
|
280
|
+
identity: undefined;
|
|
281
|
+
generated: undefined;
|
|
282
|
+
}, {}, {}>;
|
|
266
283
|
metadata: import("drizzle-orm/pg-core").PgColumn<{
|
|
267
284
|
name: "metadata";
|
|
268
285
|
tableName: "orders";
|
|
@@ -908,6 +925,7 @@ export declare const OrderWithItemsSchema: z.ZodObject<{
|
|
|
908
925
|
paymentIntentId: z.ZodNullable<z.ZodString>;
|
|
909
926
|
paymentMethodId: z.ZodNullable<z.ZodString>;
|
|
910
927
|
idempotencyKey: z.ZodNullable<z.ZodString>;
|
|
928
|
+
idempotencyScope: z.ZodNullable<z.ZodString>;
|
|
911
929
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
912
930
|
placedAt: z.ZodDate;
|
|
913
931
|
fulfilledAt: z.ZodNullable<z.ZodDate>;
|
|
@@ -1033,6 +1051,23 @@ export declare const CartSchema: import("drizzle-zod").BuildSchema<"select", {
|
|
|
1033
1051
|
identity: undefined;
|
|
1034
1052
|
generated: undefined;
|
|
1035
1053
|
}, {}, {}>;
|
|
1054
|
+
checkoutClaimToken: import("drizzle-orm/pg-core").PgColumn<{
|
|
1055
|
+
name: "checkout_claim_token";
|
|
1056
|
+
tableName: "carts";
|
|
1057
|
+
dataType: "string";
|
|
1058
|
+
columnType: "PgText";
|
|
1059
|
+
data: string;
|
|
1060
|
+
driverParam: string;
|
|
1061
|
+
notNull: false;
|
|
1062
|
+
hasDefault: false;
|
|
1063
|
+
isPrimaryKey: false;
|
|
1064
|
+
isAutoincrement: false;
|
|
1065
|
+
hasRuntimeDefault: false;
|
|
1066
|
+
enumValues: [string, ...string[]];
|
|
1067
|
+
baseColumn: never;
|
|
1068
|
+
identity: undefined;
|
|
1069
|
+
generated: undefined;
|
|
1070
|
+
}, {}, {}>;
|
|
1036
1071
|
metadata: import("drizzle-orm/pg-core").PgColumn<{
|
|
1037
1072
|
name: "metadata";
|
|
1038
1073
|
tableName: "carts";
|
|
@@ -1472,6 +1507,7 @@ export declare const CartWithItemsSchema: z.ZodObject<{
|
|
|
1472
1507
|
currency: z.ZodString;
|
|
1473
1508
|
email: z.ZodNullable<z.ZodString>;
|
|
1474
1509
|
secret: z.ZodNullable<z.ZodString>;
|
|
1510
|
+
checkoutClaimToken: z.ZodNullable<z.ZodString>;
|
|
1475
1511
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
1476
1512
|
expiresAt: z.ZodDate;
|
|
1477
1513
|
createdAt: z.ZodDate;
|
|
@@ -2646,6 +2682,23 @@ export declare const OrderResponse: z.ZodObject<{
|
|
|
2646
2682
|
identity: undefined;
|
|
2647
2683
|
generated: undefined;
|
|
2648
2684
|
}, {}, {}>;
|
|
2685
|
+
idempotencyScope: import("drizzle-orm/pg-core").PgColumn<{
|
|
2686
|
+
name: "idempotency_scope";
|
|
2687
|
+
tableName: "orders";
|
|
2688
|
+
dataType: "string";
|
|
2689
|
+
columnType: "PgText";
|
|
2690
|
+
data: string;
|
|
2691
|
+
driverParam: string;
|
|
2692
|
+
notNull: false;
|
|
2693
|
+
hasDefault: false;
|
|
2694
|
+
isPrimaryKey: false;
|
|
2695
|
+
isAutoincrement: false;
|
|
2696
|
+
hasRuntimeDefault: false;
|
|
2697
|
+
enumValues: [string, ...string[]];
|
|
2698
|
+
baseColumn: never;
|
|
2699
|
+
identity: undefined;
|
|
2700
|
+
generated: undefined;
|
|
2701
|
+
}, {}, {}>;
|
|
2649
2702
|
metadata: import("drizzle-orm/pg-core").PgColumn<{
|
|
2650
2703
|
name: "metadata";
|
|
2651
2704
|
tableName: "orders";
|
|
@@ -2977,6 +3030,23 @@ export declare const OrderListResponse: z.ZodObject<{
|
|
|
2977
3030
|
identity: undefined;
|
|
2978
3031
|
generated: undefined;
|
|
2979
3032
|
}, {}, {}>;
|
|
3033
|
+
idempotencyScope: import("drizzle-orm/pg-core").PgColumn<{
|
|
3034
|
+
name: "idempotency_scope";
|
|
3035
|
+
tableName: "orders";
|
|
3036
|
+
dataType: "string";
|
|
3037
|
+
columnType: "PgText";
|
|
3038
|
+
data: string;
|
|
3039
|
+
driverParam: string;
|
|
3040
|
+
notNull: false;
|
|
3041
|
+
hasDefault: false;
|
|
3042
|
+
isPrimaryKey: false;
|
|
3043
|
+
isAutoincrement: false;
|
|
3044
|
+
hasRuntimeDefault: false;
|
|
3045
|
+
enumValues: [string, ...string[]];
|
|
3046
|
+
baseColumn: never;
|
|
3047
|
+
identity: undefined;
|
|
3048
|
+
generated: undefined;
|
|
3049
|
+
}, {}, {}>;
|
|
2980
3050
|
metadata: import("drizzle-orm/pg-core").PgColumn<{
|
|
2981
3051
|
name: "metadata";
|
|
2982
3052
|
tableName: "orders";
|
|
@@ -3247,6 +3317,7 @@ export declare const CartResponse: z.ZodObject<{
|
|
|
3247
3317
|
currency: z.ZodString;
|
|
3248
3318
|
email: z.ZodNullable<z.ZodString>;
|
|
3249
3319
|
secret: z.ZodNullable<z.ZodString>;
|
|
3320
|
+
checkoutClaimToken: z.ZodNullable<z.ZodString>;
|
|
3250
3321
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
3251
3322
|
expiresAt: z.ZodDate;
|
|
3252
3323
|
createdAt: z.ZodDate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/responses.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAStC,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/responses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;AAKnD,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;AAKnD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCtB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkBvB,CAAC"}
|
|
@@ -6,6 +6,7 @@ export const searchRoute = createRoute({
|
|
|
6
6
|
path: "/",
|
|
7
7
|
tags: ["Search"],
|
|
8
8
|
summary: "Search catalog entities",
|
|
9
|
+
description: "Attribute filters use repeatable `attr.<name>=<value>` query parameters: repeated values for one name are ORed, distinct names are ANDed. Attribute names must match `^[A-Za-z0-9_-]+$`; anything else returns 422. Request attribute facet counts by naming the attribute in `facets`.",
|
|
9
10
|
request: {
|
|
10
11
|
query: z.object({
|
|
11
12
|
q: z.string().max(500).optional(),
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { mapErrorToStatus } from "../../kernel/error-mapper.js";
|
|
2
2
|
import type { Actor } from "../../auth/types.js";
|
|
3
|
+
export declare const ROUTE_PERMISSION_GUARD: unique symbol;
|
|
4
|
+
export declare function markRoutePermissionGuard<T>(handler: T, methods?: readonly string[]): T;
|
|
5
|
+
type PermissionContext = {
|
|
6
|
+
get(key: string): unknown;
|
|
7
|
+
json(data: unknown, status: number): unknown;
|
|
8
|
+
req: {
|
|
9
|
+
method: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
3
12
|
/**
|
|
4
13
|
* Shared Hono environment type for all sub-routers.
|
|
5
14
|
* Matches the Variables set by middleware in the top-level server app.
|
|
@@ -37,6 +46,12 @@ export declare function requirePerm(permission: string): (c: {
|
|
|
37
46
|
get(key: string): unknown;
|
|
38
47
|
json(data: unknown, status: number): unknown;
|
|
39
48
|
}, next: () => Promise<void>) => Promise<unknown>;
|
|
49
|
+
export declare function requireAnyPerm(permissions: readonly string[]): (c: {
|
|
50
|
+
get(key: string): unknown;
|
|
51
|
+
json(data: unknown, status: number): unknown;
|
|
52
|
+
}, next: () => Promise<void>) => Promise<unknown>;
|
|
53
|
+
export declare function requireMethodPerm(methods: readonly string[], permission: string): (c: PermissionContext, next: () => Promise<void>) => Promise<unknown>;
|
|
54
|
+
export declare function isRoutePermissionGuard(handler: unknown, method?: string): boolean;
|
|
40
55
|
export declare function parseSort(value?: string): {
|
|
41
56
|
field: "createdAt" | "updatedAt" | "slug";
|
|
42
57
|
direction: "asc" | "desc";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAIF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAOA;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAO/F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,sBAAsB,eAAyC,CAAC;AAM7E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAKtF;AAED,KAAK,iBAAiB,GAAG;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7C,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAIF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAOA;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAO/F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,OACf;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAmBpI;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,OAC9B;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAkBpI;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,OAEjD,iBAAiB,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAQ1E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,wBAAgB,SAAS,CACvB,KAAK,CAAC,EAAE,MAAM,GAEZ;IACF,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1C,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B,GACG,SAAS,CASZ;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { mapErrorToStatus } from "../../kernel/error-mapper.js";
|
|
2
2
|
import { toCommerceError } from "../../kernel/errors.js";
|
|
3
|
+
export const ROUTE_PERMISSION_GUARD = Symbol("porulle.routePermissionGuard");
|
|
4
|
+
export function markRoutePermissionGuard(handler, methods) {
|
|
5
|
+
if (typeof handler === "function") {
|
|
6
|
+
Object.defineProperty(handler, ROUTE_PERMISSION_GUARD, { value: { methods } });
|
|
7
|
+
}
|
|
8
|
+
return handler;
|
|
9
|
+
}
|
|
3
10
|
const MAX_PAGE_LIMIT = 100;
|
|
4
11
|
export function parsePagination(query) {
|
|
5
12
|
const page = Number.parseInt(query.page ?? "1", 10);
|
|
@@ -36,7 +43,7 @@ export { mapErrorToStatus };
|
|
|
36
43
|
* Usage: router.post("/", requirePerm("webhooks:manage"), handler);
|
|
37
44
|
*/
|
|
38
45
|
export function requirePerm(permission) {
|
|
39
|
-
|
|
46
|
+
const middleware = async (c, next) => {
|
|
40
47
|
const actor = c.get("actor");
|
|
41
48
|
if (!actor) {
|
|
42
49
|
return c.json({ error: { code: "UNAUTHORIZED", message: "Authentication required." } }, 401);
|
|
@@ -54,6 +61,42 @@ export function requirePerm(permission) {
|
|
|
54
61
|
}
|
|
55
62
|
return c.json({ error: { code: "FORBIDDEN", message: `Permission '${permission}' is required.` } }, 403);
|
|
56
63
|
};
|
|
64
|
+
return markRoutePermissionGuard(middleware);
|
|
65
|
+
}
|
|
66
|
+
export function requireAnyPerm(permissions) {
|
|
67
|
+
const middleware = async (c, next) => {
|
|
68
|
+
const actor = c.get("actor");
|
|
69
|
+
const granted = actor?.permissions ?? [];
|
|
70
|
+
const allowed = permissions.some((permission) => granted.includes(permission) ||
|
|
71
|
+
granted.includes("*:*") ||
|
|
72
|
+
granted.includes(`${permission.split(":")[0]}:*`));
|
|
73
|
+
if (!actor) {
|
|
74
|
+
return c.json({ error: { code: "UNAUTHORIZED", message: "Authentication required." } }, 401);
|
|
75
|
+
}
|
|
76
|
+
if (allowed) {
|
|
77
|
+
await next();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
return c.json({ error: { code: "FORBIDDEN", message: `One of these permissions is required: ${permissions.join(", ")}.` } }, 403);
|
|
81
|
+
};
|
|
82
|
+
return markRoutePermissionGuard(middleware);
|
|
83
|
+
}
|
|
84
|
+
export function requireMethodPerm(methods, permission) {
|
|
85
|
+
const permissionGuard = requirePerm(permission);
|
|
86
|
+
const middleware = async (c, next) => {
|
|
87
|
+
if (!methods.includes(c.req.method)) {
|
|
88
|
+
await next();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
return permissionGuard(c, next);
|
|
92
|
+
};
|
|
93
|
+
return markRoutePermissionGuard(middleware, methods);
|
|
94
|
+
}
|
|
95
|
+
export function isRoutePermissionGuard(handler, method) {
|
|
96
|
+
if (typeof handler !== "function")
|
|
97
|
+
return false;
|
|
98
|
+
const guard = handler[ROUTE_PERMISSION_GUARD];
|
|
99
|
+
return Boolean(guard && (!method || !guard.methods || guard.methods.includes(method)));
|
|
57
100
|
}
|
|
58
101
|
export function parseSort(value) {
|
|
59
102
|
if (!value)
|
|
@@ -67,5 +110,5 @@ export function parseSort(value) {
|
|
|
67
110
|
return { field, direction };
|
|
68
111
|
}
|
|
69
112
|
export function isUUID(value) {
|
|
70
|
-
return /^[0-9a-f]{8}-[0-9a-f]{4}-[
|
|
113
|
+
return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
|
|
71
114
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
function errorToRecordPayload(err) {
|
|
3
3
|
if (err && typeof err === "object" && "message" in err) {
|
|
4
4
|
const o = err;
|
|
@@ -53,7 +53,7 @@ export async function runCompensationChain(steps, input, ctx) {
|
|
|
53
53
|
ctx.hook.logger.error(`Compensation for step "${done.step.id}" failed. Manual review required.`, { compensateError });
|
|
54
54
|
if (ctx.failureRepository) {
|
|
55
55
|
try {
|
|
56
|
-
const orgId =
|
|
56
|
+
const orgId = resolveOrgIdForCommerce(ctx.hook.actor, ctx.hook.commerceConfig);
|
|
57
57
|
const recordResult = await ctx.failureRepository.record({
|
|
58
58
|
organizationId: orgId,
|
|
59
59
|
correlationId: ctx.correlationId ?? "",
|
|
@@ -4,12 +4,20 @@ export interface TxContext<TTx = unknown> {
|
|
|
4
4
|
tx: TTx;
|
|
5
5
|
actor: Actor | null;
|
|
6
6
|
requestId: string;
|
|
7
|
+
hookContext?: Record<string, unknown>;
|
|
7
8
|
}
|
|
9
|
+
export interface HookContextCarrier {
|
|
10
|
+
hookContext?: Record<string, unknown>;
|
|
11
|
+
}
|
|
12
|
+
export type CatalogWriteContext<TTx = unknown> = TxContext<TTx> | HookContextCarrier;
|
|
8
13
|
export interface WithTransactionOptions {
|
|
9
14
|
actor: Actor | null;
|
|
10
15
|
requestId?: string;
|
|
16
|
+
hookContext?: Record<string, unknown>;
|
|
11
17
|
}
|
|
12
18
|
export declare function createTxContext<TTx>(tx: TTx, options: WithTransactionOptions): TxContext<TTx>;
|
|
13
19
|
export declare function withTransaction<TDb, TTx, TResult>(database: DatabaseAdapter<TDb, TTx>, options: WithTransactionOptions, fn: (ctx: TxContext<TTx>) => Promise<TResult>): Promise<TResult>;
|
|
14
20
|
export declare function reuseOrCreateTxContext<TTx>(tx: TTx, options: WithTransactionOptions, existing?: TxContext<TTx> | null): TxContext<TTx>;
|
|
21
|
+
export declare function resolveWriteContextHookContext(ctx?: CatalogWriteContext): Record<string, unknown> | undefined;
|
|
22
|
+
export declare function isWriteContextTransactional<TTx>(ctx?: CatalogWriteContext<TTx>): ctx is TxContext<TTx>;
|
|
15
23
|
//# sourceMappingURL=tx-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx-context.d.ts","sourceRoot":"","sources":["../../../src/kernel/database/tx-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,SAAS,CAAC,GAAG,GAAG,OAAO;IACtC,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tx-context.d.ts","sourceRoot":"","sources":["../../../src/kernel/database/tx-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,WAAW,SAAS,CAAC,GAAG,GAAG,OAAO;IACtC,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,mBAAmB,CAAC,GAAG,GAAG,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,wBAAgB,eAAe,CAAC,GAAG,EACjC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE,sBAAsB,GAC9B,SAAS,CAAC,GAAG,CAAC,CAOhB;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EACrD,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,OAAO,CAAC,OAAO,CAAC,CAIlB;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EACxC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,GAC/B,SAAS,CAAC,GAAG,CAAC,CAKhB;AAUD,wBAAgB,8BAA8B,CAAC,GAAG,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAE7G;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAEtG"}
|
|
@@ -4,6 +4,7 @@ export function createTxContext(tx, options) {
|
|
|
4
4
|
tx,
|
|
5
5
|
actor: options.actor,
|
|
6
6
|
requestId: options.requestId ?? randomUUID(),
|
|
7
|
+
...(options.hookContext ? { hookContext: options.hookContext } : {}),
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
10
|
export async function withTransaction(database, options, fn) {
|
|
@@ -17,3 +18,15 @@ export function reuseOrCreateTxContext(tx, options, existing) {
|
|
|
17
18
|
}
|
|
18
19
|
return createTxContext(tx, options);
|
|
19
20
|
}
|
|
21
|
+
function hookContextFromWriteContext(ctx) {
|
|
22
|
+
return ctx?.hookContext;
|
|
23
|
+
}
|
|
24
|
+
function isTransactionalWriteContext(ctx) {
|
|
25
|
+
return "tx" in ctx && ctx.tx != null;
|
|
26
|
+
}
|
|
27
|
+
export function resolveWriteContextHookContext(ctx) {
|
|
28
|
+
return hookContextFromWriteContext(ctx);
|
|
29
|
+
}
|
|
30
|
+
export function isWriteContextTransactional(ctx) {
|
|
31
|
+
return ctx != null && isTransactionalWriteContext(ctx);
|
|
32
|
+
}
|
|
@@ -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 { JobsAdapter } from "../jobs/adapter.js";
|
|
3
4
|
import type { PluginDb } from "../database/plugin-types.js";
|
|
4
5
|
import type { HookContext, HookOrigin, Logger, ServiceContainer } from "./types.js";
|
|
@@ -24,6 +25,7 @@ export interface CreateHookContextArgs {
|
|
|
24
25
|
db: PluginDb;
|
|
25
26
|
};
|
|
26
27
|
};
|
|
28
|
+
commerceConfig?: CommerceConfig | null;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
31
|
* Creates a HookContext with sensible defaults.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-context.d.ts","sourceRoot":"","sources":["../../../src/kernel/hooks/create-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAA;KAAE,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE;YAAE,EAAE,EAAE,QAAQ,CAAA;SAAE,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"create-context.d.ts","sourceRoot":"","sources":["../../../src/kernel/hooks/create-context.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,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,6DAA6D;IAC7D,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,QAAQ,CAAA;KAAE,CAAC;IAC5B;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE;YAAE,EAAE,EAAE,QAAQ,CAAA;SAAE,CAAA;KAAE,CAAC;IACxC,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACxC;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,WAAW,CAsB1E"}
|
|
@@ -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 { JobsAdapter } from "../jobs/adapter.js";
|
|
3
4
|
import type { PluginDb } from "../database/plugin-types.js";
|
|
4
5
|
export type HookOperation = "create" | "update" | "delete" | "read" | "list" | "statusChange" | "addItem" | "removeItem" | "recover" | "custom";
|
|
@@ -25,6 +26,7 @@ export interface HookContext {
|
|
|
25
26
|
* Populated by `createHookContext` when callers pass `db`, `database`, or `kernel`.
|
|
26
27
|
*/
|
|
27
28
|
db: PluginDb;
|
|
29
|
+
commerceConfig?: CommerceConfig | null;
|
|
28
30
|
}
|
|
29
31
|
export type BeforeHook<TData> = (args: {
|
|
30
32
|
data: TData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/kernel/hooks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,GACN,cAAc,GACd,SAAS,GACT,YAAY,GACZ,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,EAAE,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/kernel/hooks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,GACN,MAAM,GACN,cAAc,GACd,SAAS,GACT,YAAY,GACZ,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB;;;OAGG;IACH,EAAE,EAAE,QAAQ,CAAC;IACb,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE;IACrC,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;CACtB,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;AAE7B,MAAM,MAAM,SAAS,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE;IACpC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,WAAW,CAAC;CACtB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/kernel/plugin/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/kernel/plugin/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
|
+
import { isRoutePermissionGuard, markRoutePermissionGuard } from "../../interfaces/rest/utils.js";
|
|
2
3
|
import { createScopedDb } from "../database/scoped-db.js";
|
|
3
4
|
import { getPluginDatabaseScopeOrganizationId, runWithPluginDatabaseScope, } from "../database/plugin-db-context.js";
|
|
4
5
|
const UNSCOPED_WARN_COOLDOWN_MS = 60_000;
|
|
@@ -18,7 +19,7 @@ function createRateLimitedUnscopedAccessWarning(logger) {
|
|
|
18
19
|
}
|
|
19
20
|
function buildPluginContextDatabase(rawDb, transactionFn, commerceConfig, logger) {
|
|
20
21
|
const orgGetter = () => getPluginDatabaseScopeOrganizationId() ??
|
|
21
|
-
|
|
22
|
+
resolveOrgIdForCommerce(null, commerceConfig);
|
|
22
23
|
const scopedDb = createScopedDb(rawDb, orgGetter);
|
|
23
24
|
const warnUnscoped = createRateLimitedUnscopedAccessWarning(logger);
|
|
24
25
|
return {
|
|
@@ -140,7 +141,7 @@ export function defineCommercePlugin(manifest) {
|
|
|
140
141
|
const wrappedHandler = async (...args) => {
|
|
141
142
|
const c = args[0];
|
|
142
143
|
const actor = c?.get?.("actor");
|
|
143
|
-
const orgId =
|
|
144
|
+
const orgId = resolveOrgIdForCommerce(actor, k.config);
|
|
144
145
|
try {
|
|
145
146
|
return await runWithPluginDatabaseScope(orgId, async () => {
|
|
146
147
|
const out = originalHandler(...args);
|
|
@@ -155,19 +156,22 @@ export function defineCommercePlugin(manifest) {
|
|
|
155
156
|
throw err; // re-throw so global handler still catches
|
|
156
157
|
}
|
|
157
158
|
};
|
|
159
|
+
const registeredHandler = isRoutePermissionGuard(originalHandler)
|
|
160
|
+
? markRoutePermissionGuard(wrappedHandler)
|
|
161
|
+
: wrappedHandler;
|
|
158
162
|
if ("openapi" in route) {
|
|
159
163
|
// OpenAPI route: validated by Zod, appears in /api/doc
|
|
160
164
|
// Hono type interop — OpenAPIHono.openapi() expects strict RouteConfig+Handler
|
|
161
165
|
// generics that can't be statically resolved for dynamic plugin routes.
|
|
162
166
|
// @ts-expect-error -- dynamic plugin routes cannot satisfy Hono's strict handler generics
|
|
163
|
-
app.openapi(route.openapi,
|
|
167
|
+
app.openapi(route.openapi, registeredHandler);
|
|
164
168
|
}
|
|
165
169
|
else {
|
|
166
170
|
// Legacy route: raw handler, invisible to OpenAPI spec.
|
|
167
171
|
// Explicit dispatch avoids casting Hono to a Record.
|
|
168
172
|
// Handler cast is a single `as any` (Hono's overloaded method
|
|
169
173
|
// signatures can't unify with our generic handler shape).
|
|
170
|
-
const h =
|
|
174
|
+
const h = registeredHandler;
|
|
171
175
|
switch (route.method.toLowerCase()) {
|
|
172
176
|
case "get":
|
|
173
177
|
app.get(route.path, h);
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { CommerceValidationError } from "../../kernel/errors.js";
|
|
9
9
|
import { Err, Ok } from "../../kernel/result.js";
|
|
10
|
-
import {
|
|
10
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
11
11
|
import { RETAIL_REPORTS } from "./reports.js";
|
|
12
12
|
export class AnalyticsService {
|
|
13
13
|
deps;
|
|
@@ -91,7 +91,7 @@ export class AnalyticsService {
|
|
|
91
91
|
if (!this.deps.reports) {
|
|
92
92
|
return Err(new CommerceValidationError("Retail reports are not available."));
|
|
93
93
|
}
|
|
94
|
-
const orgId =
|
|
94
|
+
const orgId = resolveOrgIdForCommerce(actor ?? null, this.deps.config);
|
|
95
95
|
return this.deps.reports.run(name, params, orgId);
|
|
96
96
|
}
|
|
97
97
|
async getMeta() {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { eq, and, desc, gte, lte } from "drizzle-orm";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
3
3
|
import { auditLog } from "./schema.js";
|
|
4
4
|
export function createNullAuditService() {
|
|
5
5
|
const entries = [];
|
|
@@ -7,7 +7,7 @@ export function createNullAuditService() {
|
|
|
7
7
|
async record(args) {
|
|
8
8
|
entries.push({
|
|
9
9
|
id: crypto.randomUUID(),
|
|
10
|
-
organizationId:
|
|
10
|
+
organizationId: resolveOrgIdForCommerce(args.ctx.actor, args.ctx.commerceConfig),
|
|
11
11
|
entityType: args.entityType,
|
|
12
12
|
entityId: args.entityId,
|
|
13
13
|
event: args.event,
|
|
@@ -52,7 +52,7 @@ export function createAuditService(db) {
|
|
|
52
52
|
? ctx.tx
|
|
53
53
|
: db;
|
|
54
54
|
await dbOrTx.insert(auditLog).values({
|
|
55
|
-
organizationId:
|
|
55
|
+
organizationId: resolveOrgIdForCommerce(ctx.actor, ctx.commerceConfig),
|
|
56
56
|
entityType,
|
|
57
57
|
entityId,
|
|
58
58
|
event,
|
|
@@ -30,14 +30,20 @@ export declare class CartRepository {
|
|
|
30
30
|
update(id: string, data: Partial<Omit<CartInsert, "id">>, ctx?: TxContext): Promise<Cart | undefined>;
|
|
31
31
|
updateStatus(id: string, status: Cart["status"], ctx?: TxContext): Promise<Cart | undefined>;
|
|
32
32
|
/**
|
|
33
|
-
* Atomically transitions a cart from "active" to "checking_out"
|
|
34
|
-
*
|
|
35
|
-
* the cart was not in "active" status
|
|
36
|
-
* claimed it). This prevents TOCTOU race
|
|
33
|
+
* Atomically transitions a cart from "active" to "checking_out" and records
|
|
34
|
+
* `claimToken` as the holder of that claim. Returns the updated cart if the
|
|
35
|
+
* transition succeeded, or undefined if the cart was not in "active" status
|
|
36
|
+
* (e.g., a concurrent checkout already claimed it). This prevents TOCTOU race
|
|
37
|
+
* conditions on double-checkout.
|
|
37
38
|
*/
|
|
38
|
-
transitionToCheckingOut(id: string, ctx?: TxContext): Promise<Cart | undefined>;
|
|
39
|
-
/**
|
|
40
|
-
|
|
39
|
+
transitionToCheckingOut(id: string, claimToken: string, ctx?: TxContext): Promise<Cart | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Release an in-progress checkout claim held by `claimToken`. Terminal cart
|
|
42
|
+
* states are untouched, and so is a claim held by a different checkout
|
|
43
|
+
* attempt — a losing attempt's failure path must not reopen the cart the
|
|
44
|
+
* winner is still checking out.
|
|
45
|
+
*/
|
|
46
|
+
releaseCheckoutClaim(id: string, claimToken: string, ctx?: TxContext): Promise<Cart | undefined>;
|
|
41
47
|
delete(id: string, ctx?: TxContext): Promise<boolean>;
|
|
42
48
|
findLineItemById(id: string, ctx?: TxContext): Promise<CartLineItem | undefined>;
|
|
43
49
|
findLineItemsByCartId(cartId: string, ctx?: TxContext): Promise<CartLineItem[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/cart/repository/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIpD,MAAM,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AAC7C,MAAM,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,YAAY,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC7D,MAAM,MAAM,kBAAkB,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAEnE;;;;;GAKG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,eAAe;IAEhD,OAAO,CAAC,KAAK;IAQP,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAS/E,gBAAgB,CACpB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAStB,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAStB,IAAI,CACR,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,EACrE,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAwBpD,gBAAgB,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQlD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,MAAM,CACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EACrC,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAUtB,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EACtB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAI5B
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/cart/repository/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,27 +90,33 @@ export class CartRepository {
|
|
|
90
90
|
return this.update(id, { status }, ctx);
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
|
-
* Atomically transitions a cart from "active" to "checking_out"
|
|
94
|
-
*
|
|
95
|
-
* the cart was not in "active" status
|
|
96
|
-
* claimed it). This prevents TOCTOU race
|
|
93
|
+
* Atomically transitions a cart from "active" to "checking_out" and records
|
|
94
|
+
* `claimToken` as the holder of that claim. Returns the updated cart if the
|
|
95
|
+
* transition succeeded, or undefined if the cart was not in "active" status
|
|
96
|
+
* (e.g., a concurrent checkout already claimed it). This prevents TOCTOU race
|
|
97
|
+
* conditions on double-checkout.
|
|
97
98
|
*/
|
|
98
|
-
async transitionToCheckingOut(id, ctx) {
|
|
99
|
+
async transitionToCheckingOut(id, claimToken, ctx) {
|
|
99
100
|
const db = this.getDb(ctx);
|
|
100
101
|
const rows = await db
|
|
101
102
|
.update(carts)
|
|
102
|
-
.set({ status: "checking_out", updatedAt: new Date() })
|
|
103
|
+
.set({ status: "checking_out", checkoutClaimToken: claimToken, updatedAt: new Date() })
|
|
103
104
|
.where(and(eq(carts.id, id), eq(carts.status, "active")))
|
|
104
105
|
.returning();
|
|
105
106
|
return rows[0];
|
|
106
107
|
}
|
|
107
|
-
/**
|
|
108
|
-
|
|
108
|
+
/**
|
|
109
|
+
* Release an in-progress checkout claim held by `claimToken`. Terminal cart
|
|
110
|
+
* states are untouched, and so is a claim held by a different checkout
|
|
111
|
+
* attempt — a losing attempt's failure path must not reopen the cart the
|
|
112
|
+
* winner is still checking out.
|
|
113
|
+
*/
|
|
114
|
+
async releaseCheckoutClaim(id, claimToken, ctx) {
|
|
109
115
|
const db = this.getDb(ctx);
|
|
110
116
|
const rows = await db
|
|
111
117
|
.update(carts)
|
|
112
|
-
.set({ status: "active", updatedAt: new Date() })
|
|
113
|
-
.where(and(eq(carts.id, id), eq(carts.status, "checking_out")))
|
|
118
|
+
.set({ status: "active", checkoutClaimToken: null, updatedAt: new Date() })
|
|
119
|
+
.where(and(eq(carts.id, id), eq(carts.status, "checking_out"), eq(carts.checkoutClaimToken, claimToken)))
|
|
114
120
|
.returning();
|
|
115
121
|
return rows[0];
|
|
116
122
|
}
|