@voyant-travel/auth 0.138.0 → 0.140.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.
@@ -0,0 +1,282 @@
1
+ import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
2
+ import { openApiValidationHook, parseJsonBody } from "@voyant-travel/hono";
3
+ import { hasApiKeyPermission, permissionStringsToPermissions } from "@voyant-travel/types/api-keys";
4
+ import { createStorefrontInputSchema, issueStorefrontApiKeyInputSchema, putStorefrontProviderCredentialInputSchema, setStorefrontAllowedOriginsInputSchema, updateStorefrontAccountPolicyInputSchema, updateStorefrontInputSchema, updateStorefrontMethodsInputSchema, } from "./storefront-admin-contracts.js";
5
+ import { StorefrontInputError } from "./storefront-origins.js";
6
+ const storefrontAdminApiId = "@voyant-travel/auth#storefront.api.admin";
7
+ const jsonBody = (schema) => ({
8
+ required: true,
9
+ content: { "application/json": { schema } },
10
+ });
11
+ const responses = (...statuses) => Object.fromEntries(statuses.map((status) => [status, { description: `HTTP ${status}` }]));
12
+ const storefrontRoute = (config) => createRoute({
13
+ method: config.method,
14
+ path: config.path,
15
+ operationId: config.operationId,
16
+ "x-voyant-api-id": storefrontAdminApiId,
17
+ ...(config.request ? { request: config.request } : {}),
18
+ responses: responses(...config.statuses),
19
+ });
20
+ const storefrontIdParams = z.object({ storefrontId: z.string() });
21
+ const keyIdParams = z.object({ storefrontId: z.string(), keyId: z.string() });
22
+ const providerParams = z.object({
23
+ storefrontId: z.string(),
24
+ provider: z.enum(["google", "facebook", "apple"]),
25
+ });
26
+ const capabilitiesRoute = storefrontRoute({
27
+ method: "get",
28
+ path: "/capabilities",
29
+ operationId: "getStorefrontCapabilities",
30
+ statuses: [200, 401, 403],
31
+ });
32
+ const listStorefrontsRoute = storefrontRoute({
33
+ method: "get",
34
+ path: "/storefronts",
35
+ operationId: "listStorefronts",
36
+ statuses: [200, 401, 403],
37
+ });
38
+ const createStorefrontRoute = storefrontRoute({
39
+ method: "post",
40
+ path: "/storefronts",
41
+ operationId: "createStorefront",
42
+ request: { body: jsonBody(createStorefrontInputSchema) },
43
+ statuses: [201, 400, 401, 403],
44
+ });
45
+ const getStorefrontRoute = storefrontRoute({
46
+ method: "get",
47
+ path: "/storefronts/{storefrontId}",
48
+ operationId: "getStorefront",
49
+ request: { params: storefrontIdParams },
50
+ statuses: [200, 401, 403, 404],
51
+ });
52
+ const updateStorefrontRoute = storefrontRoute({
53
+ method: "patch",
54
+ path: "/storefronts/{storefrontId}",
55
+ operationId: "updateStorefront",
56
+ request: { params: storefrontIdParams, body: jsonBody(updateStorefrontInputSchema) },
57
+ statuses: [200, 400, 401, 403, 404],
58
+ });
59
+ const deleteStorefrontRoute = storefrontRoute({
60
+ method: "delete",
61
+ path: "/storefronts/{storefrontId}",
62
+ operationId: "deleteStorefront",
63
+ request: { params: storefrontIdParams },
64
+ statuses: [204, 401, 403, 404],
65
+ });
66
+ const setAllowedOriginsRoute = storefrontRoute({
67
+ method: "put",
68
+ path: "/storefronts/{storefrontId}/allowed-origins",
69
+ operationId: "setStorefrontAllowedOrigins",
70
+ request: { params: storefrontIdParams, body: jsonBody(setStorefrontAllowedOriginsInputSchema) },
71
+ statuses: [200, 400, 401, 403, 404],
72
+ });
73
+ const listApiKeysRoute = storefrontRoute({
74
+ method: "get",
75
+ path: "/storefronts/{storefrontId}/keys",
76
+ operationId: "listStorefrontApiKeys",
77
+ request: { params: storefrontIdParams },
78
+ statuses: [200, 401, 403, 404],
79
+ });
80
+ const issueApiKeyRoute = storefrontRoute({
81
+ method: "post",
82
+ path: "/storefronts/{storefrontId}/keys",
83
+ operationId: "issueStorefrontApiKey",
84
+ request: { params: storefrontIdParams, body: jsonBody(issueStorefrontApiKeyInputSchema) },
85
+ statuses: [201, 400, 401, 403, 404],
86
+ });
87
+ const rotateApiKeyRoute = storefrontRoute({
88
+ method: "post",
89
+ path: "/storefronts/{storefrontId}/keys/{keyId}/rotate",
90
+ operationId: "rotateStorefrontApiKey",
91
+ request: { params: keyIdParams },
92
+ statuses: [201, 400, 401, 403, 404],
93
+ });
94
+ const revokeApiKeyRoute = storefrontRoute({
95
+ method: "delete",
96
+ path: "/storefronts/{storefrontId}/keys/{keyId}",
97
+ operationId: "revokeStorefrontApiKey",
98
+ request: { params: keyIdParams },
99
+ statuses: [204, 401, 403, 404],
100
+ });
101
+ const updateAccountPolicyRoute = storefrontRoute({
102
+ method: "put",
103
+ path: "/storefronts/{storefrontId}/account-policy",
104
+ operationId: "updateStorefrontAccountPolicy",
105
+ request: { params: storefrontIdParams, body: jsonBody(updateStorefrontAccountPolicyInputSchema) },
106
+ statuses: [200, 400, 401, 403, 404],
107
+ });
108
+ const updateMethodsRoute = storefrontRoute({
109
+ method: "put",
110
+ path: "/storefronts/{storefrontId}/methods",
111
+ operationId: "updateStorefrontMethods",
112
+ request: { params: storefrontIdParams, body: jsonBody(updateStorefrontMethodsInputSchema) },
113
+ statuses: [200, 400, 401, 403, 404],
114
+ });
115
+ const listProviderCredentialsRoute = storefrontRoute({
116
+ method: "get",
117
+ path: "/storefronts/{storefrontId}/provider-credentials",
118
+ operationId: "listStorefrontProviderCredentials",
119
+ request: { params: storefrontIdParams },
120
+ statuses: [200, 401, 403, 404],
121
+ });
122
+ const putProviderCredentialRoute = storefrontRoute({
123
+ method: "put",
124
+ path: "/storefronts/{storefrontId}/provider-credentials/{provider}",
125
+ operationId: "putStorefrontProviderCredential",
126
+ request: {
127
+ params: providerParams,
128
+ body: jsonBody(putStorefrontProviderCredentialInputSchema),
129
+ },
130
+ statuses: [204, 400, 401, 403, 404],
131
+ });
132
+ const deleteProviderCredentialRoute = storefrontRoute({
133
+ method: "delete",
134
+ path: "/storefronts/{storefrontId}/provider-credentials/{provider}",
135
+ operationId: "deleteStorefrontProviderCredential",
136
+ request: { params: providerParams },
137
+ statuses: [204, 401, 403, 404],
138
+ });
139
+ /**
140
+ * Resolve the operator-scoped request context. The organization is derived from
141
+ * the admin session — never a client parameter — so every write is bounded to
142
+ * the acting operator's organization.
143
+ */
144
+ function requestContext(c) {
145
+ const userId = c.get("userId");
146
+ if (!userId)
147
+ return c.json({ error: "Unauthorized" }, 401);
148
+ const organizationId = c.get("organizationId");
149
+ if (!organizationId)
150
+ return c.json({ error: "No active operator organization." }, 403);
151
+ return { bindings: c.env, db: c.get("db"), organizationId };
152
+ }
153
+ function canManageStorefronts(c) {
154
+ return hasApiKeyPermission(permissionStringsToPermissions(c.get("scopes") ?? []), "storefronts", "write");
155
+ }
156
+ function requireManage(c) {
157
+ return canManageStorefronts(c) ? null : c.json({ error: "Forbidden" }, 403);
158
+ }
159
+ function handleError(c, error) {
160
+ if (error instanceof StorefrontInputError) {
161
+ return c.json({ error: error.message }, 400);
162
+ }
163
+ if (error instanceof Error &&
164
+ "status" in error &&
165
+ typeof error.status === "number" &&
166
+ error.status >= 400 &&
167
+ error.status <= 599) {
168
+ return c.json({ error: error.message }, error.status);
169
+ }
170
+ throw error;
171
+ }
172
+ export function createStorefrontAdminRoutes(runtime, options) {
173
+ const routes = new OpenAPIHono({ defaultHook: openApiValidationHook });
174
+ const run = async (c, operation, guard = "read") => {
175
+ const context = requestContext(c);
176
+ if (context instanceof Response)
177
+ return context;
178
+ if (guard === "write") {
179
+ const forbidden = requireManage(c);
180
+ if (forbidden)
181
+ return forbidden;
182
+ }
183
+ try {
184
+ return await operation(context);
185
+ }
186
+ catch (error) {
187
+ return handleError(c, error);
188
+ }
189
+ };
190
+ routes.openapi(capabilitiesRoute, (c) => {
191
+ if (!c.get("userId"))
192
+ return c.json({ error: "Unauthorized" }, 401);
193
+ if (!c.get("organizationId"))
194
+ return c.json({ error: "No active operator organization." }, 403);
195
+ const manageProviders = canManageStorefronts(c);
196
+ return c.json({
197
+ data: { businessAccounts: options.businessAccounts, manageProviders },
198
+ });
199
+ });
200
+ routes.openapi(listStorefrontsRoute, async (c) => {
201
+ const result = await run(c, (context) => runtime.listStorefronts(context));
202
+ return result instanceof Response ? result : c.json({ data: result });
203
+ });
204
+ routes.openapi(createStorefrontRoute, async (c) => {
205
+ const input = await parseJsonBody(c, createStorefrontInputSchema);
206
+ const result = await run(c, (context) => runtime.createStorefront(context, input), "write");
207
+ return result instanceof Response ? result : c.json({ data: result }, 201);
208
+ });
209
+ routes.openapi(getStorefrontRoute, async (c) => {
210
+ const { storefrontId } = c.req.param();
211
+ const result = await run(c, (context) => runtime.getStorefront(context, storefrontId));
212
+ return result instanceof Response ? result : c.json({ data: result });
213
+ });
214
+ routes.openapi(updateStorefrontRoute, async (c) => {
215
+ const { storefrontId } = c.req.param();
216
+ const input = await parseJsonBody(c, updateStorefrontInputSchema);
217
+ const result = await run(c, (context) => runtime.updateStorefront(context, storefrontId, input), "write");
218
+ return result instanceof Response ? result : c.json({ data: result });
219
+ });
220
+ routes.openapi(deleteStorefrontRoute, async (c) => {
221
+ const { storefrontId } = c.req.param();
222
+ const result = await run(c, (context) => runtime.deleteStorefront(context, storefrontId), "write");
223
+ return result instanceof Response ? result : c.body(null, 204);
224
+ });
225
+ routes.openapi(setAllowedOriginsRoute, async (c) => {
226
+ const { storefrontId } = c.req.param();
227
+ const input = await parseJsonBody(c, setStorefrontAllowedOriginsInputSchema);
228
+ const result = await run(c, (context) => runtime.setAllowedOrigins(context, storefrontId, input.origins), "write");
229
+ return result instanceof Response ? result : c.json({ data: result });
230
+ });
231
+ routes.openapi(listApiKeysRoute, async (c) => {
232
+ const { storefrontId } = c.req.param();
233
+ const result = await run(c, (context) => runtime.listApiKeys(context, storefrontId));
234
+ return result instanceof Response ? result : c.json({ data: result });
235
+ });
236
+ routes.openapi(issueApiKeyRoute, async (c) => {
237
+ const { storefrontId } = c.req.param();
238
+ const input = await parseJsonBody(c, issueStorefrontApiKeyInputSchema);
239
+ const result = await run(c, (context) => runtime.issueApiKey(context, storefrontId, input.kind, input.name ?? null), "write");
240
+ return result instanceof Response ? result : c.json({ data: result }, 201);
241
+ });
242
+ routes.openapi(rotateApiKeyRoute, async (c) => {
243
+ const { storefrontId, keyId } = c.req.param();
244
+ const result = await run(c, (context) => runtime.rotateApiKey(context, storefrontId, keyId), "write");
245
+ return result instanceof Response ? result : c.json({ data: result }, 201);
246
+ });
247
+ routes.openapi(revokeApiKeyRoute, async (c) => {
248
+ const { storefrontId, keyId } = c.req.param();
249
+ const result = await run(c, (context) => runtime.revokeApiKey(context, storefrontId, keyId), "write");
250
+ return result instanceof Response ? result : c.body(null, 204);
251
+ });
252
+ routes.openapi(updateAccountPolicyRoute, async (c) => {
253
+ const { storefrontId } = c.req.param();
254
+ const input = await parseJsonBody(c, updateStorefrontAccountPolicyInputSchema);
255
+ const result = await run(c, (context) => runtime.updateAccountPolicy(context, storefrontId, input), "write");
256
+ return result instanceof Response ? result : c.json({ data: result });
257
+ });
258
+ routes.openapi(updateMethodsRoute, async (c) => {
259
+ const { storefrontId } = c.req.param();
260
+ const input = await parseJsonBody(c, updateStorefrontMethodsInputSchema);
261
+ const result = await run(c, (context) => runtime.updateMethods(context, storefrontId, input), "write");
262
+ return result instanceof Response ? result : c.json({ data: result });
263
+ });
264
+ routes.openapi(listProviderCredentialsRoute, async (c) => {
265
+ const { storefrontId } = c.req.param();
266
+ const result = await run(c, (context) => runtime.listProviderCredentials(context, storefrontId));
267
+ return result instanceof Response ? result : c.json({ data: result });
268
+ });
269
+ routes.openapi(putProviderCredentialRoute, async (c) => {
270
+ const { storefrontId, provider } = c.req.param();
271
+ const input = await parseJsonBody(c, putStorefrontProviderCredentialInputSchema);
272
+ const result = await run(c, (context) => runtime.putProviderCredential(context, storefrontId, provider, input), "write");
273
+ return result instanceof Response ? result : c.body(null, 204);
274
+ });
275
+ routes.openapi(deleteProviderCredentialRoute, async (c) => {
276
+ const { storefrontId, provider } = c.req.param();
277
+ const result = await run(c, (context) => runtime.deleteProviderCredential(context, storefrontId, provider), "write");
278
+ return result instanceof Response ? result : c.body(null, 204);
279
+ });
280
+ return routes;
281
+ }
282
+ //# sourceMappingURL=storefront-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storefront-routes.js","sourceRoot":"","sources":["../src/storefront-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAiB,MAAM,qBAAqB,CAAA;AACzF,OAAO,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,+BAA+B,CAAA;AAGnG,OAAO,EACL,2BAA2B,EAC3B,gCAAgC,EAChC,0CAA0C,EAC1C,sCAAsC,EACtC,wCAAwC,EACxC,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAiB9D,MAAM,oBAAoB,GAAG,0CAA0C,CAAA;AACvE,MAAM,QAAQ,GAAG,CAAyB,MAAS,EAAE,EAAE,CAAC,CAAC;IACvD,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,EAAE,kBAAkB,EAAE,EAAE,MAAM,EAAE,EAAE;CAC5C,CAAC,CAAA;AACF,MAAM,SAAS,GAAG,CAAC,GAAG,QAAkB,EAAE,EAAE,CAC1C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;AAC3F,MAAM,eAAe,GAAG,CAGtB,MAMD,EAAE,EAAE,CACH,WAAW,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,iBAAiB,EAAE,oBAAoB;IACvC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;CACzC,CAAC,CAAA;AAEJ,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACjE,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAC7E,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;CAClD,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,eAAe,CAAC;IACxC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,2BAA2B;IACxC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC1B,CAAC,CAAA;AACF,MAAM,oBAAoB,GAAG,eAAe,CAAC;IAC3C,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,iBAAiB;IAC9B,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC1B,CAAC,CAAA;AACF,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAC5C,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,2BAA2B,CAAC,EAAE;IACxD,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,kBAAkB,GAAG,eAAe,CAAC;IACzC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,eAAe;IAC5B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAC5C,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,2BAA2B,CAAC,EAAE;IACpF,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,qBAAqB,GAAG,eAAe,CAAC;IAC5C,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,6BAA6B;IACnC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,sBAAsB,GAAG,eAAe,CAAC;IAC7C,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,6CAA6C;IACnD,WAAW,EAAE,6BAA6B;IAC1C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,sCAAsC,CAAC,EAAE;IAC/F,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,gBAAgB,GAAG,eAAe,CAAC;IACvC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,kCAAkC;IACxC,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,gBAAgB,GAAG,eAAe,CAAC;IACvC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,kCAAkC;IACxC,WAAW,EAAE,uBAAuB;IACpC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,gCAAgC,CAAC,EAAE;IACzF,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,eAAe,CAAC;IACxC,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,iDAAiD;IACvD,WAAW,EAAE,wBAAwB;IACrC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,iBAAiB,GAAG,eAAe,CAAC;IACxC,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,0CAA0C;IAChD,WAAW,EAAE,wBAAwB;IACrC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;IAChC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,wBAAwB,GAAG,eAAe,CAAC;IAC/C,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,4CAA4C;IAClD,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,wCAAwC,CAAC,EAAE;IACjG,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,kBAAkB,GAAG,eAAe,CAAC;IACzC,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EAAE,yBAAyB;IACtC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,CAAC,kCAAkC,CAAC,EAAE;IAC3F,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,4BAA4B,GAAG,eAAe,CAAC;IACnD,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,kDAAkD;IACxD,WAAW,EAAE,mCAAmC;IAChD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;IACvC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AACF,MAAM,0BAA0B,GAAG,eAAe,CAAC;IACjD,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,6DAA6D;IACnE,WAAW,EAAE,iCAAiC;IAC9C,OAAO,EAAE;QACP,MAAM,EAAE,cAAc;QACtB,IAAI,EAAE,QAAQ,CAAC,0CAA0C,CAAC;KAC3D;IACD,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CACpC,CAAC,CAAA;AACF,MAAM,6BAA6B,GAAG,eAAe,CAAC;IACpD,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,6DAA6D;IACnE,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;IACnC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;CAC/B,CAAC,CAAA;AAEF;;;;GAIG;AACH,SAAS,cAAc,CAAC,CAAyB;IAC/C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC9B,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAA;IAC1D,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC9C,IAAI,CAAC,cAAc;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,GAAG,CAAC,CAAA;IACtF,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,CAAA;AAC7D,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAyB;IACrD,OAAO,mBAAmB,CACxB,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EACrD,aAAa,EACb,OAAO,CACR,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,CAAyB;IAC9C,OAAO,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,WAAW,CAAC,CAAyB,EAAE,KAAc;IAC5D,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;IAC9C,CAAC;IACD,IACE,KAAK,YAAY,KAAK;QACtB,QAAQ,IAAI,KAAK;QACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,KAAK,CAAC,MAAM,IAAI,GAAG;QACnB,KAAK,CAAC,MAAM,IAAI,GAAG,EACnB,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,MAAa,CAAC,CAAA;IAC9D,CAAC;IACD,MAAM,KAAK,CAAA;AACb,CAAC;AAOD,MAAM,UAAU,2BAA2B,CACzC,OAAkC,EAClC,OAAoC;IAEpC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAgB,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAA;IAErF,MAAM,GAAG,GAAG,KAAK,EACf,CAAyB,EACzB,SAA4D,EAC5D,QAA0B,MAAM,EACT,EAAE;QACzB,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;QACjC,IAAI,OAAO,YAAY,QAAQ;YAAE,OAAO,OAAO,CAAA;QAC/C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;YAClC,IAAI,SAAS;gBAAE,OAAO,SAAS,CAAA;QACjC,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,OAAO,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;IAED,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,GAAG,CAAC,CAAA;QACnE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kCAAkC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC/F,MAAM,eAAe,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAA;QAC/C,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,eAAe,EAAE;SACtE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAA;QAC1E,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAA;QAC3F,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QACtF,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EACnE,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,CAAC,EAC5D,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAA;QAC5E,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAC5E,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QACpF,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAA;QACtE,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,EACvF,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAC/D,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5C,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAC/D,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnD,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,wCAAwC,CAAC,CAAA;QAC9E,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EACtE,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,kCAAkC,CAAC,CAAA;QACxE,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAChE,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACvD,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QAChG,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAoC,CAAA;QAClF,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,CAAC,EAAE,0CAA0C,CAAC,CAAA;QAChF,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,EAClF,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAoC,CAAA;QAClF,MAAM,MAAM,GAAG,MAAM,GAAG,CACtB,CAAC,EACD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAC9E,OAAO,CACR,CAAA;QACD,OAAO,MAAM,YAAY,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import { createRoute, OpenAPIHono, z } from \"@hono/zod-openapi\"\nimport { openApiValidationHook, parseJsonBody, type VoyantDb } from \"@voyant-travel/hono\"\nimport { hasApiKeyPermission, permissionStringsToPermissions } from \"@voyant-travel/types/api-keys\"\nimport type { Context } from \"hono\"\n\nimport {\n createStorefrontInputSchema,\n issueStorefrontApiKeyInputSchema,\n putStorefrontProviderCredentialInputSchema,\n setStorefrontAllowedOriginsInputSchema,\n updateStorefrontAccountPolicyInputSchema,\n updateStorefrontInputSchema,\n updateStorefrontMethodsInputSchema,\n} from \"./storefront-admin-contracts.js\"\nimport { StorefrontInputError } from \"./storefront-origins.js\"\nimport type {\n StorefrontRequestContext,\n StorefrontRuntimeProvider,\n} from \"./storefront-runtime-port.js\"\n\ntype StorefrontEnv = {\n Bindings: Record<string, unknown>\n Variables: {\n userId?: string\n organizationId?: string | null\n scopes?: string[] | null\n db: VoyantDb\n }\n}\ntype StorefrontRouteContext = Context<StorefrontEnv>\n\nconst storefrontAdminApiId = \"@voyant-travel/auth#storefront.api.admin\"\nconst jsonBody = <T extends z.ZodTypeAny>(schema: T) => ({\n required: true,\n content: { \"application/json\": { schema } },\n})\nconst responses = (...statuses: number[]) =>\n Object.fromEntries(statuses.map((status) => [status, { description: `HTTP ${status}` }]))\nconst storefrontRoute = <\n M extends \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\",\n P extends string,\n>(config: {\n method: M\n path: P\n operationId: string\n request?: Record<string, unknown>\n statuses: number[]\n}) =>\n createRoute({\n method: config.method,\n path: config.path,\n operationId: config.operationId,\n \"x-voyant-api-id\": storefrontAdminApiId,\n ...(config.request ? { request: config.request } : {}),\n responses: responses(...config.statuses),\n })\n\nconst storefrontIdParams = z.object({ storefrontId: z.string() })\nconst keyIdParams = z.object({ storefrontId: z.string(), keyId: z.string() })\nconst providerParams = z.object({\n storefrontId: z.string(),\n provider: z.enum([\"google\", \"facebook\", \"apple\"]),\n})\n\nconst capabilitiesRoute = storefrontRoute({\n method: \"get\",\n path: \"/capabilities\",\n operationId: \"getStorefrontCapabilities\",\n statuses: [200, 401, 403],\n})\nconst listStorefrontsRoute = storefrontRoute({\n method: \"get\",\n path: \"/storefronts\",\n operationId: \"listStorefronts\",\n statuses: [200, 401, 403],\n})\nconst createStorefrontRoute = storefrontRoute({\n method: \"post\",\n path: \"/storefronts\",\n operationId: \"createStorefront\",\n request: { body: jsonBody(createStorefrontInputSchema) },\n statuses: [201, 400, 401, 403],\n})\nconst getStorefrontRoute = storefrontRoute({\n method: \"get\",\n path: \"/storefronts/{storefrontId}\",\n operationId: \"getStorefront\",\n request: { params: storefrontIdParams },\n statuses: [200, 401, 403, 404],\n})\nconst updateStorefrontRoute = storefrontRoute({\n method: \"patch\",\n path: \"/storefronts/{storefrontId}\",\n operationId: \"updateStorefront\",\n request: { params: storefrontIdParams, body: jsonBody(updateStorefrontInputSchema) },\n statuses: [200, 400, 401, 403, 404],\n})\nconst deleteStorefrontRoute = storefrontRoute({\n method: \"delete\",\n path: \"/storefronts/{storefrontId}\",\n operationId: \"deleteStorefront\",\n request: { params: storefrontIdParams },\n statuses: [204, 401, 403, 404],\n})\nconst setAllowedOriginsRoute = storefrontRoute({\n method: \"put\",\n path: \"/storefronts/{storefrontId}/allowed-origins\",\n operationId: \"setStorefrontAllowedOrigins\",\n request: { params: storefrontIdParams, body: jsonBody(setStorefrontAllowedOriginsInputSchema) },\n statuses: [200, 400, 401, 403, 404],\n})\nconst listApiKeysRoute = storefrontRoute({\n method: \"get\",\n path: \"/storefronts/{storefrontId}/keys\",\n operationId: \"listStorefrontApiKeys\",\n request: { params: storefrontIdParams },\n statuses: [200, 401, 403, 404],\n})\nconst issueApiKeyRoute = storefrontRoute({\n method: \"post\",\n path: \"/storefronts/{storefrontId}/keys\",\n operationId: \"issueStorefrontApiKey\",\n request: { params: storefrontIdParams, body: jsonBody(issueStorefrontApiKeyInputSchema) },\n statuses: [201, 400, 401, 403, 404],\n})\nconst rotateApiKeyRoute = storefrontRoute({\n method: \"post\",\n path: \"/storefronts/{storefrontId}/keys/{keyId}/rotate\",\n operationId: \"rotateStorefrontApiKey\",\n request: { params: keyIdParams },\n statuses: [201, 400, 401, 403, 404],\n})\nconst revokeApiKeyRoute = storefrontRoute({\n method: \"delete\",\n path: \"/storefronts/{storefrontId}/keys/{keyId}\",\n operationId: \"revokeStorefrontApiKey\",\n request: { params: keyIdParams },\n statuses: [204, 401, 403, 404],\n})\nconst updateAccountPolicyRoute = storefrontRoute({\n method: \"put\",\n path: \"/storefronts/{storefrontId}/account-policy\",\n operationId: \"updateStorefrontAccountPolicy\",\n request: { params: storefrontIdParams, body: jsonBody(updateStorefrontAccountPolicyInputSchema) },\n statuses: [200, 400, 401, 403, 404],\n})\nconst updateMethodsRoute = storefrontRoute({\n method: \"put\",\n path: \"/storefronts/{storefrontId}/methods\",\n operationId: \"updateStorefrontMethods\",\n request: { params: storefrontIdParams, body: jsonBody(updateStorefrontMethodsInputSchema) },\n statuses: [200, 400, 401, 403, 404],\n})\nconst listProviderCredentialsRoute = storefrontRoute({\n method: \"get\",\n path: \"/storefronts/{storefrontId}/provider-credentials\",\n operationId: \"listStorefrontProviderCredentials\",\n request: { params: storefrontIdParams },\n statuses: [200, 401, 403, 404],\n})\nconst putProviderCredentialRoute = storefrontRoute({\n method: \"put\",\n path: \"/storefronts/{storefrontId}/provider-credentials/{provider}\",\n operationId: \"putStorefrontProviderCredential\",\n request: {\n params: providerParams,\n body: jsonBody(putStorefrontProviderCredentialInputSchema),\n },\n statuses: [204, 400, 401, 403, 404],\n})\nconst deleteProviderCredentialRoute = storefrontRoute({\n method: \"delete\",\n path: \"/storefronts/{storefrontId}/provider-credentials/{provider}\",\n operationId: \"deleteStorefrontProviderCredential\",\n request: { params: providerParams },\n statuses: [204, 401, 403, 404],\n})\n\n/**\n * Resolve the operator-scoped request context. The organization is derived from\n * the admin session — never a client parameter — so every write is bounded to\n * the acting operator's organization.\n */\nfunction requestContext(c: StorefrontRouteContext): StorefrontRequestContext | Response {\n const userId = c.get(\"userId\")\n if (!userId) return c.json({ error: \"Unauthorized\" }, 401)\n const organizationId = c.get(\"organizationId\")\n if (!organizationId) return c.json({ error: \"No active operator organization.\" }, 403)\n return { bindings: c.env, db: c.get(\"db\"), organizationId }\n}\n\nfunction canManageStorefronts(c: StorefrontRouteContext): boolean {\n return hasApiKeyPermission(\n permissionStringsToPermissions(c.get(\"scopes\") ?? []),\n \"storefronts\",\n \"write\",\n )\n}\n\nfunction requireManage(c: StorefrontRouteContext): Response | null {\n return canManageStorefronts(c) ? null : c.json({ error: \"Forbidden\" }, 403)\n}\n\nfunction handleError(c: StorefrontRouteContext, error: unknown): Response {\n if (error instanceof StorefrontInputError) {\n return c.json({ error: error.message }, 400)\n }\n if (\n error instanceof Error &&\n \"status\" in error &&\n typeof error.status === \"number\" &&\n error.status >= 400 &&\n error.status <= 599\n ) {\n return c.json({ error: error.message }, error.status as 400)\n }\n throw error\n}\n\nexport interface StorefrontAdminRouteOptions {\n /** Whether the deployment supports business (organization) buyer accounts. */\n businessAccounts: boolean\n}\n\nexport function createStorefrontAdminRoutes(\n runtime: StorefrontRuntimeProvider,\n options: StorefrontAdminRouteOptions,\n) {\n const routes = new OpenAPIHono<StorefrontEnv>({ defaultHook: openApiValidationHook })\n\n const run = async <T>(\n c: StorefrontRouteContext,\n operation: (context: StorefrontRequestContext) => Promise<T>,\n guard: \"read\" | \"write\" = \"read\",\n ): Promise<T | Response> => {\n const context = requestContext(c)\n if (context instanceof Response) return context\n if (guard === \"write\") {\n const forbidden = requireManage(c)\n if (forbidden) return forbidden\n }\n try {\n return await operation(context)\n } catch (error) {\n return handleError(c, error)\n }\n }\n\n routes.openapi(capabilitiesRoute, (c) => {\n if (!c.get(\"userId\")) return c.json({ error: \"Unauthorized\" }, 401)\n if (!c.get(\"organizationId\")) return c.json({ error: \"No active operator organization.\" }, 403)\n const manageProviders = canManageStorefronts(c)\n return c.json({\n data: { businessAccounts: options.businessAccounts, manageProviders },\n })\n })\n\n routes.openapi(listStorefrontsRoute, async (c) => {\n const result = await run(c, (context) => runtime.listStorefronts(context))\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(createStorefrontRoute, async (c) => {\n const input = await parseJsonBody(c, createStorefrontInputSchema)\n const result = await run(c, (context) => runtime.createStorefront(context, input), \"write\")\n return result instanceof Response ? result : c.json({ data: result }, 201)\n })\n\n routes.openapi(getStorefrontRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const result = await run(c, (context) => runtime.getStorefront(context, storefrontId))\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(updateStorefrontRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const input = await parseJsonBody(c, updateStorefrontInputSchema)\n const result = await run(\n c,\n (context) => runtime.updateStorefront(context, storefrontId, input),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(deleteStorefrontRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const result = await run(\n c,\n (context) => runtime.deleteStorefront(context, storefrontId),\n \"write\",\n )\n return result instanceof Response ? result : c.body(null, 204)\n })\n\n routes.openapi(setAllowedOriginsRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const input = await parseJsonBody(c, setStorefrontAllowedOriginsInputSchema)\n const result = await run(\n c,\n (context) => runtime.setAllowedOrigins(context, storefrontId, input.origins),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(listApiKeysRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const result = await run(c, (context) => runtime.listApiKeys(context, storefrontId))\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(issueApiKeyRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const input = await parseJsonBody(c, issueStorefrontApiKeyInputSchema)\n const result = await run(\n c,\n (context) => runtime.issueApiKey(context, storefrontId, input.kind, input.name ?? null),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result }, 201)\n })\n\n routes.openapi(rotateApiKeyRoute, async (c) => {\n const { storefrontId, keyId } = c.req.param()\n const result = await run(\n c,\n (context) => runtime.rotateApiKey(context, storefrontId, keyId),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result }, 201)\n })\n\n routes.openapi(revokeApiKeyRoute, async (c) => {\n const { storefrontId, keyId } = c.req.param()\n const result = await run(\n c,\n (context) => runtime.revokeApiKey(context, storefrontId, keyId),\n \"write\",\n )\n return result instanceof Response ? result : c.body(null, 204)\n })\n\n routes.openapi(updateAccountPolicyRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const input = await parseJsonBody(c, updateStorefrontAccountPolicyInputSchema)\n const result = await run(\n c,\n (context) => runtime.updateAccountPolicy(context, storefrontId, input),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(updateMethodsRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const input = await parseJsonBody(c, updateStorefrontMethodsInputSchema)\n const result = await run(\n c,\n (context) => runtime.updateMethods(context, storefrontId, input),\n \"write\",\n )\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(listProviderCredentialsRoute, async (c) => {\n const { storefrontId } = c.req.param()\n const result = await run(c, (context) => runtime.listProviderCredentials(context, storefrontId))\n return result instanceof Response ? result : c.json({ data: result })\n })\n\n routes.openapi(putProviderCredentialRoute, async (c) => {\n const { storefrontId, provider } = c.req.param() as z.infer<typeof providerParams>\n const input = await parseJsonBody(c, putStorefrontProviderCredentialInputSchema)\n const result = await run(\n c,\n (context) => runtime.putProviderCredential(context, storefrontId, provider, input),\n \"write\",\n )\n return result instanceof Response ? result : c.body(null, 204)\n })\n\n routes.openapi(deleteProviderCredentialRoute, async (c) => {\n const { storefrontId, provider } = c.req.param() as z.infer<typeof providerParams>\n const result = await run(\n c,\n (context) => runtime.deleteProviderCredential(context, storefrontId, provider),\n \"write\",\n )\n return result instanceof Response ? result : c.body(null, 204)\n })\n\n return routes\n}\n"]}