@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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
import { CommerceValidationError } from "../../kernel/errors.js";
|
|
3
3
|
import { Err, Ok } from "../../kernel/result.js";
|
|
4
4
|
const GROUP_NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
@@ -11,8 +11,10 @@ const GROUP_NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
|
11
11
|
*/
|
|
12
12
|
export class SettingsService {
|
|
13
13
|
repository;
|
|
14
|
+
config;
|
|
14
15
|
constructor(deps) {
|
|
15
16
|
this.repository = deps.repository;
|
|
17
|
+
this.config = deps.config;
|
|
16
18
|
}
|
|
17
19
|
/** Runtime read for plugins/hooks. Unset groups read as `{}`. */
|
|
18
20
|
async read(orgId, group, ctx) {
|
|
@@ -20,11 +22,11 @@ export class SettingsService {
|
|
|
20
22
|
return row?.value ?? {};
|
|
21
23
|
}
|
|
22
24
|
async getGroup(group, actor, ctx) {
|
|
23
|
-
const orgId =
|
|
25
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
24
26
|
return Ok(await this.read(orgId, group, ctx));
|
|
25
27
|
}
|
|
26
28
|
async getAll(actor, ctx) {
|
|
27
|
-
const orgId =
|
|
29
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
28
30
|
const rows = await this.repository.findAll(orgId, ctx);
|
|
29
31
|
const all = {};
|
|
30
32
|
for (const row of rows)
|
|
@@ -36,7 +38,7 @@ export class SettingsService {
|
|
|
36
38
|
if (!GROUP_NAME_RE.test(group)) {
|
|
37
39
|
return Err(new CommerceValidationError("Settings group must match [a-z][a-z0-9_-]* (e.g. general, branding, policies)."));
|
|
38
40
|
}
|
|
39
|
-
const orgId =
|
|
41
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
40
42
|
const current = await this.read(orgId, group, ctx);
|
|
41
43
|
const next = { ...current };
|
|
42
44
|
for (const [key, value] of Object.entries(patch)) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
import { CommerceNotFoundError, CommerceValidationError } from "../../kernel/errors.js";
|
|
3
3
|
import { Err, Ok } from "../../kernel/result.js";
|
|
4
4
|
import { calculateShippingCost, computeShippableWeightGrams, } from "./calculator.js";
|
|
@@ -83,7 +83,7 @@ export class ShippingService {
|
|
|
83
83
|
if (input.countries.length === 0) {
|
|
84
84
|
return Err(new CommerceValidationError("A shipping zone requires at least one country (\"*\" matches any)."));
|
|
85
85
|
}
|
|
86
|
-
const orgId =
|
|
86
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
87
87
|
const zone = await this.deps.repository.createZone({
|
|
88
88
|
organizationId: orgId,
|
|
89
89
|
name: input.name,
|
|
@@ -95,11 +95,11 @@ export class ShippingService {
|
|
|
95
95
|
return Ok(zone);
|
|
96
96
|
}
|
|
97
97
|
async listZones(actor, ctx) {
|
|
98
|
-
const orgId =
|
|
98
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
99
99
|
return Ok(await this.deps.repository.findZones(orgId, ctx));
|
|
100
100
|
}
|
|
101
101
|
async updateZone(id, patch, actor, ctx) {
|
|
102
|
-
const orgId =
|
|
102
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
103
103
|
const existing = await this.deps.repository.findZoneById(orgId, id, ctx);
|
|
104
104
|
if (!existing)
|
|
105
105
|
return Err(new CommerceNotFoundError("Shipping zone not found."));
|
|
@@ -117,7 +117,7 @@ export class ShippingService {
|
|
|
117
117
|
return Ok(updated);
|
|
118
118
|
}
|
|
119
119
|
async deleteZone(id, actor, ctx) {
|
|
120
|
-
const orgId =
|
|
120
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
121
121
|
const existing = await this.deps.repository.findZoneById(orgId, id, ctx);
|
|
122
122
|
if (!existing)
|
|
123
123
|
return Err(new CommerceNotFoundError("Shipping zone not found."));
|
|
@@ -125,7 +125,7 @@ export class ShippingService {
|
|
|
125
125
|
return Ok({ deleted: true });
|
|
126
126
|
}
|
|
127
127
|
async createRate(input, actor, ctx) {
|
|
128
|
-
const orgId =
|
|
128
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
129
129
|
const zone = await this.deps.repository.findZoneById(orgId, input.zoneId, ctx);
|
|
130
130
|
if (!zone)
|
|
131
131
|
return Err(new CommerceNotFoundError("Shipping zone not found."));
|
|
@@ -145,11 +145,11 @@ export class ShippingService {
|
|
|
145
145
|
return Ok(rate);
|
|
146
146
|
}
|
|
147
147
|
async listRates(filter, actor, ctx) {
|
|
148
|
-
const orgId =
|
|
148
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
149
149
|
return Ok(await this.deps.repository.findRates(orgId, filter?.zoneId !== undefined ? { zoneId: filter.zoneId } : undefined, ctx));
|
|
150
150
|
}
|
|
151
151
|
async updateRate(id, patch, actor, ctx) {
|
|
152
|
-
const orgId =
|
|
152
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
153
153
|
const existing = await this.deps.repository.findRateById(orgId, id, ctx);
|
|
154
154
|
if (!existing)
|
|
155
155
|
return Err(new CommerceNotFoundError("Shipping rate not found."));
|
|
@@ -169,7 +169,7 @@ export class ShippingService {
|
|
|
169
169
|
return Ok(updated);
|
|
170
170
|
}
|
|
171
171
|
async deleteRate(id, actor, ctx) {
|
|
172
|
-
const orgId =
|
|
172
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
173
173
|
const existing = await this.deps.repository.findRateById(orgId, id, ctx);
|
|
174
174
|
if (!existing)
|
|
175
175
|
return Err(new CommerceNotFoundError("Shipping rate not found."));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/tax/module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,SAAS;cACR,OAAO,QAAQ;gBAAc,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/tax/module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,eAAO,MAAM,SAAS;cACR,OAAO,QAAQ;gBAAc,OAAO,UAAU;qCAY1D,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 { TaxAdapter, TaxCalculationParams, TaxCalculationResult, TaxReportParams, TaxVoidParams } from "./adapter.js";
|
|
@@ -6,10 +7,12 @@ import type { TaxClass, TaxRate, TaxRatesRepository } from "./repository/index.j
|
|
|
6
7
|
interface TaxServiceDeps {
|
|
7
8
|
adapter: TaxAdapter | undefined;
|
|
8
9
|
repository?: TaxRatesRepository;
|
|
10
|
+
config: CommerceConfig;
|
|
9
11
|
}
|
|
10
12
|
export declare class TaxService {
|
|
11
13
|
private adapter;
|
|
12
14
|
private repository;
|
|
15
|
+
private config;
|
|
13
16
|
constructor(deps: TaxServiceDeps);
|
|
14
17
|
/**
|
|
15
18
|
* Calculates tax. Resolution order:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/tax/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAErE,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEnF,UAAU,cAAc;IACtB,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/tax/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
import { CommerceNotFoundError, CommerceValidationError } from "../../kernel/errors.js";
|
|
3
3
|
import { Err, Ok } from "../../kernel/result.js";
|
|
4
4
|
export class TaxService {
|
|
5
5
|
adapter;
|
|
6
6
|
repository;
|
|
7
|
+
config;
|
|
7
8
|
constructor(deps) {
|
|
8
9
|
this.adapter = deps.adapter;
|
|
9
10
|
this.repository = deps.repository;
|
|
11
|
+
this.config = deps.config;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* Calculates tax. Resolution order:
|
|
@@ -117,7 +119,7 @@ export class TaxService {
|
|
|
117
119
|
if (input.rateBps < 0) {
|
|
118
120
|
return Err(new CommerceValidationError("rateBps must be non-negative."));
|
|
119
121
|
}
|
|
120
|
-
const orgId =
|
|
122
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
121
123
|
if (input.isDefault)
|
|
122
124
|
await repo.value.clearDefaultClass(orgId, ctx);
|
|
123
125
|
const created = await repo.value.createClass({
|
|
@@ -133,14 +135,14 @@ export class TaxService {
|
|
|
133
135
|
const repo = this.requireRepository();
|
|
134
136
|
if (!repo.ok)
|
|
135
137
|
return repo;
|
|
136
|
-
const orgId =
|
|
138
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
137
139
|
return Ok(await repo.value.findAllClasses(orgId, ctx));
|
|
138
140
|
}
|
|
139
141
|
async updateTaxClass(id, patch, actor, ctx) {
|
|
140
142
|
const repo = this.requireRepository();
|
|
141
143
|
if (!repo.ok)
|
|
142
144
|
return repo;
|
|
143
|
-
const orgId =
|
|
145
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
144
146
|
const existing = await repo.value.findClassById(orgId, id, ctx);
|
|
145
147
|
if (!existing)
|
|
146
148
|
return Err(new CommerceNotFoundError("Tax class not found."));
|
|
@@ -158,7 +160,7 @@ export class TaxService {
|
|
|
158
160
|
const repo = this.requireRepository();
|
|
159
161
|
if (!repo.ok)
|
|
160
162
|
return repo;
|
|
161
|
-
const orgId =
|
|
163
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
162
164
|
const existing = await repo.value.findClassById(orgId, id, ctx);
|
|
163
165
|
if (!existing)
|
|
164
166
|
return Err(new CommerceNotFoundError("Tax class not found."));
|
|
@@ -207,7 +209,7 @@ export class TaxService {
|
|
|
207
209
|
if (input.rateBps < 0) {
|
|
208
210
|
return Err(new CommerceValidationError("rateBps must be non-negative."));
|
|
209
211
|
}
|
|
210
|
-
const orgId =
|
|
212
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
211
213
|
const rate = await repo.value.create({
|
|
212
214
|
organizationId: orgId,
|
|
213
215
|
name: input.name,
|
|
@@ -224,14 +226,14 @@ export class TaxService {
|
|
|
224
226
|
const repo = this.requireRepository();
|
|
225
227
|
if (!repo.ok)
|
|
226
228
|
return repo;
|
|
227
|
-
const orgId =
|
|
229
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
228
230
|
return Ok(await repo.value.findAll(orgId, ctx));
|
|
229
231
|
}
|
|
230
232
|
async updateTaxRate(id, patch, actor, ctx) {
|
|
231
233
|
const repo = this.requireRepository();
|
|
232
234
|
if (!repo.ok)
|
|
233
235
|
return repo;
|
|
234
|
-
const orgId =
|
|
236
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
235
237
|
const existing = await repo.value.findById(orgId, id, ctx);
|
|
236
238
|
if (!existing)
|
|
237
239
|
return Err(new CommerceNotFoundError("Tax rate not found."));
|
|
@@ -252,7 +254,7 @@ export class TaxService {
|
|
|
252
254
|
const repo = this.requireRepository();
|
|
253
255
|
if (!repo.ok)
|
|
254
256
|
return repo;
|
|
255
|
-
const orgId =
|
|
257
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.config);
|
|
256
258
|
const existing = await repo.value.findById(orgId, id, ctx);
|
|
257
259
|
if (!existing)
|
|
258
260
|
return Err(new CommerceNotFoundError("Tax rate not found."));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
/**
|
|
3
3
|
* Webhook delivery hook — enqueues delivery jobs instead of blocking.
|
|
4
4
|
*
|
|
@@ -15,7 +15,7 @@ export const deliverWebhooks = async ({ result, operation, context }) => {
|
|
|
15
15
|
// VAPT r2 (codex) finding: fan-out queried ALL endpoints across the
|
|
16
16
|
// database, so Tenant B's webhooks fired on Tenant A's events —
|
|
17
17
|
// payload-level cross-tenant data leak. Now scoped to the actor's org.
|
|
18
|
-
const orgId =
|
|
18
|
+
const orgId = resolveOrgIdForCommerce(context.actor, context.commerceConfig);
|
|
19
19
|
const endpoints = await webhooksService.getEndpointsForEvent(eventName, orgId);
|
|
20
20
|
if (!endpoints.ok)
|
|
21
21
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/webhooks/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/modules/webhooks/module.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9C,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAYzB,CAAC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Actor } from "../../auth/types.js";
|
|
2
|
+
import type { CommerceConfig } from "../../config/types.js";
|
|
2
3
|
import { type Result } from "../../kernel/result.js";
|
|
3
4
|
import type { TxContext } from "../../kernel/database/tx-context.js";
|
|
4
5
|
import type { WebhooksRepository, WebhookEndpoint } from "./repository/index.js";
|
|
5
6
|
interface WebhookServiceDeps {
|
|
6
7
|
repository: WebhooksRepository;
|
|
8
|
+
config: CommerceConfig;
|
|
7
9
|
}
|
|
8
10
|
export declare class WebhookService {
|
|
9
11
|
private deps;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/webhooks/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/webhooks/service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA4CjF,UAAU,kBAAkB;IAC1B,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,qBAAa,cAAc;IAGb,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;gBAEtB,IAAI,EAAE,kBAAkB;IAItC,cAAc,CAClB,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,EACD,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAyB7B,aAAa,CACjB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IAM/B,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EACpB,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAWlB,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,SAAS,GACd,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;CAItC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
2
2
|
import { CommerceNotFoundError, CommerceValidationError } from "../../kernel/errors.js";
|
|
3
3
|
import { Err, Ok } from "../../kernel/result.js";
|
|
4
4
|
/**
|
|
@@ -62,7 +62,7 @@ export class WebhookService {
|
|
|
62
62
|
if (isPrivateUrl(input.url)) {
|
|
63
63
|
return Err(new CommerceValidationError("Webhook URL must not point to a private or internal address."));
|
|
64
64
|
}
|
|
65
|
-
const orgId =
|
|
65
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
66
66
|
const endpoint = await this.repo.createEndpoint({
|
|
67
67
|
organizationId: orgId,
|
|
68
68
|
url: input.url,
|
|
@@ -74,12 +74,12 @@ export class WebhookService {
|
|
|
74
74
|
return Ok(endpoint);
|
|
75
75
|
}
|
|
76
76
|
async listEndpoints(actor, ctx) {
|
|
77
|
-
const orgId =
|
|
77
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
78
78
|
const endpoints = await this.repo.findAllEndpoints(orgId, ctx);
|
|
79
79
|
return Ok(endpoints);
|
|
80
80
|
}
|
|
81
81
|
async deleteEndpoint(id, actor, ctx) {
|
|
82
|
-
const orgId =
|
|
82
|
+
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
83
83
|
const existing = await this.repo.findEndpointById(id, orgId, ctx);
|
|
84
84
|
if (!existing) {
|
|
85
85
|
return Err(new CommerceNotFoundError("Webhook endpoint not found."));
|
|
@@ -764,6 +764,57 @@ export declare const KERNEL_ALL_MODULES: {
|
|
|
764
764
|
}, {}, {
|
|
765
765
|
$type: Record<string, unknown>;
|
|
766
766
|
}>;
|
|
767
|
+
origin: import("drizzle-orm/pg-core").PgColumn<{
|
|
768
|
+
name: "origin";
|
|
769
|
+
tableName: "media_assets";
|
|
770
|
+
dataType: "string";
|
|
771
|
+
columnType: "PgEnumColumn";
|
|
772
|
+
data: "generated" | "merchant" | "imported";
|
|
773
|
+
driverParam: string;
|
|
774
|
+
notNull: true;
|
|
775
|
+
hasDefault: true;
|
|
776
|
+
isPrimaryKey: false;
|
|
777
|
+
isAutoincrement: false;
|
|
778
|
+
hasRuntimeDefault: false;
|
|
779
|
+
enumValues: ["merchant", "generated", "imported"];
|
|
780
|
+
baseColumn: never;
|
|
781
|
+
identity: undefined;
|
|
782
|
+
generated: undefined;
|
|
783
|
+
}, {}, {}>;
|
|
784
|
+
confidence: import("drizzle-orm/pg-core").PgColumn<{
|
|
785
|
+
name: "confidence";
|
|
786
|
+
tableName: "media_assets";
|
|
787
|
+
dataType: "string";
|
|
788
|
+
columnType: "PgNumeric";
|
|
789
|
+
data: string;
|
|
790
|
+
driverParam: string;
|
|
791
|
+
notNull: false;
|
|
792
|
+
hasDefault: false;
|
|
793
|
+
isPrimaryKey: false;
|
|
794
|
+
isAutoincrement: false;
|
|
795
|
+
hasRuntimeDefault: false;
|
|
796
|
+
enumValues: undefined;
|
|
797
|
+
baseColumn: never;
|
|
798
|
+
identity: undefined;
|
|
799
|
+
generated: undefined;
|
|
800
|
+
}, {}, {}>;
|
|
801
|
+
derivedFromAssetId: import("drizzle-orm/pg-core").PgColumn<{
|
|
802
|
+
name: "derived_from_asset_id";
|
|
803
|
+
tableName: "media_assets";
|
|
804
|
+
dataType: "string";
|
|
805
|
+
columnType: "PgUUID";
|
|
806
|
+
data: string;
|
|
807
|
+
driverParam: string;
|
|
808
|
+
notNull: false;
|
|
809
|
+
hasDefault: false;
|
|
810
|
+
isPrimaryKey: false;
|
|
811
|
+
isAutoincrement: false;
|
|
812
|
+
hasRuntimeDefault: false;
|
|
813
|
+
enumValues: undefined;
|
|
814
|
+
baseColumn: never;
|
|
815
|
+
identity: undefined;
|
|
816
|
+
generated: undefined;
|
|
817
|
+
}, {}, {}>;
|
|
767
818
|
uploadedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
768
819
|
name: "uploaded_at";
|
|
769
820
|
tableName: "media_assets";
|
|
@@ -873,6 +924,23 @@ export declare const KERNEL_ALL_MODULES: {
|
|
|
873
924
|
identity: undefined;
|
|
874
925
|
generated: undefined;
|
|
875
926
|
}, {}, {}>;
|
|
927
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
928
|
+
name: "created_at";
|
|
929
|
+
tableName: "entity_media";
|
|
930
|
+
dataType: "date";
|
|
931
|
+
columnType: "PgTimestamp";
|
|
932
|
+
data: Date;
|
|
933
|
+
driverParam: string;
|
|
934
|
+
notNull: true;
|
|
935
|
+
hasDefault: true;
|
|
936
|
+
isPrimaryKey: false;
|
|
937
|
+
isAutoincrement: false;
|
|
938
|
+
hasRuntimeDefault: false;
|
|
939
|
+
enumValues: undefined;
|
|
940
|
+
baseColumn: never;
|
|
941
|
+
identity: undefined;
|
|
942
|
+
generated: undefined;
|
|
943
|
+
}, {}, {}>;
|
|
876
944
|
};
|
|
877
945
|
dialect: "pg";
|
|
878
946
|
}>;
|
|
@@ -1653,14 +1721,19 @@ export declare const KERNEL_ALL_MODULES: {
|
|
|
1653
1721
|
sellableEntities: typeof import("../modules/catalog/schema.js").sellableEntities;
|
|
1654
1722
|
sellableAttributes: typeof import("../modules/catalog/schema.js").sellableAttributes;
|
|
1655
1723
|
sellableCustomFields: typeof import("../modules/catalog/schema.js").sellableCustomFields;
|
|
1724
|
+
entityFieldDefinitions: typeof import("../modules/catalog/schema.js").entityFieldDefinitions;
|
|
1725
|
+
sellableEntityRevisions: typeof import("../modules/catalog/schema.js").sellableEntityRevisions;
|
|
1656
1726
|
categories: typeof import("../modules/catalog/schema.js").categories;
|
|
1657
1727
|
entityCategories: typeof import("../modules/catalog/schema.js").entityCategories;
|
|
1658
1728
|
brands: typeof import("../modules/catalog/schema.js").brands;
|
|
1659
1729
|
entityBrands: typeof import("../modules/catalog/schema.js").entityBrands;
|
|
1730
|
+
tags: typeof import("../modules/catalog/schema.js").tags;
|
|
1731
|
+
entityTags: typeof import("../modules/catalog/schema.js").entityTags;
|
|
1660
1732
|
optionTypes: typeof import("../modules/catalog/schema.js").optionTypes;
|
|
1661
1733
|
optionValues: typeof import("../modules/catalog/schema.js").optionValues;
|
|
1662
1734
|
variants: typeof import("../modules/catalog/schema.js").variants;
|
|
1663
1735
|
variantOptionValues: typeof import("../modules/catalog/schema.js").variantOptionValues;
|
|
1736
|
+
catalogFieldOwnership: typeof import("../modules/catalog/schema.js").catalogFieldOwnership;
|
|
1664
1737
|
}, import("../modules/catalog/service.js").CatalogServiceImpl, {
|
|
1665
1738
|
pricing: import("../modules/pricing/service.js").PricingService;
|
|
1666
1739
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kernel-modules.d.ts","sourceRoot":"","sources":["../../src/runtime/kernel-modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAsB3D,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"kernel-modules.d.ts","sourceRoot":"","sources":["../../src/runtime/kernel-modules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAsB3D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoBrB,CAAC;AAEX,2FAA2F;AAC3F,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAoBpE;AAED,wBAAgB,8BAA8B,IAAI,SAAS,MAAM,EAAE,CAElE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AASzD,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtE,KAAK,SAAS,GAAG;IACf,SAAS,EAAE;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAcvC;AAeD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,cAAc;;;;;sBAiWxB,MAAM,UAAU,MAAM;GA6FtD"}
|
package/dist/runtime/server.js
CHANGED
|
@@ -7,12 +7,15 @@ import { rateLimiter } from "hono-rate-limiter";
|
|
|
7
7
|
import { createHash } from "node:crypto";
|
|
8
8
|
import { createClientIpResolver } from "./client-ip.js";
|
|
9
9
|
import { authMiddleware } from "../auth/middleware.js";
|
|
10
|
+
import { organizationGuard } from "../auth/organization-guard.js";
|
|
10
11
|
import { CommerceCsrfError } from "../kernel/errors.js";
|
|
11
12
|
import { createRestRoutes } from "../interfaces/rest/index.js";
|
|
12
13
|
import { createCustomerPortalRoutes } from "../interfaces/rest/customer-portal.js";
|
|
13
14
|
import { createCommerce } from "./commerce.js";
|
|
14
15
|
import { rewriteCommerceAliasRequest } from "./url-alias-rewrite.js";
|
|
15
16
|
import { mapErrorToResponse } from "../kernel/error-mapper.js";
|
|
17
|
+
import { assertRouteCoverage } from "../interfaces/rest/route-coverage.js";
|
|
18
|
+
import { markRoutePermissionGuard } from "../interfaces/rest/utils.js";
|
|
16
19
|
/**
|
|
17
20
|
* Returns true if running in a Node-like runtime that supports
|
|
18
21
|
* `process.on()` + `process.exit()`. Edge runtimes (Cloudflare Workers,
|
|
@@ -265,6 +268,10 @@ export async function createServer(config) {
|
|
|
265
268
|
}
|
|
266
269
|
}
|
|
267
270
|
// ─── Auth ──────────────────────────────────────────────────────────
|
|
271
|
+
// Better Auth's organization endpoints are mounted below but governed here:
|
|
272
|
+
// `admin/staff.ts` owns membership, and this guard keeps the plugin's own
|
|
273
|
+
// paths from minting members outside those rules.
|
|
274
|
+
app.use("/api/auth/organization/*", organizationGuard(kernel.database.db, config));
|
|
268
275
|
app.use("/api/auth/*", async (c, next) => {
|
|
269
276
|
if (c.req.path.startsWith("/api/auth/pos/")) {
|
|
270
277
|
await next();
|
|
@@ -367,7 +374,7 @@ export async function createServer(config) {
|
|
|
367
374
|
// Strategy 1: Built-in cron endpoint for serverless deployments.
|
|
368
375
|
// Point Vercel Cron or Cloudflare Cron Trigger at GET /api/jobs/run
|
|
369
376
|
// Optional query params: ?queue=emails&limit=20
|
|
370
|
-
app.get("/api/jobs/run", async (c) => {
|
|
377
|
+
app.get("/api/jobs/run", markRoutePermissionGuard(async (c) => {
|
|
371
378
|
// Always require admin — cron triggers must authenticate
|
|
372
379
|
const actor = c.get("actor");
|
|
373
380
|
if (!actor?.permissions?.includes("*:*")) {
|
|
@@ -383,7 +390,7 @@ export async function createServer(config) {
|
|
|
383
390
|
logger.error({ err }, "Job runner endpoint failed");
|
|
384
391
|
return c.json({ error: { code: "INTERNAL_ERROR", message: "Job processing failed" } }, 500);
|
|
385
392
|
}
|
|
386
|
-
});
|
|
393
|
+
}));
|
|
387
394
|
// Strategy 2: In-process polling for long-running servers (ECS, Cloud Run, Docker).
|
|
388
395
|
// Enable via config.jobs.autorun.enabled = true
|
|
389
396
|
if (config.jobs?.autorun?.enabled) {
|
|
@@ -413,6 +420,7 @@ export async function createServer(config) {
|
|
|
413
420
|
"or set config.jobs.autorun.enabled = true for in-process polling.");
|
|
414
421
|
}
|
|
415
422
|
}
|
|
423
|
+
assertRouteCoverage(app);
|
|
416
424
|
const dispatchFetch = app.fetch.bind(app);
|
|
417
425
|
app.fetch = ((input, env, executionCtx) => {
|
|
418
426
|
const req = input instanceof Request ? input : new Request(input);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-pglite-adapter.d.ts","sourceRoot":"","sources":["../../src/test-utils/create-pglite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA0BxE;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,OAAO,EAAE,eAAe,CAAC;IACzB,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,
|
|
1
|
+
{"version":3,"file":"create-pglite-adapter.d.ts","sourceRoot":"","sources":["../../src/test-utils/create-pglite-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAMrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA0BxE;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,OAAO,EAAE,eAAe,CAAC;IACzB,EAAE,EAAE,eAAe,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAqFD"}
|
|
@@ -62,21 +62,43 @@ export async function createPGliteTestAdapter() {
|
|
|
62
62
|
/**
|
|
63
63
|
* PGlite-compatible transaction wrapper.
|
|
64
64
|
*
|
|
65
|
-
* Drizzle's transaction() method can hang with PGlite due to how
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* Drizzle's transaction() method can hang with PGlite due to how the adapter
|
|
66
|
+
* manages transaction state, so this drives BEGIN/COMMIT manually.
|
|
67
|
+
*
|
|
68
|
+
* PGlite is a single connection, so two transaction bodies awaiting
|
|
69
|
+
* concurrently would otherwise interleave their statements between one
|
|
70
|
+
* BEGIN and one COMMIT — the second BEGIN is a no-op Postgres only warns
|
|
71
|
+
* about. Merged that way, two callers share a snapshot and hold each other's
|
|
72
|
+
* row locks, so an isolation bug reads as if the guard failed. Bodies are
|
|
73
|
+
* queued instead, which is what a connection pool would do to two
|
|
74
|
+
* transactions competing for the same rows.
|
|
75
|
+
*
|
|
76
|
+
* A nested call joins the transaction already open rather than deadlocking
|
|
77
|
+
* on the queue; without savepoints that is the only sound reading.
|
|
68
78
|
*/
|
|
79
|
+
let transactionQueue = Promise.resolve();
|
|
80
|
+
let inTransaction = false;
|
|
69
81
|
async function transaction(fn) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
82
|
+
if (inTransaction)
|
|
83
|
+
return fn(db);
|
|
84
|
+
const run = transactionQueue.then(async () => {
|
|
85
|
+
inTransaction = true;
|
|
86
|
+
await pg.exec("BEGIN");
|
|
87
|
+
try {
|
|
88
|
+
const result = await fn(db);
|
|
89
|
+
await pg.exec("COMMIT");
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
await pg.exec("ROLLBACK");
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
inTransaction = false;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
transactionQueue = run.catch(() => undefined);
|
|
101
|
+
return run;
|
|
80
102
|
}
|
|
81
103
|
const adapter = {
|
|
82
104
|
provider: "postgresql",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-test-config.d.ts","sourceRoot":"","sources":["../../src/test-utils/create-test-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgDzD,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GACtC,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"create-test-config.d.ts","sourceRoot":"","sources":["../../src/test-utils/create-test-config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgDzD,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GACtC,OAAO,CAAC,cAAc,CAAC,CAqHzB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GACtC,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAUnE"}
|
|
@@ -67,11 +67,13 @@ export async function createTestConfig(overrides = {}) {
|
|
|
67
67
|
"catalog:update",
|
|
68
68
|
"catalog:delete",
|
|
69
69
|
"catalog:read",
|
|
70
|
+
"catalog:read:unpublished",
|
|
70
71
|
"inventory:adjust",
|
|
71
72
|
"orders:create",
|
|
72
73
|
"orders:read",
|
|
73
74
|
"orders:update",
|
|
74
75
|
"orders:manage",
|
|
76
|
+
"orders:create:on-behalf",
|
|
75
77
|
"cart:create",
|
|
76
78
|
"cart:update",
|
|
77
79
|
"customers:update:self",
|
|
@@ -80,10 +82,12 @@ export async function createTestConfig(overrides = {}) {
|
|
|
80
82
|
ai_agent: {
|
|
81
83
|
permissions: [
|
|
82
84
|
"catalog:read",
|
|
85
|
+
"catalog:read:unpublished",
|
|
83
86
|
"catalog:create",
|
|
84
87
|
"inventory:read",
|
|
85
88
|
"inventory:adjust",
|
|
86
89
|
"orders:read",
|
|
90
|
+
"orders:create:on-behalf",
|
|
87
91
|
"cart:create",
|
|
88
92
|
"cart:update",
|
|
89
93
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-api-test-utils.d.ts","sourceRoot":"","sources":["../../src/test-utils/rest-api-test-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;KACrB,CAAC;CACH,CAAC;AAiDF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GACtC,OAAO,CAAC;IACT,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAqDD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAEnF;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"rest-api-test-utils.d.ts","sourceRoot":"","sources":["../../src/test-utils/rest-api-test-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,KAAK,SAAS,GAAG;IACf,SAAS,EAAE;QACT,IAAI,EAAE,YAAY,CAAC;QACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;KACrB,CAAC;CACH,CAAC;AAiDF;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,GAAE,OAAO,CAAC,cAAc,CAAM,GACtC,OAAO,CAAC;IACT,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAqDD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAEnF;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,KAsCvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,WAwBA;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EACvB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,qBAYF"}
|
|
@@ -125,9 +125,11 @@ export const testActor = {
|
|
|
125
125
|
"catalog:create",
|
|
126
126
|
"catalog:update",
|
|
127
127
|
"catalog:read",
|
|
128
|
+
"catalog:read:unpublished",
|
|
128
129
|
"inventory:adjust",
|
|
129
130
|
"inventory:read",
|
|
130
131
|
"orders:create",
|
|
132
|
+
"orders:create:on-behalf",
|
|
131
133
|
"orders:read",
|
|
132
134
|
"orders:update",
|
|
133
135
|
"orders:manage",
|
|
@@ -27,8 +27,8 @@ export const testStaffActor = {
|
|
|
27
27
|
organizationId: TEST_ORG_ID,
|
|
28
28
|
role: "staff",
|
|
29
29
|
permissions: [
|
|
30
|
-
"catalog:read", "catalog:create", "catalog:update",
|
|
31
|
-
"inventory:adjust", "orders:read", "orders:create", "orders:update", "orders:manage",
|
|
30
|
+
"catalog:read", "catalog:read:unpublished", "catalog:create", "catalog:update",
|
|
31
|
+
"inventory:adjust", "orders:read", "orders:create", "orders:create:on-behalf", "orders:update", "orders:manage",
|
|
32
32
|
],
|
|
33
33
|
};
|
|
34
34
|
/** Customer with minimal read/write-own permissions. */
|