Files
web/server/routers/booking/output.ts
Christel Westerberg f4f771ec70 fix: rename BedTypeEnums
2024-11-07 13:53:24 +01:00

86 lines
2.3 KiB
TypeScript

import { z } from "zod"
import { ChildBedTypeEnum } 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 extraBedTypesSchema = z.object({
quantity: z.number(),
bedType: z.nativeEnum(ChildBedTypeEnum),
})
const guestSchema = z.object({
firstName: z.string(),
lastName: z.string(),
email: z.string().nullable(),
phoneNumber: z.string().nullable(),
})
const packagesSchema = z.array(
z.object({
accessibility: z.boolean().optional(),
allergyFriendly: z.boolean().optional(),
breakfast: z.boolean().optional(),
petFriendly: z.boolean().optional(),
})
)
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(z.number()),
extraBedTypes: z.array(extraBedTypesSchema),
computedReservationStatus: z.string(),
confirmationNumber: z.string(),
currencyCode: z.string(),
guest: guestSchema,
hasPayRouting: z.boolean().optional(),
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)