94 lines
2.1 KiB
TypeScript
94 lines
2.1 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { imageMetaDataSchema, imageSizesSchema } from "./image"
|
|
|
|
const roomContentSchema = z.object({
|
|
images: z.array(
|
|
z.object({
|
|
metaData: imageMetaDataSchema,
|
|
imageSizes: imageSizesSchema,
|
|
})
|
|
),
|
|
texts: z.object({
|
|
descriptions: z.object({
|
|
short: z.string(),
|
|
medium: z.string(),
|
|
}),
|
|
}),
|
|
})
|
|
|
|
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(),
|
|
}),
|
|
}),
|
|
fixedExtraBed: z.object({
|
|
type: z.string(),
|
|
description: z.string().optional(),
|
|
widthRange: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
}),
|
|
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(),
|
|
})
|
|
|
|
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({
|
|
total: z.number(),
|
|
adults: z.number(),
|
|
children: z.number(),
|
|
}),
|
|
roomSize: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
}),
|
|
id: z.string(),
|
|
type: z.enum(["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,
|
|
roomSize: data.attributes.roomSize,
|
|
sortOrder: data.attributes.sortOrder,
|
|
type: data.type,
|
|
}
|
|
})
|