From 9b95149469f8ead33041ffb38c0e11d33c568d5d Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Wed, 15 Apr 2026 11:57:39 +0530 Subject: [PATCH] Sending itenary based on the start date and end date --- .../itinerary/getAllUserSavedItineraries.ts | 66 +++++++++++++++++++ .../user/services/itinerary.service.ts | 12 ++++ 2 files changed, 78 insertions(+) diff --git a/src/modules/user/handlers/itinerary/getAllUserSavedItineraries.ts b/src/modules/user/handlers/itinerary/getAllUserSavedItineraries.ts index 57cac97..8ff7a8d 100644 --- a/src/modules/user/handlers/itinerary/getAllUserSavedItineraries.ts +++ b/src/modules/user/handlers/itinerary/getAllUserSavedItineraries.ts @@ -7,6 +7,37 @@ import { ItineraryService } from '../../services/itinerary.service'; const itineraryService = new ItineraryService(prismaClient); +const parseQueryDate = (value: string, fieldName: string) => { + const trimmedValue = value.trim(); + const isoMatch = trimmedValue.match(/^(\d{4})-(\d{2})-(\d{2})$/); + + if (isoMatch) { + const [, year, month, day] = isoMatch; + const parsedDate = new Date(Number(year), Number(month) - 1, Number(day)); + + if (!Number.isNaN(parsedDate.getTime())) { + return parsedDate; + } + } + + const slashMatch = trimmedValue.match(/^(\d{4})\/(\d{2})\/(\d{2})$/); + if (slashMatch) { + const [, year, month, day] = slashMatch; + const parsedDate = new Date(Number(year), Number(month) - 1, Number(day)); + + if (!Number.isNaN(parsedDate.getTime())) { + return parsedDate; + } + } + + const parsedDate = new Date(trimmedValue); + if (Number.isNaN(parsedDate.getTime())) { + throw new ApiError(400, `Invalid ${fieldName}`); + } + + return parsedDate; +}; + export const handler = safeHandler(async ( event: APIGatewayProxyEvent, context?: Context, @@ -28,6 +59,8 @@ export const handler = safeHandler(async ( const itineraryHeaderXidRaw = event.queryStringParameters?.itineraryHeaderXid ?? null; + const startDateRaw = event.queryStringParameters?.startDate ?? null; + const endDateRaw = event.queryStringParameters?.endDate ?? null; let itineraryHeaderXid: number | undefined; if ( @@ -42,9 +75,42 @@ export const handler = safeHandler(async ( } } + const hasStartDate = + startDateRaw !== null && + startDateRaw !== undefined && + startDateRaw.trim() !== ''; + const hasEndDate = + endDateRaw !== null && + endDateRaw !== undefined && + endDateRaw.trim() !== ''; + + if (hasStartDate !== hasEndDate) { + throw new ApiError( + 400, + 'startDate and endDate must be provided together', + ); + } + + let startDate: Date | undefined; + let endDate: Date | undefined; + + if (hasStartDate && hasEndDate) { + startDate = parseQueryDate(startDateRaw, 'startDate'); + endDate = parseQueryDate(endDateRaw, 'endDate'); + + if (startDate > endDate) { + throw new ApiError( + 400, + 'startDate must be earlier than or equal to endDate', + ); + } + } + const result = await itineraryService.getAllUserSavedItineraries( userId, itineraryHeaderXid, + startDate, + endDate, ); return { diff --git a/src/modules/user/services/itinerary.service.ts b/src/modules/user/services/itinerary.service.ts index 7d2aacc..55d0aec 100644 --- a/src/modules/user/services/itinerary.service.ts +++ b/src/modules/user/services/itinerary.service.ts @@ -1778,10 +1778,22 @@ export class ItineraryService { async getAllUserSavedItineraries( userXid: number, itineraryHeaderXid?: number, + startDate?: Date, + endDate?: Date, ) { const itineraries = await this.prisma.itineraryHeader.findMany({ where: { ...(itineraryHeaderXid ? { id: itineraryHeaderXid } : {}), + ...(startDate && endDate + ? { + fromDate: { + gte: startDate, + }, + toDate: { + lte: endDate, + }, + } + : {}), isActive: true, deletedAt: null, OR: [