81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { BedTypeEnum } from "@/constants/booking"
|
|
|
|
// MUTATION
|
|
export const createBookingSchema = z
|
|
.object({
|
|
data: z.object({
|
|
attributes: z.object({
|
|
confirmationNumber: z.string(),
|
|
cancellationNumber: z.string().nullable(),
|
|
reservationStatus: z.string(),
|
|
paymentUrl: z.string().nullable(),
|
|
metadata: z.any(), // TODO: define metadata schema (not sure what it does)
|
|
}),
|
|
type: z.string(),
|
|
id: z.string(),
|
|
links: z.object({
|
|
self: z.object({
|
|
href: z.string().url(),
|
|
meta: z.object({
|
|
method: z.string(),
|
|
}),
|
|
}),
|
|
}),
|
|
}),
|
|
})
|
|
.transform((d) => ({
|
|
id: d.data.id,
|
|
links: d.data.links,
|
|
type: d.data.type,
|
|
confirmationNumber: d.data.attributes.confirmationNumber,
|
|
cancellationNumber: d.data.attributes.cancellationNumber,
|
|
reservationStatus: d.data.attributes.reservationStatus,
|
|
paymentUrl: d.data.attributes.paymentUrl,
|
|
}))
|
|
|
|
// QUERY
|
|
const childrenAgesSchema = z.object({
|
|
age: z.number(),
|
|
bedType: z.nativeEnum(BedTypeEnum),
|
|
})
|
|
|
|
const guestSchema = z.object({
|
|
firstName: z.string(),
|
|
lastName: z.string(),
|
|
})
|
|
|
|
const packagesSchema = z.object({
|
|
accessibility: z.boolean(),
|
|
allergyFriendly: z.boolean(),
|
|
breakfast: z.boolean(),
|
|
petFriendly: z.boolean(),
|
|
})
|
|
|
|
export const bookingConfirmationSchema = z
|
|
.object({
|
|
data: z.object({
|
|
attributes: z.object({
|
|
adults: z.number(),
|
|
checkInDate: z.date({ coerce: true }),
|
|
checkOutDate: z.date({ coerce: true }),
|
|
createDateTime: z.date({ coerce: true }),
|
|
childrenAges: z.array(childrenAgesSchema),
|
|
computedReservationStatus: z.string(),
|
|
confirmationNumber: z.string(),
|
|
currencyCode: z.string(),
|
|
guest: guestSchema,
|
|
hasPayRouting: z.boolean(),
|
|
hotelId: z.string(),
|
|
packages: packagesSchema,
|
|
rateCode: z.string(),
|
|
reservationStatus: z.string(),
|
|
totalPrice: z.number(),
|
|
}),
|
|
id: z.string(),
|
|
type: z.literal("booking"),
|
|
}),
|
|
})
|
|
.transform(({ data }) => data.attributes)
|