Skip to content

Commit 83aea7d

Browse files
CarinaWolliCarinaWollizomars
authored
fix: webhooks for managed event types (#10958)
Co-authored-by: CarinaWolli <[email protected]> Co-authored-by: Omar López <[email protected]>
1 parent a810a53 commit 83aea7d

File tree

8 files changed

+36
-14
lines changed

8 files changed

+36
-14
lines changed

apps/web/pages/api/recorded-daily-video.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,17 @@ const triggerWebhook = async ({
3434
booking: {
3535
userId: number | undefined;
3636
eventTypeId: number | null;
37+
eventTypeParentId: number | null | undefined;
3738
teamId?: number | null;
3839
};
3940
}) => {
4041
const eventTrigger: WebhookTriggerEvents = "RECORDING_READY";
4142
// Send Webhook call if hooked to BOOKING.RECORDING_READY
43+
44+
const triggerForUser = !booking.teamId || (booking.teamId && booking.eventTypeParentId);
45+
4246
const subscriberOptions = {
43-
userId: booking.userId,
47+
userId: triggerForUser ? booking.userId : null,
4448
eventTypeId: booking.eventTypeId,
4549
triggerEvent: eventTrigger,
4650
teamId: booking.teamId,
@@ -183,6 +187,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
183187
booking: {
184188
userId: booking?.user?.id,
185189
eventTypeId: booking.eventTypeId,
190+
eventTypeParentId: booking.eventType?.parentId,
186191
teamId,
187192
},
188193
});

packages/app-store/zapier/api/subscriptions/listBookings.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,14 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
2222

2323
try {
2424
const where: Prisma.BookingWhereInput = {};
25-
if (validKey.teamId) where.eventType = { teamId: validKey.teamId };
26-
else where.userId = validKey.userId;
25+
if (validKey.teamId) {
26+
where.eventType = {
27+
OR: [{ teamId: validKey.teamId }, { parent: { teamId: validKey.teamId } }],
28+
};
29+
} else {
30+
where.userId = validKey.userId;
31+
}
32+
2733
const bookings = await prisma.booking.findMany({
2834
take: 3,
2935
where,

packages/features/bookings/lib/handleCancelBooking.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,10 @@ async function handler(req: CustomRequest) {
157157
},
158158
});
159159

160+
const triggerForUser = !teamId || (teamId && bookingToDelete.eventType?.parentId);
161+
160162
const subscriberOptions = {
161-
userId: bookingToDelete.userId,
163+
userId: triggerForUser ? bookingToDelete.userId : null,
162164
eventTypeId: bookingToDelete.eventTypeId as number,
163165
triggerEvent: eventTrigger,
164166
teamId,

packages/features/bookings/lib/handleConfirmation.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,16 @@ export async function handleConfirmation(args: {
293293
},
294294
});
295295

296+
const triggerForUser = !teamId || (teamId && booking.eventType?.parentId);
297+
296298
const subscribersBookingCreated = await getWebhooks({
297-
userId: booking.userId,
299+
userId: triggerForUser ? booking.userId : null,
298300
eventTypeId: booking.eventTypeId,
299301
triggerEvent: WebhookTriggerEvents.BOOKING_CREATED,
300302
teamId,
301303
});
302304
const subscribersMeetingEnded = await getWebhooks({
303-
userId: booking.userId,
305+
userId: triggerForUser ? booking.userId : null,
304306
eventTypeId: booking.eventTypeId,
305307
triggerEvent: WebhookTriggerEvents.MEETING_ENDED,
306308
teamId: booking.eventType?.teamId,

packages/features/bookings/lib/handleNewBooking.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,8 +1126,10 @@ async function handler(
11261126

11271127
const teamId = await getTeamIdFromEventType({ eventType });
11281128

1129+
const triggerForUser = !teamId || (teamId && eventType.parentId);
1130+
11291131
const subscriberOptions: GetSubscriberOptions = {
1130-
userId: organizerUser.id,
1132+
userId: triggerForUser ? organizerUser.id : null,
11311133
eventTypeId,
11321134
triggerEvent: WebhookTriggerEvents.BOOKING_CREATED,
11331135
teamId,
@@ -1140,7 +1142,7 @@ async function handler(
11401142
subscriberOptions.triggerEvent = eventTrigger;
11411143

11421144
const subscriberOptionsMeetingEnded = {
1143-
userId: organizerUser.id,
1145+
userId: triggerForUser ? organizerUser.id : null,
11441146
eventTypeId,
11451147
triggerEvent: WebhookTriggerEvents.MEETING_ENDED,
11461148
teamId,

packages/features/webhooks/lib/getWebhooks.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@ export type GetSubscriberOptions = {
1010
};
1111

1212
const getWebhooks = async (options: GetSubscriberOptions, prisma: PrismaClient = defaultPrisma) => {
13-
const userId = options.teamId ? 0 : options.userId ?? 0;
13+
const userId = options.userId ?? 0;
1414
const eventTypeId = options.eventTypeId ?? 0;
1515
const teamId = options.teamId ?? 0;
16-
16+
// if we have userId and teamId it is a managed event type and should trigger for team and user
1717
const allWebhooks = await prisma.webhook.findMany({
1818
where: {
1919
OR: [
2020
{
2121
userId,
22-
teamId: null,
2322
},
2423
{
2524
eventTypeId,

packages/features/webhooks/lib/sendPayload.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ export type WebhookDataType = CalendarEvent &
3030
downloadLink?: string;
3131
};
3232

33-
function getZapierPayload(data: CalendarEvent & EventTypeInfo & { status?: string }): string {
33+
function getZapierPayload(
34+
data: CalendarEvent & EventTypeInfo & { status?: string; createdAt: string }
35+
): string {
3436
const attendees = data.attendees.map((attendee) => {
3537
return {
3638
name: attendee.name,
@@ -69,6 +71,7 @@ function getZapierPayload(data: CalendarEvent & EventTypeInfo & { status?: strin
6971
length: data.length,
7072
},
7173
attendees: attendees,
74+
createdAt: data.createdAt,
7275
};
7376
return JSON.stringify(body);
7477
}
@@ -112,7 +115,7 @@ const sendPayload = async (
112115

113116
/* Zapier id is hardcoded in the DB, we send the raw data for this case */
114117
if (appId === "zapier") {
115-
body = getZapierPayload(data);
118+
body = getZapierPayload({ ...data, createdAt });
116119
} else if (template) {
117120
body = applyTemplate(template, { ...data, triggerEvent, createdAt }, contentType);
118121
} else {

packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,12 @@ export const requestRescheduleHandler = async ({ ctx, input }: RequestReschedule
248248
parentId: bookingToReschedule?.eventType?.parentId ?? null,
249249
},
250250
});
251+
252+
const triggerForUser = !teamId || (teamId && bookingToReschedule.eventType?.parentId);
253+
251254
// Send Webhook call if hooked to BOOKING.CANCELLED
252255
const subscriberOptions = {
253-
userId: bookingToReschedule.userId,
256+
userId: triggerForUser ? bookingToReschedule.userId : null,
254257
eventTypeId: bookingToReschedule.eventTypeId as number,
255258
triggerEvent: eventTrigger,
256259
teamId,

0 commit comments

Comments
 (0)