@voyantjs/bookings 0.74.2 → 0.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/checkout-capability.d.ts +14 -0
- package/dist/checkout-capability.d.ts.map +1 -1
- package/dist/checkout-capability.js +51 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/routes-public.d.ts +96 -1
- package/dist/routes-public.d.ts.map +1 -1
- package/dist/routes-public.js +97 -4
- package/dist/service-public.d.ts +65 -1
- package/dist/service-public.d.ts.map +1 -1
- package/dist/service-public.js +12 -1
- package/dist/validation-public.d.ts +163 -1
- package/dist/validation-public.d.ts.map +1 -1
- package/dist/validation-public.js +32 -2
- package/package.json +7 -7
|
@@ -2,15 +2,29 @@ import type { Context } from "hono";
|
|
|
2
2
|
export declare const CHECKOUT_CAPABILITY_COOKIE = "voyant_checkout_session";
|
|
3
3
|
export declare const CHECKOUT_CAPABILITY_HEADER = "X-Voyant-Checkout-Capability";
|
|
4
4
|
export declare const CHECKOUT_CAPABILITY_SCOPE = "booking-checkout-session";
|
|
5
|
+
export declare const GUEST_BOOKING_ACCESS_COOKIE = "voyant_guest_booking";
|
|
6
|
+
export declare const GUEST_BOOKING_ACCESS_HEADER = "X-Voyant-Guest-Booking-Access";
|
|
7
|
+
export declare const GUEST_BOOKING_ACCESS_SCOPE = "guest-booking";
|
|
5
8
|
export declare const checkoutCapabilityActions: readonly ["session:read", "session:update", "session:reprice", "session:finalize", "payment:read", "payment:start"];
|
|
6
9
|
export type CheckoutCapabilityAction = (typeof checkoutCapabilityActions)[number];
|
|
10
|
+
export declare const guestBookingAccessActions: readonly ["overview:read", "payment:read", "payment:start"];
|
|
11
|
+
export type GuestBookingAccessAction = (typeof guestBookingAccessActions)[number];
|
|
7
12
|
export declare function resolveCheckoutCapabilitySecret(env: Record<string, string | undefined>): string;
|
|
8
13
|
export declare function resolveCheckoutCapabilityTtlSeconds(env: Record<string, string | undefined>): number;
|
|
14
|
+
export declare function resolveGuestBookingAccessSecret(env: Record<string, string | undefined>): string;
|
|
15
|
+
export declare function resolveGuestBookingAccessTtlSeconds(env: Record<string, string | undefined>): number;
|
|
9
16
|
export declare function issueCheckoutCapability(bookingId: string, env: Record<string, string | undefined>): Promise<{
|
|
10
17
|
token: string;
|
|
11
18
|
payload: import("@voyantjs/hono").PublicCapabilityPayload;
|
|
12
19
|
expiresAt: Date;
|
|
13
20
|
}>;
|
|
21
|
+
export declare function issueGuestBookingAccess(bookingId: string, env: Record<string, string | undefined>): Promise<{
|
|
22
|
+
token: string;
|
|
23
|
+
payload: import("@voyantjs/hono").PublicCapabilityPayload;
|
|
24
|
+
expiresAt: Date;
|
|
25
|
+
}>;
|
|
14
26
|
export declare function requireCheckoutCapability(c: Context, bookingId: string, action: CheckoutCapabilityAction, env: Record<string, string | undefined>): Promise<import("@voyantjs/hono").PublicCapabilityPayload>;
|
|
27
|
+
export declare function requireGuestBookingAccess(c: Context, bookingId: string, action: GuestBookingAccessAction, env: Record<string, string | undefined>): Promise<import("@voyantjs/hono").PublicCapabilityPayload>;
|
|
15
28
|
export declare function checkoutCapabilityCookie(token: string, expiresAt: Date): string;
|
|
29
|
+
export declare function guestBookingAccessCookie(token: string, expiresAt: Date): string;
|
|
16
30
|
//# sourceMappingURL=checkout-capability.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout-capability.d.ts","sourceRoot":"","sources":["../src/checkout-capability.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,eAAO,MAAM,0BAA0B,4BAA4B,CAAA;AACnE,eAAO,MAAM,0BAA0B,iCAAiC,CAAA;AACxE,eAAO,MAAM,yBAAyB,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"checkout-capability.d.ts","sourceRoot":"","sources":["../src/checkout-capability.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,eAAO,MAAM,0BAA0B,4BAA4B,CAAA;AACnE,eAAO,MAAM,0BAA0B,iCAAiC,CAAA;AACxE,eAAO,MAAM,yBAAyB,6BAA6B,CAAA;AACnE,eAAO,MAAM,2BAA2B,yBAAyB,CAAA;AACjE,eAAO,MAAM,2BAA2B,kCAAkC,CAAA;AAC1E,eAAO,MAAM,0BAA0B,kBAAkB,CAAA;AAEzD,eAAO,MAAM,yBAAyB,qHAO5B,CAAA;AAEV,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjF,eAAO,MAAM,yBAAyB,6DAA8D,CAAA;AAEpG,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAA;AAOjF,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,UAQtF;AAED,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,UAQ1F;AAED,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,UAMtF;AAED,wBAAgB,mCAAmC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,UAQ1F;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;;;;GASxC;AAED,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;;;;GASxC;AAED,wBAAsB,yBAAyB,CAC7C,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,wBAAwB,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,6DAiBxC;AAED,wBAAsB,yBAAyB,CAC7C,CAAC,EAAE,OAAO,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,wBAAwB,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,6DAiBxC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,UAOtE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,UAOtE"}
|
|
@@ -2,6 +2,9 @@ import { createPublicCapabilityToken, extractPublicCapabilityToken, serializePub
|
|
|
2
2
|
export const CHECKOUT_CAPABILITY_COOKIE = "voyant_checkout_session";
|
|
3
3
|
export const CHECKOUT_CAPABILITY_HEADER = "X-Voyant-Checkout-Capability";
|
|
4
4
|
export const CHECKOUT_CAPABILITY_SCOPE = "booking-checkout-session";
|
|
5
|
+
export const GUEST_BOOKING_ACCESS_COOKIE = "voyant_guest_booking";
|
|
6
|
+
export const GUEST_BOOKING_ACCESS_HEADER = "X-Voyant-Guest-Booking-Access";
|
|
7
|
+
export const GUEST_BOOKING_ACCESS_SCOPE = "guest-booking";
|
|
5
8
|
export const checkoutCapabilityActions = [
|
|
6
9
|
"session:read",
|
|
7
10
|
"session:update",
|
|
@@ -10,8 +13,11 @@ export const checkoutCapabilityActions = [
|
|
|
10
13
|
"payment:read",
|
|
11
14
|
"payment:start",
|
|
12
15
|
];
|
|
16
|
+
export const guestBookingAccessActions = ["overview:read", "payment:read", "payment:start"];
|
|
13
17
|
const DEFAULT_TTL_SECONDS = 30 * 60;
|
|
14
18
|
const MAX_TTL_SECONDS = 2 * 60 * 60;
|
|
19
|
+
const DEFAULT_GUEST_ACCESS_TTL_SECONDS = 30 * 60;
|
|
20
|
+
const MAX_GUEST_ACCESS_TTL_SECONDS = 2 * 60 * 60;
|
|
15
21
|
export function resolveCheckoutCapabilitySecret(env) {
|
|
16
22
|
return (env.VOYANT_CHECKOUT_CAPABILITY_SECRET ??
|
|
17
23
|
env.CHECKOUT_CAPABILITY_SECRET ??
|
|
@@ -27,6 +33,19 @@ export function resolveCheckoutCapabilityTtlSeconds(env) {
|
|
|
27
33
|
}
|
|
28
34
|
return Math.min(Math.floor(parsed), MAX_TTL_SECONDS);
|
|
29
35
|
}
|
|
36
|
+
export function resolveGuestBookingAccessSecret(env) {
|
|
37
|
+
return (env.VOYANT_GUEST_BOOKING_ACCESS_SECRET ??
|
|
38
|
+
env.GUEST_BOOKING_ACCESS_SECRET ??
|
|
39
|
+
resolveCheckoutCapabilitySecret(env));
|
|
40
|
+
}
|
|
41
|
+
export function resolveGuestBookingAccessTtlSeconds(env) {
|
|
42
|
+
const raw = env.VOYANT_GUEST_BOOKING_ACCESS_TTL_SECONDS ?? env.GUEST_BOOKING_ACCESS_TTL_SECONDS;
|
|
43
|
+
const parsed = raw ? Number(raw) : DEFAULT_GUEST_ACCESS_TTL_SECONDS;
|
|
44
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
45
|
+
return DEFAULT_GUEST_ACCESS_TTL_SECONDS;
|
|
46
|
+
}
|
|
47
|
+
return Math.min(Math.floor(parsed), MAX_GUEST_ACCESS_TTL_SECONDS);
|
|
48
|
+
}
|
|
30
49
|
export async function issueCheckoutCapability(bookingId, env) {
|
|
31
50
|
return createPublicCapabilityToken({
|
|
32
51
|
secret: resolveCheckoutCapabilitySecret(env),
|
|
@@ -36,6 +55,15 @@ export async function issueCheckoutCapability(bookingId, env) {
|
|
|
36
55
|
ttlSeconds: resolveCheckoutCapabilityTtlSeconds(env),
|
|
37
56
|
});
|
|
38
57
|
}
|
|
58
|
+
export async function issueGuestBookingAccess(bookingId, env) {
|
|
59
|
+
return createPublicCapabilityToken({
|
|
60
|
+
secret: resolveGuestBookingAccessSecret(env),
|
|
61
|
+
scope: GUEST_BOOKING_ACCESS_SCOPE,
|
|
62
|
+
subjectId: bookingId,
|
|
63
|
+
actions: [...guestBookingAccessActions],
|
|
64
|
+
ttlSeconds: resolveGuestBookingAccessTtlSeconds(env),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
39
67
|
export async function requireCheckoutCapability(c, bookingId, action, env) {
|
|
40
68
|
const token = extractPublicCapabilityToken(c, {
|
|
41
69
|
headerName: CHECKOUT_CAPABILITY_HEADER,
|
|
@@ -51,6 +79,21 @@ export async function requireCheckoutCapability(c, bookingId, action, env) {
|
|
|
51
79
|
action,
|
|
52
80
|
});
|
|
53
81
|
}
|
|
82
|
+
export async function requireGuestBookingAccess(c, bookingId, action, env) {
|
|
83
|
+
const token = extractPublicCapabilityToken(c, {
|
|
84
|
+
headerName: GUEST_BOOKING_ACCESS_HEADER,
|
|
85
|
+
cookieName: GUEST_BOOKING_ACCESS_COOKIE,
|
|
86
|
+
});
|
|
87
|
+
if (!token) {
|
|
88
|
+
throw new UnauthorizedApiError("Missing guest booking access capability");
|
|
89
|
+
}
|
|
90
|
+
return verifyPublicCapabilityToken(token, {
|
|
91
|
+
secret: resolveGuestBookingAccessSecret(env),
|
|
92
|
+
scope: GUEST_BOOKING_ACCESS_SCOPE,
|
|
93
|
+
subjectId: bookingId,
|
|
94
|
+
action,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
54
97
|
export function checkoutCapabilityCookie(token, expiresAt) {
|
|
55
98
|
return serializePublicCapabilityCookie({
|
|
56
99
|
name: CHECKOUT_CAPABILITY_COOKIE,
|
|
@@ -59,3 +102,11 @@ export function checkoutCapabilityCookie(token, expiresAt) {
|
|
|
59
102
|
path: "/v1/public",
|
|
60
103
|
});
|
|
61
104
|
}
|
|
105
|
+
export function guestBookingAccessCookie(token, expiresAt) {
|
|
106
|
+
return serializePublicCapabilityCookie({
|
|
107
|
+
name: GUEST_BOOKING_ACCESS_COOKIE,
|
|
108
|
+
token,
|
|
109
|
+
expiresAt,
|
|
110
|
+
path: "/v1/public",
|
|
111
|
+
});
|
|
112
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -30,5 +30,5 @@ export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, booki
|
|
|
30
30
|
export type { Booking, BookingActivity, BookingAllocation, BookingDocument, BookingFulfillment, BookingGroup, BookingGroupMember, BookingItem, BookingItemTraveler, BookingNote, BookingPiiAccessLog, BookingPriceOverride, BookingRedemptionEvent, BookingSessionState, BookingStaffAssignment, BookingSupplierStatus, BookingTraveler, NewBooking, NewBookingActivity, NewBookingAllocation, NewBookingDocument, NewBookingFulfillment, NewBookingGroup, NewBookingGroupMember, NewBookingItem, NewBookingItemTraveler, NewBookingNote, NewBookingPiiAccessLog, NewBookingRedemptionEvent, NewBookingSessionState, NewBookingStaffAssignment, NewBookingSupplierStatus, NewBookingTraveler, } from "./schema.js";
|
|
31
31
|
export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
|
|
32
32
|
export { type PublicBookingsServiceResolvers, publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
|
|
33
|
-
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
|
33
|
+
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewAccessQuerySchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicGuestBookingAccessSchema, publicGuestBookingLookupResponseSchema, publicGuestBookingLookupSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
|
34
34
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -44,4 +44,4 @@ export { publicBookingRoutes } from "./routes-public.js";
|
|
|
44
44
|
export { bookingTravelerBedPreferenceSchema, bookingTravelerDietarySchema, bookingTravelerIdentitySchema, bookingTravelerTravelDetailInsertSchema, bookingTravelerTravelDetailSelectSchema, bookingTravelerTravelDetails, bookingTravelerTravelDetailUpdateSchema, decryptedBookingTravelerTravelDetailSchema, travelerAllocationMapSchema, } from "./schema/travel-details.js";
|
|
45
45
|
export { bookingActivityLog, bookingAllocations, bookingDocuments, bookingFulfillments, bookingGroupKindEnum, bookingGroupMemberRoleEnum, bookingGroupMembers, bookingGroups, bookingItems, bookingItemTravelers, bookingNotes, bookingPiiAccessLog, bookingRedemptionEvents, bookingSessionStates, bookingStaffAssignments, bookingSupplierStatuses, bookings, bookingTravelers, } from "./schema.js";
|
|
46
46
|
export { publicBookingsService, resolveSessionPricingSnapshot, } from "./service-public.js";
|
|
47
|
-
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
|
47
|
+
export { addBookingGroupMemberSchema, bookingGroupKindSchema, bookingGroupListQuerySchema, bookingGroupMemberRoleSchema, bookingListQuerySchema, bookingPriceOverrideSchema, cancelBookingSchema, completeBookingSchema, confirmBookingSchema, convertProductSchema, createBookingSchema, createTravelerWithTravelDetailsSchema, expireBookingSchema, expireStaleBookingsSchema, extendBookingHoldSchema, insertBookingAllocationSchema, insertBookingDocumentSchema, insertBookingFulfillmentSchema, insertBookingGroupSchema, insertBookingItemSchema, insertBookingItemTravelerSchema, insertBookingNoteSchema, insertBookingSchema, insertBookingTravelerDocumentSchema, insertSupplierStatusSchema, insertTravelerSchema, internalBookingOverviewLookupQuerySchema, overrideBookingStatusSchema, pricingPreviewSchema, publicBookingOverviewAccessQuerySchema, publicBookingOverviewLookupQuerySchema, publicBookingSessionMutationSchema, publicBookingSessionRepriceItemSchema, publicBookingSessionRepriceResultSchema, publicBookingSessionRepriceSummarySchema, publicBookingSessionStateSchema, publicCreateBookingSessionSchema, publicGuestBookingAccessSchema, publicGuestBookingLookupResponseSchema, publicGuestBookingLookupSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, recordBookingRedemptionSchema, reserveBookingFromTransactionSchema, reserveBookingSchema, sharingGroupsForSlotQuerySchema, startBookingSchema, updateBookingAllocationSchema, updateBookingFulfillmentSchema, updateBookingGroupSchema, updateBookingItemSchema, updateBookingSchema, updateSupplierStatusSchema, updateTravelerSchema, updateTravelerWithTravelDetailsSchema, upsertTravelerTravelDetailsSchema, } from "./validation.js";
|
package/dist/routes-public.d.ts
CHANGED
|
@@ -578,6 +578,101 @@ export declare const publicBookingRoutes: import("hono/hono-base").HonoBase<Env,
|
|
|
578
578
|
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
579
579
|
};
|
|
580
580
|
};
|
|
581
|
-
}
|
|
581
|
+
} & {
|
|
582
|
+
"/guest-lookup": {
|
|
583
|
+
$post: {
|
|
584
|
+
input: {};
|
|
585
|
+
output: {
|
|
586
|
+
error: string;
|
|
587
|
+
};
|
|
588
|
+
outputFormat: "json";
|
|
589
|
+
status: 404;
|
|
590
|
+
} | {
|
|
591
|
+
input: {};
|
|
592
|
+
output: {
|
|
593
|
+
error: string;
|
|
594
|
+
};
|
|
595
|
+
outputFormat: "json";
|
|
596
|
+
status: 429;
|
|
597
|
+
} | {
|
|
598
|
+
input: {};
|
|
599
|
+
output: {
|
|
600
|
+
data: {
|
|
601
|
+
overview: {
|
|
602
|
+
bookingId: string;
|
|
603
|
+
bookingNumber: string;
|
|
604
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
605
|
+
sellCurrency: string;
|
|
606
|
+
sellAmountCents: number | null;
|
|
607
|
+
startDate: string | null;
|
|
608
|
+
endDate: string | null;
|
|
609
|
+
pax: number | null;
|
|
610
|
+
confirmedAt: string | null;
|
|
611
|
+
cancelledAt: string | null;
|
|
612
|
+
completedAt: string | null;
|
|
613
|
+
travelers: {
|
|
614
|
+
id: string;
|
|
615
|
+
participantType: "other" | "traveler" | "occupant";
|
|
616
|
+
firstName: string;
|
|
617
|
+
lastName: string;
|
|
618
|
+
isPrimary: boolean;
|
|
619
|
+
}[];
|
|
620
|
+
items: {
|
|
621
|
+
id: string;
|
|
622
|
+
title: string;
|
|
623
|
+
description: string | null;
|
|
624
|
+
itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
|
|
625
|
+
status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
|
|
626
|
+
serviceDate: string | null;
|
|
627
|
+
startsAt: string | null;
|
|
628
|
+
endsAt: string | null;
|
|
629
|
+
quantity: number;
|
|
630
|
+
sellCurrency: string;
|
|
631
|
+
unitSellAmountCents: number | null;
|
|
632
|
+
totalSellAmountCents: number | null;
|
|
633
|
+
costCurrency: string | null;
|
|
634
|
+
unitCostAmountCents: number | null;
|
|
635
|
+
totalCostAmountCents: number | null;
|
|
636
|
+
notes: string | null;
|
|
637
|
+
productId: string | null;
|
|
638
|
+
optionId: string | null;
|
|
639
|
+
optionUnitId: string | null;
|
|
640
|
+
pricingCategoryId: string | null;
|
|
641
|
+
travelerLinks: {
|
|
642
|
+
id: string;
|
|
643
|
+
travelerId: string;
|
|
644
|
+
role: string;
|
|
645
|
+
isPrimary: boolean;
|
|
646
|
+
}[];
|
|
647
|
+
}[];
|
|
648
|
+
documents: {
|
|
649
|
+
id: string;
|
|
650
|
+
travelerId: string | null;
|
|
651
|
+
type: "visa" | "other" | "insurance" | "health" | "passport_copy";
|
|
652
|
+
fileName: string;
|
|
653
|
+
fileUrl: string;
|
|
654
|
+
}[];
|
|
655
|
+
fulfillments: {
|
|
656
|
+
id: string;
|
|
657
|
+
bookingItemId: string | null;
|
|
658
|
+
travelerId: string | null;
|
|
659
|
+
fulfillmentType: "other" | "voucher" | "ticket" | "pdf" | "qr_code" | "barcode" | "mobile";
|
|
660
|
+
deliveryChannel: "api" | "email" | "other" | "download" | "wallet";
|
|
661
|
+
status: "failed" | "pending" | "issued" | "reissued" | "revoked";
|
|
662
|
+
artifactUrl: string | null;
|
|
663
|
+
}[];
|
|
664
|
+
};
|
|
665
|
+
guestBookingAccess: {
|
|
666
|
+
token: string;
|
|
667
|
+
expiresAt: string;
|
|
668
|
+
actions: ("payment:read" | "payment:start" | "overview:read")[];
|
|
669
|
+
};
|
|
670
|
+
};
|
|
671
|
+
};
|
|
672
|
+
outputFormat: "json";
|
|
673
|
+
status: import("hono/utils/http-status").ContentfulStatusCode;
|
|
674
|
+
};
|
|
675
|
+
};
|
|
676
|
+
}, "/", "/guest-lookup">;
|
|
582
677
|
export type PublicBookingRoutes = typeof publicBookingRoutes;
|
|
583
678
|
//# sourceMappingURL=routes-public.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routes-public.d.ts","sourceRoot":"","sources":["../src/routes-public.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,GAAG,EAA2B,MAAM,oBAAoB,CAAA;AAyKtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;+BA0BsC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAsLxE,CAAA;AAEJ,MAAM,MAAM,mBAAmB,GAAG,OAAO,mBAAmB,CAAA"}
|
package/dist/routes-public.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { idempotencyKey, parseJsonBody, parseQuery, UnauthorizedApiError } from "@voyantjs/hono";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import { checkoutCapabilityActions, checkoutCapabilityCookie, issueCheckoutCapability, requireCheckoutCapability, } from "./checkout-capability.js";
|
|
3
|
+
import { checkoutCapabilityActions, checkoutCapabilityCookie, guestBookingAccessActions, guestBookingAccessCookie, issueCheckoutCapability, issueGuestBookingAccess, requireCheckoutCapability, requireGuestBookingAccess, } from "./checkout-capability.js";
|
|
4
4
|
import { BOOKING_ROUTE_RUNTIME_CONTAINER_KEY, buildBookingRouteRuntime, } from "./route-runtime.js";
|
|
5
5
|
import { getRuntimeEnv, notFound } from "./routes-shared.js";
|
|
6
6
|
import { publicBookingsService } from "./service-public.js";
|
|
7
|
-
import {
|
|
7
|
+
import { publicBookingOverviewAccessQuerySchema, publicBookingSessionMutationSchema, publicCreateBookingSessionSchema, publicGuestBookingLookupSchema, publicRepriceBookingSessionSchema, publicUpdateBookingSessionSchema, publicUpsertBookingSessionStateSchema, } from "./validation-public.js";
|
|
8
8
|
function hasSessionResult(result) {
|
|
9
9
|
return "session" in result;
|
|
10
10
|
}
|
|
@@ -38,6 +38,16 @@ function attachCheckoutCapability(session, issued) {
|
|
|
38
38
|
},
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
+
function attachGuestBookingAccess(overview, issued) {
|
|
42
|
+
return {
|
|
43
|
+
overview,
|
|
44
|
+
guestBookingAccess: {
|
|
45
|
+
token: issued.token,
|
|
46
|
+
expiresAt: issued.expiresAt.toISOString(),
|
|
47
|
+
actions: [...guestBookingAccessActions],
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
41
51
|
async function requireSessionCapability(c, action) {
|
|
42
52
|
const sessionId = c.req.param("sessionId");
|
|
43
53
|
if (!sessionId) {
|
|
@@ -51,6 +61,57 @@ function sessionCapability(action) {
|
|
|
51
61
|
await next();
|
|
52
62
|
};
|
|
53
63
|
}
|
|
64
|
+
function guestBookingLookupLimit(env) {
|
|
65
|
+
const raw = env.VOYANT_GUEST_BOOKING_LOOKUP_LIMIT_PER_MINUTE ?? env.GUEST_BOOKING_LOOKUP_LIMIT_PER_MINUTE;
|
|
66
|
+
const parsed = raw ? Number(raw) : 10;
|
|
67
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
68
|
+
return 10;
|
|
69
|
+
}
|
|
70
|
+
return Math.min(Math.floor(parsed), 100);
|
|
71
|
+
}
|
|
72
|
+
function clientIp(c) {
|
|
73
|
+
return (c.req.header("CF-Connecting-IP") ??
|
|
74
|
+
c.req.header("X-Real-IP") ??
|
|
75
|
+
c.req.header("X-Forwarded-For")?.split(",")[0]?.trim() ??
|
|
76
|
+
"unknown");
|
|
77
|
+
}
|
|
78
|
+
async function enforceGuestBookingLookupRateLimit(c, bookingCode) {
|
|
79
|
+
const kv = c.env?.RATE_LIMIT;
|
|
80
|
+
if (!kv)
|
|
81
|
+
return null;
|
|
82
|
+
const now = new Date();
|
|
83
|
+
const pad = (value) => String(value).padStart(2, "0");
|
|
84
|
+
const windowKey = `${now.getUTCFullYear()}${pad(now.getUTCMonth() + 1)}${pad(now.getUTCDate())}${pad(now.getUTCHours())}${pad(now.getUTCMinutes())}`;
|
|
85
|
+
const key = [
|
|
86
|
+
"lim",
|
|
87
|
+
"guest-booking-lookup",
|
|
88
|
+
clientIp(c),
|
|
89
|
+
bookingCode.trim().toLowerCase(),
|
|
90
|
+
windowKey,
|
|
91
|
+
].join(":");
|
|
92
|
+
const limit = guestBookingLookupLimit(getRuntimeEnv(c));
|
|
93
|
+
const raw = await kv.get(key);
|
|
94
|
+
let current = 0;
|
|
95
|
+
if (raw) {
|
|
96
|
+
try {
|
|
97
|
+
current = Number(JSON.parse(raw).count || 0);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
current = 0;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const nextCount = current + 1;
|
|
104
|
+
await kv.put(key, JSON.stringify({ count: nextCount }), { expirationTtl: 120 });
|
|
105
|
+
const resetIn = 60000 - (now.getUTCSeconds() * 1000 + now.getUTCMilliseconds());
|
|
106
|
+
c.header("X-RateLimit-Limit", String(limit));
|
|
107
|
+
c.header("X-RateLimit-Remaining", String(Math.max(0, limit - nextCount)));
|
|
108
|
+
c.header("X-RateLimit-Reset", String(Date.now() + resetIn));
|
|
109
|
+
if (nextCount <= limit) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
c.header("Retry-After", "60");
|
|
113
|
+
return c.json({ error: "Too Many Requests" }, 429);
|
|
114
|
+
}
|
|
54
115
|
function getRouteRuntime(c) {
|
|
55
116
|
const container = c.var.container;
|
|
56
117
|
try {
|
|
@@ -148,6 +209,38 @@ export const publicBookingRoutes = new Hono()
|
|
|
148
209
|
return c.json({ data: result.session });
|
|
149
210
|
})
|
|
150
211
|
.get("/overview", async (c) => {
|
|
151
|
-
const
|
|
152
|
-
|
|
212
|
+
const query = await parseQuery(c, publicBookingOverviewAccessQuerySchema);
|
|
213
|
+
const overview = query.email
|
|
214
|
+
? await publicBookingsService.getOverview(c.get("db"), {
|
|
215
|
+
bookingId: query.bookingId,
|
|
216
|
+
bookingNumber: query.bookingNumber,
|
|
217
|
+
bookingCode: query.bookingCode,
|
|
218
|
+
email: query.email,
|
|
219
|
+
})
|
|
220
|
+
: await publicBookingsService.getOverviewByGuestAccess(c.get("db"), query);
|
|
221
|
+
if (!overview) {
|
|
222
|
+
if (!query.email) {
|
|
223
|
+
throw new UnauthorizedApiError("Missing guest booking access capability");
|
|
224
|
+
}
|
|
225
|
+
return notFound(c, "Booking overview not found");
|
|
226
|
+
}
|
|
227
|
+
if (!query.email) {
|
|
228
|
+
await requireGuestBookingAccess(c, overview.bookingId, "overview:read", getRuntimeEnv(c));
|
|
229
|
+
}
|
|
230
|
+
return c.json({ data: overview });
|
|
231
|
+
})
|
|
232
|
+
.post("/guest-lookup", async (c) => {
|
|
233
|
+
const input = await parseJsonBody(c, publicGuestBookingLookupSchema);
|
|
234
|
+
const rateLimited = await enforceGuestBookingLookupRateLimit(c, input.bookingCode);
|
|
235
|
+
if (rateLimited)
|
|
236
|
+
return rateLimited;
|
|
237
|
+
const overview = await publicBookingsService.getOverview(c.get("db"), input);
|
|
238
|
+
if (!overview) {
|
|
239
|
+
return notFound(c, "Booking overview not found");
|
|
240
|
+
}
|
|
241
|
+
const capability = await issueGuestBookingAccess(overview.bookingId, getRuntimeEnv(c));
|
|
242
|
+
c.header("Set-Cookie", guestBookingAccessCookie(capability.token, capability.expiresAt), {
|
|
243
|
+
append: true,
|
|
244
|
+
});
|
|
245
|
+
return c.json({ data: attachGuestBookingAccess(overview, capability) });
|
|
153
246
|
});
|
package/dist/service-public.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
2
2
|
import type { ResolveBookingBillingPerson, ResolveBookingTravelerPerson } from "./route-runtime.js";
|
|
3
|
-
import type { InternalBookingOverviewLookupQuery, PublicBookingOverviewLookupQuery, PublicBookingSessionMutationInput, PublicBookingSessionRepriceInput, PublicCreateBookingSessionInput, PublicUpdateBookingSessionInput, PublicUpsertBookingSessionStateInput } from "./validation-public.js";
|
|
3
|
+
import type { InternalBookingOverviewLookupQuery, PublicBookingOverviewAccessQuery, PublicBookingOverviewLookupQuery, PublicBookingSessionMutationInput, PublicBookingSessionRepriceInput, PublicCreateBookingSessionInput, PublicUpdateBookingSessionInput, PublicUpsertBookingSessionStateInput } from "./validation-public.js";
|
|
4
4
|
/**
|
|
5
5
|
* Optional resolver bundle for storefront/public booking flows. When
|
|
6
6
|
* supplied, billing-contact + traveler payloads are run through the
|
|
@@ -761,6 +761,70 @@ export declare const publicBookingsService: {
|
|
|
761
761
|
artifactUrl: string | null;
|
|
762
762
|
}[];
|
|
763
763
|
} | null>;
|
|
764
|
+
getOverviewByGuestAccess(db: PostgresJsDatabase, query: PublicBookingOverviewAccessQuery): Promise<{
|
|
765
|
+
bookingId: string;
|
|
766
|
+
bookingNumber: string;
|
|
767
|
+
status: "expired" | "cancelled" | "completed" | "draft" | "on_hold" | "awaiting_payment" | "confirmed" | "in_progress";
|
|
768
|
+
sellCurrency: string;
|
|
769
|
+
sellAmountCents: number | null;
|
|
770
|
+
startDate: string | null;
|
|
771
|
+
endDate: string | null;
|
|
772
|
+
pax: number | null;
|
|
773
|
+
confirmedAt: string | null;
|
|
774
|
+
cancelledAt: string | null;
|
|
775
|
+
completedAt: string | null;
|
|
776
|
+
travelers: {
|
|
777
|
+
id: string;
|
|
778
|
+
participantType: "other" | "traveler" | "occupant";
|
|
779
|
+
firstName: string;
|
|
780
|
+
lastName: string;
|
|
781
|
+
isPrimary: boolean;
|
|
782
|
+
}[];
|
|
783
|
+
items: {
|
|
784
|
+
id: string;
|
|
785
|
+
title: string;
|
|
786
|
+
description: string | null;
|
|
787
|
+
itemType: "service" | "other" | "unit" | "extra" | "fee" | "tax" | "discount" | "adjustment" | "accommodation" | "transport";
|
|
788
|
+
status: "expired" | "cancelled" | "draft" | "on_hold" | "confirmed" | "fulfilled";
|
|
789
|
+
serviceDate: string | null;
|
|
790
|
+
startsAt: string | null;
|
|
791
|
+
endsAt: string | null;
|
|
792
|
+
quantity: number;
|
|
793
|
+
sellCurrency: string;
|
|
794
|
+
unitSellAmountCents: number | null;
|
|
795
|
+
totalSellAmountCents: number | null;
|
|
796
|
+
costCurrency: string | null;
|
|
797
|
+
unitCostAmountCents: number | null;
|
|
798
|
+
totalCostAmountCents: number | null;
|
|
799
|
+
notes: string | null;
|
|
800
|
+
productId: string | null;
|
|
801
|
+
optionId: string | null;
|
|
802
|
+
optionUnitId: string | null;
|
|
803
|
+
pricingCategoryId: string | null;
|
|
804
|
+
travelerLinks: {
|
|
805
|
+
id: string;
|
|
806
|
+
travelerId: string;
|
|
807
|
+
role: string;
|
|
808
|
+
isPrimary: boolean;
|
|
809
|
+
}[];
|
|
810
|
+
}[];
|
|
811
|
+
documents: {
|
|
812
|
+
id: string;
|
|
813
|
+
travelerId: string | null;
|
|
814
|
+
type: "visa" | "other" | "insurance" | "health" | "passport_copy";
|
|
815
|
+
fileName: string;
|
|
816
|
+
fileUrl: string;
|
|
817
|
+
}[];
|
|
818
|
+
fulfillments: {
|
|
819
|
+
id: string;
|
|
820
|
+
bookingItemId: string | null;
|
|
821
|
+
travelerId: string | null;
|
|
822
|
+
fulfillmentType: "other" | "voucher" | "ticket" | "pdf" | "qr_code" | "barcode" | "mobile";
|
|
823
|
+
deliveryChannel: "api" | "email" | "other" | "download" | "wallet";
|
|
824
|
+
status: "failed" | "pending" | "issued" | "reissued" | "revoked";
|
|
825
|
+
artifactUrl: string | null;
|
|
826
|
+
}[];
|
|
827
|
+
} | null>;
|
|
764
828
|
getOverviewByLookup(db: PostgresJsDatabase, query: InternalBookingOverviewLookupQuery): Promise<{
|
|
765
829
|
bookingId: string;
|
|
766
830
|
bookingNumber: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AASjE,OAAO,KAAK,EAEV,2BAA2B,EAC3B,4BAA4B,EAC7B,MAAM,oBAAoB,CAAA;AAY3B,OAAO,KAAK,EACV,kCAAkC,EAClC,gCAAgC,EAChC,iCAAiC,EACjC,gCAAgC,EAEhC,+BAA+B,EAC/B,+BAA+B,EAC/B,oCAAoC,EACrC,MAAM,wBAAwB,CAAA;AAG/B;;;;;;;GAOG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oBAAoB,CAAC,EAAE,2BAA2B,CAAA;IAClD,qBAAqB,CAAC,EAAE,4BAA4B,CAAA;CACrD;
|
|
1
|
+
{"version":3,"file":"service-public.d.ts","sourceRoot":"","sources":["../src/service-public.ts"],"names":[],"mappings":"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"}
|
package/dist/service-public.js
CHANGED
|
@@ -341,7 +341,7 @@ async function buildOverviewSnapshot(db, query) {
|
|
|
341
341
|
]);
|
|
342
342
|
const email = query.email?.trim().toLowerCase() ?? null;
|
|
343
343
|
if (email) {
|
|
344
|
-
const authorized = participants.some((participant) => participant.email?.toLowerCase()
|
|
344
|
+
const authorized = participants.some((participant) => constantTimeEqualString(participant.email?.trim().toLowerCase() ?? "", email));
|
|
345
345
|
if (!authorized) {
|
|
346
346
|
return null;
|
|
347
347
|
}
|
|
@@ -417,6 +417,14 @@ async function buildOverviewSnapshot(db, query) {
|
|
|
417
417
|
})),
|
|
418
418
|
};
|
|
419
419
|
}
|
|
420
|
+
function constantTimeEqualString(left, right) {
|
|
421
|
+
let result = left.length ^ right.length;
|
|
422
|
+
const length = Math.max(left.length, right.length);
|
|
423
|
+
for (let index = 0; index < length; index += 1) {
|
|
424
|
+
result |= (left.charCodeAt(index) || 0) ^ (right.charCodeAt(index) || 0);
|
|
425
|
+
}
|
|
426
|
+
return result === 0;
|
|
427
|
+
}
|
|
420
428
|
function buildUnitWarnings(unit, quantity, sessionPax) {
|
|
421
429
|
const warnings = [];
|
|
422
430
|
if (!unit) {
|
|
@@ -1113,6 +1121,9 @@ export const publicBookingsService = {
|
|
|
1113
1121
|
async getOverview(db, query) {
|
|
1114
1122
|
return buildOverviewSnapshot(db, query);
|
|
1115
1123
|
},
|
|
1124
|
+
async getOverviewByGuestAccess(db, query) {
|
|
1125
|
+
return buildOverviewSnapshot(db, query);
|
|
1126
|
+
},
|
|
1116
1127
|
async getOverviewByLookup(db, query) {
|
|
1117
1128
|
return buildOverviewSnapshot(db, query);
|
|
1118
1129
|
},
|
|
@@ -199,7 +199,19 @@ export declare const publicRepriceBookingSessionSchema: z.ZodObject<{
|
|
|
199
199
|
}, z.core.$strip>>;
|
|
200
200
|
}, z.core.$strip>;
|
|
201
201
|
export declare const publicBookingOverviewLookupQuerySchema: z.ZodObject<{
|
|
202
|
-
|
|
202
|
+
email: z.ZodString;
|
|
203
|
+
bookingId: z.ZodOptional<z.ZodString>;
|
|
204
|
+
bookingNumber: z.ZodOptional<z.ZodString>;
|
|
205
|
+
bookingCode: z.ZodOptional<z.ZodString>;
|
|
206
|
+
}, z.core.$strip>;
|
|
207
|
+
export declare const publicBookingOverviewAccessQuerySchema: z.ZodObject<{
|
|
208
|
+
email: z.ZodOptional<z.ZodString>;
|
|
209
|
+
bookingId: z.ZodOptional<z.ZodString>;
|
|
210
|
+
bookingNumber: z.ZodOptional<z.ZodString>;
|
|
211
|
+
bookingCode: z.ZodOptional<z.ZodString>;
|
|
212
|
+
}, z.core.$strip>;
|
|
213
|
+
export declare const publicGuestBookingLookupSchema: z.ZodObject<{
|
|
214
|
+
bookingCode: z.ZodString;
|
|
203
215
|
email: z.ZodString;
|
|
204
216
|
}, z.core.$strip>;
|
|
205
217
|
export declare const internalBookingOverviewLookupQuerySchema: z.ZodObject<{
|
|
@@ -338,6 +350,15 @@ export declare const publicCheckoutCapabilitySchema: z.ZodObject<{
|
|
|
338
350
|
"payment:start": "payment:start";
|
|
339
351
|
}>>;
|
|
340
352
|
}, z.core.$strip>;
|
|
353
|
+
export declare const publicGuestBookingAccessSchema: z.ZodObject<{
|
|
354
|
+
token: z.ZodString;
|
|
355
|
+
expiresAt: z.ZodString;
|
|
356
|
+
actions: z.ZodArray<z.ZodEnum<{
|
|
357
|
+
"payment:read": "payment:read";
|
|
358
|
+
"payment:start": "payment:start";
|
|
359
|
+
"overview:read": "overview:read";
|
|
360
|
+
}>>;
|
|
361
|
+
}, z.core.$strip>;
|
|
341
362
|
export declare const publicBookingSessionSchema: z.ZodObject<{
|
|
342
363
|
sessionId: z.ZodString;
|
|
343
364
|
bookingNumber: z.ZodString;
|
|
@@ -890,13 +911,154 @@ export declare const publicBookingOverviewSchema: z.ZodObject<{
|
|
|
890
911
|
artifactUrl: z.ZodNullable<z.ZodString>;
|
|
891
912
|
}, z.core.$strip>>;
|
|
892
913
|
}, z.core.$strip>;
|
|
914
|
+
export declare const publicGuestBookingLookupResponseSchema: z.ZodObject<{
|
|
915
|
+
overview: z.ZodObject<{
|
|
916
|
+
bookingId: z.ZodString;
|
|
917
|
+
bookingNumber: z.ZodString;
|
|
918
|
+
status: z.ZodEnum<{
|
|
919
|
+
expired: "expired";
|
|
920
|
+
cancelled: "cancelled";
|
|
921
|
+
completed: "completed";
|
|
922
|
+
draft: "draft";
|
|
923
|
+
on_hold: "on_hold";
|
|
924
|
+
awaiting_payment: "awaiting_payment";
|
|
925
|
+
confirmed: "confirmed";
|
|
926
|
+
in_progress: "in_progress";
|
|
927
|
+
}>;
|
|
928
|
+
sellCurrency: z.ZodString;
|
|
929
|
+
sellAmountCents: z.ZodNullable<z.ZodNumber>;
|
|
930
|
+
startDate: z.ZodNullable<z.ZodString>;
|
|
931
|
+
endDate: z.ZodNullable<z.ZodString>;
|
|
932
|
+
pax: z.ZodNullable<z.ZodNumber>;
|
|
933
|
+
confirmedAt: z.ZodNullable<z.ZodString>;
|
|
934
|
+
cancelledAt: z.ZodNullable<z.ZodString>;
|
|
935
|
+
completedAt: z.ZodNullable<z.ZodString>;
|
|
936
|
+
travelers: z.ZodArray<z.ZodObject<{
|
|
937
|
+
id: z.ZodString;
|
|
938
|
+
participantType: z.ZodEnum<{
|
|
939
|
+
other: "other";
|
|
940
|
+
traveler: "traveler";
|
|
941
|
+
occupant: "occupant";
|
|
942
|
+
}>;
|
|
943
|
+
firstName: z.ZodString;
|
|
944
|
+
lastName: z.ZodString;
|
|
945
|
+
isPrimary: z.ZodBoolean;
|
|
946
|
+
}, z.core.$strip>>;
|
|
947
|
+
items: z.ZodArray<z.ZodObject<{
|
|
948
|
+
id: z.ZodString;
|
|
949
|
+
title: z.ZodString;
|
|
950
|
+
description: z.ZodNullable<z.ZodString>;
|
|
951
|
+
itemType: z.ZodEnum<{
|
|
952
|
+
service: "service";
|
|
953
|
+
other: "other";
|
|
954
|
+
unit: "unit";
|
|
955
|
+
extra: "extra";
|
|
956
|
+
fee: "fee";
|
|
957
|
+
tax: "tax";
|
|
958
|
+
discount: "discount";
|
|
959
|
+
adjustment: "adjustment";
|
|
960
|
+
accommodation: "accommodation";
|
|
961
|
+
transport: "transport";
|
|
962
|
+
}>;
|
|
963
|
+
status: z.ZodEnum<{
|
|
964
|
+
expired: "expired";
|
|
965
|
+
cancelled: "cancelled";
|
|
966
|
+
draft: "draft";
|
|
967
|
+
on_hold: "on_hold";
|
|
968
|
+
confirmed: "confirmed";
|
|
969
|
+
fulfilled: "fulfilled";
|
|
970
|
+
}>;
|
|
971
|
+
serviceDate: z.ZodNullable<z.ZodString>;
|
|
972
|
+
startsAt: z.ZodNullable<z.ZodString>;
|
|
973
|
+
endsAt: z.ZodNullable<z.ZodString>;
|
|
974
|
+
quantity: z.ZodNumber;
|
|
975
|
+
sellCurrency: z.ZodString;
|
|
976
|
+
unitSellAmountCents: z.ZodNullable<z.ZodNumber>;
|
|
977
|
+
totalSellAmountCents: z.ZodNullable<z.ZodNumber>;
|
|
978
|
+
costCurrency: z.ZodNullable<z.ZodString>;
|
|
979
|
+
unitCostAmountCents: z.ZodNullable<z.ZodNumber>;
|
|
980
|
+
totalCostAmountCents: z.ZodNullable<z.ZodNumber>;
|
|
981
|
+
notes: z.ZodNullable<z.ZodString>;
|
|
982
|
+
productId: z.ZodNullable<z.ZodString>;
|
|
983
|
+
optionId: z.ZodNullable<z.ZodString>;
|
|
984
|
+
optionUnitId: z.ZodNullable<z.ZodString>;
|
|
985
|
+
pricingCategoryId: z.ZodNullable<z.ZodString>;
|
|
986
|
+
travelerLinks: z.ZodArray<z.ZodObject<{
|
|
987
|
+
id: z.ZodString;
|
|
988
|
+
travelerId: z.ZodString;
|
|
989
|
+
role: z.ZodEnum<{
|
|
990
|
+
other: "other";
|
|
991
|
+
traveler: "traveler";
|
|
992
|
+
occupant: "occupant";
|
|
993
|
+
beneficiary: "beneficiary";
|
|
994
|
+
}>;
|
|
995
|
+
isPrimary: z.ZodBoolean;
|
|
996
|
+
}, z.core.$strip>>;
|
|
997
|
+
}, z.core.$strip>>;
|
|
998
|
+
documents: z.ZodArray<z.ZodObject<{
|
|
999
|
+
id: z.ZodString;
|
|
1000
|
+
travelerId: z.ZodNullable<z.ZodString>;
|
|
1001
|
+
type: z.ZodEnum<{
|
|
1002
|
+
visa: "visa";
|
|
1003
|
+
other: "other";
|
|
1004
|
+
insurance: "insurance";
|
|
1005
|
+
health: "health";
|
|
1006
|
+
passport_copy: "passport_copy";
|
|
1007
|
+
}>;
|
|
1008
|
+
fileName: z.ZodString;
|
|
1009
|
+
fileUrl: z.ZodString;
|
|
1010
|
+
}, z.core.$strip>>;
|
|
1011
|
+
fulfillments: z.ZodArray<z.ZodObject<{
|
|
1012
|
+
id: z.ZodString;
|
|
1013
|
+
bookingItemId: z.ZodNullable<z.ZodString>;
|
|
1014
|
+
travelerId: z.ZodNullable<z.ZodString>;
|
|
1015
|
+
fulfillmentType: z.ZodEnum<{
|
|
1016
|
+
other: "other";
|
|
1017
|
+
voucher: "voucher";
|
|
1018
|
+
ticket: "ticket";
|
|
1019
|
+
pdf: "pdf";
|
|
1020
|
+
qr_code: "qr_code";
|
|
1021
|
+
barcode: "barcode";
|
|
1022
|
+
mobile: "mobile";
|
|
1023
|
+
}>;
|
|
1024
|
+
deliveryChannel: z.ZodEnum<{
|
|
1025
|
+
api: "api";
|
|
1026
|
+
email: "email";
|
|
1027
|
+
other: "other";
|
|
1028
|
+
download: "download";
|
|
1029
|
+
wallet: "wallet";
|
|
1030
|
+
}>;
|
|
1031
|
+
status: z.ZodEnum<{
|
|
1032
|
+
failed: "failed";
|
|
1033
|
+
pending: "pending";
|
|
1034
|
+
issued: "issued";
|
|
1035
|
+
reissued: "reissued";
|
|
1036
|
+
revoked: "revoked";
|
|
1037
|
+
}>;
|
|
1038
|
+
artifactUrl: z.ZodNullable<z.ZodString>;
|
|
1039
|
+
}, z.core.$strip>>;
|
|
1040
|
+
}, z.core.$strip>;
|
|
1041
|
+
guestBookingAccess: z.ZodObject<{
|
|
1042
|
+
token: z.ZodString;
|
|
1043
|
+
expiresAt: z.ZodString;
|
|
1044
|
+
actions: z.ZodArray<z.ZodEnum<{
|
|
1045
|
+
"payment:read": "payment:read";
|
|
1046
|
+
"payment:start": "payment:start";
|
|
1047
|
+
"overview:read": "overview:read";
|
|
1048
|
+
}>>;
|
|
1049
|
+
}, z.core.$strip>;
|
|
1050
|
+
}, z.core.$strip>;
|
|
893
1051
|
export type PublicCreateBookingSessionInput = z.infer<typeof publicCreateBookingSessionSchema>;
|
|
894
1052
|
export type PublicUpdateBookingSessionInput = z.infer<typeof publicUpdateBookingSessionSchema>;
|
|
895
1053
|
export type PublicBookingSessionMutationInput = z.infer<typeof publicBookingSessionMutationSchema>;
|
|
896
1054
|
export type PublicCheckoutCapability = z.infer<typeof publicCheckoutCapabilitySchema>;
|
|
1055
|
+
export type PublicGuestBookingAccess = z.infer<typeof publicGuestBookingAccessSchema>;
|
|
897
1056
|
export type PublicBookingSessionState = z.infer<typeof publicBookingSessionStateSchema>;
|
|
898
1057
|
export type PublicUpsertBookingSessionStateInput = z.infer<typeof publicUpsertBookingSessionStateSchema>;
|
|
899
1058
|
export type PublicBookingSessionRepriceInput = z.infer<typeof publicRepriceBookingSessionSchema>;
|
|
900
1059
|
export type PublicBookingOverviewLookupQuery = z.infer<typeof publicBookingOverviewLookupQuerySchema>;
|
|
1060
|
+
export type PublicBookingOverviewAccessQuery = z.infer<typeof publicBookingOverviewAccessQuerySchema>;
|
|
1061
|
+
export type PublicGuestBookingLookupInput = z.infer<typeof publicGuestBookingLookupSchema>;
|
|
1062
|
+
export type PublicGuestBookingLookupResponse = z.infer<typeof publicGuestBookingLookupResponseSchema>;
|
|
901
1063
|
export type InternalBookingOverviewLookupQuery = z.infer<typeof internalBookingOverviewLookupQuerySchema>;
|
|
902
1064
|
//# sourceMappingURL=validation-public.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-public.d.ts","sourceRoot":"","sources":["../src/validation-public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAqBvB,eAAO,MAAM,uCAAuC;;;;;;;;;;;;;;;;;;;;;iBAYlD,CAAA;AAEF,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB/C,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsB3C,CAAA;AAEF,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAa3C,CAAA;AAEF,eAAO,MAAM,kCAAkC;;iBAE7C,CAAA;AAEF,eAAO,MAAM,+BAA+B;;;;;;;;;iBAS1C,CAAA;AAEF,eAAO,MAAM,qCAAqC;;;;;iBAKhD,CAAA;AAEF,eAAO,MAAM,0CAA0C;;;;;;iBAMrD,CAAA;AAEF,eAAO,MAAM,iCAAiC;;;;;;;;;;iBAI5C,CAAA;
|
|
1
|
+
{"version":3,"file":"validation-public.d.ts","sourceRoot":"","sources":["../src/validation-public.ts"],"names":[],"mappings":"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"}
|
|
@@ -106,8 +106,29 @@ export const publicRepriceBookingSessionSchema = z.object({
|
|
|
106
106
|
applyToSession: z.boolean().default(false),
|
|
107
107
|
selections: z.array(publicBookingSessionRepriceSelectionSchema).min(1),
|
|
108
108
|
});
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
const publicBookingOverviewLocatorShape = {
|
|
110
|
+
bookingId: z.string().min(1).max(50).optional(),
|
|
111
|
+
bookingNumber: z.string().min(1).max(50).optional(),
|
|
112
|
+
bookingCode: z.string().min(1).max(50).optional(),
|
|
113
|
+
};
|
|
114
|
+
export const publicBookingOverviewLookupQuerySchema = z
|
|
115
|
+
.object({
|
|
116
|
+
...publicBookingOverviewLocatorShape,
|
|
117
|
+
email: z.string().email(),
|
|
118
|
+
})
|
|
119
|
+
.refine((value) => Boolean(value.bookingId || value.bookingNumber || value.bookingCode), {
|
|
120
|
+
message: "Provide a bookingId, bookingNumber, or bookingCode",
|
|
121
|
+
});
|
|
122
|
+
export const publicBookingOverviewAccessQuerySchema = z
|
|
123
|
+
.object({
|
|
124
|
+
...publicBookingOverviewLocatorShape,
|
|
125
|
+
email: z.string().email().optional(),
|
|
126
|
+
})
|
|
127
|
+
.refine((value) => Boolean(value.bookingId || value.bookingNumber || value.bookingCode), {
|
|
128
|
+
message: "Provide a bookingId, bookingNumber, or bookingCode",
|
|
129
|
+
});
|
|
130
|
+
export const publicGuestBookingLookupSchema = z.object({
|
|
131
|
+
bookingCode: z.string().min(1).max(50),
|
|
111
132
|
email: z.string().email(),
|
|
112
133
|
});
|
|
113
134
|
export const internalBookingOverviewLookupQuerySchema = z
|
|
@@ -196,6 +217,11 @@ export const publicCheckoutCapabilitySchema = z.object({
|
|
|
196
217
|
"payment:start",
|
|
197
218
|
])),
|
|
198
219
|
});
|
|
220
|
+
export const publicGuestBookingAccessSchema = z.object({
|
|
221
|
+
token: z.string().min(1),
|
|
222
|
+
expiresAt: z.string(),
|
|
223
|
+
actions: z.array(z.enum(["overview:read", "payment:read", "payment:start"])),
|
|
224
|
+
});
|
|
199
225
|
export const publicBookingSessionSchema = z.object({
|
|
200
226
|
sessionId: z.string(),
|
|
201
227
|
bookingNumber: z.string(),
|
|
@@ -287,3 +313,7 @@ export const publicBookingOverviewSchema = z.object({
|
|
|
287
313
|
documents: z.array(publicBookingOverviewDocumentSchema),
|
|
288
314
|
fulfillments: z.array(publicBookingOverviewFulfillmentSchema),
|
|
289
315
|
});
|
|
316
|
+
export const publicGuestBookingLookupResponseSchema = z.object({
|
|
317
|
+
overview: publicBookingOverviewSchema,
|
|
318
|
+
guestBookingAccess: publicGuestBookingAccessSchema,
|
|
319
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/bookings",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.75.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -79,15 +79,15 @@
|
|
|
79
79
|
"drizzle-orm": "^0.45.2",
|
|
80
80
|
"hono": "^4.12.10",
|
|
81
81
|
"zod": "^4.3.6",
|
|
82
|
-
"@voyantjs/action-ledger": "0.
|
|
83
|
-
"@voyantjs/core": "0.
|
|
84
|
-
"@voyantjs/db": "0.
|
|
85
|
-
"@voyantjs/hono": "0.
|
|
86
|
-
"@voyantjs/utils": "0.
|
|
82
|
+
"@voyantjs/action-ledger": "0.75.0",
|
|
83
|
+
"@voyantjs/core": "0.75.0",
|
|
84
|
+
"@voyantjs/db": "0.75.0",
|
|
85
|
+
"@voyantjs/hono": "0.75.0",
|
|
86
|
+
"@voyantjs/utils": "0.75.0"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
89
|
"typescript": "^6.0.2",
|
|
90
|
-
"@voyantjs/products": "0.
|
|
90
|
+
"@voyantjs/products": "0.75.0",
|
|
91
91
|
"@voyantjs/voyant-typescript-config": "0.1.0"
|
|
92
92
|
},
|
|
93
93
|
"files": [
|