Skip to content

Commit 6b9d233

Browse files
Pradumn27Udit-takkarhariombalhara
authored
fix: Managed Event Type Webhooks (#10300)
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
1 parent 2011a1b commit 6b9d233

File tree

7 files changed

+81
-26
lines changed

7 files changed

+81
-26
lines changed

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
99
import getWebhooks from "@calcom/features/webhooks/lib/getWebhooks";
1010
import sendPayload from "@calcom/features/webhooks/lib/sendPayload";
1111
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
12+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
1213
import { defaultHandler } from "@calcom/lib/server";
1314
import { getTranslation } from "@calcom/lib/server/i18n";
1415
import prisma, { bookingMinimalSelect } from "@calcom/prisma";
@@ -92,6 +93,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
9293
eventType: {
9394
select: {
9495
teamId: true,
96+
parentId: true,
9597
},
9698
},
9799
user: {
@@ -168,13 +170,20 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
168170
uid: booking.uid,
169171
};
170172

173+
const teamId = await getTeamIdFromEventType({
174+
eventType: {
175+
team: { id: booking?.eventType?.teamId ?? null },
176+
parentId: booking?.eventType?.parentId ?? null,
177+
},
178+
});
179+
171180
await triggerWebhook({
172181
evt,
173182
downloadLink,
174183
booking: {
175184
userId: booking?.user?.id,
176185
eventTypeId: booking.eventTypeId,
177-
teamId: booking.eventType?.teamId,
186+
teamId,
178187
},
179188
});
180189

packages/features/bookings/lib/handleCancelBooking.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import getWebhooks from "@calcom/features/webhooks/lib/getWebhooks";
1818
import type { EventTypeInfo } from "@calcom/features/webhooks/lib/sendPayload";
1919
import sendPayload from "@calcom/features/webhooks/lib/sendPayload";
2020
import { isPrismaObjOrUndefined, parseRecurringEvent } from "@calcom/lib";
21+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
2122
import { HttpError } from "@calcom/lib/http-error";
2223
import logger from "@calcom/lib/logger";
2324
import { handleRefundError } from "@calcom/lib/payment/handleRefundError";
@@ -91,6 +92,7 @@ async function getBookingToDelete(id: number | undefined, uid: string | undefine
9192
},
9293
},
9394
},
95+
parentId: true,
9496
},
9597
},
9698
uid: true,
@@ -131,11 +133,18 @@ async function handler(req: CustomRequest) {
131133
// get webhooks
132134
const eventTrigger: WebhookTriggerEvents = "BOOKING_CANCELLED";
133135

136+
const teamId = await getTeamIdFromEventType({
137+
eventType: {
138+
team: { id: bookingToDelete.eventType?.teamId ?? null },
139+
parentId: bookingToDelete?.eventType?.parentId ?? null,
140+
},
141+
});
142+
134143
const subscriberOptions = {
135144
userId: bookingToDelete.userId,
136145
eventTypeId: bookingToDelete.eventTypeId as number,
137146
triggerEvent: eventTrigger,
138-
teamId: bookingToDelete.eventType?.teamId,
147+
teamId,
139148
};
140149
const eventTypeInfo: EventTypeInfo = {
141150
eventTitle: bookingToDelete?.eventType?.title || null,

packages/features/bookings/lib/handleConfirmation.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { scheduleWorkflowReminders } from "@calcom/features/ee/workflows/lib/rem
88
import getWebhooks from "@calcom/features/webhooks/lib/getWebhooks";
99
import type { EventTypeInfo } from "@calcom/features/webhooks/lib/sendPayload";
1010
import sendPayload from "@calcom/features/webhooks/lib/sendPayload";
11+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
1112
import logger from "@calcom/lib/logger";
1213
import { BookingStatus, WebhookTriggerEvents } from "@calcom/prisma/enums";
1314
import { bookingMetadataSchema } from "@calcom/prisma/zod-utils";
@@ -31,6 +32,7 @@ export async function handleConfirmation(args: {
3132
requiresConfirmation: boolean;
3233
title: string;
3334
teamId?: number | null;
35+
parentId?: number | null;
3436
} | null;
3537
eventTypeId: number | null;
3638
smsReminderNumber: string | null;
@@ -236,11 +238,18 @@ export async function handleConfirmation(args: {
236238
}
237239

238240
try {
241+
const teamId = await getTeamIdFromEventType({
242+
eventType: {
243+
team: { id: booking.eventType?.teamId ?? null },
244+
parentId: booking?.eventType?.parentId ?? null,
245+
},
246+
});
247+
239248
const subscribersBookingCreated = await getWebhooks({
240249
userId: booking.userId,
241250
eventTypeId: booking.eventTypeId,
242251
triggerEvent: WebhookTriggerEvents.BOOKING_CREATED,
243-
teamId: booking.eventType?.teamId,
252+
teamId,
244253
});
245254
const subscribersMeetingEnded = await getWebhooks({
246255
userId: booking.userId,

packages/features/bookings/lib/handleNewBooking.ts

+2-21
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import { getDefaultEvent, getGroupName, getUsernameList } from "@calcom/lib/defa
5252
import { getErrorFromUnknown } from "@calcom/lib/errors";
5353
import getIP from "@calcom/lib/getIP";
5454
import getPaymentAppData from "@calcom/lib/getPaymentAppData";
55+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
5556
import { HttpError } from "@calcom/lib/http-error";
5657
import isOutOfBounds, { BookingDateInPastError } from "@calcom/lib/isOutOfBounds";
5758
import logger from "@calcom/lib/logger";
@@ -651,26 +652,6 @@ function getCustomInputsResponses(
651652
return customInputsResponses;
652653
}
653654

654-
async function getTeamId({ eventType }: { eventType: Awaited<ReturnType<typeof getEventTypesFromDB>> }) {
655-
if (eventType?.team?.id) {
656-
return eventType.team.id;
657-
}
658-
659-
// If it's a managed event we need to find the teamId for it from the parent
660-
if (eventType.parentId) {
661-
const managedEvent = await prisma.eventType.findFirst({
662-
where: {
663-
id: eventType.parentId,
664-
},
665-
select: {
666-
teamId: true,
667-
},
668-
});
669-
670-
return managedEvent?.teamId;
671-
}
672-
}
673-
674655
async function handler(
675656
req: NextApiRequest & { userId?: number | undefined },
676657
{
@@ -1151,7 +1132,7 @@ async function handler(
11511132
length: eventType.length,
11521133
};
11531134

1154-
const teamId = await getTeamId({ eventType });
1135+
const teamId = await getTeamIdFromEventType({ eventType });
11551136

11561137
const subscriberOptions: GetSubscriberOptions = {
11571138
userId: organizerUser.id,
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import prisma from "@calcom/prisma";
2+
3+
export async function getTeamIdFromEventType({
4+
eventType,
5+
}: {
6+
eventType: { team: { id: number | null } | null; parentId: number | null };
7+
}) {
8+
if (!eventType) {
9+
return null;
10+
}
11+
12+
if (eventType?.team?.id) {
13+
return eventType.team.id;
14+
}
15+
16+
// If it's a managed event we need to find the teamId for it from the parent
17+
if (eventType?.parentId) {
18+
const managedEvent = await prisma.eventType.findFirst({
19+
where: {
20+
id: eventType.parentId,
21+
},
22+
select: {
23+
teamId: true,
24+
},
25+
});
26+
27+
return managedEvent?.teamId;
28+
}
29+
}

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { handleConfirmation } from "@calcom/features/bookings/lib/handleConfirma
77
import { handleWebhookTrigger } from "@calcom/features/bookings/lib/handleWebhookTrigger";
88
import type { EventTypeInfo } from "@calcom/features/webhooks/lib/sendPayload";
99
import { isPrismaObjOrUndefined, parseRecurringEvent } from "@calcom/lib";
10+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
1011
import { getTranslation } from "@calcom/lib/server";
1112
import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat";
1213
import { prisma } from "@calcom/prisma";
@@ -71,6 +72,7 @@ export const confirmHandler = async ({ ctx, input }: ConfirmOptions) => {
7172
},
7273
},
7374
customInputs: true,
75+
parentId: true,
7476
},
7577
},
7678
location: true,
@@ -310,12 +312,20 @@ export const confirmHandler = async ({ ctx, input }: ConfirmOptions) => {
310312
}
311313

312314
await sendDeclinedEmails(evt);
315+
316+
const teamId = await getTeamIdFromEventType({
317+
eventType: {
318+
team: { id: booking.eventType?.teamId ?? null },
319+
parentId: booking?.eventType?.parentId ?? null,
320+
},
321+
});
322+
313323
// send BOOKING_REJECTED webhooks
314324
const subscriberOptions = {
315325
userId: booking.userId,
316326
eventTypeId: booking.eventTypeId,
317327
triggerEvent: WebhookTriggerEvents.BOOKING_REJECTED,
318-
teamId: booking.eventType?.teamId,
328+
teamId,
319329
};
320330
const eventTrigger: WebhookTriggerEvents = WebhookTriggerEvents.BOOKING_REJECTED;
321331
const eventTypeInfo: EventTypeInfo = {

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { getCalEventResponses } from "@calcom/features/bookings/lib/getCalEventR
1515
import getWebhooks from "@calcom/features/webhooks/lib/getWebhooks";
1616
import sendPayload from "@calcom/features/webhooks/lib/sendPayload";
1717
import { isPrismaObjOrUndefined } from "@calcom/lib";
18+
import { getTeamIdFromEventType } from "@calcom/lib/getTeamIdFromEventType";
1819
import { getTranslation } from "@calcom/lib/server";
1920
import { prisma } from "@calcom/prisma";
2021
import type { WebhookTriggerEvents } from "@calcom/prisma/enums";
@@ -238,12 +239,19 @@ export const requestRescheduleHandler = async ({ ctx, input }: RequestReschedule
238239

239240
// Send webhook
240241
const eventTrigger: WebhookTriggerEvents = "BOOKING_CANCELLED";
242+
243+
const teamId = await getTeamIdFromEventType({
244+
eventType: {
245+
team: { id: bookingToReschedule.eventType?.teamId ?? null },
246+
parentId: bookingToReschedule?.eventType?.parentId ?? null,
247+
},
248+
});
241249
// Send Webhook call if hooked to BOOKING.CANCELLED
242250
const subscriberOptions = {
243251
userId: bookingToReschedule.userId,
244252
eventTypeId: bookingToReschedule.eventTypeId as number,
245253
triggerEvent: eventTrigger,
246-
teamId: bookingToReschedule.eventType?.teamId,
254+
teamId,
247255
};
248256
const webhooks = await getWebhooks(subscriberOptions);
249257
const promises = webhooks.map((webhook) =>

0 commit comments

Comments
 (0)