From 5272af2ab15854b6062ef905c90650bf2dcea9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20J=C3=A4derberg?= Date: Wed, 21 May 2025 04:47:05 +0000 Subject: [PATCH] Merged in fix/SW-2839-prevent-fetching-hotel-availability-with-invalid-input (pull request #2166) Prevent calling availability for cities if input model is invalid * fix: make sure that input data is valid Approved-by: Linus Flood --- .../server/routers/hotels/input.ts | 114 +++++++++++++++--- 1 file changed, 97 insertions(+), 17 deletions(-) diff --git a/apps/scandic-web/server/routers/hotels/input.ts b/apps/scandic-web/server/routers/hotels/input.ts index b58d730f6..f55901f62 100644 --- a/apps/scandic-web/server/routers/hotels/input.ts +++ b/apps/scandic-web/server/routers/hotels/input.ts @@ -8,24 +8,104 @@ import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectR import { BreakfastPackageEnum } from "@/types/enums/breakfast" import { Country } from "@/types/enums/country" -export const hotelsAvailabilityInputSchema = z.object({ - cityId: z.string(), - roomStayStartDate: z.string(), - roomStayEndDate: z.string(), - adults: z.number(), - children: z.string().optional(), - bookingCode: z.string().optional().default(""), - redemption: z.boolean().optional().default(false), -}) +export const hotelsAvailabilityInputSchema = z + .object({ + cityId: z.string(), + roomStayStartDate: z.string().refine( + (val) => { + const fromDate = dayjs(val) -export const getHotelsByHotelIdsAvailabilityInputSchema = z.object({ - hotelIds: z.array(z.number()), - roomStayStartDate: z.string(), - roomStayEndDate: z.string(), - adults: z.number(), - children: z.string().optional(), - bookingCode: z.string().optional().default(""), -}) + return fromDate.isValid() + }, + { + message: "FROMDATE_INVALID", + } + ), + roomStayEndDate: z.string().refine( + (val) => { + const fromDate = dayjs(val) + return fromDate.isValid() + }, + { + message: "TODATE_INVALID", + } + ), + adults: z.number(), + children: z.string().optional(), + bookingCode: z.string().optional().default(""), + redemption: z.boolean().optional().default(false), + }) + .refine( + (data) => { + const fromDate = dayjs(data.roomStayStartDate).startOf("day") + const toDate = dayjs(data.roomStayEndDate).startOf("day") + + return fromDate.isBefore(toDate) + }, + { + message: "FROMDATE_BEFORE_TODATE", + } + ) + .refine( + (data) => { + const fromDate = dayjs(data.roomStayStartDate) + const today = dayjs().startOf("day") + + return fromDate.isSameOrAfter(today) + }, + { + message: "FROMDATE_CANNOT_BE_IN_THE_PAST", + } + ) + +export const getHotelsByHotelIdsAvailabilityInputSchema = z + .object({ + hotelIds: z.array(z.number()), + roomStayStartDate: z.string().refine( + (val) => { + const fromDate = dayjs(val) + return fromDate.isValid() + }, + { + message: "FROMDATE_INVALID", + } + ), + roomStayEndDate: z.string().refine( + (val) => { + const toDate = dayjs(val) + + return toDate.isValid() + }, + { + message: "TODATE_INVALID", + } + ), + adults: z.number(), + children: z.string().optional(), + bookingCode: z.string().optional().default(""), + }) + .refine( + (data) => { + const fromDate = dayjs(data.roomStayStartDate).startOf("day") + const toDate = dayjs(data.roomStayEndDate).startOf("day") + + return fromDate.isBefore(toDate) + }, + { + message: "FROMDATE_BEFORE_TODATE", + } + ) + .refine( + (data) => { + const fromDate = dayjs(data.roomStayStartDate) + const today = dayjs().startOf("day") + + return fromDate.isSameOrAfter(today) + }, + { + message: "FROMDATE_CANNOT_BE_IN_THE_PAST", + } + ) const childrenInRoomSchema = z .array(