@porulle/core 0.11.0 → 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 +30 -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 +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -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/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.js +2 -2
- 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 +10 -2
- 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 +2 -1
- 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/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/responses.d.ts +71 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
- 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 +14 -7
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +109 -31
- 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 +3 -2
- package/dist/modules/catalog/repository/index.d.ts.map +1 -1
- package/dist/modules/catalog/repository/index.js +14 -4
- package/dist/modules/catalog/service.d.ts +15 -13
- package/dist/modules/catalog/service.d.ts.map +1 -1
- package/dist/modules/catalog/service.js +25 -18
- 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/service.js +6 -6
- 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/service.d.ts +2 -0
- package/dist/modules/pricing/service.d.ts.map +1 -1
- package/dist/modules/pricing/service.js +12 -11
- 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 +6 -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 +1 -0
- package/dist/modules/search/service.d.ts +1 -0
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +57 -6
- 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/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 +29 -4
- package/src/hooks/checkout.ts +19 -12
- package/src/index.ts +16 -6
- package/src/interfaces/rest/audit-middleware.ts +2 -0
- package/src/interfaces/rest/customer-portal.ts +31 -24
- 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 +2 -2
- 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 +11 -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 +3 -1
- 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 +117 -35
- package/src/modules/catalog/read-policy.ts +16 -0
- package/src/modules/catalog/repository/index.ts +19 -3
- package/src/modules/catalog/service.ts +46 -31
- 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/service.ts +6 -6
- 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/service.ts +14 -16
- package/src/modules/promotions/module.ts +2 -0
- package/src/modules/promotions/service.ts +25 -16
- package/src/modules/search/adapter.ts +6 -0
- package/src/modules/search/module.ts +1 -0
- package/src/modules/search/service.ts +55 -6
- 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
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { defineConfig } from "./config/define-config.js";
|
|
2
|
-
export type { CommerceConfig, CommercePlugin, ApiKeyScopeDefinition, } from "./config/types.js";
|
|
2
|
+
export type { CommerceConfig, CommercePlugin, ApiKeyScopeDefinition, GuestOrderAccessStrategy, } from "./config/types.js";
|
|
3
3
|
export { defineCommercePlugin } from "./kernel/plugin/manifest.js";
|
|
4
4
|
export type { CommercePluginManifest, PluginContext, PluginHookRegistration, PluginLogger, PluginPermission, PluginRouteRegistration, } from "./kernel/plugin/manifest.js";
|
|
5
5
|
export { router } from "./interfaces/rest/router.js";
|
|
@@ -15,12 +15,12 @@ export { setupGracefulShutdown } from "./runtime/shutdown.js";
|
|
|
15
15
|
export { createKernel } from "./runtime/kernel.js";
|
|
16
16
|
export type { Kernel } from "./runtime/kernel.js";
|
|
17
17
|
export type { Actor } from "./auth/types.js";
|
|
18
|
-
export { resolveOrgId, ensureDefaultOrg, DEFAULT_ORG_ID } from "./auth/org.js";
|
|
18
|
+
export { resolveOrgId, resolveOrgIdForCommerce, ensureDefaultOrg, DEFAULT_ORG_ID } from "./auth/org.js";
|
|
19
19
|
export { createSystemActor } from "./auth/system-actor.js";
|
|
20
20
|
export { OrganizationService } from "./modules/organization/service.js";
|
|
21
21
|
export { createScopedDb } from "./kernel/database/scoped-db.js";
|
|
22
22
|
export type { ScopedOrganizationId } from "./kernel/database/scoped-db.js";
|
|
23
|
-
export { assertOwnership, assertPermission } from "./auth/permissions.js";
|
|
23
|
+
export { assertOwnership, assertPermission, requireUserId } from "./auth/permissions.js";
|
|
24
24
|
export type { AccessResult, AccessContext, AccessFn, WhereClause } from "./auth/access.js";
|
|
25
25
|
export { accessOR, accessAND, conditional, isAdmin, isAuthenticated, isDocumentOwner, publicAccess, denyAll, } from "./auth/access.js";
|
|
26
26
|
export { HookRegistry } from "./kernel/hooks/registry.js";
|
|
@@ -62,8 +62,8 @@ export type { SearchAdapter, SearchDocument, SearchFilters, SearchHit, SearchQue
|
|
|
62
62
|
export type { DatabaseAdapter } from "./kernel/database/adapter.js";
|
|
63
63
|
export { isValidFieldPath, validateFieldPath } from "./modules/catalog/ownership.js";
|
|
64
64
|
export type { FieldPath, FieldOwner } from "./modules/catalog/ownership.js";
|
|
65
|
-
export {
|
|
66
|
-
export
|
|
65
|
+
export type { TxContext, WithTransactionOptions, CatalogWriteContext, HookContextCarrier, } from "./kernel/database/tx-context.js";
|
|
66
|
+
export { createTxContext, reuseOrCreateTxContext, withTransaction, isWriteContextTransactional, resolveWriteContextHookContext, } from "./kernel/database/tx-context.js";
|
|
67
67
|
export type { TaxAdapter, TaxAddress, TaxCalculationParams, TaxCalculationResult, TaxLineItem, TaxReportParams, TaxVoidParams, } from "./modules/tax/adapter.js";
|
|
68
68
|
export { getSchema, buildSchema, getTableNames, getSchemaFiles, pushSchema, } from "./kernel/database/migrate.js";
|
|
69
69
|
export { consoleEmailAdapter } from "./adapters/console-email.js";
|
|
@@ -85,6 +85,7 @@ export type { RelationDefinition, EntityDefinition, } from "./kernel/query/regis
|
|
|
85
85
|
export type { QueryInput, QueryResult } from "./kernel/query/executor.js";
|
|
86
86
|
export type { CommerceModuleTypes } from "./types/commerce-types.js";
|
|
87
87
|
export { staleOrderCleanupTask } from "./modules/orders/stale-order-cleanup.js";
|
|
88
|
+
export { windowedGuestOrderAccess, defaultGuestOrderAccess, parseAccessWindow, } from "./modules/orders/guest-access.js";
|
|
88
89
|
export { COMMERCE_AGENT_SYSTEM_PROMPT } from "./utils/agent-prompt.js";
|
|
89
90
|
export { DrizzleAnalyticsAdapter } from "./modules/analytics/drizzle-adapter.js";
|
|
90
91
|
export { BUILTIN_ANALYTICS_MODELS } from "./modules/analytics/models.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,11 +9,11 @@ export { createClientIpResolver } from "./runtime/client-ip.js";
|
|
|
9
9
|
export { createLogger } from "./runtime/logger.js";
|
|
10
10
|
export { setupGracefulShutdown } from "./runtime/shutdown.js";
|
|
11
11
|
export { createKernel } from "./runtime/kernel.js";
|
|
12
|
-
export { resolveOrgId, ensureDefaultOrg, DEFAULT_ORG_ID } from "./auth/org.js";
|
|
12
|
+
export { resolveOrgId, resolveOrgIdForCommerce, ensureDefaultOrg, DEFAULT_ORG_ID } from "./auth/org.js";
|
|
13
13
|
export { createSystemActor } from "./auth/system-actor.js";
|
|
14
14
|
export { OrganizationService } from "./modules/organization/service.js";
|
|
15
15
|
export { createScopedDb } from "./kernel/database/scoped-db.js";
|
|
16
|
-
export { assertOwnership, assertPermission } from "./auth/permissions.js";
|
|
16
|
+
export { assertOwnership, assertPermission, requireUserId } from "./auth/permissions.js";
|
|
17
17
|
export { accessOR, accessAND, conditional, isAdmin, isAuthenticated, isDocumentOwner, publicAccess, denyAll, } from "./auth/access.js";
|
|
18
18
|
export { HookRegistry } from "./kernel/hooks/registry.js";
|
|
19
19
|
export { runBeforeHooks, runAfterHooks } from "./kernel/hooks/executor.js";
|
|
@@ -36,7 +36,7 @@ export { canTransition, assertTransition, orderStateMachine, extendOrderStateMac
|
|
|
36
36
|
export { defineChannelConnector } from "./modules/channels/adapter.js";
|
|
37
37
|
export { noopStorageAdapter } from "./modules/media/noop-adapter.js";
|
|
38
38
|
export { isValidFieldPath, validateFieldPath } from "./modules/catalog/ownership.js";
|
|
39
|
-
export { createTxContext, reuseOrCreateTxContext, withTransaction, } from "./kernel/database/tx-context.js";
|
|
39
|
+
export { createTxContext, reuseOrCreateTxContext, withTransaction, isWriteContextTransactional, resolveWriteContextHookContext, } from "./kernel/database/tx-context.js";
|
|
40
40
|
export { getSchema, buildSchema, getTableNames, getSchemaFiles, pushSchema, } from "./kernel/database/migrate.js";
|
|
41
41
|
export { consoleEmailAdapter } from "./adapters/console-email.js";
|
|
42
42
|
export { promotionTypeEnum } from "./modules/promotions/schemas.js";
|
|
@@ -49,6 +49,7 @@ export { canAccessCart } from "./modules/cart/access.js";
|
|
|
49
49
|
export { QueryRegistry } from "./kernel/query/registry.js";
|
|
50
50
|
export { executeQuery } from "./kernel/query/executor.js";
|
|
51
51
|
export { staleOrderCleanupTask } from "./modules/orders/stale-order-cleanup.js";
|
|
52
|
+
export { windowedGuestOrderAccess, defaultGuestOrderAccess, parseAccessWindow, } from "./modules/orders/guest-access.js";
|
|
52
53
|
export { COMMERCE_AGENT_SYSTEM_PROMPT } from "./utils/agent-prompt.js";
|
|
53
54
|
export { DrizzleAnalyticsAdapter } from "./modules/analytics/drizzle-adapter.js";
|
|
54
55
|
export { BUILTIN_ANALYTICS_MODELS } from "./modules/analytics/models.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-middleware.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/audit-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAK9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"audit-middleware.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/audit-middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAK9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAE5D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAC;CACpB;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAkDjE"}
|
|
@@ -66,12 +66,14 @@ export function auditMiddleware(kernel) {
|
|
|
66
66
|
try {
|
|
67
67
|
const requestId = c.get("requestId");
|
|
68
68
|
const ctx = createHookContext({
|
|
69
|
+
// Anonymous audit records retain actor: null; organization comes from the deployment config.
|
|
69
70
|
actor: c.get("actor") ?? null,
|
|
70
71
|
...(requestId ? { requestId } : {}),
|
|
71
72
|
logger: kernel.logger,
|
|
72
73
|
services: kernel.services,
|
|
73
74
|
database: { db: kernel.database.db },
|
|
74
75
|
origin: "rest",
|
|
76
|
+
commerceConfig: kernel.config,
|
|
75
77
|
});
|
|
76
78
|
await kernel.services.audit.record({ entityType, entityId, event, payload, ctx });
|
|
77
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-portal.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/customer-portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"customer-portal.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/customer-portal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAkBzC,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,gCA2RxD"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import { assertPermission } from "../../auth/permissions.js";
|
|
2
|
+
import { assertPermission, requireUserId } from "../../auth/permissions.js";
|
|
3
3
|
import { getProfileRoute, listAddressesRoute, listCustomerOrdersRoute, getCustomerOrderRoute, getOrderTrackingRoute, getOrderDownloadsRoute, listCoursesRoute, deleteAddressRoute, reorderRoute, updateProfileRoute, createAddressRoute, } from "./schemas/customer-portal.js";
|
|
4
|
-
import { isUUID, mapErrorToStatus } from "./utils.js";
|
|
4
|
+
import { isUUID, mapErrorToStatus, markRoutePermissionGuard } from "./utils.js";
|
|
5
5
|
export function createCustomerPortalRoutes(kernel) {
|
|
6
6
|
const router = new OpenAPIHono();
|
|
7
|
-
router.use("*", async (c, next) => {
|
|
8
|
-
|
|
7
|
+
router.use("*", markRoutePermissionGuard(async (c, next) => {
|
|
8
|
+
const actor = c.get("actor");
|
|
9
|
+
if (!actor?.userId) {
|
|
9
10
|
return c.json({ error: { code: "FORBIDDEN", message: "Authentication required." } }, 401);
|
|
10
11
|
}
|
|
11
12
|
await next();
|
|
12
|
-
});
|
|
13
|
+
}));
|
|
13
14
|
/**
|
|
14
15
|
* Resolves an actor whose userId is the customer profile UUID (not the Better Auth user ID).
|
|
15
16
|
* Required so that `assertOwnership(actor, order.customerId)` compares UUIDs correctly,
|
|
@@ -71,9 +72,9 @@ export function createCustomerPortalRoutes(kernel) {
|
|
|
71
72
|
page: Number.parseInt(c.req.query("page") ?? "1", 10),
|
|
72
73
|
limit: Number.parseInt(c.req.query("limit") ?? "20", 10),
|
|
73
74
|
...(status !== undefined ? { status } : {}),
|
|
74
|
-
});
|
|
75
|
+
}, actor);
|
|
75
76
|
if (!result.ok)
|
|
76
|
-
return c.json({ error: result.error },
|
|
77
|
+
return c.json({ error: result.error }, mapErrorToStatus(result.error));
|
|
77
78
|
return c.json({ data: result.value.items, meta: result.value.pagination });
|
|
78
79
|
});
|
|
79
80
|
// @ts-expect-error -- openapi handler union return type
|
|
@@ -171,7 +172,7 @@ export function createCustomerPortalRoutes(kernel) {
|
|
|
171
172
|
return c.json({ error: orderResult.error }, mapErrorToStatus(orderResult.error));
|
|
172
173
|
}
|
|
173
174
|
const cartResult = await kernel.services.cart.create({
|
|
174
|
-
customerId: actor
|
|
175
|
+
customerId: requireUserId(actor),
|
|
175
176
|
currency: orderResult.value.currency,
|
|
176
177
|
}, actor);
|
|
177
178
|
if (!cartResult.ok)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RouterRoute } from "hono/types";
|
|
2
|
+
export type PublicRoute = {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
justification: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const PUBLIC_ROUTES: readonly PublicRoute[];
|
|
8
|
+
type RouteTableApp = {
|
|
9
|
+
routes: readonly RouterRoute[];
|
|
10
|
+
};
|
|
11
|
+
export declare function findUncoveredRoutes(app: RouteTableApp): string[];
|
|
12
|
+
export declare function assertRouteCoverage(app: RouteTableApp): void;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=route-coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-coverage.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/route-coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAc/C,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;CAChC,CAAC;AA6CF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,EAAE,CAuBhE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAK5D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { isRoutePermissionGuard } from "./utils.js";
|
|
2
|
+
export const PUBLIC_ROUTES = [
|
|
3
|
+
{ method: "GET", path: "/api/health", justification: "Load balancers need an unauthenticated liveness probe." },
|
|
4
|
+
{ method: "GET", path: "/api/reference", justification: "The development API explorer is intentionally public when enabled." },
|
|
5
|
+
{ method: "GET", path: "/api/doc", justification: "The generated OpenAPI document is public when documentation exposure is enabled." },
|
|
6
|
+
{ method: "GET", path: "/api/doc-ext", justification: "The enriched OpenAPI document is public when documentation exposure is enabled." },
|
|
7
|
+
{ method: "POST", path: "/api/carts", justification: "Anonymous storefront shoppers create secret-backed guest carts." },
|
|
8
|
+
{ method: "GET", path: "/api/carts/:id", justification: "Guest cart reads require the cart secret; customer carts require ownership in the service." },
|
|
9
|
+
{ method: "POST", path: "/api/carts/:id/items", justification: "Anonymous storefront shoppers add items to a secret-backed guest cart." },
|
|
10
|
+
{ method: "PATCH", path: "/api/carts/:id/items/:itemId", justification: "Anonymous storefront shoppers change quantities in a secret-backed guest cart." },
|
|
11
|
+
{ method: "DELETE", path: "/api/carts/:id/items/:itemId", justification: "Anonymous storefront shoppers remove items from a secret-backed guest cart." },
|
|
12
|
+
{ method: "POST", path: "/api/checkout", justification: "Anonymous storefront checkout is authorized by the customer actor and cart/payment pipeline." },
|
|
13
|
+
{ method: "GET", path: "/api/media/:id", justification: "Public media assets redirect to their configured public storage URL; signed URLs still require an actor in the handler." },
|
|
14
|
+
{ method: "POST", path: "/api/promotions/validate", justification: "Storefront shoppers validate a promotion code before checkout; the route is rate-limited." },
|
|
15
|
+
{ method: "POST", path: "/api/payments/webhook", justification: "The payment provider authenticates this endpoint with its signed webhook payload." },
|
|
16
|
+
];
|
|
17
|
+
function hasPermissionGuard(handler, method, seen = new Set()) {
|
|
18
|
+
if (typeof handler !== "function" || seen.has(handler))
|
|
19
|
+
return false;
|
|
20
|
+
seen.add(handler);
|
|
21
|
+
if (isRoutePermissionGuard(handler, method))
|
|
22
|
+
return true;
|
|
23
|
+
const composed = handler.__COMPOSED_HANDLER;
|
|
24
|
+
return hasPermissionGuard(composed, method, seen);
|
|
25
|
+
}
|
|
26
|
+
function splitPath(path) {
|
|
27
|
+
return path.split("/").filter(Boolean);
|
|
28
|
+
}
|
|
29
|
+
function pathPatternCovers(pattern, target) {
|
|
30
|
+
const patternParts = splitPath(pattern);
|
|
31
|
+
const targetParts = splitPath(target);
|
|
32
|
+
const wildcardIndex = patternParts.indexOf("*");
|
|
33
|
+
if (wildcardIndex >= 0) {
|
|
34
|
+
if (wildcardIndex !== patternParts.length - 1 || targetParts.length < wildcardIndex)
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
else if (patternParts.length !== targetParts.length) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return patternParts.every((part, index) => {
|
|
41
|
+
if (part === "*")
|
|
42
|
+
return true;
|
|
43
|
+
const targetPart = targetParts[index];
|
|
44
|
+
return part.startsWith(":") || part === targetPart;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function publicRouteCovers(route) {
|
|
48
|
+
return PUBLIC_ROUTES.some((publicRoute) => publicRoute.method === route.method && pathPatternCovers(publicRoute.path, route.path));
|
|
49
|
+
}
|
|
50
|
+
function routeKey(route) {
|
|
51
|
+
return `${route.method} ${route.path}`;
|
|
52
|
+
}
|
|
53
|
+
export function findUncoveredRoutes(app) {
|
|
54
|
+
const routes = app.routes;
|
|
55
|
+
const guardedRoutes = routes
|
|
56
|
+
.map((route, index) => ({ route, index }))
|
|
57
|
+
.filter(({ route }) => route.method === "ALL" && hasPermissionGuard(route.handler));
|
|
58
|
+
const endpoints = new Map();
|
|
59
|
+
for (const [index, route] of routes.entries()) {
|
|
60
|
+
if (route.method === "ALL")
|
|
61
|
+
continue;
|
|
62
|
+
const key = routeKey(route);
|
|
63
|
+
if (!endpoints.has(key))
|
|
64
|
+
endpoints.set(key, { route, index });
|
|
65
|
+
}
|
|
66
|
+
return [...endpoints.values()]
|
|
67
|
+
.filter(({ route, index }) => {
|
|
68
|
+
if (publicRouteCovers(route))
|
|
69
|
+
return false;
|
|
70
|
+
const directlyGuarded = hasPermissionGuard(route.handler, route.method);
|
|
71
|
+
const coveredByMiddleware = guardedRoutes.some(({ route: guard, index: guardIndex }) => guardIndex <= index && pathPatternCovers(guard.path, route.path) && hasPermissionGuard(guard.handler, route.method));
|
|
72
|
+
return !directlyGuarded && !coveredByMiddleware;
|
|
73
|
+
})
|
|
74
|
+
.map(({ route }) => routeKey(route));
|
|
75
|
+
}
|
|
76
|
+
export function assertRouteCoverage(app) {
|
|
77
|
+
const uncovered = findUncoveredRoutes(app);
|
|
78
|
+
if (uncovered.length > 0) {
|
|
79
|
+
throw new Error(`Unclassified routes: ${uncovered.join(", ")}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
28
|
import { z } from "@hono/zod-openapi";
|
|
29
|
+
import type { CommerceConfig } from "../../config/types.js";
|
|
29
30
|
import type { PluginRouteRegistration } from "../../kernel/plugin/manifest.js";
|
|
30
31
|
export interface RouteHandlerContext {
|
|
31
32
|
/** Validated request body (from .input()). Undefined if no .input() was called. */
|
|
@@ -36,13 +37,13 @@ export interface RouteHandlerContext {
|
|
|
36
37
|
params: Record<string, string>;
|
|
37
38
|
/** Authenticated actor. Guaranteed non-null if .auth() or .permission() was called. */
|
|
38
39
|
actor: {
|
|
39
|
-
userId: string;
|
|
40
|
+
userId: string | null;
|
|
40
41
|
role: string;
|
|
41
42
|
permissions: string[];
|
|
42
43
|
vendorId?: string | null;
|
|
43
44
|
[key: string]: unknown;
|
|
44
45
|
} | null;
|
|
45
|
-
/** Resolved organization ID. Derived from actor.organizationId
|
|
46
|
+
/** Resolved organization ID. Derived from actor.organizationId or the deployment config. */
|
|
46
47
|
orgId: string;
|
|
47
48
|
/** Kernel services (orders, cart, inventory, etc.) */
|
|
48
49
|
services: Record<string, unknown>;
|
|
@@ -69,6 +70,7 @@ declare class RouteChain {
|
|
|
69
70
|
private _requireAuth;
|
|
70
71
|
private _requiredPermission;
|
|
71
72
|
constructor(method: string, fullPath: string, tag: string, routesList: PluginRouteRegistration[], pluginCtx?: {
|
|
73
|
+
config?: CommerceConfig;
|
|
72
74
|
services: Record<string, unknown>;
|
|
73
75
|
db: unknown;
|
|
74
76
|
} | undefined);
|
|
@@ -116,6 +118,7 @@ declare class RouterImpl {
|
|
|
116
118
|
private _prefix;
|
|
117
119
|
private _pluginCtx;
|
|
118
120
|
constructor(tag: string, prefix: string, pluginCtx?: {
|
|
121
|
+
config?: CommerceConfig;
|
|
119
122
|
services?: Record<string, unknown>;
|
|
120
123
|
database?: {
|
|
121
124
|
db: unknown;
|
|
@@ -123,6 +126,7 @@ declare class RouterImpl {
|
|
|
123
126
|
});
|
|
124
127
|
/** @internal — used by RouteChain to wire plugin context into handlers */
|
|
125
128
|
get pluginContext(): {
|
|
129
|
+
config?: CommerceConfig;
|
|
126
130
|
services: Record<string, unknown>;
|
|
127
131
|
db: unknown;
|
|
128
132
|
} | undefined;
|
|
@@ -155,6 +159,7 @@ declare class RouterImpl {
|
|
|
155
159
|
* ```
|
|
156
160
|
*/
|
|
157
161
|
export declare function router(tag: string, prefix: string, ctx?: {
|
|
162
|
+
config?: CommerceConfig;
|
|
158
163
|
services?: Record<string, unknown>;
|
|
159
164
|
database?: {
|
|
160
165
|
db: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAe,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAwB/E,MAAM,WAAW,mBAAmB;IAClC,mFAAmF;IACnF,KAAK,EAAE,OAAO,CAAC;IACf,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,uFAAuF;IACvF,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { createRoute, z } from "@hono/zod-openapi";
|
|
29
29
|
import { ErrorSchema } from "./schemas/shared.js";
|
|
30
|
-
import { mapErrorToResponse, mapErrorToStatus } from "./utils.js";
|
|
30
|
+
import { mapErrorToResponse, mapErrorToStatus, markRoutePermissionGuard } from "./utils.js";
|
|
31
31
|
import { createScopedDb } from "../../kernel/database/scoped-db.js";
|
|
32
|
-
import {
|
|
32
|
+
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
33
33
|
// ─── Shared OpenAPI Error Responses ──────────────────────────────────────────
|
|
34
34
|
const errorResponses = {
|
|
35
35
|
400: { content: { "application/json": { schema: ErrorSchema } }, description: "Bad request." },
|
|
@@ -166,7 +166,7 @@ class RouteChain {
|
|
|
166
166
|
// Plugin route handlers receive a db that auto-filters queries
|
|
167
167
|
// and auto-stamps inserts with the actor's organizationId.
|
|
168
168
|
const rawDb = kernel?.db;
|
|
169
|
-
const orgId =
|
|
169
|
+
const orgId = resolveOrgIdForCommerce(actor, kernel?.config);
|
|
170
170
|
const scopedDb = rawDb ? createScopedDb(rawDb, orgId) : rawDb;
|
|
171
171
|
const handlerCtx = {
|
|
172
172
|
input: inputSchema ? ctx.req.valid("json") : undefined,
|
|
@@ -198,7 +198,10 @@ class RouteChain {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
|
-
|
|
201
|
+
const registeredHandler = requireAuth || requiredPermission
|
|
202
|
+
? markRoutePermissionGuard(honoHandler)
|
|
203
|
+
: honoHandler;
|
|
204
|
+
this.routesList.push({ openapi: routeConfig, handler: registeredHandler });
|
|
202
205
|
}
|
|
203
206
|
}
|
|
204
207
|
// ─── Router ──────────────────────────────────────────────────────────────────
|
|
@@ -216,6 +219,7 @@ class RouterImpl {
|
|
|
216
219
|
// If plugin context is provided, wire services + db for handler access
|
|
217
220
|
if (pluginCtx) {
|
|
218
221
|
this._pluginCtx = {
|
|
222
|
+
...(pluginCtx.config !== undefined ? { config: pluginCtx.config } : {}),
|
|
219
223
|
services: pluginCtx.services ?? {},
|
|
220
224
|
db: pluginCtx.database?.db,
|
|
221
225
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compensation-failures.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/compensation-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAU5D,OAAO,EAAE,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"compensation-failures.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/compensation-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAU5D,OAAO,EAAE,KAAK,MAAM,EAAqD,MAAM,gBAAgB,CAAC;AAuDhG,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,gCAgG5D"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
2
|
import { assertPermission } from "../../../../auth/permissions.js";
|
|
3
|
-
import {
|
|
3
|
+
import { resolveOrgIdForCommerce } from "../../../../auth/org.js";
|
|
4
4
|
import { CommerceValidationError } from "../../../../kernel/errors.js";
|
|
5
5
|
import { listCompensationFailuresRoute, resolveCompensationFailureRoute, } from "../../schemas/compensation-failures.js";
|
|
6
|
-
import { mapErrorToResponse, mapErrorToStatus } from "../../utils.js";
|
|
6
|
+
import { mapErrorToResponse, mapErrorToStatus, requirePerm } from "../../utils.js";
|
|
7
7
|
function toIso(d) {
|
|
8
8
|
if (d == null)
|
|
9
9
|
return null;
|
|
@@ -45,11 +45,13 @@ function parseResolvedFilter(raw) {
|
|
|
45
45
|
}
|
|
46
46
|
export function compensationFailureAdminRoutes(kernel) {
|
|
47
47
|
const router = new OpenAPIHono();
|
|
48
|
+
router.use("/compensation-failures", requirePerm("compensation:admin"));
|
|
49
|
+
router.use("/compensation-failures/*", requirePerm("compensation:admin"));
|
|
48
50
|
// @ts-expect-error -- openapi handler union return type
|
|
49
51
|
router.openapi(listCompensationFailuresRoute, async (c) => {
|
|
50
52
|
const actor = c.get("actor");
|
|
51
53
|
assertPermission(actor, "compensation:admin");
|
|
52
|
-
const orgId =
|
|
54
|
+
const orgId = resolveOrgIdForCommerce(actor, kernel.config);
|
|
53
55
|
const resolvedParsed = parseResolvedFilter(c.req.query("resolved"));
|
|
54
56
|
if (!resolvedParsed.ok) {
|
|
55
57
|
return c.json(mapErrorToResponse(new CommerceValidationError('Query "resolved" must be true, false, or all.')), 422);
|
|
@@ -82,7 +84,7 @@ export function compensationFailureAdminRoutes(kernel) {
|
|
|
82
84
|
router.openapi(resolveCompensationFailureRoute, async (c) => {
|
|
83
85
|
const actor = c.get("actor");
|
|
84
86
|
assertPermission(actor, "compensation:admin");
|
|
85
|
-
const orgId =
|
|
87
|
+
const orgId = resolveOrgIdForCommerce(actor, kernel.config);
|
|
86
88
|
const id = c.req.param("id");
|
|
87
89
|
const body = c.req.valid("json");
|
|
88
90
|
const found = await kernel.services.compensationFailures.findById(id);
|
|
@@ -102,7 +104,7 @@ export function compensationFailureAdminRoutes(kernel) {
|
|
|
102
104
|
const resolved = await kernel.services.compensationFailures.markResolved({
|
|
103
105
|
id,
|
|
104
106
|
organizationId: orgId,
|
|
105
|
-
resolvedBy: actor.userId,
|
|
107
|
+
resolvedBy: actor.userId ?? "system",
|
|
106
108
|
...(body.notes !== undefined ? { notes: body.notes } : {}),
|
|
107
109
|
});
|
|
108
110
|
if (!resolved.ok) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveOrgIdForCommerce } from "../../../../auth/org.js";
|
|
3
3
|
import { listCustomFieldProposalsRoute, } from "../../schemas/admin-custom-field-proposals.js";
|
|
4
4
|
import { parsePagination, requirePerm, } from "../../utils.js";
|
|
5
5
|
export function adminCustomFieldProposalRoutes(kernel) {
|
|
@@ -8,7 +8,7 @@ export function adminCustomFieldProposalRoutes(kernel) {
|
|
|
8
8
|
router.openapi(listCustomFieldProposalsRoute, async (c) => {
|
|
9
9
|
const pagination = parsePagination(c.req.query());
|
|
10
10
|
const entityType = c.req.query("entityType");
|
|
11
|
-
const result = await kernel.services.catalog.repository.listProposedCustomFields(
|
|
11
|
+
const result = await kernel.services.catalog.repository.listProposedCustomFields(resolveOrgIdForCommerce(c.get("actor"), kernel.config), pagination, entityType !== undefined ? { entityType } : undefined);
|
|
12
12
|
return c.json({
|
|
13
13
|
data: {
|
|
14
14
|
items: result.items,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
2
|
import type { Kernel } from "../../../../runtime/kernel.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type AppEnv } from "../../utils.js";
|
|
4
4
|
export declare function adminPermissionsRoutes(kernel: Kernel): OpenAPIHono<AppEnv, {}, "/">;
|
|
5
5
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAI5D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAI5D,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAa1D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,gCAoBpD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
2
|
import { assertPermission } from "../../../../auth/permissions.js";
|
|
3
3
|
import { listAdminPermissionsRoute } from "../../schemas/admin-permissions.js";
|
|
4
|
+
import { requirePerm } from "../../utils.js";
|
|
4
5
|
function flattenCoreRolePermissions(config) {
|
|
5
6
|
const roles = config.auth?.roles ?? {};
|
|
6
7
|
const set = new Set();
|
|
@@ -13,6 +14,7 @@ function flattenCoreRolePermissions(config) {
|
|
|
13
14
|
}
|
|
14
15
|
export function adminPermissionsRoutes(kernel) {
|
|
15
16
|
const router = new OpenAPIHono();
|
|
17
|
+
router.use("/permissions", requirePerm("admin"));
|
|
16
18
|
router.openapi(listAdminPermissionsRoute, (c) => {
|
|
17
19
|
const actor = c.get("actor");
|
|
18
20
|
assertPermission(actor, "admin");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staff.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/staff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"staff.d.ts","sourceRoot":"","sources":["../../../../../src/interfaces/rest/routes/admin/staff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAwB5D,OAAO,EAAE,KAAK,MAAM,EAAe,MAAM,gBAAgB,CAAC;AAE1D;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,gCAyT9C"}
|