feat: add checkAvailabilityDetails API endpoint and implement schedule details retrieval logic
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
import { getPresignedUrl } from '../../../common/middlewares/aws/getPreSignedUrl';
|
||||
import { ACTIVITY_AM_DISPLAY_STATUS, ACTIVITY_AM_INTERNAL_STATUS, ACTIVITY_DISPLAY_STATUS, ACTIVITY_INTERNAL_STATUS, SCHEDULING_TYPE } from '../../../common/utils/constants/host.constant';
|
||||
import ApiError from '../../../common/utils/helper/ApiError';
|
||||
import { ScheduleActivityDTO } from '../../../common/utils/validation/host/createSchedulingOfAct.validation';
|
||||
import { getPresignedUrl } from '../../../common/middlewares/aws/getPreSignedUrl';
|
||||
import config from '../../../config/config';
|
||||
|
||||
|
||||
@@ -317,6 +317,100 @@ export class SchedulingService {
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return full schedule header + venue + slots for a given activity and date
|
||||
*/
|
||||
async getScheduleDetailsForDate(
|
||||
activityXid: number,
|
||||
selectedDate: string
|
||||
) {
|
||||
const date = new Date(selectedDate);
|
||||
|
||||
if (isNaN(date.getTime())) {
|
||||
throw new ApiError(400, 'Invalid date format');
|
||||
}
|
||||
|
||||
const weekDay = date.toLocaleDateString('en-US', { weekday: 'long' }).toUpperCase();
|
||||
const dayOfMonth = date.getDate();
|
||||
|
||||
const scheduleHeaders = await this.prisma.scheduleHeader.findMany({
|
||||
where: {
|
||||
activityXid,
|
||||
isActive: true,
|
||||
startDate: { lte: date },
|
||||
OR: [
|
||||
{ endDate: null },
|
||||
{ endDate: { gte: date } },
|
||||
],
|
||||
},
|
||||
include: {
|
||||
activityVenue: {
|
||||
select: {
|
||||
id: true,
|
||||
venueName: true,
|
||||
venueLabel: true,
|
||||
venueCapacity: true,
|
||||
},
|
||||
},
|
||||
scheduleRecurrences: {
|
||||
where: { isActive: true },
|
||||
},
|
||||
ScheduleDetails: {
|
||||
where: {
|
||||
isActive: true,
|
||||
OR: [
|
||||
{ occurenceDate: date },
|
||||
{ weekDay: weekDay },
|
||||
{ dayOfMonth: dayOfMonth },
|
||||
],
|
||||
},
|
||||
},
|
||||
Cancellations: {
|
||||
where: {
|
||||
occurenceDate: date,
|
||||
isActive: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
if (!scheduleHeaders.length) return [];
|
||||
|
||||
const response = scheduleHeaders.map((header) => {
|
||||
const cancelledSlotIds = new Set(header.Cancellations.map(c => c.slotXid));
|
||||
|
||||
const slots = header.ScheduleDetails
|
||||
.filter(slot => !cancelledSlotIds.has(slot.id))
|
||||
.map(slot => ({
|
||||
slotId: slot.id,
|
||||
occurenceDate: slot.occurenceDate,
|
||||
weekDay: slot.weekDay,
|
||||
dayOfMonth: slot.dayOfMonth,
|
||||
startTime: slot.startTime,
|
||||
endTime: slot.endTime,
|
||||
maxCapacity: slot.maxCapacity,
|
||||
}));
|
||||
|
||||
return {
|
||||
scheduleHeaderXid: header.id,
|
||||
scheduleType: header.scheduleType,
|
||||
startDate: header.startDate,
|
||||
endDate: header.endDate,
|
||||
earlyCheckInMins: header.earlyCheckInMins,
|
||||
bookingCutOffMins: header.bookingCutOffMins,
|
||||
activityVenue: {
|
||||
venueXid: header.activityVenue.id,
|
||||
venueName: header.activityVenue.venueName,
|
||||
venueLabel: header.activityVenue.venueLabel,
|
||||
venueCapacity: header.activityVenue.venueCapacity,
|
||||
},
|
||||
slots,
|
||||
};
|
||||
});
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
async getVenueFromVenueXid(venueXid: number, activityXid: number) {
|
||||
return await this.prisma.activityVenues.findUnique({
|
||||
where: { id: venueXid, activityXid: activityXid, isActive: true },
|
||||
|
||||
Reference in New Issue
Block a user