Sending itenary based on the start date and end date
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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: [
|
||||
|
||||
Reference in New Issue
Block a user