diff --git a/apps/web/pages/api/book/recurring-event.ts b/apps/web/pages/api/book/recurring-event.ts new file mode 100644 index 0000000000..b6b9d6ce00 --- /dev/null +++ b/apps/web/pages/api/book/recurring-event.ts @@ -0,0 +1,59 @@ +import type { NextApiRequest, NextApiResponse } from "next"; + +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; +import handleNewBooking from "@calcom/features/bookings/lib/handleNewBooking"; +import type { BookingResponse, RecurringBookingCreateBody } from "@calcom/features/bookings/types"; +import { defaultResponder } from "@calcom/lib/server"; +import type { AppsStatus } from "@calcom/types/Calendar"; + +// @TODO: Didn't look at the contents of this function in order to not break old booking page. + +async function handler(req: NextApiRequest & { userId?: number }, res: NextApiResponse) { + const data: RecurringBookingCreateBody[] = req.body; + const session = await getServerSession({ req, res }); + const createdBookings: BookingResponse[] = []; + const allRecurringDates: string[] = data.map((booking) => booking.start); + let appsStatus: AppsStatus[] | undefined = undefined; + + /* To mimic API behavior and comply with types */ + req.userId = session?.user?.id || -1; + + // Reversing to accumulate results for noEmail instances first, to then lastly, create the + // emailed booking taking into account accumulated results to send app status accurately + for (let key = data.length - 1; key >= 0; key--) { + const booking = data[key]; + if (key === 0) { + const calcAppsStatus: { [key: string]: AppsStatus } = createdBookings + .flatMap((book) => (book.appsStatus !== undefined ? book.appsStatus : [])) + .reduce((prev, curr) => { + if (prev[curr.type]) { + prev[curr.type].failures += curr.failures; + prev[curr.type].success += curr.success; + } else { + prev[curr.type] = curr; + } + return prev; + }, {} as { [key: string]: AppsStatus }); + appsStatus = Object.values(calcAppsStatus); + } + + const recurringEventReq: NextApiRequest & { userId?: number } = req; + + recurringEventReq.body = { + ...booking, + appsStatus, + allRecurringDates, + currentRecurringIndex: key, + noEmail: key !== 0, + }; + + const eachRecurringBooking = await handleNewBooking(recurringEventReq, { + isNotAnApiCall: true, + }); + + createdBookings.push(eachRecurringBooking); + } + return createdBookings; +} + +export default defaultResponder(handler); diff --git a/packages/features/bookings/lib/create-recurring-booking.ts b/packages/features/bookings/lib/create-recurring-booking.ts index 41e29c467f..67765d2ed0 100644 --- a/packages/features/bookings/lib/create-recurring-booking.ts +++ b/packages/features/bookings/lib/create-recurring-booking.ts @@ -1,40 +1,11 @@ -import * as fetch from "@calcom/lib/fetch-wrapper"; -import type { AppsStatus } from "@calcom/types/Calendar"; +import { post } from "@calcom/lib/fetch-wrapper"; import type { RecurringBookingCreateBody, BookingResponse } from "../types"; -// @TODO: Didn't look at the contents of this function in order to not break old booking page. export const createRecurringBooking = async (data: RecurringBookingCreateBody[]) => { - const createdBookings: BookingResponse[] = []; - const allRecurringDates: string[] = data.map((booking) => booking.start); - let appsStatus: AppsStatus[] | undefined = undefined; - // Reversing to accumulate results for noEmail instances first, to then lastly, create the - // emailed booking taking into account accumulated results to send app status accurately - for (let key = data.length - 1; key >= 0; key--) { - const booking = data[key]; - if (key === 0) { - const calcAppsStatus: { [key: string]: AppsStatus } = createdBookings - .flatMap((book) => (book.appsStatus !== undefined ? book.appsStatus : [])) - .reduce((prev, curr) => { - if (prev[curr.type]) { - prev[curr.type].failures += curr.failures; - prev[curr.type].success += curr.success; - } else { - prev[curr.type] = curr; - } - return prev; - }, {} as { [key: string]: AppsStatus }); - appsStatus = Object.values(calcAppsStatus); - } - - const response = await fetch.post("/api/book/event", { - ...booking, - appsStatus, - allRecurringDates, - currentRecurringIndex: key, - noEmail: key !== 0, - }); - createdBookings.push(response); - } - return createdBookings; + const response = await post( + "/api/book/recurring-event", + data + ); + return response; };