Files
web/server/routers/hotels/schemas/room.ts
Bianca Widstam a620be9331 Merged in fix/SW-1145-occupancy-room-api-change (pull request #1148)
Fix/SW-1145 occupancy room api change

* fix(SW-1145): change occupancy to min and max

* fix(SW-1145): small edit

* fix(SW-1145): refactor to transform total room occupancy

* fix(SW-1145): remove space

* fix(SW-1145): small fix

* fix(SW-1145): change to max for readability


Approved-by: Erik Tiekstra
Approved-by: Linus Flood
2025-01-08 14:22:01 +00:00

123 lines
3.1 KiB
TypeScript

import { z } from "zod"
import { BedTypeEnum, ExtraBedTypeEnum } from "@/constants/booking"
import { imageSchema } from "./image"
const roomContentSchema = z.object({
images: z.array(imageSchema),
texts: z.object({
descriptions: z.object({
short: z.string().optional(),
medium: z.string().optional(),
}),
}),
})
const roomTypesSchema = z.object({
name: z.string(),
description: z.string(),
code: z.string(),
roomCount: z.number(),
mainBed: z
.object({
type: z.string(),
description: z.string(),
widthRange: z.object({
min: z.number(),
max: z.number(),
}),
})
.transform((data) => ({
type:
data.type in BedTypeEnum
? (data.type as BedTypeEnum)
: BedTypeEnum.Other,
description: data.description,
widthRange: data.widthRange,
})),
fixedExtraBed: z
.object({
type: z.string(),
description: z.string().optional(),
widthRange: z.object({
min: z.number(),
max: z.number(),
}),
})
.transform((data) => {
return data.type in ExtraBedTypeEnum
? {
type: data.type as ExtraBedTypeEnum,
description: data.description,
}
: undefined
}),
roomSize: z.object({
min: z.number(),
max: z.number(),
}),
occupancy: z.object({
total: z.number(),
adults: z.number(),
children: z.number(),
}),
isLackingCribs: z.boolean(),
isLackingExtraBeds: z.boolean(),
})
const roomFacilitiesSchema = z.object({
availableInAllRooms: z.boolean(),
name: z.string(),
isUniqueSellingPoint: z.boolean(),
sortOrder: z.number(),
icon: z.string().optional(),
})
export const roomSchema = z
.object({
attributes: z.object({
name: z.string(),
sortOrder: z.number(),
content: roomContentSchema,
roomTypes: z.array(roomTypesSchema),
roomFacilities: z.array(roomFacilitiesSchema),
occupancy: z.object({
min: z.number(),
max: z.number(),
}),
roomSize: z.object({
min: z.number(),
max: z.number(),
}),
}),
id: z.string(),
type: z.literal("roomcategories"),
})
.transform((data) => {
return {
descriptions: data.attributes.content.texts.descriptions,
id: data.id,
images: data.attributes.content.images,
name: data.attributes.name,
occupancy: data.attributes.occupancy,
totalOccupancy:
data.attributes.occupancy.min === data.attributes.occupancy.max
? {
max: data.attributes.occupancy.max,
range: `${data.attributes.occupancy.max}`,
}
: {
max: data.attributes.occupancy.max,
range: `${data.attributes.occupancy.min}-${data.attributes.occupancy.max}`,
},
roomSize: data.attributes.roomSize,
roomTypes: data.attributes.roomTypes,
sortOrder: data.attributes.sortOrder,
type: data.type,
roomFacilities: data.attributes.roomFacilities,
}
})
export type RoomType = Pick<z.output<typeof roomSchema>, "roomTypes" | "name">