@voyantjs/bookings 0.52.1 → 0.52.3
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/README.md +16 -0
- package/dist/action-ledger-capabilities.d.ts +306 -0
- package/dist/action-ledger-capabilities.d.ts.map +1 -0
- package/dist/action-ledger-capabilities.js +92 -0
- package/dist/action-ledger-drift-remediation.d.ts +30 -0
- package/dist/action-ledger-drift-remediation.d.ts.map +1 -0
- package/dist/action-ledger-drift-remediation.js +85 -0
- package/dist/action-ledger-drift.d.ts +29 -0
- package/dist/action-ledger-drift.d.ts.map +1 -0
- package/dist/action-ledger-drift.js +217 -0
- package/dist/availability-ref.d.ts +2 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/routes-groups.d.ts +13 -13
- package/dist/routes-public.d.ts +9 -9
- package/dist/routes-shared.d.ts +13 -4
- package/dist/routes-shared.d.ts.map +1 -1
- package/dist/routes.d.ts +347 -663
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +1191 -49
- package/dist/schema-core.d.ts +3 -3
- package/dist/schema-items.d.ts +3 -3
- package/dist/service-public.d.ts +24 -24
- package/dist/service.d.ts +62 -45
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +166 -14
- package/dist/status-dispatch.d.ts +3 -1
- package/dist/status-dispatch.d.ts.map +1 -1
- package/dist/status-dispatch.js +18 -3
- package/dist/validation-public.d.ts +12 -12
- package/dist/validation-shared.d.ts +4 -4
- package/dist/validation.d.ts +41 -19
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +39 -0
- package/package.json +22 -6
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { actionLedgerEntries } from "@voyantjs/action-ledger/schema";
|
|
2
|
+
import { sql } from "drizzle-orm";
|
|
3
|
+
import { bookingTravelerTravelDetails } from "./schema/travel-details.js";
|
|
4
|
+
import { bookings, bookingTravelers } from "./schema-core.js";
|
|
5
|
+
import { bookingItems } from "./schema-items.js";
|
|
6
|
+
const DEFAULT_SAMPLE_LIMIT = 20;
|
|
7
|
+
const MAX_SAMPLE_LIMIT = 100;
|
|
8
|
+
const BOOKING_CONFIRM_ACTION_NAME = "booking.status.confirm";
|
|
9
|
+
const BOOKING_EXPIRE_ACTION_NAME = "booking.status.expire";
|
|
10
|
+
const BOOKING_CANCEL_ACTION_NAME = "booking.status.cancel";
|
|
11
|
+
const BOOKING_COMPLETE_ACTION_NAME = "booking.status.complete";
|
|
12
|
+
const BOOKING_TRAVELER_CREATE_ACTION_NAMES = [
|
|
13
|
+
"booking.traveler.create",
|
|
14
|
+
"booking.traveler_with_travel_details.create",
|
|
15
|
+
];
|
|
16
|
+
const BOOKING_TRAVELER_TRAVEL_DETAILS_ACTION_NAMES = [
|
|
17
|
+
"booking.traveler_with_travel_details.create",
|
|
18
|
+
"booking.traveler_travel_details.update",
|
|
19
|
+
];
|
|
20
|
+
const BOOKING_ITEM_CREATE_ACTION_NAME = "booking.item.create";
|
|
21
|
+
export function buildBookingActionLedgerDriftQueries(input = {}) {
|
|
22
|
+
const sampleLimit = normalizeSampleLimit(input.sampleLimit);
|
|
23
|
+
return {
|
|
24
|
+
booking_confirmed: buildBookingStatusDriftQuery({
|
|
25
|
+
check: "booking_confirmed",
|
|
26
|
+
actionName: BOOKING_CONFIRM_ACTION_NAME,
|
|
27
|
+
timestampColumn: bookings.confirmedAt,
|
|
28
|
+
input,
|
|
29
|
+
sampleLimit,
|
|
30
|
+
}),
|
|
31
|
+
booking_expired: buildBookingStatusDriftQuery({
|
|
32
|
+
check: "booking_expired",
|
|
33
|
+
actionName: BOOKING_EXPIRE_ACTION_NAME,
|
|
34
|
+
timestampColumn: bookings.expiredAt,
|
|
35
|
+
input,
|
|
36
|
+
sampleLimit,
|
|
37
|
+
}),
|
|
38
|
+
booking_cancelled: buildBookingStatusDriftQuery({
|
|
39
|
+
check: "booking_cancelled",
|
|
40
|
+
actionName: BOOKING_CANCEL_ACTION_NAME,
|
|
41
|
+
timestampColumn: bookings.cancelledAt,
|
|
42
|
+
input,
|
|
43
|
+
sampleLimit,
|
|
44
|
+
}),
|
|
45
|
+
booking_completed: buildBookingStatusDriftQuery({
|
|
46
|
+
check: "booking_completed",
|
|
47
|
+
actionName: BOOKING_COMPLETE_ACTION_NAME,
|
|
48
|
+
timestampColumn: bookings.completedAt,
|
|
49
|
+
input,
|
|
50
|
+
sampleLimit,
|
|
51
|
+
}),
|
|
52
|
+
booking_item: sql `
|
|
53
|
+
SELECT
|
|
54
|
+
'booking_item' AS check,
|
|
55
|
+
count(*)::int AS missing_count,
|
|
56
|
+
coalesce(
|
|
57
|
+
array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
|
|
58
|
+
FILTER (WHERE sample_ordinal <= ${sampleLimit}),
|
|
59
|
+
ARRAY[]::text[]
|
|
60
|
+
) AS sample_ids
|
|
61
|
+
FROM (
|
|
62
|
+
SELECT
|
|
63
|
+
${bookingItems.id} AS candidate_id,
|
|
64
|
+
${bookingItems.createdAt} AS created_at,
|
|
65
|
+
row_number() OVER (
|
|
66
|
+
ORDER BY ${bookingItems.createdAt} DESC, ${bookingItems.id} DESC
|
|
67
|
+
) AS sample_ordinal
|
|
68
|
+
FROM ${bookingItems}
|
|
69
|
+
WHERE 1 = 1
|
|
70
|
+
${buildCreatedAtCondition(bookingItems.createdAt, input.createdAtFrom)}
|
|
71
|
+
AND NOT EXISTS (
|
|
72
|
+
SELECT 1
|
|
73
|
+
FROM ${actionLedgerEntries}
|
|
74
|
+
WHERE ${actionLedgerEntries.actionName} = ${BOOKING_ITEM_CREATE_ACTION_NAME}
|
|
75
|
+
AND ${actionLedgerEntries.targetType} = ${"booking_item"}
|
|
76
|
+
AND ${actionLedgerEntries.targetId} = ${bookingItems.id}
|
|
77
|
+
)
|
|
78
|
+
) missing
|
|
79
|
+
`,
|
|
80
|
+
booking_traveler: sql `
|
|
81
|
+
SELECT
|
|
82
|
+
'booking_traveler' AS check,
|
|
83
|
+
count(*)::int AS missing_count,
|
|
84
|
+
coalesce(
|
|
85
|
+
array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
|
|
86
|
+
FILTER (WHERE sample_ordinal <= ${sampleLimit}),
|
|
87
|
+
ARRAY[]::text[]
|
|
88
|
+
) AS sample_ids
|
|
89
|
+
FROM (
|
|
90
|
+
SELECT
|
|
91
|
+
${bookingTravelers.id} AS candidate_id,
|
|
92
|
+
${bookingTravelers.createdAt} AS created_at,
|
|
93
|
+
row_number() OVER (
|
|
94
|
+
ORDER BY ${bookingTravelers.createdAt} DESC, ${bookingTravelers.id} DESC
|
|
95
|
+
) AS sample_ordinal
|
|
96
|
+
FROM ${bookingTravelers}
|
|
97
|
+
WHERE 1 = 1
|
|
98
|
+
${buildCreatedAtCondition(bookingTravelers.createdAt, input.createdAtFrom)}
|
|
99
|
+
AND NOT EXISTS (
|
|
100
|
+
SELECT 1
|
|
101
|
+
FROM ${actionLedgerEntries}
|
|
102
|
+
WHERE ${actionLedgerEntries.actionName} IN (${sql.join(BOOKING_TRAVELER_CREATE_ACTION_NAMES.map((actionName) => sql `${actionName}`), sql `, `)})
|
|
103
|
+
AND ${actionLedgerEntries.targetType} = ${"booking_traveler"}
|
|
104
|
+
AND ${actionLedgerEntries.targetId} = ${bookingTravelers.id}
|
|
105
|
+
)
|
|
106
|
+
) missing
|
|
107
|
+
`,
|
|
108
|
+
booking_traveler_travel_details: sql `
|
|
109
|
+
SELECT
|
|
110
|
+
'booking_traveler_travel_details' AS check,
|
|
111
|
+
count(*)::int AS missing_count,
|
|
112
|
+
coalesce(
|
|
113
|
+
array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
|
|
114
|
+
FILTER (WHERE sample_ordinal <= ${sampleLimit}),
|
|
115
|
+
ARRAY[]::text[]
|
|
116
|
+
) AS sample_ids
|
|
117
|
+
FROM (
|
|
118
|
+
SELECT
|
|
119
|
+
${bookingTravelerTravelDetails.travelerId} AS candidate_id,
|
|
120
|
+
${bookingTravelerTravelDetails.createdAt} AS created_at,
|
|
121
|
+
row_number() OVER (
|
|
122
|
+
ORDER BY ${bookingTravelerTravelDetails.createdAt} DESC,
|
|
123
|
+
${bookingTravelerTravelDetails.travelerId} DESC
|
|
124
|
+
) AS sample_ordinal
|
|
125
|
+
FROM ${bookingTravelerTravelDetails}
|
|
126
|
+
WHERE 1 = 1
|
|
127
|
+
${buildCreatedAtCondition(bookingTravelerTravelDetails.createdAt, input.createdAtFrom)}
|
|
128
|
+
AND NOT EXISTS (
|
|
129
|
+
SELECT 1
|
|
130
|
+
FROM ${actionLedgerEntries}
|
|
131
|
+
WHERE ${actionLedgerEntries.actionName} IN (${sql.join(BOOKING_TRAVELER_TRAVEL_DETAILS_ACTION_NAMES.map((actionName) => sql `${actionName}`), sql `, `)})
|
|
132
|
+
AND ${actionLedgerEntries.targetType} = ${"booking_traveler"}
|
|
133
|
+
AND ${actionLedgerEntries.targetId} = ${bookingTravelerTravelDetails.travelerId}
|
|
134
|
+
)
|
|
135
|
+
) missing
|
|
136
|
+
`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export async function checkBookingActionLedgerDrift(db, input = {}) {
|
|
140
|
+
const queries = buildBookingActionLedgerDriftQueries(input);
|
|
141
|
+
const results = await Promise.all([
|
|
142
|
+
db.execute(queries.booking_confirmed),
|
|
143
|
+
db.execute(queries.booking_expired),
|
|
144
|
+
db.execute(queries.booking_cancelled),
|
|
145
|
+
db.execute(queries.booking_completed),
|
|
146
|
+
db.execute(queries.booking_item),
|
|
147
|
+
db.execute(queries.booking_traveler),
|
|
148
|
+
db.execute(queries.booking_traveler_travel_details),
|
|
149
|
+
]);
|
|
150
|
+
const rows = results
|
|
151
|
+
.flatMap((result) => extractRows(result))
|
|
152
|
+
.map((row) => normalizeRow(row));
|
|
153
|
+
return {
|
|
154
|
+
ok: rows.every((row) => row.missingCount === 0),
|
|
155
|
+
rows,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function buildBookingStatusDriftQuery(input) {
|
|
159
|
+
return sql `
|
|
160
|
+
SELECT
|
|
161
|
+
${input.check} AS check,
|
|
162
|
+
count(*)::int AS missing_count,
|
|
163
|
+
coalesce(
|
|
164
|
+
array_agg(candidate_id ORDER BY created_at DESC, candidate_id DESC)
|
|
165
|
+
FILTER (WHERE sample_ordinal <= ${input.sampleLimit}),
|
|
166
|
+
ARRAY[]::text[]
|
|
167
|
+
) AS sample_ids
|
|
168
|
+
FROM (
|
|
169
|
+
SELECT
|
|
170
|
+
${bookings.id} AS candidate_id,
|
|
171
|
+
${input.timestampColumn} AS created_at,
|
|
172
|
+
row_number() OVER (
|
|
173
|
+
ORDER BY ${input.timestampColumn} DESC, ${bookings.id} DESC
|
|
174
|
+
) AS sample_ordinal
|
|
175
|
+
FROM ${bookings}
|
|
176
|
+
WHERE ${input.timestampColumn} IS NOT NULL
|
|
177
|
+
${buildCreatedAtCondition(input.timestampColumn, input.input.createdAtFrom)}
|
|
178
|
+
AND NOT EXISTS (
|
|
179
|
+
SELECT 1
|
|
180
|
+
FROM ${actionLedgerEntries}
|
|
181
|
+
WHERE ${actionLedgerEntries.actionName} = ${input.actionName}
|
|
182
|
+
AND ${actionLedgerEntries.targetType} = ${"booking"}
|
|
183
|
+
AND ${actionLedgerEntries.targetId} = ${bookings.id}
|
|
184
|
+
)
|
|
185
|
+
) missing
|
|
186
|
+
`;
|
|
187
|
+
}
|
|
188
|
+
function normalizeSampleLimit(limit) {
|
|
189
|
+
if (!limit)
|
|
190
|
+
return DEFAULT_SAMPLE_LIMIT;
|
|
191
|
+
return Math.min(Math.max(Math.trunc(limit), 1), MAX_SAMPLE_LIMIT);
|
|
192
|
+
}
|
|
193
|
+
function buildCreatedAtCondition(column, value) {
|
|
194
|
+
if (!value)
|
|
195
|
+
return sql ``;
|
|
196
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
197
|
+
if (Number.isNaN(date.getTime())) {
|
|
198
|
+
throw new Error("createdAtFrom must be a valid date");
|
|
199
|
+
}
|
|
200
|
+
return sql `AND ${column} >= ${date}`;
|
|
201
|
+
}
|
|
202
|
+
function extractRows(result) {
|
|
203
|
+
if (Array.isArray(result))
|
|
204
|
+
return result;
|
|
205
|
+
const maybeRows = result.rows;
|
|
206
|
+
return Array.isArray(maybeRows) ? maybeRows : [];
|
|
207
|
+
}
|
|
208
|
+
function normalizeRow(row) {
|
|
209
|
+
return {
|
|
210
|
+
check: row.check,
|
|
211
|
+
missingCount: Number(row.missing_count),
|
|
212
|
+
sampleIds: row.sample_ids ?? [],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
export const __test__ = {
|
|
216
|
+
normalizeRow,
|
|
217
|
+
};
|
|
@@ -177,7 +177,7 @@ export declare const availabilitySlotsRef: import("drizzle-orm/pg-core").PgTable
|
|
|
177
177
|
tableName: "availability_slots";
|
|
178
178
|
dataType: "string";
|
|
179
179
|
columnType: "PgText";
|
|
180
|
-
data: "
|
|
180
|
+
data: "cancelled" | "open" | "closed" | "sold_out";
|
|
181
181
|
driverParam: string;
|
|
182
182
|
notNull: true;
|
|
183
183
|
hasDefault: false;
|
|
@@ -189,7 +189,7 @@ export declare const availabilitySlotsRef: import("drizzle-orm/pg-core").PgTable
|
|
|
189
189
|
identity: undefined;
|
|
190
190
|
generated: undefined;
|
|
191
191
|
}, {}, {
|
|
192
|
-
$type: "
|
|
192
|
+
$type: "cancelled" | "open" | "closed" | "sold_out";
|
|
193
193
|
}>;
|
|
194
194
|
unlimited: import("drizzle-orm/pg-core").PgColumn<{
|
|
195
195
|
name: "unlimited";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { LinkableDefinition, Module } from "@voyantjs/core";
|
|
2
2
|
import type { HonoModule } from "@voyantjs/hono/module";
|
|
3
3
|
import { type BookingRouteRuntimeOptions } from "./route-runtime.js";
|
|
4
|
+
export { BOOKING_ACTION_LEDGER_CAPABILITIES, BOOKING_PII_READ_CAPABILITY, BOOKING_STATUS_CAPABILITIES, bookingActionLedgerCapabilityRegistry, } from "./action-ledger-capabilities.js";
|
|
4
5
|
export { bookingsSupplierExtension } from "./extensions/suppliers.js";
|
|
5
6
|
export { type BookingPiiAuditEvent, type BookingPiiService, type BookingPiiServiceOptions, createBookingPiiService, type UpsertBookingTravelerTravelDetailInput, } from "./pii.js";
|
|
6
7
|
export { type PiiAccessContext, redactBookingContact, redactEmail, redactPhone, redactString, redactTravelerIdentity, shouldRevealBookingPii, } from "./pii-redaction.js";
|
|
7
|
-
export type { BookingTravelerSharingGroupMember, BookingTravelerSharingGroupSummary, ConvertProductData, CreateTravelerWithTravelDetailsInput, UpdateTravelerWithTravelDetailsInput, } from "./service.js";
|
|
8
|
+
export type { BookingCancelledEvent, BookingConfirmedEvent, BookingTravelerSharingGroupMember, BookingTravelerSharingGroupSummary, ConvertProductData, CreateTravelerWithTravelDetailsInput, UpdateTravelerWithTravelDetailsInput, } from "./service.js";
|
|
8
9
|
export { bookingsService } from "./service.js";
|
|
9
10
|
export { type AddBookingGroupMemberInput, type BookingGroupListQuery, type BookingGroupMemberWithBooking, bookingGroupsService, type CreateBookingGroupInput, listGroupBookingTravelers, type UpdateBookingGroupInput, } from "./service-groups.js";
|
|
10
11
|
export { BOOKING_TRANSITIONS, type BookingStatus, type BookingStatusPatch, BookingTransitionError, canTransitionBooking, transitionBooking, } from "./state-machine.js";
|
|
@@ -21,7 +22,7 @@ export declare function createBookingsHonoModule(options?: BookingsHonoModuleOpt
|
|
|
21
22
|
export declare const bookingsHonoModule: HonoModule;
|
|
22
23
|
export type { BookingRouteRuntime, BookingRouteRuntimeOptions, ResolveBookingKmsProvider, } from "./route-runtime.js";
|
|
23
24
|
export { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
|
|
24
|
-
export type { BookingRoutes } from "./routes.js";
|
|
25
|
+
export type { BookingActionLedgerListResponse, BookingRoutes } from "./routes.js";
|
|
25
26
|
export type { PublicBookingRoutes } from "./routes-public.js";
|
|
26
27
|
export { publicBookingRoutes } from "./routes-public.js";
|
|
27
28
|
export type { BookingTravelerBedPreference, BookingTravelerDietary, BookingTravelerIdentity, BookingTravelerTravelDetail, DecryptedBookingTravelerTravelDetail, NewBookingTravelerTravelDetail, TravelerAllocationMap, } from "./schema/travel-details.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,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAEL,KAAK,0BAA0B,EAEhC,MAAM,oBAAoB,CAAA;AAI3B,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,uBAAuB,EACvB,KAAK,sCAAsC,GAC5C,MAAM,UAAU,CAAA;AACjB,OAAO,EACL,KAAK,gBAAgB,EACrB,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,iCAAiC,EACjC,kCAAkC,EAClC,kBAAkB,EAClB,oCAAoC,EACpC,oCAAoC,GACrC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EAClC,oBAAoB,EACpB,KAAK,uBAAuB,EAC5B,yBAAyB,EACzB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,2BAA2B,EAChC,2BAA2B,GAC5B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,6BAA6B,EAClC,uBAAuB,GACxB,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,eAAe,EAAE,kBAK7B,CAAA;AAED,eAAO,MAAM,gBAAgB;;CAE5B,CAAA;AAED,eAAO,MAAM,cAAc,EAAE,MAG5B,CAAA;AAED,MAAM,WAAW,yBAA0B,SAAQ,0BAA0B;CAAG;AAEhF,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,UAAU,CAiB5F;AAED,eAAO,MAAM,kBAAkB,EAAE,UAAuC,CAAA;AAExE,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,mCAAmC,EACnC,wBAAwB,GACzB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
|
|
2
2
|
import { bookingRoutes } from "./routes.js";
|
|
3
3
|
import { publicBookingRoutes } from "./routes-public.js";
|
|
4
|
+
export { BOOKING_ACTION_LEDGER_CAPABILITIES, BOOKING_PII_READ_CAPABILITY, BOOKING_STATUS_CAPABILITIES, bookingActionLedgerCapabilityRegistry, } from "./action-ledger-capabilities.js";
|
|
4
5
|
export { bookingsSupplierExtension } from "./extensions/suppliers.js";
|
|
5
6
|
export { createBookingPiiService, } from "./pii.js";
|
|
6
7
|
export { redactBookingContact, redactEmail, redactPhone, redactString, redactTravelerIdentity, shouldRevealBookingPii, } from "./pii-redaction.js";
|
package/dist/routes-groups.d.ts
CHANGED
|
@@ -12,15 +12,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
12
12
|
output: {
|
|
13
13
|
data: {
|
|
14
14
|
id: string;
|
|
15
|
-
productId: string | null;
|
|
16
15
|
createdAt: string;
|
|
17
|
-
updatedAt: string;
|
|
18
16
|
metadata: {
|
|
19
17
|
[x: string]: import("hono/utils/types").JSONValue;
|
|
20
18
|
} | null;
|
|
19
|
+
updatedAt: string;
|
|
21
20
|
kind: "other" | "shared_room" | "cruise_party";
|
|
22
21
|
label: string;
|
|
23
22
|
primaryBookingId: string | null;
|
|
23
|
+
productId: string | null;
|
|
24
24
|
optionUnitId: string | null;
|
|
25
25
|
}[];
|
|
26
26
|
total: number;
|
|
@@ -38,15 +38,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
38
38
|
output: {
|
|
39
39
|
data: {
|
|
40
40
|
id: string;
|
|
41
|
-
productId: string | null;
|
|
42
41
|
createdAt: string;
|
|
43
|
-
updatedAt: string;
|
|
44
42
|
metadata: {
|
|
45
43
|
[x: string]: import("hono/utils/types").JSONValue;
|
|
46
44
|
} | null;
|
|
45
|
+
updatedAt: string;
|
|
47
46
|
kind: "other" | "shared_room" | "cruise_party";
|
|
48
47
|
label: string;
|
|
49
48
|
primaryBookingId: string | null;
|
|
49
|
+
productId: string | null;
|
|
50
50
|
optionUnitId: string | null;
|
|
51
51
|
};
|
|
52
52
|
};
|
|
@@ -83,10 +83,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
83
83
|
groupId: string;
|
|
84
84
|
booking: {
|
|
85
85
|
id: string;
|
|
86
|
-
status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress"
|
|
86
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
87
|
+
organizationId: string | null;
|
|
87
88
|
createdAt: string;
|
|
88
89
|
updatedAt: string;
|
|
89
|
-
organizationId: string | null;
|
|
90
90
|
redeemedAt: string | null;
|
|
91
91
|
startDate: string | null;
|
|
92
92
|
endDate: string | null;
|
|
@@ -135,15 +135,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
135
135
|
} | null;
|
|
136
136
|
}[];
|
|
137
137
|
id: string;
|
|
138
|
-
productId: string | null;
|
|
139
138
|
createdAt: string;
|
|
140
|
-
updatedAt: string;
|
|
141
139
|
metadata: {
|
|
142
140
|
[x: string]: import("hono/utils/types").JSONValue;
|
|
143
141
|
} | null;
|
|
142
|
+
updatedAt: string;
|
|
144
143
|
kind: "other" | "shared_room" | "cruise_party";
|
|
145
144
|
label: string;
|
|
146
145
|
primaryBookingId: string | null;
|
|
146
|
+
productId: string | null;
|
|
147
147
|
optionUnitId: string | null;
|
|
148
148
|
};
|
|
149
149
|
};
|
|
@@ -173,15 +173,15 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
173
173
|
output: {
|
|
174
174
|
data: {
|
|
175
175
|
id: string;
|
|
176
|
-
productId: string | null;
|
|
177
176
|
createdAt: string;
|
|
178
|
-
updatedAt: string;
|
|
179
177
|
metadata: {
|
|
180
178
|
[x: string]: import("hono/utils/types").JSONValue;
|
|
181
179
|
} | null;
|
|
180
|
+
updatedAt: string;
|
|
182
181
|
kind: "other" | "shared_room" | "cruise_party";
|
|
183
182
|
label: string;
|
|
184
183
|
primaryBookingId: string | null;
|
|
184
|
+
productId: string | null;
|
|
185
185
|
optionUnitId: string | null;
|
|
186
186
|
};
|
|
187
187
|
};
|
|
@@ -232,10 +232,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
232
232
|
groupId: string;
|
|
233
233
|
booking: {
|
|
234
234
|
id: string;
|
|
235
|
-
status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress"
|
|
235
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
236
|
+
organizationId: string | null;
|
|
236
237
|
createdAt: string;
|
|
237
238
|
updatedAt: string;
|
|
238
|
-
organizationId: string | null;
|
|
239
239
|
redeemedAt: string | null;
|
|
240
240
|
startDate: string | null;
|
|
241
241
|
endDate: string | null;
|
|
@@ -373,10 +373,10 @@ export declare const bookingGroupRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
373
373
|
output: {
|
|
374
374
|
data: {
|
|
375
375
|
id: string;
|
|
376
|
-
notes: string | null;
|
|
377
376
|
createdAt: string;
|
|
378
377
|
updatedAt: string;
|
|
379
378
|
email: string | null;
|
|
379
|
+
notes: string | null;
|
|
380
380
|
firstName: string;
|
|
381
381
|
lastName: string;
|
|
382
382
|
bookingId: string;
|
package/dist/routes-public.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
43
43
|
data: {
|
|
44
44
|
sessionId: string;
|
|
45
45
|
bookingNumber: string;
|
|
46
|
-
status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress"
|
|
46
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
47
47
|
externalBookingRef: string | null;
|
|
48
48
|
communicationLanguage: string | null;
|
|
49
49
|
sellCurrency: string;
|
|
@@ -74,7 +74,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
74
74
|
title: string;
|
|
75
75
|
description: string | null;
|
|
76
76
|
itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
|
|
77
|
-
status: "
|
|
77
|
+
status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
|
|
78
78
|
serviceDate: string | null;
|
|
79
79
|
startsAt: string | null;
|
|
80
80
|
endsAt: string | null;
|
|
@@ -107,7 +107,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
107
107
|
availabilitySlotId: string | null;
|
|
108
108
|
quantity: number;
|
|
109
109
|
allocationType: "resource" | "unit" | "pickup";
|
|
110
|
-
status: "
|
|
110
|
+
status: "expired" | "cancelled" | "confirmed" | "fulfilled" | "held" | "released";
|
|
111
111
|
holdExpiresAt: string | null;
|
|
112
112
|
confirmedAt: string | null;
|
|
113
113
|
releasedAt: string | null;
|
|
@@ -328,7 +328,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
328
328
|
session: {
|
|
329
329
|
sessionId: string;
|
|
330
330
|
bookingNumber: string;
|
|
331
|
-
status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress"
|
|
331
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
332
332
|
externalBookingRef: string | null;
|
|
333
333
|
communicationLanguage: string | null;
|
|
334
334
|
sellCurrency: string;
|
|
@@ -359,7 +359,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
359
359
|
title: string;
|
|
360
360
|
description: string | null;
|
|
361
361
|
itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
|
|
362
|
-
status: "
|
|
362
|
+
status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
|
|
363
363
|
serviceDate: string | null;
|
|
364
364
|
startsAt: string | null;
|
|
365
365
|
endsAt: string | null;
|
|
@@ -392,7 +392,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
392
392
|
availabilitySlotId: string | null;
|
|
393
393
|
quantity: number;
|
|
394
394
|
allocationType: "resource" | "unit" | "pickup";
|
|
395
|
-
status: "
|
|
395
|
+
status: "expired" | "cancelled" | "confirmed" | "fulfilled" | "held" | "released";
|
|
396
396
|
holdExpiresAt: string | null;
|
|
397
397
|
confirmedAt: string | null;
|
|
398
398
|
releasedAt: string | null;
|
|
@@ -512,7 +512,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
512
512
|
data: {
|
|
513
513
|
bookingId: string;
|
|
514
514
|
bookingNumber: string;
|
|
515
|
-
status: "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress"
|
|
515
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
516
516
|
sellCurrency: string;
|
|
517
517
|
sellAmountCents: number | null;
|
|
518
518
|
startDate: string | null;
|
|
@@ -533,7 +533,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
533
533
|
title: string;
|
|
534
534
|
description: string | null;
|
|
535
535
|
itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
|
|
536
|
-
status: "
|
|
536
|
+
status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
|
|
537
537
|
serviceDate: string | null;
|
|
538
538
|
startsAt: string | null;
|
|
539
539
|
endsAt: string | null;
|
|
@@ -569,7 +569,7 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
569
569
|
travelerId: string | null;
|
|
570
570
|
fulfillmentType: "other" | "voucher" | "ticket" | "pdf" | "qr_code" | "barcode" | "mobile";
|
|
571
571
|
deliveryChannel: "api" | "email" | "other" | "download" | "wallet";
|
|
572
|
-
status: "
|
|
572
|
+
status: "failed" | "pending" | "issued" | "reissued" | "revoked";
|
|
573
573
|
artifactUrl: string | null;
|
|
574
574
|
}[];
|
|
575
575
|
};
|
package/dist/routes-shared.d.ts
CHANGED
|
@@ -27,15 +27,24 @@ export type Env = {
|
|
|
27
27
|
db: PostgresJsDatabase;
|
|
28
28
|
eventBus?: EventBus;
|
|
29
29
|
userId?: string;
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
agentId?: string;
|
|
31
|
+
workflowPrincipalId?: string;
|
|
32
|
+
principalSubtype?: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
organizationId?: string | null;
|
|
35
|
+
workflowRunId?: string | null;
|
|
36
|
+
workflowStepId?: string | null;
|
|
37
|
+
actor?: "staff" | "customer" | "partner" | "supplier" | "agent" | "system";
|
|
38
|
+
callerType?: "session" | "api_key" | "internal" | "agent" | "workflow";
|
|
39
|
+
apiTokenId?: string;
|
|
40
|
+
apiKeyId?: string;
|
|
32
41
|
scopes?: string[] | null;
|
|
33
42
|
isInternalRequest?: boolean;
|
|
34
43
|
authorizeBookingPii?: (args: {
|
|
35
44
|
db: PostgresJsDatabase;
|
|
36
45
|
userId?: string;
|
|
37
|
-
actor?: "staff" | "customer" | "partner" | "supplier";
|
|
38
|
-
callerType?: "session" | "api_key" | "internal";
|
|
46
|
+
actor?: "staff" | "customer" | "partner" | "supplier" | "agent" | "system";
|
|
47
|
+
callerType?: "session" | "api_key" | "internal" | "agent" | "workflow";
|
|
39
48
|
scopes?: string[] | null;
|
|
40
49
|
isInternalRequest?: boolean;
|
|
41
50
|
bookingId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-shared.d.ts","sourceRoot":"","sources":["../src/routes-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,yBAAyB,EAAE,MAAM,CAAA;IACjC,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,6BAA6B,EAAE,MAAM,CAAA;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,CAAA;IACzB,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;CACpC,CAAC,CAAA;AAEF,MAAM,MAAM,GAAG,GAAG;IAChB,QAAQ,EAAE,WAAW,CAAA;IACrB,SAAS,EAAE;QACT,SAAS,CAAC,EAAE,eAAe,CAAA;QAC3B,EAAE,EAAE,kBAAkB,CAAA;QACtB,QAAQ,CAAC,EAAE,QAAQ,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"routes-shared.d.ts","sourceRoot":"","sources":["../src/routes-shared.ts"],"names":[],"mappings":"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"}
|