/* eslint-disable no-case-declarations */ import { logger } from '../../utils/logger' import * as ZoomUtils from '../../utils/zoom' import { prismaClient as prisma } from '../../prismaClient' async function getMeetingParticipant({ accessToken, webinarId, registrantId, meetingId, }: { accessToken: string webinarId: string registrantId: string meetingId: string }) { const registrant = await ZoomUtils.getRegistrant({ accessToken, webinarId, registrantId, }) const participantEmail = registrant.email if (!participantEmail) { throw new Error("Registrant doesn't have email") // throw new Error(`Registrant doesn't have access code`) } const meetingParticipants = await prisma.meeting .findOne({ where: { id: meetingId }, select: { participants: { select: { id: true, zoomRegistrantId: true, isInTheMeeting: true, }, }, }, }) .participants() const meetingParticipantsForRegistrants = meetingParticipants.filter( (meetingParticipant) => meetingParticipant.zoomRegistrantId === registrant.id // meetingParticipant.owners.some(({ email }) => email === participantEmail) || // meetingParticipant.isRepresentedByEmail === registrant.email ) if (meetingParticipantsForRegistrants.length === 0) { throw new Error(`Can't find meeting participant for registrant: ${JSON.stringify(registrant)}`) } return meetingParticipantsForRegistrants } export default async function handleZoomWebhook({ data }) { try { const { event, payload } = data const meeting = ( await prisma.meeting.findMany({ where: { zoomWebinarId: String(payload.object.id), }, }) )[0] if (!meeting) { throw new Error(`Couldnt find meeting with id: ${payload.object.id}`) } const managingCompanyOfMeeting = await prisma.meeting .findOne({ where: { id: meeting.id } }) .project() .managingCompany() if (event === 'webinar.started') { await prisma.meeting.update({ where: { id: meeting.id, }, data: { status: 'IN_PROGRESS', startedAt: new Date(), }, }) } if (event === 'webinar.ended') { await prisma.meeting.update({ where: { id: meeting.id, }, data: { status: 'ENDED', endedAt: new Date(), }, }) } if (event === 'webinar.participant_joined' || event === 'webinar.participant_left') { const { host_id: hostId } = payload.object if (hostId !== payload.object.participant.id) { const meetingParticipants = await getMeetingParticipant({ accessToken: managingCompanyOfMeeting.zoomAccessToken, webinarId: payload.object.id, registrantId: payload.object.participant.id, meetingId: meeting.id, }) for await (const meetingParticipant of meetingParticipants) { console.log('meetingParticipant', meetingParticipant) if (event === 'webinar.participant_left') { if (meetingParticipant.isInTheMeeting) { await prisma.meetingParticipant.update({ where: { id: meetingParticipant.id }, data: { isInTheMeeting: false, status: 'LEFT_MEETING', activities: { create: [ { text: 'Left the meeting', }, ], }, leftTheMeetingAt: new Date(), }, }) } } else { if (!meetingParticipant.isInTheMeeting) { await prisma.meetingParticipant.update({ where: { id: meetingParticipant.id }, data: { isInTheMeeting: true, status: 'IN_THE_MEETING', activities: { create: [ { text: 'Joined the meeting', }, ], }, ...(!meetingParticipant.joinedTheMeetingAt && { joinedTheMeetingAt: new Date(), }), }, }) } } } } } } catch (error) { logger.error(error) } }