feat(BOOK-750): refactor booking endpoints * WIP * wip * wip * parse dates in UTC * wip * no more errors * Merge branch 'master' of bitbucket.org:scandic-swap/web into chore/refactor-trpc-booking-routes * . * cleanup * import named z from zod * fix(BOOK-750): updateBooking api endpoint expects dateOnly, we passed ISO date Approved-by: Anton Gunnarsson
85 lines
2.4 KiB
TypeScript
85 lines
2.4 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import {
|
|
nullableStringEmailValidator,
|
|
nullableStringValidator,
|
|
} from "@scandic-hotels/common/utils/zod/stringValidator"
|
|
|
|
import { calculateRefId } from "../../utils/refId"
|
|
|
|
const guestSchema = z.object({
|
|
email: nullableStringEmailValidator,
|
|
firstName: nullableStringValidator,
|
|
lastName: nullableStringValidator,
|
|
membershipNumber: nullableStringValidator,
|
|
phoneNumber: nullableStringValidator,
|
|
countryCode: nullableStringValidator,
|
|
})
|
|
|
|
export const slimBookingSchema = z
|
|
.object({
|
|
data: z.object({
|
|
attributes: z.object({
|
|
reservationStatus: z.string(),
|
|
guest: guestSchema.optional(),
|
|
paymentUrl: z.string().nullable().optional(),
|
|
paymentMethod: z.string().nullable().optional(),
|
|
rooms: z
|
|
.array(
|
|
z.object({
|
|
confirmationNumber: z.string(),
|
|
cancellationNumber: z.string().nullable(),
|
|
priceChangedMetadata: z
|
|
.object({
|
|
roomPrice: z.number(),
|
|
totalPrice: z.number(),
|
|
})
|
|
.nullable()
|
|
.optional(),
|
|
})
|
|
)
|
|
.default([]),
|
|
errors: z
|
|
.array(
|
|
z.object({
|
|
confirmationNumber: z.string().nullable().optional(),
|
|
errorCode: z.string(),
|
|
description: z.string().nullable().optional(),
|
|
meta: z
|
|
.record(z.string(), z.union([z.string(), z.number()]))
|
|
.nullable()
|
|
.optional(),
|
|
})
|
|
)
|
|
.default([]),
|
|
}),
|
|
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,
|
|
reservationStatus: d.data.attributes.reservationStatus,
|
|
paymentUrl: d.data.attributes.paymentUrl,
|
|
paymentMethod: d.data.attributes.paymentMethod,
|
|
rooms: d.data.attributes.rooms.map((room) => {
|
|
const lastName = d.data.attributes.guest?.lastName ?? ""
|
|
return {
|
|
...room,
|
|
refId: calculateRefId(room.confirmationNumber, lastName),
|
|
}
|
|
}),
|
|
errors: d.data.attributes.errors,
|
|
guest: d.data.attributes.guest,
|
|
}))
|