feat: meeting started webhook (#12764)

Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com>
This commit is contained in:
Somay Chauhan 2023-12-19 20:22:35 +05:30 committed by GitHub
parent 038008502c
commit 2e0c9c7068
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 58 additions and 11 deletions

View File

@ -2168,5 +2168,6 @@
"need_help": "Need help?", "need_help": "Need help?",
"troubleshooter": "Troubleshooter", "troubleshooter": "Troubleshooter",
"please_install_a_calendar": "Please install a calendar", "please_install_a_calendar": "Please install a calendar",
"meeting_started": "Meeting Started",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
} }

View File

@ -300,6 +300,12 @@ export async function handleConfirmation(args: {
triggerEvent: WebhookTriggerEvents.BOOKING_CREATED, triggerEvent: WebhookTriggerEvents.BOOKING_CREATED,
teamId, teamId,
}); });
const subscribersMeetingStarted = await getWebhooks({
userId: triggerForUser ? booking.userId : null,
eventTypeId: booking.eventTypeId,
triggerEvent: WebhookTriggerEvents.MEETING_STARTED,
teamId: booking.eventType?.teamId,
});
const subscribersMeetingEnded = await getWebhooks({ const subscribersMeetingEnded = await getWebhooks({
userId: triggerForUser ? booking.userId : null, userId: triggerForUser ? booking.userId : null,
eventTypeId: booking.eventTypeId, eventTypeId: booking.eventTypeId,
@ -307,9 +313,14 @@ export async function handleConfirmation(args: {
teamId: booking.eventType?.teamId, teamId: booking.eventType?.teamId,
}); });
subscribersMeetingStarted.forEach((subscriber) => {
updatedBookings.forEach((booking) => {
scheduleTrigger(booking, subscriber.subscriberUrl, subscriber, WebhookTriggerEvents.MEETING_STARTED);
});
});
subscribersMeetingEnded.forEach((subscriber) => { subscribersMeetingEnded.forEach((subscriber) => {
updatedBookings.forEach((booking) => { updatedBookings.forEach((booking) => {
scheduleTrigger(booking, subscriber.subscriberUrl, subscriber); scheduleTrigger(booking, subscriber.subscriberUrl, subscriber, WebhookTriggerEvents.MEETING_ENDED);
}); });
}); });

View File

@ -1416,6 +1416,12 @@ async function handler(
teamId, teamId,
}; };
const subscriberOptionsMeetingStarted = {
userId: triggerForUser ? organizerUser.id : null,
eventTypeId,
triggerEvent: WebhookTriggerEvents.MEETING_STARTED,
teamId,
};
const handleSeats = async () => { const handleSeats = async () => {
let resultBooking: let resultBooking:
| (Partial<Booking> & { | (Partial<Booking> & {
@ -2693,13 +2699,28 @@ async function handler(
if (isConfirmedByDefault) { if (isConfirmedByDefault) {
try { try {
const subscribersMeetingEnded = await getWebhooks(subscriberOptionsMeetingEnded); const subscribersMeetingEnded = await getWebhooks(subscriberOptionsMeetingEnded);
const subscribersMeetingStarted = await getWebhooks(subscriberOptionsMeetingStarted);
subscribersMeetingEnded.forEach((subscriber) => { subscribersMeetingEnded.forEach((subscriber) => {
if (rescheduleUid && originalRescheduledBooking) { if (rescheduleUid && originalRescheduledBooking) {
cancelScheduledJobs(originalRescheduledBooking, undefined, true); cancelScheduledJobs(originalRescheduledBooking, undefined, true);
} }
if (booking && booking.status === BookingStatus.ACCEPTED) { if (booking && booking.status === BookingStatus.ACCEPTED) {
scheduleTrigger(booking, subscriber.subscriberUrl, subscriber); scheduleTrigger(booking, subscriber.subscriberUrl, subscriber, WebhookTriggerEvents.MEETING_ENDED);
}
});
subscribersMeetingStarted.forEach((subscriber) => {
if (rescheduleUid && originalRescheduledBooking) {
cancelScheduledJobs(originalRescheduledBooking, undefined, true);
}
if (booking && booking.status === BookingStatus.ACCEPTED) {
scheduleTrigger(
booking,
subscriber.subscriberUrl,
subscriber,
WebhookTriggerEvents.MEETING_STARTED
);
} }
}); });
} catch (error) { } catch (error) {

View File

@ -39,6 +39,7 @@ const WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP_V2: Record<string, WebhookTriggerEve
{ value: WebhookTriggerEvents.BOOKING_RESCHEDULED, label: "booking_rescheduled" }, { value: WebhookTriggerEvents.BOOKING_RESCHEDULED, label: "booking_rescheduled" },
{ value: WebhookTriggerEvents.BOOKING_PAID, label: "booking_paid" }, { value: WebhookTriggerEvents.BOOKING_PAID, label: "booking_paid" },
{ value: WebhookTriggerEvents.MEETING_ENDED, label: "meeting_ended" }, { value: WebhookTriggerEvents.MEETING_ENDED, label: "meeting_ended" },
{ value: WebhookTriggerEvents.MEETING_STARTED, label: "meeting_started" },
{ value: WebhookTriggerEvents.RECORDING_READY, label: "recording_ready" }, { value: WebhookTriggerEvents.RECORDING_READY, label: "recording_ready" },
], ],
"routing-forms": [{ value: WebhookTriggerEvents.FORM_SUBMITTED, label: "form_submitted" }], "routing-forms": [{ value: WebhookTriggerEvents.FORM_SUBMITTED, label: "form_submitted" }],

View File

@ -10,6 +10,7 @@ export const WEBHOOK_TRIGGER_EVENTS_GROUPED_BY_APP = {
WebhookTriggerEvents.BOOKING_PAID, WebhookTriggerEvents.BOOKING_PAID,
WebhookTriggerEvents.BOOKING_PAYMENT_INITIATED, WebhookTriggerEvents.BOOKING_PAYMENT_INITIATED,
WebhookTriggerEvents.MEETING_ENDED, WebhookTriggerEvents.MEETING_ENDED,
WebhookTriggerEvents.MEETING_STARTED,
WebhookTriggerEvents.BOOKING_REQUESTED, WebhookTriggerEvents.BOOKING_REQUESTED,
WebhookTriggerEvents.BOOKING_REJECTED, WebhookTriggerEvents.BOOKING_REJECTED,
WebhookTriggerEvents.RECORDING_READY, WebhookTriggerEvents.RECORDING_READY,

View File

@ -45,7 +45,10 @@ export async function addSubscription({
}, },
}); });
if (triggerEvent === WebhookTriggerEvents.MEETING_ENDED) { if (
triggerEvent === WebhookTriggerEvents.MEETING_ENDED ||
triggerEvent === WebhookTriggerEvents.MEETING_STARTED
) {
//schedule job for already existing bookings //schedule job for already existing bookings
const where: Prisma.BookingWhereInput = {}; const where: Prisma.BookingWhereInput = {};
if (teamId) { if (teamId) {
@ -64,10 +67,15 @@ export async function addSubscription({
}); });
for (const booking of bookings) { for (const booking of bookings) {
scheduleTrigger(booking, createSubscription.subscriberUrl, { scheduleTrigger(
id: createSubscription.id, booking,
appId: createSubscription.appId, createSubscription.subscriberUrl,
}); {
id: createSubscription.id,
appId: createSubscription.appId,
},
triggerEvent
);
} }
} }
@ -273,12 +281,13 @@ export async function listBookings(
} }
export async function scheduleTrigger( export async function scheduleTrigger(
booking: { id: number; endTime: Date; scheduledJobs: string[] }, booking: { id: number; endTime: Date; startTime: Date; scheduledJobs: string[] },
subscriberUrl: string, subscriberUrl: string,
subscriber: { id: string; appId: string | null } subscriber: { id: string; appId: string | null },
triggerEvent: WebhookTriggerEvents
) { ) {
try { try {
const payload = JSON.stringify({ triggerEvent: WebhookTriggerEvents.MEETING_ENDED, ...booking }); const payload = JSON.stringify({ triggerEvent, ...booking });
const jobName = `${subscriber.appId}_${subscriber.id}`; const jobName = `${subscriber.appId}_${subscriber.id}`;
// add scheduled job to database // add scheduled job to database
@ -286,7 +295,7 @@ export async function scheduleTrigger(
data: { data: {
jobName, jobName,
payload, payload,
startAfter: booking.endTime, startAfter: triggerEvent === WebhookTriggerEvents.MEETING_ENDED ? booking.endTime : booking.startTime,
subscriberUrl, subscriberUrl,
}, },
}); });

View File

@ -0,0 +1,2 @@
-- AlterEnum
ALTER TYPE "WebhookTriggerEvents" ADD VALUE 'MEETING_STARTED';

View File

@ -570,6 +570,7 @@ enum WebhookTriggerEvents {
BOOKING_REJECTED BOOKING_REJECTED
FORM_SUBMITTED FORM_SUBMITTED
MEETING_ENDED MEETING_ENDED
MEETING_STARTED
RECORDING_READY RECORDING_READY
} }