Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: Morgan Vernay <morgan@cal.com> Co-authored-by: Omar López <zomars@me.com>
49 lines
2.0 KiB
TypeScript
49 lines
2.0 KiB
TypeScript
import type { NextApiRequest } from "next";
|
|
|
|
import { HttpError } from "@calcom/lib/http-error";
|
|
import { defaultHandler, defaultResponder } from "@calcom/lib/server";
|
|
import { SelectedCalendarRepository } from "@calcom/lib/server/repository/selectedCalendar";
|
|
|
|
import { getCalendar } from "../../_utils/getCalendar";
|
|
|
|
async function postHandler(req: NextApiRequest) {
|
|
if (req.headers["x-goog-channel-token"] !== process.env.GOOGLE_WEBHOOK_TOKEN) {
|
|
throw new HttpError({ statusCode: 403, message: "Invalid API key" });
|
|
}
|
|
if (typeof req.headers["x-goog-channel-id"] !== "string") {
|
|
throw new HttpError({ statusCode: 403, message: "Missing Channel ID" });
|
|
}
|
|
|
|
// There could be multiple selected calendars for the same googleChannelId for different eventTypes and same user
|
|
// Every such record has their googleChannel related fields set which are same
|
|
// So, it is enough to get the first selected calendar for this googleChannelId
|
|
// Further code gets all the selected calendars for this calendar's credential
|
|
const selectedCalendar = await SelectedCalendarRepository.findFirstByGoogleChannelId(
|
|
req.headers["x-goog-channel-id"]
|
|
);
|
|
|
|
if (!selectedCalendar) {
|
|
throw new HttpError({
|
|
statusCode: 200,
|
|
message: `No selected calendar found for googleChannelId: ${req.headers["x-goog-channel-id"]}`,
|
|
});
|
|
}
|
|
const { credential } = selectedCalendar;
|
|
if (!credential)
|
|
throw new HttpError({
|
|
statusCode: 200,
|
|
message: `No credential found for selected calendar for googleChannelId: ${req.headers["x-goog-channel-id"]}`,
|
|
});
|
|
const { selectedCalendars } = credential;
|
|
const calendar = await getCalendar(credential);
|
|
|
|
// Make sure to pass unique SelectedCalendars to avoid unnecessary third party api calls
|
|
// Necessary to do here so that it is ensure for all calendar apps
|
|
await calendar?.fetchAvailabilityAndSetCache?.(selectedCalendars);
|
|
return { message: "ok" };
|
|
}
|
|
|
|
export default defaultHandler({
|
|
POST: Promise.resolve({ default: defaultResponder(postHandler) }),
|
|
});
|