From 633697a8121a8484173fe47ea6cb856370adca4b Mon Sep 17 00:00:00 2001 From: Lauris Skraucis Date: Thu, 5 Sep 2024 10:37:26 +0200 Subject: [PATCH] fix: v2 api fix recurring booking (#16472) * fix: v2 POST recurring booking * refactor: have default recurringEventId for recurring booking --- .../controllers/bookings.controller.ts | 23 ++++++++++++++++++- .../bookings/inputs/create-booking.input.ts | 4 ---- .../inputs/create-recurring-booking.input.ts | 6 ++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/apps/api/v2/src/ee/bookings/controllers/bookings.controller.ts b/apps/api/v2/src/ee/bookings/controllers/bookings.controller.ts index 0f5a1f2344..a23bf5dd8c 100644 --- a/apps/api/v2/src/ee/bookings/controllers/bookings.controller.ts +++ b/apps/api/v2/src/ee/bookings/controllers/bookings.controller.ts @@ -35,6 +35,7 @@ import { ApiQuery, ApiTags as DocsTags } from "@nestjs/swagger"; import { User } from "@prisma/client"; import { Request } from "express"; import { NextApiRequest } from "next/types"; +import { v4 as uuidv4 } from "uuid"; import { X_CAL_CLIENT_ID } from "@calcom/platform-constants"; import { BOOKING_READ, SUCCESS_STATUS, BOOKING_WRITE } from "@calcom/platform-constants"; @@ -244,8 +245,15 @@ export class BookingsController { ): Promise> { const oAuthClientId = clientId?.toString(); try { + const recurringEventId = uuidv4(); + for (const recurringEvent of req.body) { + if (!recurringEvent.recurringEventId) { + recurringEvent.recurringEventId = recurringEventId; + } + } + const createdBookings: BookingResponse[] = await handleNewRecurringBooking( - await this.createNextApiBookingRequest(req, oAuthClientId) + await this.createNextApiRecurringBookingRequest(req, oAuthClientId) ); createdBookings.forEach(async (booking) => { @@ -352,6 +360,19 @@ export class BookingsController { return req as unknown as NextApiRequest & { userId?: number } & OAuthRequestParams; } + private async createNextApiRecurringBookingRequest( + req: BookingRequest, + oAuthClientId?: string, + platformBookingLocation?: string + ): Promise { + const userId = (await this.getOwnerId(req)) ?? -1; + const oAuthParams = oAuthClientId + ? await this.getOAuthClientsParams(oAuthClientId) + : DEFAULT_PLATFORM_PARAMS; + Object.assign(req, { userId, ...oAuthParams, platformBookingLocation }); + return req as unknown as NextApiRequest & { userId?: number } & OAuthRequestParams; + } + private handleBookingErrors( err: Error | HttpError | unknown, type?: "recurring" | `instant` | "no-show" diff --git a/apps/api/v2/src/ee/bookings/inputs/create-booking.input.ts b/apps/api/v2/src/ee/bookings/inputs/create-booking.input.ts index 7101bb80a2..0feeb0cc19 100644 --- a/apps/api/v2/src/ee/bookings/inputs/create-booking.input.ts +++ b/apps/api/v2/src/ee/bookings/inputs/create-booking.input.ts @@ -59,10 +59,6 @@ export class CreateBookingInput { @IsOptional() rescheduleUid?: string; - @IsString() - @IsOptional() - recurringEventId?: string; - @IsTimeZone() timeZone!: string; diff --git a/apps/api/v2/src/ee/bookings/inputs/create-recurring-booking.input.ts b/apps/api/v2/src/ee/bookings/inputs/create-recurring-booking.input.ts index 471e8ab8df..658e12aaa2 100644 --- a/apps/api/v2/src/ee/bookings/inputs/create-recurring-booking.input.ts +++ b/apps/api/v2/src/ee/bookings/inputs/create-recurring-booking.input.ts @@ -1,5 +1,5 @@ import { CreateBookingInput } from "@/ee/bookings/inputs/create-booking.input"; -import { IsBoolean, IsNumber, IsOptional } from "class-validator"; +import { IsBoolean, IsString, IsNumber, IsOptional } from "class-validator"; import type { AppsStatus } from "@calcom/platform-libraries"; @@ -21,4 +21,8 @@ export class CreateRecurringBookingInput extends CreateBookingInput { @IsOptional() @IsNumber() currentRecurringIndex?: number; + + @IsString() + @IsOptional() + recurringEventId?: string; }