@porulle/core 0.18.0 → 0.20.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/hooks/checkout.d.ts +3 -0
- package/dist/hooks/checkout.d.ts.map +1 -1
- package/dist/hooks/checkout.js +3 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/interfaces/rest/router.d.ts +21 -0
- package/dist/interfaces/rest/router.d.ts.map +1 -1
- package/dist/interfaces/rest/router.js +24 -3
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/checkout.js +5 -0
- package/dist/interfaces/rest/schemas/checkout.d.ts +8 -0
- package/dist/interfaces/rest/schemas/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/checkout.js +10 -0
- package/dist/interfaces/rest/utils.d.ts +1 -0
- package/dist/interfaces/rest/utils.d.ts.map +1 -1
- package/dist/interfaces/rest/utils.js +3 -0
- package/dist/modules/payments/adapter.d.ts +3 -0
- package/dist/modules/payments/adapter.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hooks/checkout.ts +9 -1
- package/src/index.ts +1 -1
- package/src/interfaces/rest/router.ts +26 -3
- package/src/interfaces/rest/routes/checkout.ts +5 -0
- package/src/interfaces/rest/schemas/checkout.ts +10 -0
- package/src/interfaces/rest/utils.ts +4 -0
- package/src/modules/payments/adapter.ts +3 -0
package/dist/hooks/checkout.d.ts
CHANGED
|
@@ -54,6 +54,8 @@ export interface CheckoutData {
|
|
|
54
54
|
paymentMethodToken?: string;
|
|
55
55
|
/** Stable retry key shared by order creation and payment authorization. */
|
|
56
56
|
idempotencyKey?: string;
|
|
57
|
+
returnUrl?: string;
|
|
58
|
+
cancelUrl?: string;
|
|
57
59
|
lineItems: CheckoutLineItem[];
|
|
58
60
|
subtotal: number;
|
|
59
61
|
discountTotal: number;
|
|
@@ -63,6 +65,7 @@ export interface CheckoutData {
|
|
|
63
65
|
promotionCodes?: string[];
|
|
64
66
|
paymentIntentId?: string;
|
|
65
67
|
paymentClientSecret?: string | undefined;
|
|
68
|
+
paymentRedirectUrl?: string | undefined;
|
|
66
69
|
shippingAddress?: ShippingAddress;
|
|
67
70
|
appliedPromotions?: AppliedPromotion[];
|
|
68
71
|
freeShipping?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/hooks/checkout.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/hooks/checkout.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/checkout.js
CHANGED
|
@@ -219,6 +219,8 @@ export const authorizePayment = async ({ data, context, }) => {
|
|
|
219
219
|
...(data.idempotencyKey !== undefined
|
|
220
220
|
? { idempotencyKey: data.idempotencyKey }
|
|
221
221
|
: {}),
|
|
222
|
+
...(data.returnUrl !== undefined ? { returnUrl: data.returnUrl } : {}),
|
|
223
|
+
...(data.cancelUrl !== undefined ? { cancelUrl: data.cancelUrl } : {}),
|
|
222
224
|
metadata: {
|
|
223
225
|
...(data.orderId !== undefined ? { orderId: data.orderId } : {}),
|
|
224
226
|
organizationId: resolveOrgIdForCommerce(context.actor, context.commerceConfig),
|
|
@@ -232,6 +234,7 @@ export const authorizePayment = async ({ data, context, }) => {
|
|
|
232
234
|
}
|
|
233
235
|
data.paymentIntentId = authorized.value.id;
|
|
234
236
|
data.paymentClientSecret = authorized.value.clientSecret ?? undefined;
|
|
237
|
+
data.paymentRedirectUrl = authorized.value.redirectUrl ?? undefined;
|
|
235
238
|
context.context.paymentIntentId = authorized.value.id;
|
|
236
239
|
return data;
|
|
237
240
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export type { CommerceConfig, CommercePlugin, ApiKeyScopeDefinition, GuestOrderA
|
|
|
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";
|
|
6
|
-
export { requirePerm } from "./interfaces/rest/utils.js";
|
|
6
|
+
export { markPublicRoute, markRoutePermissionGuard, requirePerm } from "./interfaces/rest/utils.js";
|
|
7
7
|
export { webhookRouter, type WebhookRouterResult } from "./interfaces/rest/webhook-router.js";
|
|
8
8
|
export { isPrivateUrl, isPrivateIp } from "./modules/webhooks/ssrf-guard.js";
|
|
9
9
|
export { createServer } from "./runtime/server.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,EACrB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { defineConfig } from "./config/define-config.js";
|
|
2
2
|
export { defineCommercePlugin } from "./kernel/plugin/manifest.js";
|
|
3
3
|
export { router } from "./interfaces/rest/router.js";
|
|
4
|
-
export { requirePerm } from "./interfaces/rest/utils.js";
|
|
4
|
+
export { markPublicRoute, markRoutePermissionGuard, requirePerm } from "./interfaces/rest/utils.js";
|
|
5
5
|
export { webhookRouter } from "./interfaces/rest/webhook-router.js";
|
|
6
6
|
export { isPrivateUrl, isPrivateIp } from "./modules/webhooks/ssrf-guard.js";
|
|
7
7
|
export { createServer } from "./runtime/server.js";
|
|
@@ -67,6 +67,7 @@ declare class RouteChain {
|
|
|
67
67
|
private _input;
|
|
68
68
|
private _query;
|
|
69
69
|
private _params;
|
|
70
|
+
private _output;
|
|
70
71
|
private _requireAuth;
|
|
71
72
|
private _requiredPermission;
|
|
72
73
|
constructor(method: string, fullPath: string, tag: string, routesList: PluginRouteRegistration[], pluginCtx?: {
|
|
@@ -84,6 +85,26 @@ declare class RouteChain {
|
|
|
84
85
|
query(schema: z.ZodType): this;
|
|
85
86
|
/** Override the auto-detected path parameter schema. */
|
|
86
87
|
params(schema: z.ZodType): this;
|
|
88
|
+
/**
|
|
89
|
+
* Declare the shape carried inside the `{ data }` envelope on success.
|
|
90
|
+
*
|
|
91
|
+
* Without it the route documents its payload as `any`, and every generated
|
|
92
|
+
* client sees `data?: unknown` — so a consumer has to hand-maintain a
|
|
93
|
+
* parallel schema, which is the drift the generated SDK exists to prevent.
|
|
94
|
+
*
|
|
95
|
+
* Documentation only: the handler's return value is not validated against
|
|
96
|
+
* this schema. Validating would mean either stripping unknown keys — silently
|
|
97
|
+
* changing what goes over the wire for anyone who adopts it — or throwing at
|
|
98
|
+
* runtime, turning an OpenAPI annotation into a new failure mode. A stale
|
|
99
|
+
* annotation is the cheaper wrong.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* vendors.get("/{id}").summary("Get").output(VendorSchema)
|
|
104
|
+
* .handler(async ({ params, services }) => services.vendor.get(params.id));
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
output(schema: z.ZodType): this;
|
|
87
108
|
/**
|
|
88
109
|
* Require authentication. The handler's `actor` is guaranteed non-null.
|
|
89
110
|
* Returns 401 if the request has no authenticated actor.
|
|
@@ -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,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,7 @@ import { ErrorSchema } from "./schemas/shared.js";
|
|
|
30
30
|
import { mapErrorToResponse, mapErrorToStatus, markRoutePermissionGuard } from "./utils.js";
|
|
31
31
|
import { createScopedDb } from "../../kernel/database/scoped-db.js";
|
|
32
32
|
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
33
|
+
import { hasPermission } from "../../auth/permissions.js";
|
|
33
34
|
// ─── Shared OpenAPI Error Responses ──────────────────────────────────────────
|
|
34
35
|
const errorResponses = {
|
|
35
36
|
400: { content: { "application/json": { schema: ErrorSchema } }, description: "Bad request." },
|
|
@@ -56,6 +57,7 @@ class RouteChain {
|
|
|
56
57
|
_input;
|
|
57
58
|
_query;
|
|
58
59
|
_params;
|
|
60
|
+
_output;
|
|
59
61
|
_requireAuth = false;
|
|
60
62
|
_requiredPermission;
|
|
61
63
|
constructor(method, fullPath, tag, routesList, pluginCtx) {
|
|
@@ -79,6 +81,26 @@ class RouteChain {
|
|
|
79
81
|
query(schema) { this._query = schema; return this; }
|
|
80
82
|
/** Override the auto-detected path parameter schema. */
|
|
81
83
|
params(schema) { this._params = schema; return this; }
|
|
84
|
+
/**
|
|
85
|
+
* Declare the shape carried inside the `{ data }` envelope on success.
|
|
86
|
+
*
|
|
87
|
+
* Without it the route documents its payload as `any`, and every generated
|
|
88
|
+
* client sees `data?: unknown` — so a consumer has to hand-maintain a
|
|
89
|
+
* parallel schema, which is the drift the generated SDK exists to prevent.
|
|
90
|
+
*
|
|
91
|
+
* Documentation only: the handler's return value is not validated against
|
|
92
|
+
* this schema. Validating would mean either stripping unknown keys — silently
|
|
93
|
+
* changing what goes over the wire for anyone who adopts it — or throwing at
|
|
94
|
+
* runtime, turning an OpenAPI annotation into a new failure mode. A stale
|
|
95
|
+
* annotation is the cheaper wrong.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```typescript
|
|
99
|
+
* vendors.get("/{id}").summary("Get").output(VendorSchema)
|
|
100
|
+
* .handler(async ({ params, services }) => services.vendor.get(params.id));
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
output(schema) { this._output = schema; return this; }
|
|
82
104
|
/**
|
|
83
105
|
* Require authentication. The handler's `actor` is guaranteed non-null.
|
|
84
106
|
* Returns 401 if the request has no authenticated actor.
|
|
@@ -126,7 +148,7 @@ class RouteChain {
|
|
|
126
148
|
...(this._description ? { description: this._description } : {}),
|
|
127
149
|
...(Object.keys(request).length > 0 ? { request } : {}),
|
|
128
150
|
responses: {
|
|
129
|
-
[status]: wrapJson(z.object({ data: z.any() })),
|
|
151
|
+
[status]: wrapJson(z.object({ data: this._output ?? z.any() })),
|
|
130
152
|
...errorResponses,
|
|
131
153
|
},
|
|
132
154
|
});
|
|
@@ -148,8 +170,7 @@ class RouteChain {
|
|
|
148
170
|
return ctx.json({ error: { code: "UNAUTHORIZED", message: "Authentication required." } }, 401);
|
|
149
171
|
}
|
|
150
172
|
if (requiredPermission) {
|
|
151
|
-
|
|
152
|
-
if (!perms.includes(requiredPermission) && !perms.includes("*:*")) {
|
|
173
|
+
if (!hasPermission(actor, requiredPermission)) {
|
|
153
174
|
return ctx.json({
|
|
154
175
|
error: { code: "FORBIDDEN", message: `Permission '${requiredPermission}' is required.` },
|
|
155
176
|
}, 403);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/routes/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAoBzD,OAAO,EAAE,KAAK,MAAM,EAAwC,MAAM,aAAa,CAAC;AAMhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,EAC1C,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC7B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/routes/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAoBzD,OAAO,EAAE,KAAK,MAAM,EAAwC,MAAM,aAAa,CAAC;AAMhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;GAMG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,EAC1C,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC7B;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,gCAwV5C"}
|
|
@@ -99,6 +99,8 @@ export function checkoutRoutes(kernel) {
|
|
|
99
99
|
...(body.idempotencyKey !== undefined
|
|
100
100
|
? { idempotencyKey: body.idempotencyKey }
|
|
101
101
|
: {}),
|
|
102
|
+
...(body.returnUrl !== undefined ? { returnUrl: body.returnUrl } : {}),
|
|
103
|
+
...(body.cancelUrl !== undefined ? { cancelUrl: body.cancelUrl } : {}),
|
|
102
104
|
lineItems: [],
|
|
103
105
|
subtotal: 0,
|
|
104
106
|
discountTotal: 0,
|
|
@@ -286,6 +288,9 @@ export function checkoutRoutes(kernel) {
|
|
|
286
288
|
...(processed.paymentClientSecret
|
|
287
289
|
? { paymentClientSecret: processed.paymentClientSecret }
|
|
288
290
|
: {}),
|
|
291
|
+
...(processed.paymentRedirectUrl
|
|
292
|
+
? { paymentRedirectUrl: processed.paymentRedirectUrl }
|
|
293
|
+
: {}),
|
|
289
294
|
},
|
|
290
295
|
meta: afterReport.hasErrors
|
|
291
296
|
? { hookErrors: afterReport.errors }
|
|
@@ -4,6 +4,8 @@ export declare const CheckoutBodySchema: z.ZodObject<{
|
|
|
4
4
|
paymentMethodId: z.ZodString;
|
|
5
5
|
paymentMethodToken: z.ZodOptional<z.ZodString>;
|
|
6
6
|
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
7
|
+
returnUrl: z.ZodOptional<z.ZodString>;
|
|
8
|
+
cancelUrl: z.ZodOptional<z.ZodString>;
|
|
7
9
|
customerId: z.ZodOptional<z.ZodString>;
|
|
8
10
|
customerGroupIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
9
11
|
currency: z.ZodOptional<z.ZodString>;
|
|
@@ -29,6 +31,8 @@ export declare const OrderResponseSchema: z.ZodObject<{
|
|
|
29
31
|
discountTotal: z.ZodNumber;
|
|
30
32
|
grandTotal: z.ZodNumber;
|
|
31
33
|
placedAt: z.ZodString;
|
|
34
|
+
paymentClientSecret: z.ZodOptional<z.ZodString>;
|
|
35
|
+
paymentRedirectUrl: z.ZodOptional<z.ZodString>;
|
|
32
36
|
}, z.core.$strip>;
|
|
33
37
|
meta: z.ZodOptional<z.ZodObject<{
|
|
34
38
|
hookErrors: z.ZodArray<z.ZodString>;
|
|
@@ -49,6 +53,8 @@ export declare const checkoutRoute: {
|
|
|
49
53
|
paymentMethodId: z.ZodString;
|
|
50
54
|
paymentMethodToken: z.ZodOptional<z.ZodString>;
|
|
51
55
|
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
56
|
+
returnUrl: z.ZodOptional<z.ZodString>;
|
|
57
|
+
cancelUrl: z.ZodOptional<z.ZodString>;
|
|
52
58
|
customerId: z.ZodOptional<z.ZodString>;
|
|
53
59
|
customerGroupIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
54
60
|
currency: z.ZodOptional<z.ZodString>;
|
|
@@ -183,6 +189,8 @@ export declare const checkoutRoute: {
|
|
|
183
189
|
discountTotal: z.ZodNumber;
|
|
184
190
|
grandTotal: z.ZodNumber;
|
|
185
191
|
placedAt: z.ZodString;
|
|
192
|
+
paymentClientSecret: z.ZodOptional<z.ZodString>;
|
|
193
|
+
paymentRedirectUrl: z.ZodOptional<z.ZodString>;
|
|
186
194
|
}, z.core.$strip>;
|
|
187
195
|
meta: z.ZodOptional<z.ZodObject<{
|
|
188
196
|
hookErrors: z.ZodArray<z.ZodString>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;AAKnD,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../../../src/interfaces/rest/schemas/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAe,MAAM,mBAAmB,CAAC;AAKnD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;iBAkCF,CAAC;AAI9B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;iBAkBF,CAAC;AAI/B,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBxB,CAAC"}
|
|
@@ -15,6 +15,14 @@ export const CheckoutBodySchema = z.object({
|
|
|
15
15
|
example: "checkout-8f14e45f-1738312200",
|
|
16
16
|
description: "Client-supplied retry key. A re-submitted checkout with the same key returns the already-created order without re-authorizing payment (safe offline-queue replay).",
|
|
17
17
|
}),
|
|
18
|
+
returnUrl: z.string().url().optional().openapi({
|
|
19
|
+
example: "https://example.com/checkout/return",
|
|
20
|
+
description: "URL where the payment provider returns the shopper after payment.",
|
|
21
|
+
}),
|
|
22
|
+
cancelUrl: z.string().url().optional().openapi({
|
|
23
|
+
example: "https://example.com/checkout/cancel",
|
|
24
|
+
description: "URL where the payment provider returns the shopper after cancellation.",
|
|
25
|
+
}),
|
|
18
26
|
customerId: z.string().optional().openapi({ example: "customer-uuid-or-user-id" }),
|
|
19
27
|
customerGroupIds: z.array(z.string()).optional(),
|
|
20
28
|
currency: z.string().length(3).optional().openapi({ example: "USD" }),
|
|
@@ -41,6 +49,8 @@ export const OrderResponseSchema = z.object({
|
|
|
41
49
|
discountTotal: z.number(),
|
|
42
50
|
grandTotal: z.number(),
|
|
43
51
|
placedAt: z.string(),
|
|
52
|
+
paymentClientSecret: z.string().optional(),
|
|
53
|
+
paymentRedirectUrl: z.string().optional(),
|
|
44
54
|
}),
|
|
45
55
|
meta: z.object({
|
|
46
56
|
hookErrors: z.array(z.string()),
|
|
@@ -2,6 +2,7 @@ import { mapErrorToStatus } from "../../kernel/error-mapper.js";
|
|
|
2
2
|
import type { Actor } from "../../auth/types.js";
|
|
3
3
|
export declare const ROUTE_PERMISSION_GUARD: unique symbol;
|
|
4
4
|
export declare function markRoutePermissionGuard<T>(handler: T, methods?: readonly string[]): T;
|
|
5
|
+
export declare function markPublicRoute<T>(handler: T, methods?: readonly string[]): T;
|
|
5
6
|
type PermissionContext = {
|
|
6
7
|
get(key: string): unknown;
|
|
7
8
|
json(data: unknown, status: number): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,sBAAsB,eAAyC,CAAC;AAM7E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAKtF;AAED,KAAK,iBAAiB,GAAG;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7C,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAIF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAOA;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAO/F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,OACf;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAmBpI;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,OAC9B;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAkBpI;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,OAEjD,iBAAiB,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAQ1E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,wBAAgB,SAAS,CACvB,KAAK,CAAC,EAAE,MAAM,GAEZ;IACF,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1C,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B,GACG,SAAS,CASZ;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/interfaces/rest/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,eAAO,MAAM,sBAAsB,eAAyC,CAAC;AAM7E,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAKtF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,CAE7E;AAED,KAAK,iBAAiB,GAAG;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7C,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACzB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,SAAS,EAAE;QACT,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH,CAAC;AAIF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAOA;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAQxD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAO/F;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,OACf;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAmBpI;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,OAC9B;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAkBpI;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,OAEjD,iBAAiB,QAAQ,MAAM,OAAO,CAAC,IAAI,CAAC,sBAQ1E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,wBAAgB,SAAS,CACvB,KAAK,CAAC,EAAE,MAAM,GAEZ;IACF,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;IAC1C,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B,GACG,SAAS,CASZ;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7C"}
|
|
@@ -7,6 +7,9 @@ export function markRoutePermissionGuard(handler, methods) {
|
|
|
7
7
|
}
|
|
8
8
|
return handler;
|
|
9
9
|
}
|
|
10
|
+
export function markPublicRoute(handler, methods) {
|
|
11
|
+
return markRoutePermissionGuard(handler, methods);
|
|
12
|
+
}
|
|
10
13
|
const MAX_PAGE_LIMIT = 100;
|
|
11
14
|
export function parsePagination(query) {
|
|
12
15
|
const page = Number.parseInt(query.page ?? "1", 10);
|
|
@@ -5,6 +5,7 @@ export interface PaymentIntent {
|
|
|
5
5
|
amount: number;
|
|
6
6
|
currency: string;
|
|
7
7
|
clientSecret?: string | null;
|
|
8
|
+
redirectUrl?: string | null;
|
|
8
9
|
}
|
|
9
10
|
export interface PaymentCapture {
|
|
10
11
|
id: string;
|
|
@@ -31,6 +32,8 @@ export interface CreatePaymentIntentParams {
|
|
|
31
32
|
paymentMethodToken?: string;
|
|
32
33
|
/** Stable key forwarded to the provider so retries cannot create a second intent. */
|
|
33
34
|
idempotencyKey?: string;
|
|
35
|
+
returnUrl?: string;
|
|
36
|
+
cancelUrl?: string;
|
|
34
37
|
terminalId?: string;
|
|
35
38
|
}
|
|
36
39
|
export interface PaymentAdapter {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/payments/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/modules/payments/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kEAAkE;IAClE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACvF,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1F,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IAClG,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;CACvE"}
|
package/package.json
CHANGED
package/src/hooks/checkout.ts
CHANGED
|
@@ -69,6 +69,8 @@ export interface CheckoutData {
|
|
|
69
69
|
paymentMethodToken?: string;
|
|
70
70
|
/** Stable retry key shared by order creation and payment authorization. */
|
|
71
71
|
idempotencyKey?: string;
|
|
72
|
+
returnUrl?: string;
|
|
73
|
+
cancelUrl?: string;
|
|
72
74
|
lineItems: CheckoutLineItem[];
|
|
73
75
|
subtotal: number;
|
|
74
76
|
discountTotal: number;
|
|
@@ -78,6 +80,7 @@ export interface CheckoutData {
|
|
|
78
80
|
promotionCodes?: string[];
|
|
79
81
|
paymentIntentId?: string;
|
|
80
82
|
paymentClientSecret?: string | undefined;
|
|
83
|
+
paymentRedirectUrl?: string | undefined;
|
|
81
84
|
shippingAddress?: ShippingAddress;
|
|
82
85
|
appliedPromotions?: AppliedPromotion[];
|
|
83
86
|
freeShipping?: boolean;
|
|
@@ -533,11 +536,13 @@ export const authorizePayment: BeforeHook<CheckoutData> = async ({
|
|
|
533
536
|
paymentMethodId: string;
|
|
534
537
|
paymentMethodToken?: string;
|
|
535
538
|
idempotencyKey?: string;
|
|
539
|
+
returnUrl?: string;
|
|
540
|
+
cancelUrl?: string;
|
|
536
541
|
customerId?: string;
|
|
537
542
|
metadata: Record<string, unknown>;
|
|
538
543
|
}): Promise<{
|
|
539
544
|
ok: boolean;
|
|
540
|
-
value?: { id: string; clientSecret?: string | null };
|
|
545
|
+
value?: { id: string; clientSecret?: string | null; redirectUrl?: string | null };
|
|
541
546
|
error?: { message: string };
|
|
542
547
|
}>;
|
|
543
548
|
};
|
|
@@ -551,6 +556,8 @@ export const authorizePayment: BeforeHook<CheckoutData> = async ({
|
|
|
551
556
|
...(data.idempotencyKey !== undefined
|
|
552
557
|
? { idempotencyKey: data.idempotencyKey }
|
|
553
558
|
: {}),
|
|
559
|
+
...(data.returnUrl !== undefined ? { returnUrl: data.returnUrl } : {}),
|
|
560
|
+
...(data.cancelUrl !== undefined ? { cancelUrl: data.cancelUrl } : {}),
|
|
554
561
|
metadata: {
|
|
555
562
|
...(data.orderId !== undefined ? { orderId: data.orderId } : {}),
|
|
556
563
|
organizationId: resolveOrgIdForCommerce(context.actor, context.commerceConfig),
|
|
@@ -568,6 +575,7 @@ export const authorizePayment: BeforeHook<CheckoutData> = async ({
|
|
|
568
575
|
|
|
569
576
|
data.paymentIntentId = authorized.value.id;
|
|
570
577
|
data.paymentClientSecret = authorized.value.clientSecret ?? undefined;
|
|
578
|
+
data.paymentRedirectUrl = authorized.value.redirectUrl ?? undefined;
|
|
571
579
|
context.context.paymentIntentId = authorized.value.id;
|
|
572
580
|
return data;
|
|
573
581
|
};
|
package/src/index.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type {
|
|
|
16
16
|
} from "./kernel/plugin/manifest.js";
|
|
17
17
|
|
|
18
18
|
export { router } from "./interfaces/rest/router.js";
|
|
19
|
-
export { requirePerm } from "./interfaces/rest/utils.js";
|
|
19
|
+
export { markPublicRoute, markRoutePermissionGuard, requirePerm } from "./interfaces/rest/utils.js";
|
|
20
20
|
export { webhookRouter, type WebhookRouterResult } from "./interfaces/rest/webhook-router.js";
|
|
21
21
|
export { isPrivateUrl, isPrivateIp } from "./modules/webhooks/ssrf-guard.js";
|
|
22
22
|
export { createServer } from "./runtime/server.js";
|
|
@@ -33,6 +33,8 @@ import type { CommerceConfig } from "../../config/types.js";
|
|
|
33
33
|
import type { PluginRouteRegistration } from "../../kernel/plugin/manifest.js";
|
|
34
34
|
import { createScopedDb } from "../../kernel/database/scoped-db.js";
|
|
35
35
|
import { resolveOrgIdForCommerce } from "../../auth/org.js";
|
|
36
|
+
import { hasPermission } from "../../auth/permissions.js";
|
|
37
|
+
import type { Actor } from "../../auth/types.js";
|
|
36
38
|
|
|
37
39
|
// ─── Shared OpenAPI Error Responses ──────────────────────────────────────────
|
|
38
40
|
|
|
@@ -85,6 +87,7 @@ class RouteChain {
|
|
|
85
87
|
private _input: z.ZodType | undefined;
|
|
86
88
|
private _query: z.ZodType | undefined;
|
|
87
89
|
private _params: z.ZodType | undefined;
|
|
90
|
+
private _output: z.ZodType | undefined;
|
|
88
91
|
private _requireAuth = false;
|
|
89
92
|
private _requiredPermission: string | undefined;
|
|
90
93
|
constructor(
|
|
@@ -117,6 +120,27 @@ class RouteChain {
|
|
|
117
120
|
/** Override the auto-detected path parameter schema. */
|
|
118
121
|
params(schema: z.ZodType) { this._params = schema; return this; }
|
|
119
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Declare the shape carried inside the `{ data }` envelope on success.
|
|
125
|
+
*
|
|
126
|
+
* Without it the route documents its payload as `any`, and every generated
|
|
127
|
+
* client sees `data?: unknown` — so a consumer has to hand-maintain a
|
|
128
|
+
* parallel schema, which is the drift the generated SDK exists to prevent.
|
|
129
|
+
*
|
|
130
|
+
* Documentation only: the handler's return value is not validated against
|
|
131
|
+
* this schema. Validating would mean either stripping unknown keys — silently
|
|
132
|
+
* changing what goes over the wire for anyone who adopts it — or throwing at
|
|
133
|
+
* runtime, turning an OpenAPI annotation into a new failure mode. A stale
|
|
134
|
+
* annotation is the cheaper wrong.
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* vendors.get("/{id}").summary("Get").output(VendorSchema)
|
|
139
|
+
* .handler(async ({ params, services }) => services.vendor.get(params.id));
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
output(schema: z.ZodType) { this._output = schema; return this; }
|
|
143
|
+
|
|
120
144
|
/**
|
|
121
145
|
* Require authentication. The handler's `actor` is guaranteed non-null.
|
|
122
146
|
* Returns 401 if the request has no authenticated actor.
|
|
@@ -165,7 +189,7 @@ class RouteChain {
|
|
|
165
189
|
...(this._description ? { description: this._description } : {}),
|
|
166
190
|
...(Object.keys(request).length > 0 ? { request } : {}),
|
|
167
191
|
responses: {
|
|
168
|
-
[status]: wrapJson(z.object({ data: z.any() })),
|
|
192
|
+
[status]: wrapJson(z.object({ data: this._output ?? z.any() })),
|
|
169
193
|
...errorResponses,
|
|
170
194
|
},
|
|
171
195
|
});
|
|
@@ -199,8 +223,7 @@ class RouteChain {
|
|
|
199
223
|
}
|
|
200
224
|
|
|
201
225
|
if (requiredPermission) {
|
|
202
|
-
|
|
203
|
-
if (!perms.includes(requiredPermission) && !perms.includes("*:*")) {
|
|
226
|
+
if (!hasPermission(actor as Actor | null, requiredPermission)) {
|
|
204
227
|
return ctx.json({
|
|
205
228
|
error: { code: "FORBIDDEN", message: `Permission '${requiredPermission}' is required.` },
|
|
206
229
|
}, 403);
|
|
@@ -140,6 +140,8 @@ export function checkoutRoutes(kernel: Kernel) {
|
|
|
140
140
|
...(body.idempotencyKey !== undefined
|
|
141
141
|
? { idempotencyKey: body.idempotencyKey }
|
|
142
142
|
: {}),
|
|
143
|
+
...(body.returnUrl !== undefined ? { returnUrl: body.returnUrl } : {}),
|
|
144
|
+
...(body.cancelUrl !== undefined ? { cancelUrl: body.cancelUrl } : {}),
|
|
143
145
|
lineItems: [],
|
|
144
146
|
subtotal: 0,
|
|
145
147
|
discountTotal: 0,
|
|
@@ -368,6 +370,9 @@ export function checkoutRoutes(kernel: Kernel) {
|
|
|
368
370
|
...(processed.paymentClientSecret
|
|
369
371
|
? { paymentClientSecret: processed.paymentClientSecret }
|
|
370
372
|
: {}),
|
|
373
|
+
...(processed.paymentRedirectUrl
|
|
374
|
+
? { paymentRedirectUrl: processed.paymentRedirectUrl }
|
|
375
|
+
: {}),
|
|
371
376
|
},
|
|
372
377
|
meta: afterReport.hasErrors
|
|
373
378
|
? { hookErrors: afterReport.errors }
|
|
@@ -17,6 +17,14 @@ export const CheckoutBodySchema = z.object({
|
|
|
17
17
|
example: "checkout-8f14e45f-1738312200",
|
|
18
18
|
description: "Client-supplied retry key. A re-submitted checkout with the same key returns the already-created order without re-authorizing payment (safe offline-queue replay).",
|
|
19
19
|
}),
|
|
20
|
+
returnUrl: z.string().url().optional().openapi({
|
|
21
|
+
example: "https://example.com/checkout/return",
|
|
22
|
+
description: "URL where the payment provider returns the shopper after payment.",
|
|
23
|
+
}),
|
|
24
|
+
cancelUrl: z.string().url().optional().openapi({
|
|
25
|
+
example: "https://example.com/checkout/cancel",
|
|
26
|
+
description: "URL where the payment provider returns the shopper after cancellation.",
|
|
27
|
+
}),
|
|
20
28
|
customerId: z.string().optional().openapi({ example: "customer-uuid-or-user-id" }),
|
|
21
29
|
customerGroupIds: z.array(z.string()).optional(),
|
|
22
30
|
currency: z.string().length(3).optional().openapi({ example: "USD" }),
|
|
@@ -45,6 +53,8 @@ export const OrderResponseSchema = z.object({
|
|
|
45
53
|
discountTotal: z.number(),
|
|
46
54
|
grandTotal: z.number(),
|
|
47
55
|
placedAt: z.string(),
|
|
56
|
+
paymentClientSecret: z.string().optional(),
|
|
57
|
+
paymentRedirectUrl: z.string().optional(),
|
|
48
58
|
}),
|
|
49
59
|
meta: z.object({
|
|
50
60
|
hookErrors: z.array(z.string()),
|
|
@@ -16,6 +16,10 @@ export function markRoutePermissionGuard<T>(handler: T, methods?: readonly strin
|
|
|
16
16
|
return handler;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
export function markPublicRoute<T>(handler: T, methods?: readonly string[]): T {
|
|
20
|
+
return markRoutePermissionGuard(handler, methods);
|
|
21
|
+
}
|
|
22
|
+
|
|
19
23
|
type PermissionContext = {
|
|
20
24
|
get(key: string): unknown;
|
|
21
25
|
json(data: unknown, status: number): unknown;
|
|
@@ -6,6 +6,7 @@ export interface PaymentIntent {
|
|
|
6
6
|
amount: number;
|
|
7
7
|
currency: string;
|
|
8
8
|
clientSecret?: string | null;
|
|
9
|
+
redirectUrl?: string | null;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
export interface PaymentCapture {
|
|
@@ -36,6 +37,8 @@ export interface CreatePaymentIntentParams {
|
|
|
36
37
|
paymentMethodToken?: string;
|
|
37
38
|
/** Stable key forwarded to the provider so retries cannot create a second intent. */
|
|
38
39
|
idempotencyKey?: string;
|
|
40
|
+
returnUrl?: string;
|
|
41
|
+
cancelUrl?: string;
|
|
39
42
|
terminalId?: string;
|
|
40
43
|
}
|
|
41
44
|
|