Files
calendar/packages/features/tasker/tasks/triggerNoShow/triggerGuestNoShow.ts
T

106 lines
3.2 KiB
TypeScript

import type { Host } from "@calcom/features/bookings/lib/getHostsAndGuests";
import { prisma } from "@calcom/prisma";
import { WebhookTriggerEvents } from "@calcom/prisma/enums";
import { calculateMaxStartTime, sendWebhookPayload, prepareNoShowTrigger, log } from "./common";
const markGuestAsNoshowInBooking = async ({
bookingId,
hostsThatJoinedTheCall,
guestsThatDidntJoinTheCall,
}: {
bookingId: number;
hostsThatJoinedTheCall: Host[];
guestsThatDidntJoinTheCall?: { email: string; name: string }[];
}) => {
try {
if (guestsThatDidntJoinTheCall && guestsThatDidntJoinTheCall.length > 0) {
const guestEmailsThatDidntJoin = guestsThatDidntJoinTheCall.map((g) => g.email);
await prisma.attendee.updateMany({
where: {
bookingId,
email: { in: guestEmailsThatDidntJoin },
},
data: { noShow: true },
});
} else {
const hostsThatJoinedTheCallEmails = hostsThatJoinedTheCall.map((h) => h.email);
await prisma.attendee.updateMany({
where: {
bookingId,
email: { notIn: hostsThatJoinedTheCallEmails },
},
data: { noShow: true },
});
}
return await prisma.attendee.findMany({ where: { bookingId } });
} catch (err) {
log.error("Error marking guests as no show in booking", err);
return null;
}
};
export async function triggerGuestNoShow(payload: string): Promise<void> {
const result = await prepareNoShowTrigger(payload);
if (!result) return;
const {
webhook,
booking,
hosts,
hostsThatJoinedTheCall,
didGuestJoinTheCall,
guestsThatDidntJoinTheCall,
originalRescheduledBooking,
participants,
} = result;
const hostEmails = new Set(hosts.map((h) => h.email));
const maxStartTime = calculateMaxStartTime(booking.startTime, webhook.time, webhook.timeUnit);
const requireEmailForGuests = booking.eventType?.calVideoSettings?.requireEmailForGuests ?? false;
if (requireEmailForGuests) {
if (guestsThatDidntJoinTheCall.length > 0) {
const updatedAttendees = await markGuestAsNoshowInBooking({
bookingId: booking.id,
hostsThatJoinedTheCall,
guestsThatDidntJoinTheCall,
});
const guests = updatedAttendees?.filter((a) => !hostEmails.has(a.email)) ?? [];
const bookingWithUpdatedData = updatedAttendees
? { ...booking, attendees: updatedAttendees, guests }
: booking;
await sendWebhookPayload(
webhook,
WebhookTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
bookingWithUpdatedData,
maxStartTime,
participants,
originalRescheduledBooking
);
}
} else {
if (!didGuestJoinTheCall) {
const updatedAttendees = await markGuestAsNoshowInBooking({
bookingId: booking.id,
hostsThatJoinedTheCall,
});
const guests = updatedAttendees?.filter((a) => !hostEmails.has(a.email)) ?? [];
const bookingWithUpdatedData = updatedAttendees
? { ...booking, attendees: updatedAttendees, guests }
: booking;
await sendWebhookPayload(
webhook,
WebhookTriggerEvents.AFTER_GUESTS_CAL_VIDEO_NO_SHOW,
bookingWithUpdatedData,
maxStartTime,
participants,
originalRescheduledBooking
);
}
}
}