@voyantjs/transactions 0.6.8 → 0.6.9
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/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/pii.d.ts +16 -9
- package/dist/pii.d.ts.map +1 -1
- package/dist/pii.js +76 -70
- package/dist/routes-offers.d.ts +462 -28
- package/dist/routes-offers.d.ts.map +1 -1
- package/dist/routes-offers.js +199 -84
- package/dist/routes-orders.d.ts +461 -27
- package/dist/routes-orders.d.ts.map +1 -1
- package/dist/routes-orders.js +199 -84
- package/dist/routes-shared.d.ts +20 -13
- package/dist/routes-shared.d.ts.map +1 -1
- package/dist/routes-shared.js +7 -6
- package/dist/schema/participant-identity.d.ts +43 -6
- package/dist/schema/participant-identity.d.ts.map +1 -1
- package/dist/schema/participant-identity.js +12 -5
- package/dist/schema-audit.d.ts +4 -4
- package/dist/schema-audit.js +3 -3
- package/dist/schema-contacts.d.ts +529 -0
- package/dist/schema-contacts.d.ts.map +1 -0
- package/dist/schema-contacts.js +57 -0
- package/dist/schema-offers.d.ts +177 -3
- package/dist/schema-offers.d.ts.map +1 -1
- package/dist/schema-offers.js +13 -3
- package/dist/schema-orders.d.ts +177 -3
- package/dist/schema-orders.d.ts.map +1 -1
- package/dist/schema-orders.js +13 -3
- package/dist/schema-relations.d.ts +24 -0
- package/dist/schema-relations.d.ts.map +1 -1
- package/dist/schema-relations.js +40 -2
- package/dist/schema-shared.d.ts +3 -1
- package/dist/schema-shared.d.ts.map +1 -1
- package/dist/schema-shared.js +8 -2
- package/dist/schema-staff.d.ts +529 -0
- package/dist/schema-staff.d.ts.map +1 -0
- package/dist/schema-staff.js +57 -0
- package/dist/schema.d.ts +2 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/service-offers.d.ts +275 -29
- package/dist/service-offers.d.ts.map +1 -1
- package/dist/service-offers.js +306 -43
- package/dist/service-orders.d.ts +227 -25
- package/dist/service-orders.d.ts.map +1 -1
- package/dist/service-orders.js +127 -22
- package/dist/service-shared.d.ts +144 -22
- package/dist/service-shared.d.ts.map +1 -1
- package/dist/service-shared.js +30 -2
- package/dist/service.d.ts +62 -22
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +42 -2
- package/dist/storefront-offers.d.ts +39 -5
- package/dist/storefront-offers.d.ts.map +1 -1
- package/dist/storefront-offers.js +3 -3
- package/dist/validation.d.ts +674 -36
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +186 -29
- package/package.json +5 -5
package/dist/routes-offers.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { parseJsonBody, parseQuery } from "@voyantjs/hono";
|
|
1
|
+
import { normalizeValidationError, parseJsonBody, parseQuery } from "@voyantjs/hono";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import { authorizeTransactionPiiAccess, createPiiService,
|
|
3
|
+
import { authorizeTransactionPiiAccess, createPiiService, hasTravelerIdentityInput, logTransactionPiiAccess, notFound, } from "./routes-shared.js";
|
|
4
4
|
import { transactionsService } from "./service.js";
|
|
5
|
-
import {
|
|
5
|
+
import { toTravelerIdentityResponse } from "./service-shared.js";
|
|
6
|
+
import { insertOfferContactAssignmentSchema, insertOfferItemSchema, insertOfferItemTravelerSchema, insertOfferSchema, insertOfferStaffAssignmentSchema, insertOfferTravelerSchema, offerContactAssignmentListQuerySchema, offerItemListQuerySchema, offerItemTravelerListQuerySchema, offerListQuerySchema, offerStaffAssignmentListQuerySchema, offerTravelerListQuerySchema, updateOfferContactAssignmentSchema, updateOfferItemSchema, updateOfferItemTravelerSchema, updateOfferSchema, updateOfferStaffAssignmentSchema, updateOfferTravelerSchema, } from "./validation.js";
|
|
6
7
|
export const transactionOfferRoutes = new Hono()
|
|
7
8
|
.get("/offers", async (c) => {
|
|
8
9
|
const query = parseQuery(c, offerListQuerySchema);
|
|
@@ -23,104 +24,218 @@ export const transactionOfferRoutes = new Hono()
|
|
|
23
24
|
const row = await transactionsService.deleteOffer(c.get("db"), c.req.param("id"));
|
|
24
25
|
return row ? c.json({ success: true }) : notFound(c, "Offer not found");
|
|
25
26
|
})
|
|
26
|
-
.get("/offer-
|
|
27
|
-
const query = parseQuery(c,
|
|
28
|
-
return c.json(await transactionsService.
|
|
27
|
+
.get("/offer-travelers", async (c) => {
|
|
28
|
+
const query = parseQuery(c, offerTravelerListQuerySchema);
|
|
29
|
+
return c.json(await transactionsService.listOfferTravelers(c.get("db"), query));
|
|
29
30
|
})
|
|
30
|
-
.post("/offer-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
.post("/offer-travelers", async (c) => {
|
|
32
|
+
try {
|
|
33
|
+
const payload = await parseJsonBody(c, insertOfferTravelerSchema);
|
|
34
|
+
const row = await transactionsService.createOfferTraveler(c.get("db"), payload);
|
|
35
|
+
if (!row)
|
|
36
|
+
return c.json({ data: row }, 201);
|
|
37
|
+
if (hasTravelerIdentityInput(payload)) {
|
|
38
|
+
const pii = createPiiService(c, "offer", row.offerId);
|
|
39
|
+
await pii.upsertTravelerIdentity(c.get("db"), "offer", row.id, payload, c.get("userId"));
|
|
40
|
+
return c.json({ data: await transactionsService.getOfferTravelerById(c.get("db"), row.id) }, 201);
|
|
41
|
+
}
|
|
34
42
|
return c.json({ data: row }, 201);
|
|
35
|
-
if (hasParticipantIdentityInput(payload)) {
|
|
36
|
-
const pii = createPiiService(c, "offer", row.offerId);
|
|
37
|
-
await pii.upsertParticipantIdentity(c.get("db"), "offer", row.id, payload, c.get("userId"));
|
|
38
|
-
return c.json({ data: await transactionsService.getOfferParticipantById(c.get("db"), row.id) }, 201);
|
|
39
43
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (!row)
|
|
50
|
-
return notFound(c, "Offer participant not found");
|
|
51
|
-
if (hasParticipantIdentityInput(payload)) {
|
|
52
|
-
const pii = createPiiService(c, "offer", row.offerId);
|
|
53
|
-
await pii.upsertParticipantIdentity(c.get("db"), "offer", row.id, payload, c.get("userId"));
|
|
54
|
-
return c.json({
|
|
55
|
-
data: await transactionsService.getOfferParticipantById(c.get("db"), row.id),
|
|
56
|
-
});
|
|
44
|
+
catch (error) {
|
|
45
|
+
const validationError = normalizeValidationError(error);
|
|
46
|
+
if (validationError?.status === 400) {
|
|
47
|
+
return c.json({
|
|
48
|
+
error: validationError.message,
|
|
49
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
50
|
+
}, 400);
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
57
53
|
}
|
|
58
|
-
return c.json({ data: row });
|
|
59
54
|
})
|
|
60
|
-
.get("/offer-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
.get("/offer-travelers/:id", async (c) => {
|
|
56
|
+
const row = await transactionsService.getOfferTravelerById(c.get("db"), c.req.param("id"));
|
|
57
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer traveler not found");
|
|
58
|
+
})
|
|
59
|
+
.patch("/offer-travelers/:id", async (c) => {
|
|
60
|
+
try {
|
|
61
|
+
const payload = await parseJsonBody(c, updateOfferTravelerSchema);
|
|
62
|
+
const row = await transactionsService.updateOfferTraveler(c.get("db"), c.req.param("id"), payload);
|
|
63
|
+
if (!row)
|
|
64
|
+
return notFound(c, "Offer traveler not found");
|
|
65
|
+
if (hasTravelerIdentityInput(payload)) {
|
|
66
|
+
const pii = createPiiService(c, "offer", row.offerId);
|
|
67
|
+
await pii.upsertTravelerIdentity(c.get("db"), "offer", row.id, payload, c.get("userId"));
|
|
68
|
+
return c.json({
|
|
69
|
+
data: await transactionsService.getOfferTravelerById(c.get("db"), row.id),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return c.json({ data: row });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const validationError = normalizeValidationError(error);
|
|
76
|
+
if (validationError?.status === 400) {
|
|
77
|
+
return c.json({
|
|
78
|
+
error: validationError.message,
|
|
79
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
80
|
+
}, 400);
|
|
81
|
+
}
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
.get("/offer-travelers/:id/travel-details", async (c) => {
|
|
86
|
+
const traveler = await transactionsService.getOfferTravelerById(c.get("db"), c.req.param("id"));
|
|
87
|
+
if (!traveler)
|
|
88
|
+
return notFound(c, "Offer traveler not found");
|
|
64
89
|
const auth = await authorizeTransactionPiiAccess(c, {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
parentId:
|
|
90
|
+
travelerKind: "offer",
|
|
91
|
+
travelerId: traveler.id,
|
|
92
|
+
parentId: traveler.offerId,
|
|
68
93
|
action: "read",
|
|
69
94
|
});
|
|
70
95
|
if (!auth.allowed)
|
|
71
96
|
return auth.response;
|
|
72
|
-
const pii = createPiiService(c, "offer",
|
|
73
|
-
const row = await pii.
|
|
97
|
+
const pii = createPiiService(c, "offer", traveler.offerId);
|
|
98
|
+
const row = await pii.getTravelerIdentity(c.get("db"), "offer", traveler.id, c.get("userId"));
|
|
74
99
|
if (!row) {
|
|
75
100
|
await logTransactionPiiAccess(c, {
|
|
76
|
-
|
|
77
|
-
parentId:
|
|
78
|
-
|
|
101
|
+
travelerKind: "offer",
|
|
102
|
+
parentId: traveler.offerId,
|
|
103
|
+
travelerId: traveler.id,
|
|
79
104
|
action: "read",
|
|
80
105
|
outcome: "denied",
|
|
81
106
|
reason: "travel_details_not_found",
|
|
82
107
|
});
|
|
83
|
-
return c.json({ error: "Offer
|
|
108
|
+
return c.json({ error: "Offer traveler travel details not found" }, 404);
|
|
84
109
|
}
|
|
85
|
-
return c.json({ data: row });
|
|
110
|
+
return c.json({ data: toTravelerIdentityResponse(row) });
|
|
86
111
|
})
|
|
87
|
-
.patch("/offer-
|
|
88
|
-
const
|
|
89
|
-
if (!
|
|
90
|
-
return notFound(c, "Offer
|
|
112
|
+
.patch("/offer-travelers/:id/travel-details", async (c) => {
|
|
113
|
+
const traveler = await transactionsService.getOfferTravelerById(c.get("db"), c.req.param("id"));
|
|
114
|
+
if (!traveler)
|
|
115
|
+
return notFound(c, "Offer traveler not found");
|
|
91
116
|
const auth = await authorizeTransactionPiiAccess(c, {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
parentId:
|
|
117
|
+
travelerKind: "offer",
|
|
118
|
+
travelerId: traveler.id,
|
|
119
|
+
parentId: traveler.offerId,
|
|
95
120
|
action: "update",
|
|
96
121
|
});
|
|
97
122
|
if (!auth.allowed)
|
|
98
123
|
return auth.response;
|
|
99
|
-
const pii = createPiiService(c, "offer",
|
|
100
|
-
const row = await pii.
|
|
101
|
-
return row
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
124
|
+
const pii = createPiiService(c, "offer", traveler.offerId);
|
|
125
|
+
const row = await pii.upsertTravelerIdentity(c.get("db"), "offer", traveler.id, await parseJsonBody(c, updateOfferTravelerSchema), c.get("userId"));
|
|
126
|
+
return row
|
|
127
|
+
? c.json({ data: toTravelerIdentityResponse(row) })
|
|
128
|
+
: notFound(c, "Offer traveler not found");
|
|
129
|
+
})
|
|
130
|
+
.delete("/offer-travelers/:id/travel-details", async (c) => {
|
|
131
|
+
const traveler = await transactionsService.getOfferTravelerById(c.get("db"), c.req.param("id"));
|
|
132
|
+
if (!traveler)
|
|
133
|
+
return notFound(c, "Offer traveler not found");
|
|
107
134
|
const auth = await authorizeTransactionPiiAccess(c, {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
parentId:
|
|
135
|
+
travelerKind: "offer",
|
|
136
|
+
travelerId: traveler.id,
|
|
137
|
+
parentId: traveler.offerId,
|
|
111
138
|
action: "delete",
|
|
112
139
|
});
|
|
113
140
|
if (!auth.allowed)
|
|
114
141
|
return auth.response;
|
|
115
|
-
const pii = createPiiService(c, "offer",
|
|
116
|
-
const row = await pii.
|
|
142
|
+
const pii = createPiiService(c, "offer", traveler.offerId);
|
|
143
|
+
const row = await pii.deleteTravelerIdentity(c.get("db"), "offer", traveler.id, c.get("userId"));
|
|
117
144
|
return row
|
|
118
145
|
? c.json({ success: true })
|
|
119
|
-
: c.json({ error: "Offer
|
|
146
|
+
: c.json({ error: "Offer traveler travel details not found" }, 404);
|
|
147
|
+
})
|
|
148
|
+
.delete("/offer-travelers/:id", async (c) => {
|
|
149
|
+
const row = await transactionsService.deleteOfferTraveler(c.get("db"), c.req.param("id"));
|
|
150
|
+
return row ? c.json({ success: true }) : notFound(c, "Offer traveler not found");
|
|
151
|
+
})
|
|
152
|
+
.get("/offer-contact-assignments", async (c) => {
|
|
153
|
+
const query = parseQuery(c, offerContactAssignmentListQuerySchema);
|
|
154
|
+
return c.json(await transactionsService.listOfferContactAssignments(c.get("db"), query));
|
|
155
|
+
})
|
|
156
|
+
.post("/offer-contact-assignments", async (c) => {
|
|
157
|
+
try {
|
|
158
|
+
const row = await transactionsService.createOfferContactAssignment(c.get("db"), await parseJsonBody(c, insertOfferContactAssignmentSchema));
|
|
159
|
+
return c.json({ data: row }, 201);
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const validationError = normalizeValidationError(error);
|
|
163
|
+
if (validationError?.status === 400) {
|
|
164
|
+
return c.json({
|
|
165
|
+
error: validationError.message,
|
|
166
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
167
|
+
}, 400);
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
})
|
|
172
|
+
.get("/offer-contact-assignments/:id", async (c) => {
|
|
173
|
+
const row = await transactionsService.getOfferContactAssignmentById(c.get("db"), c.req.param("id"));
|
|
174
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer contact assignment not found");
|
|
175
|
+
})
|
|
176
|
+
.patch("/offer-contact-assignments/:id", async (c) => {
|
|
177
|
+
try {
|
|
178
|
+
const row = await transactionsService.updateOfferContactAssignment(c.get("db"), c.req.param("id"), await parseJsonBody(c, updateOfferContactAssignmentSchema));
|
|
179
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer contact assignment not found");
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const validationError = normalizeValidationError(error);
|
|
183
|
+
if (validationError?.status === 400) {
|
|
184
|
+
return c.json({
|
|
185
|
+
error: validationError.message,
|
|
186
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
187
|
+
}, 400);
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
.delete("/offer-contact-assignments/:id", async (c) => {
|
|
193
|
+
const row = await transactionsService.deleteOfferContactAssignment(c.get("db"), c.req.param("id"));
|
|
194
|
+
return row ? c.json({ success: true }) : notFound(c, "Offer contact assignment not found");
|
|
195
|
+
})
|
|
196
|
+
.get("/offer-staff-assignments", async (c) => {
|
|
197
|
+
const query = parseQuery(c, offerStaffAssignmentListQuerySchema);
|
|
198
|
+
return c.json(await transactionsService.listOfferStaffAssignments(c.get("db"), query));
|
|
199
|
+
})
|
|
200
|
+
.post("/offer-staff-assignments", async (c) => {
|
|
201
|
+
try {
|
|
202
|
+
const row = await transactionsService.createOfferStaffAssignment(c.get("db"), await parseJsonBody(c, insertOfferStaffAssignmentSchema));
|
|
203
|
+
return c.json({ data: row }, 201);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
const validationError = normalizeValidationError(error);
|
|
207
|
+
if (validationError?.status === 400) {
|
|
208
|
+
return c.json({
|
|
209
|
+
error: validationError.message,
|
|
210
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
211
|
+
}, 400);
|
|
212
|
+
}
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
})
|
|
216
|
+
.get("/offer-staff-assignments/:id", async (c) => {
|
|
217
|
+
const row = await transactionsService.getOfferStaffAssignmentById(c.get("db"), c.req.param("id"));
|
|
218
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer staff assignment not found");
|
|
219
|
+
})
|
|
220
|
+
.patch("/offer-staff-assignments/:id", async (c) => {
|
|
221
|
+
try {
|
|
222
|
+
const row = await transactionsService.updateOfferStaffAssignment(c.get("db"), c.req.param("id"), await parseJsonBody(c, updateOfferStaffAssignmentSchema));
|
|
223
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer staff assignment not found");
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
const validationError = normalizeValidationError(error);
|
|
227
|
+
if (validationError?.status === 400) {
|
|
228
|
+
return c.json({
|
|
229
|
+
error: validationError.message,
|
|
230
|
+
details: validationError.details?.fields ?? validationError.details,
|
|
231
|
+
}, 400);
|
|
232
|
+
}
|
|
233
|
+
throw error;
|
|
234
|
+
}
|
|
120
235
|
})
|
|
121
|
-
.delete("/offer-
|
|
122
|
-
const row = await transactionsService.
|
|
123
|
-
return row ? c.json({ success: true }) : notFound(c, "Offer
|
|
236
|
+
.delete("/offer-staff-assignments/:id", async (c) => {
|
|
237
|
+
const row = await transactionsService.deleteOfferStaffAssignment(c.get("db"), c.req.param("id"));
|
|
238
|
+
return row ? c.json({ success: true }) : notFound(c, "Offer staff assignment not found");
|
|
124
239
|
})
|
|
125
240
|
.get("/offer-items", async (c) => {
|
|
126
241
|
const query = parseQuery(c, offerItemListQuerySchema);
|
|
@@ -141,22 +256,22 @@ export const transactionOfferRoutes = new Hono()
|
|
|
141
256
|
const row = await transactionsService.deleteOfferItem(c.get("db"), c.req.param("id"));
|
|
142
257
|
return row ? c.json({ success: true }) : notFound(c, "Offer item not found");
|
|
143
258
|
})
|
|
144
|
-
.get("/offer-item-
|
|
145
|
-
const query = parseQuery(c,
|
|
146
|
-
return c.json(await transactionsService.
|
|
259
|
+
.get("/offer-item-travelers", async (c) => {
|
|
260
|
+
const query = parseQuery(c, offerItemTravelerListQuerySchema);
|
|
261
|
+
return c.json(await transactionsService.listOfferItemTravelers(c.get("db"), query));
|
|
147
262
|
})
|
|
148
|
-
.post("/offer-item-
|
|
149
|
-
data: await transactionsService.
|
|
263
|
+
.post("/offer-item-travelers", async (c) => c.json({
|
|
264
|
+
data: await transactionsService.createOfferItemTraveler(c.get("db"), await parseJsonBody(c, insertOfferItemTravelerSchema)),
|
|
150
265
|
}, 201))
|
|
151
|
-
.get("/offer-item-
|
|
152
|
-
const row = await transactionsService.
|
|
153
|
-
return row ? c.json({ data: row }) : notFound(c, "Offer item
|
|
266
|
+
.get("/offer-item-travelers/:id", async (c) => {
|
|
267
|
+
const row = await transactionsService.getOfferItemTravelerById(c.get("db"), c.req.param("id"));
|
|
268
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer item traveler not found");
|
|
154
269
|
})
|
|
155
|
-
.patch("/offer-item-
|
|
156
|
-
const row = await transactionsService.
|
|
157
|
-
return row ? c.json({ data: row }) : notFound(c, "Offer item
|
|
270
|
+
.patch("/offer-item-travelers/:id", async (c) => {
|
|
271
|
+
const row = await transactionsService.updateOfferItemTraveler(c.get("db"), c.req.param("id"), await parseJsonBody(c, updateOfferItemTravelerSchema));
|
|
272
|
+
return row ? c.json({ data: row }) : notFound(c, "Offer item traveler not found");
|
|
158
273
|
})
|
|
159
|
-
.delete("/offer-item-
|
|
160
|
-
const row = await transactionsService.
|
|
161
|
-
return row ? c.json({ success: true }) : notFound(c, "Offer item
|
|
274
|
+
.delete("/offer-item-travelers/:id", async (c) => {
|
|
275
|
+
const row = await transactionsService.deleteOfferItemTraveler(c.get("db"), c.req.param("id"));
|
|
276
|
+
return row ? c.json({ success: true }) : notFound(c, "Offer item traveler not found");
|
|
162
277
|
});
|