@voyant-travel/trips 0.110.2
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/LICENSE +201 -0
- package/README.md +38 -0
- package/dist/catalog-component-adapter.d.ts +16 -0
- package/dist/catalog-component-adapter.d.ts.map +1 -0
- package/dist/catalog-component-adapter.js +34 -0
- package/dist/cruise-extension.d.ts +48 -0
- package/dist/cruise-extension.d.ts.map +1 -0
- package/dist/cruise-extension.js +66 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/mcp-contract.d.ts +79 -0
- package/dist/mcp-contract.d.ts.map +1 -0
- package/dist/mcp-contract.js +21 -0
- package/dist/mcp-registry.d.ts +48 -0
- package/dist/mcp-registry.d.ts.map +1 -0
- package/dist/mcp-registry.js +88 -0
- package/dist/mcp-tools.d.ts +157 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +109 -0
- package/dist/routes.d.ts +2068 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +280 -0
- package/dist/schema.d.ts +1897 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +255 -0
- package/dist/service-cancellation.d.ts +6 -0
- package/dist/service-cancellation.d.ts.map +1 -0
- package/dist/service-cancellation.js +251 -0
- package/dist/service-checkout.d.ts +6 -0
- package/dist/service-checkout.d.ts.map +1 -0
- package/dist/service-checkout.js +328 -0
- package/dist/service-helpers.d.ts +17 -0
- package/dist/service-helpers.d.ts.map +1 -0
- package/dist/service-helpers.js +161 -0
- package/dist/service-internals.d.ts +11 -0
- package/dist/service-internals.d.ts.map +1 -0
- package/dist/service-internals.js +72 -0
- package/dist/service-pricing.d.ts +8 -0
- package/dist/service-pricing.d.ts.map +1 -0
- package/dist/service-pricing.js +142 -0
- package/dist/service-reservation.d.ts +5 -0
- package/dist/service-reservation.d.ts.map +1 -0
- package/dist/service-reservation.js +493 -0
- package/dist/service-snapshots.d.ts +8 -0
- package/dist/service-snapshots.d.ts.map +1 -0
- package/dist/service-snapshots.js +115 -0
- package/dist/service-trips.d.ts +14 -0
- package/dist/service-trips.d.ts.map +1 -0
- package/dist/service-trips.js +378 -0
- package/dist/service-types.d.ts +285 -0
- package/dist/service-types.d.ts.map +1 -0
- package/dist/service-types.js +6 -0
- package/dist/service.d.ts +38 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +40 -0
- package/dist/traveler-party-validation.d.ts +3 -0
- package/dist/traveler-party-validation.d.ts.map +1 -0
- package/dist/traveler-party-validation.js +68 -0
- package/dist/validation.d.ts +449 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +261 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAGnC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGvB,MAAM,cAAc,CAAA;AAiBrB,KAAK,GAAG,GAAG;IACT,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,SAAS,EAAE;QACT,EAAE,EAAE,YAAY,CAAA;KACjB,CAAA;CACF,CAAA;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,aAAa,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,CAAA;IAC7C,eAAe,CAAC,EAAE,cAAc,CAAC,eAAe,CAAC,CAAA;IACjD,iBAAiB,CAAC,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACrD,wBAAwB,CAAC,EAAE,cAAc,CAAC,wBAAwB,CAAC,CAAA;CACpE;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAA;AAoPxE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA+DjE;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCAAsB,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { parseJsonBody, parseQuery } from "@voyant-travel/hono";
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { TripsInvariantError, tripsService, } from "./service.js";
|
|
4
|
+
import { cancelTripComponentsSchema, createTripComponentBodySchema, createTripEnvelopeSchema, createTripSnapshotSchema, listTripsQuerySchema, previewTripCancellationSchema, priceTripSchema, reorderTripComponentsSchema, reserveTripSchema, startTripCheckoutSchema, updateTripComponentRefsSchema, updateTripComponentSchema, updateTripEnvelopeSchema, } from "./validation.js";
|
|
5
|
+
const priceTripBodySchema = priceTripSchema.omit({ envelopeId: true });
|
|
6
|
+
const createTripSnapshotBodySchema = createTripSnapshotSchema.omit({ envelopeId: true });
|
|
7
|
+
const reserveTripBodySchema = reserveTripSchema.omit({ envelopeId: true });
|
|
8
|
+
const startCheckoutBodySchema = startTripCheckoutSchema.omit({ envelopeId: true });
|
|
9
|
+
const previewCancellationBodySchema = previewTripCancellationSchema.omit({ envelopeId: true });
|
|
10
|
+
const cancelTripComponentsBodySchema = cancelTripComponentsSchema.omit({ envelopeId: true });
|
|
11
|
+
function routeError(error) {
|
|
12
|
+
if (error instanceof TripsInvariantError) {
|
|
13
|
+
return {
|
|
14
|
+
message: error.message,
|
|
15
|
+
status: error.message.includes("was not found") ? 404 : 409,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
message: error instanceof Error ? error.message : "Trips route failed",
|
|
20
|
+
status: 400,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function resolveRouteDeps(c, deps) {
|
|
24
|
+
if (typeof deps !== "function")
|
|
25
|
+
return deps;
|
|
26
|
+
const resolver = deps;
|
|
27
|
+
return resolver(c);
|
|
28
|
+
}
|
|
29
|
+
function isPublicSurface(options) {
|
|
30
|
+
return options.surface === "public";
|
|
31
|
+
}
|
|
32
|
+
function publicForbidden() {
|
|
33
|
+
return new Response(JSON.stringify({ error: "Trips operation is admin-only" }), {
|
|
34
|
+
status: 403,
|
|
35
|
+
headers: { "content-type": "application/json" },
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function envelopeIdParam(c) {
|
|
39
|
+
const envelopeId = c.req.param("envelopeId");
|
|
40
|
+
if (!envelopeId)
|
|
41
|
+
throw new TripsInvariantError("Trip envelope id is required");
|
|
42
|
+
return envelopeId;
|
|
43
|
+
}
|
|
44
|
+
function snapshotIdParam(c) {
|
|
45
|
+
const snapshotId = c.req.param("snapshotId");
|
|
46
|
+
if (!snapshotId)
|
|
47
|
+
throw new TripsInvariantError("Trip snapshot id is required");
|
|
48
|
+
return snapshotId;
|
|
49
|
+
}
|
|
50
|
+
async function listTripsHandler(c) {
|
|
51
|
+
const query = parseQuery(c, listTripsQuerySchema);
|
|
52
|
+
return c.json(await tripsService.listTrips(c.get("db"), query));
|
|
53
|
+
}
|
|
54
|
+
async function createTripHandler(c) {
|
|
55
|
+
try {
|
|
56
|
+
const trip = await tripsService.createTrip(c.get("db"), await parseJsonBody(c, createTripEnvelopeSchema));
|
|
57
|
+
return c.json({ data: trip }, 201);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const { message, status } = routeError(error);
|
|
61
|
+
return c.json({ error: message }, status);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function getTripHandler(c) {
|
|
65
|
+
const trip = await tripsService.getTrip(c.get("db"), envelopeIdParam(c));
|
|
66
|
+
if (!trip)
|
|
67
|
+
return c.json({ error: "Trip envelope not found" }, 404);
|
|
68
|
+
return c.json({ data: trip });
|
|
69
|
+
}
|
|
70
|
+
async function listTripSnapshotsHandler(c, options) {
|
|
71
|
+
if (isPublicSurface(options))
|
|
72
|
+
return publicForbidden();
|
|
73
|
+
return c.json({
|
|
74
|
+
data: await tripsService.listTripSnapshots(c.get("db"), envelopeIdParam(c)),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function createTripSnapshotHandler(c, options) {
|
|
78
|
+
if (isPublicSurface(options))
|
|
79
|
+
return publicForbidden();
|
|
80
|
+
try {
|
|
81
|
+
const body = await parseJsonBody(c, createTripSnapshotBodySchema);
|
|
82
|
+
const snapshot = await tripsService.freezeTripSnapshot(c.get("db"), {
|
|
83
|
+
...body,
|
|
84
|
+
envelopeId: envelopeIdParam(c),
|
|
85
|
+
});
|
|
86
|
+
return c.json({ data: snapshot }, 201);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const { message, status } = routeError(error);
|
|
90
|
+
return c.json({ error: message }, status);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function getTripSnapshotHandler(c, options) {
|
|
94
|
+
if (isPublicSurface(options))
|
|
95
|
+
return publicForbidden();
|
|
96
|
+
const snapshot = await tripsService.getTripSnapshotById(c.get("db"), snapshotIdParam(c));
|
|
97
|
+
if (!snapshot)
|
|
98
|
+
return c.json({ error: "Trip snapshot not found" }, 404);
|
|
99
|
+
return c.json({ data: snapshot });
|
|
100
|
+
}
|
|
101
|
+
async function updateTripHandler(c, options) {
|
|
102
|
+
if (isPublicSurface(options))
|
|
103
|
+
return publicForbidden();
|
|
104
|
+
try {
|
|
105
|
+
const envelope = await tripsService.updateTrip(c.get("db"), envelopeIdParam(c), await parseJsonBody(c, updateTripEnvelopeSchema));
|
|
106
|
+
if (!envelope)
|
|
107
|
+
return c.json({ error: "Trip envelope not found" }, 404);
|
|
108
|
+
return c.json({ data: envelope });
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const { message, status } = routeError(error);
|
|
112
|
+
return c.json({ error: message }, status);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function addTripComponentHandler(c) {
|
|
116
|
+
try {
|
|
117
|
+
const body = await parseJsonBody(c, createTripComponentBodySchema);
|
|
118
|
+
const component = await tripsService.addComponent(c.get("db"), {
|
|
119
|
+
...body,
|
|
120
|
+
envelopeId: envelopeIdParam(c),
|
|
121
|
+
});
|
|
122
|
+
return c.json({ data: component }, 201);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const { message, status } = routeError(error);
|
|
126
|
+
return c.json({ error: message }, status);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function reorderTripComponentsHandler(c, options) {
|
|
130
|
+
if (isPublicSurface(options))
|
|
131
|
+
return publicForbidden();
|
|
132
|
+
try {
|
|
133
|
+
const body = await parseJsonBody(c, reorderTripComponentsSchema.omit({ envelopeId: true }));
|
|
134
|
+
const components = await tripsService.reorderComponents(c.get("db"), {
|
|
135
|
+
...body,
|
|
136
|
+
envelopeId: envelopeIdParam(c),
|
|
137
|
+
});
|
|
138
|
+
return c.json({ data: components });
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const { message, status } = routeError(error);
|
|
142
|
+
return c.json({ error: message }, status);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function priceTripHandler(c, options) {
|
|
146
|
+
const deps = resolveRouteDeps(c, options.priceTripDeps);
|
|
147
|
+
if (!deps) {
|
|
148
|
+
return c.json({ error: "Trips price dependencies are not configured" }, 501);
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
const body = await parseJsonBody(c, priceTripBodySchema);
|
|
152
|
+
const result = await tripsService.priceTrip(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
|
|
153
|
+
return c.json({ data: result });
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const { message, status } = routeError(error);
|
|
157
|
+
return c.json({ error: message }, status);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function reserveTripHandler(c, options) {
|
|
161
|
+
const deps = resolveRouteDeps(c, options.reserveTripDeps);
|
|
162
|
+
if (!deps) {
|
|
163
|
+
return c.json({ error: "Trips reserve dependencies are not configured" }, 501);
|
|
164
|
+
}
|
|
165
|
+
try {
|
|
166
|
+
const body = await parseJsonBody(c, reserveTripBodySchema);
|
|
167
|
+
const result = await tripsService.reserveTrip(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
|
|
168
|
+
return c.json({ data: result });
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const { message, status } = routeError(error);
|
|
172
|
+
return c.json({ error: message }, status);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function startTripCheckoutHandler(c, options) {
|
|
176
|
+
const deps = resolveRouteDeps(c, options.startCheckoutDeps);
|
|
177
|
+
if (!deps) {
|
|
178
|
+
return c.json({ error: "Trips checkout dependencies are not configured" }, 501);
|
|
179
|
+
}
|
|
180
|
+
try {
|
|
181
|
+
const body = await parseJsonBody(c, startCheckoutBodySchema);
|
|
182
|
+
const result = await tripsService.startCheckout(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
|
|
183
|
+
return c.json({ data: result });
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
const { message, status } = routeError(error);
|
|
187
|
+
return c.json({ error: message }, status);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function previewTripCancellationHandler(c, options) {
|
|
191
|
+
if (isPublicSurface(options))
|
|
192
|
+
return publicForbidden();
|
|
193
|
+
try {
|
|
194
|
+
const body = await parseJsonBody(c, previewCancellationBodySchema);
|
|
195
|
+
const deps = resolveRouteDeps(c, options.cancelTripComponentsDeps);
|
|
196
|
+
const result = await tripsService.previewCancellation(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
|
|
197
|
+
return c.json({ data: result });
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
const { message, status } = routeError(error);
|
|
201
|
+
return c.json({ error: message }, status);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function cancelTripComponentsHandler(c, options) {
|
|
205
|
+
if (isPublicSurface(options))
|
|
206
|
+
return publicForbidden();
|
|
207
|
+
try {
|
|
208
|
+
const body = await parseJsonBody(c, cancelTripComponentsBodySchema);
|
|
209
|
+
const deps = resolveRouteDeps(c, options.cancelTripComponentsDeps);
|
|
210
|
+
const result = await tripsService.cancelComponents(c.get("db"), { ...body, envelopeId: envelopeIdParam(c) }, deps);
|
|
211
|
+
return c.json({ data: result });
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
const { message, status } = routeError(error);
|
|
215
|
+
return c.json({ error: message }, status);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
export function createTripsRoutes(options = {}) {
|
|
219
|
+
return new Hono()
|
|
220
|
+
.get("/health", (c) => {
|
|
221
|
+
return c.json({ data: tripsService.getStatus() });
|
|
222
|
+
})
|
|
223
|
+
.get("/", listTripsHandler)
|
|
224
|
+
.post("/", createTripHandler)
|
|
225
|
+
.get("/:envelopeId", getTripHandler)
|
|
226
|
+
.get("/:envelopeId/snapshots", (c) => listTripSnapshotsHandler(c, options))
|
|
227
|
+
.post("/:envelopeId/snapshots", (c) => createTripSnapshotHandler(c, options))
|
|
228
|
+
.get("/snapshots/:snapshotId", (c) => getTripSnapshotHandler(c, options))
|
|
229
|
+
.patch("/:envelopeId", (c) => updateTripHandler(c, options))
|
|
230
|
+
.post("/:envelopeId/components", addTripComponentHandler)
|
|
231
|
+
.post("/:envelopeId/components/reorder", (c) => reorderTripComponentsHandler(c, options))
|
|
232
|
+
.post("/:envelopeId/price", (c) => priceTripHandler(c, options))
|
|
233
|
+
.post("/:envelopeId/reserve", (c) => reserveTripHandler(c, options))
|
|
234
|
+
.post("/:envelopeId/checkout", (c) => startTripCheckoutHandler(c, options))
|
|
235
|
+
.post("/:envelopeId/cancellation-preview", (c) => previewTripCancellationHandler(c, options))
|
|
236
|
+
.post("/:envelopeId/cancel-components", (c) => cancelTripComponentsHandler(c, options))
|
|
237
|
+
.patch("/components/:componentId", async (c) => {
|
|
238
|
+
if (isPublicSurface(options))
|
|
239
|
+
return publicForbidden();
|
|
240
|
+
try {
|
|
241
|
+
const component = await tripsService.updateComponent(c.get("db"), c.req.param("componentId"), await parseJsonBody(c, updateTripComponentSchema));
|
|
242
|
+
if (!component)
|
|
243
|
+
return c.json({ error: "Trip component not found" }, 404);
|
|
244
|
+
return c.json({ data: component });
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
const { message, status } = routeError(error);
|
|
248
|
+
return c.json({ error: message }, status);
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
.post("/components/:componentId/refs", async (c) => {
|
|
252
|
+
if (isPublicSurface(options))
|
|
253
|
+
return publicForbidden();
|
|
254
|
+
try {
|
|
255
|
+
const component = await tripsService.updateComponentRefs(c.get("db"), c.req.param("componentId"), await parseJsonBody(c, updateTripComponentRefsSchema));
|
|
256
|
+
if (!component)
|
|
257
|
+
return c.json({ error: "Trip component not found" }, 404);
|
|
258
|
+
return c.json({ data: component });
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
const { message, status } = routeError(error);
|
|
262
|
+
return c.json({ error: message }, status);
|
|
263
|
+
}
|
|
264
|
+
})
|
|
265
|
+
.delete("/components/:componentId", async (c) => {
|
|
266
|
+
if (isPublicSurface(options))
|
|
267
|
+
return publicForbidden();
|
|
268
|
+
try {
|
|
269
|
+
const component = await tripsService.removeComponent(c.get("db"), c.req.param("componentId"));
|
|
270
|
+
if (!component)
|
|
271
|
+
return c.json({ error: "Trip component not found" }, 404);
|
|
272
|
+
return c.json({ data: component });
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
const { message, status } = routeError(error);
|
|
276
|
+
return c.json({ error: message }, status);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
export const tripsRoutes = createTripsRoutes();
|