From 1914b37ee423c8e8bc3e5137facdfe18ce1597c9 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:24:19 +0100 Subject: [PATCH] feat: add PATCH endpoint for updating Google Calendar events (#22339) * feat: add PATCH endpoint for updating Google Calendar events - Create UpdateUnifiedCalendarEventInput DTO with optional fields for partial updates - Add PATCH /:calendar/event/:eventUid endpoint to CalUnifiedCalendarsController - Extend GoogleCalendarService with updateEventDetails method - Support updating title, description, start/end times for Google Calendar events - Follow existing patterns for validation, error handling, and response transformation - Initially support Google Calendar only with extensibility for other providers Co-Authored-By: somay@cal.com * feat: expand PATCH endpoint to support all calendar event fields - Add comprehensive field support to UpdateUnifiedCalendarEventInput DTO - Include locations, attendees, status, and hosts fields with proper validation - Expand GoogleCalendarService.updateEventDetails to handle complex field transformations - Add helper methods for response status and event status mapping - Preserve existing transformation logic from GoogleCalendarEventOutputPipe - Support conferenceData updates with conferenceDataVersion parameter Co-Authored-By: somay@cal.com * fix: add support for simple location field in Google Calendar events - Add handling for geographic location field in addition to conferenceData - Filter non-video locations for the simple location string field - Preserve existing conferenceData support for video meetings - Verified against Google Calendar API documentation Co-Authored-By: somay@cal.com * refactor: extract transformation logic into GoogleCalendarEventInputPipe - Create GoogleCalendarEventInputPipe following existing patterns - Extract transformation logic from updateEventDetails method - Move mapping methods to the new pipe for better organization - Improve code reusability and maintainability Addresses PR comment requesting transformation logic extraction. Co-Authored-By: somay@cal.com * refactor: remove locations field and simplify calendar event input handling * update docs * refactor: remove hosts field from the update endpoint * fix: exclude organizer from attendees list in Google Calendar event transformation * feat: implement organizer preservation logic in PATCH endpoint - Fetch existing Google Calendar event data before transformation - Extract organizer attendees from existing event and merge with user-provided attendees - Prevent accidental removal of organizers when users update attendees - Add custom interface for GoogleCalendarEventInputPipe to support optional existingEvent parameter - Preserve organizers unless user explicitly provides hosts field in update request Co-Authored-By: somay@cal.com * feat: add hosts array handling to PATCH endpoint - Add hosts field back to UpdateUnifiedCalendarEventInput DTO - Implement transformAttendeesWithHostsHandling method in GoogleCalendarEventInputPipe - Convert hosts to attendees with organizer: true for Google Calendar API - When hosts are provided, they replace existing organizers (not merge) - Maintain backward compatibility with existing organizer preservation logic Co-Authored-By: somay@cal.com * feat: implement sophisticated attendee update logic with preservation and deletion support - Add UpdateCalendarEventAttendee class with action: 'delete' support - Implement attendee preservation logic that starts with existing Google Calendar attendees - Support explicit attendee deletion using action: 'delete' field - Update existing attendees when provided without action field - Add new attendees that don't exist in current event - Preserve organizer status when updating existing attendees - Fetch existing event data when attendees OR hosts are being updated - Maintain hosts array handling that replaces existing organizers Co-Authored-By: somay@cal.com * feat: add host management and attendee deletion to calendar event API * refactor: improve readability of transformAttendeesWithHostsHandling and restrict hosts to responseStatus updates only - Break down complex transformAttendeesWithHostsHandling method into smaller, more readable helper functions: - preserveExistingAttendees: handles existing attendee preservation - processAttendeeDeletions: handles attendee deletion logic - processAttendeeUpdatesAndAdditions: handles attendee updates and additions - replaceHostsWithUpdatedOnes: handles host replacement with restrictions - Create UpdateCalendarEventHost class that only allows responseStatus updates - Restrict hosts array to prevent changes to name, email, and other fields - Preserve existing host displayName from Google Calendar when updating responseStatus Co-Authored-By: somay@cal.com * feat: restrict host updates to responseStatus only, preserve email and name from Google Calendar data - Remove email field from UpdateCalendarEventHost class - Update replaceHostsWithUpdatedOnes to preserve all host data except responseStatus - Apply responseStatus updates to all existing organizers from Google Calendar - Prevent users from updating host email or name fields Co-Authored-By: somay@cal.com * Revert "feat: restrict host updates to responseStatus only, preserve email and name from Google Calendar data" This reverts commit 22d07ce0cb13e71661522b2fd8a237d8b6e0809c. * refactor: replace optional flag with organizer property in calendar event attendees * refactor: remove organizer field from calendar event attendee input * feat: add comprehensive test suites for calendar transformation pipes - Create google-calendar-event-input.pipe.spec.ts with 67 test cases - Create get-calendar-event-details-output-pipe.spec.ts with 35 test cases - Follow event-types transformer test patterns with separate describe blocks - Cover all transformation functions including edge cases and null handling - Test attendee preservation, deletion, host management, and status transformations - Ensure comprehensive coverage for sophisticated attendee update logic Co-Authored-By: somay@cal.com * fix: remove invalid optional properties from calendar pipe tests - Remove optional: false from line 85 in 'should transform attendees without existing event' test case - Remove optional: true from line 388 in 'should update existing attendee' test case - Remove optional: false from line 421 in 'should add new attendee' test case - Update expected outputs to match actual pipe implementation behavior - All 30 tests now pass locally Co-Authored-By: somay@cal.com * fix: add platform library path mappings to Jest configuration - Resolves module resolution errors for @calcom/platform-libraries/* imports in Jest - Ensures test suite can run without 'Cannot find module' errors - Adds comprehensive path mappings matching TypeScript configuration Co-Authored-By: somay@cal.com * fix: add @calcom/dayjs path mapping to Jest configuration - Add missing moduleNameMapper entry for @calcom/dayjs to resolve TypeScript path mappings in Jest - Fixes TypeError: Cannot read properties of undefined (reading 'extend') in calendar pipe tests - Calendar transformation pipe tests now pass successfully Co-Authored-By: somay@cal.com * fix: configure Jest to use dayjs mock system for consistent test environment - Remove @calcom/dayjs path mapping from Jest config - Add setupFilesAfterEnv to automatically import dayjs mock - Update dayjs mock with comprehensive jest.fn() implementation - Add @calcom/platform-libraries/repositories and @calcom/prisma/client mappings - Resolves dayjs TypeError in slots.service.spec.ts and other test files Co-Authored-By: somay@cal.com * fix: complete shared Google event data with required properties for test suites - Add missing required properties to sharedGoogleEvent in both test files - Fix TypeScript compilation errors in calendar transformation pipe tests - Correct test assertion for attendees filtering logic in output pipe - All 11 test suites now pass with 199 tests total Co-Authored-By: somay@cal.com * undo extra changes * better tests * fix: update calendar API endpoints to use plural events in path * update documentation * fix: Restrict updates to only the responseStatus field for hosts * feat: add PATCH endpoint for updating Google Calendar events - Create UpdateUnifiedCalendarEventInput DTO with optional fields for partial updates - Add PATCH /:calendar/event/:eventUid endpoint to CalUnifiedCalendarsController - Extend GoogleCalendarService with updateEventDetails method - Support updating title, description, start/end times for Google Calendar events - Follow existing patterns for validation, error handling, and response transformation - Initially support Google Calendar only with extensibility for other providers Co-Authored-By: somay@cal.com * feat: expand PATCH endpoint to support all calendar event fields - Add comprehensive field support to UpdateUnifiedCalendarEventInput DTO - Include locations, attendees, status, and hosts fields with proper validation - Expand GoogleCalendarService.updateEventDetails to handle complex field transformations - Add helper methods for response status and event status mapping - Preserve existing transformation logic from GoogleCalendarEventOutputPipe - Support conferenceData updates with conferenceDataVersion parameter Co-Authored-By: somay@cal.com * fix: add support for simple location field in Google Calendar events - Add handling for geographic location field in addition to conferenceData - Filter non-video locations for the simple location string field - Preserve existing conferenceData support for video meetings - Verified against Google Calendar API documentation Co-Authored-By: somay@cal.com * refactor: extract transformation logic into GoogleCalendarEventInputPipe - Create GoogleCalendarEventInputPipe following existing patterns - Extract transformation logic from updateEventDetails method - Move mapping methods to the new pipe for better organization - Improve code reusability and maintainability Addresses PR comment requesting transformation logic extraction. Co-Authored-By: somay@cal.com * refactor: remove locations field and simplify calendar event input handling * update docs * refactor: remove hosts field from the update endpoint * fix: exclude organizer from attendees list in Google Calendar event transformation * feat: implement organizer preservation logic in PATCH endpoint - Fetch existing Google Calendar event data before transformation - Extract organizer attendees from existing event and merge with user-provided attendees - Prevent accidental removal of organizers when users update attendees - Add custom interface for GoogleCalendarEventInputPipe to support optional existingEvent parameter - Preserve organizers unless user explicitly provides hosts field in update request Co-Authored-By: somay@cal.com * feat: add hosts array handling to PATCH endpoint - Add hosts field back to UpdateUnifiedCalendarEventInput DTO - Implement transformAttendeesWithHostsHandling method in GoogleCalendarEventInputPipe - Convert hosts to attendees with organizer: true for Google Calendar API - When hosts are provided, they replace existing organizers (not merge) - Maintain backward compatibility with existing organizer preservation logic Co-Authored-By: somay@cal.com * feat: implement sophisticated attendee update logic with preservation and deletion support - Add UpdateCalendarEventAttendee class with action: 'delete' support - Implement attendee preservation logic that starts with existing Google Calendar attendees - Support explicit attendee deletion using action: 'delete' field - Update existing attendees when provided without action field - Add new attendees that don't exist in current event - Preserve organizer status when updating existing attendees - Fetch existing event data when attendees OR hosts are being updated - Maintain hosts array handling that replaces existing organizers Co-Authored-By: somay@cal.com * feat: add host management and attendee deletion to calendar event API * refactor: improve readability of transformAttendeesWithHostsHandling and restrict hosts to responseStatus updates only - Break down complex transformAttendeesWithHostsHandling method into smaller, more readable helper functions: - preserveExistingAttendees: handles existing attendee preservation - processAttendeeDeletions: handles attendee deletion logic - processAttendeeUpdatesAndAdditions: handles attendee updates and additions - replaceHostsWithUpdatedOnes: handles host replacement with restrictions - Create UpdateCalendarEventHost class that only allows responseStatus updates - Restrict hosts array to prevent changes to name, email, and other fields - Preserve existing host displayName from Google Calendar when updating responseStatus Co-Authored-By: somay@cal.com * feat: restrict host updates to responseStatus only, preserve email and name from Google Calendar data - Remove email field from UpdateCalendarEventHost class - Update replaceHostsWithUpdatedOnes to preserve all host data except responseStatus - Apply responseStatus updates to all existing organizers from Google Calendar - Prevent users from updating host email or name fields Co-Authored-By: somay@cal.com * Revert "feat: restrict host updates to responseStatus only, preserve email and name from Google Calendar data" This reverts commit 22d07ce0cb13e71661522b2fd8a237d8b6e0809c. * feat: add comprehensive test suites for calendar transformation pipes - Create google-calendar-event-input.pipe.spec.ts with 67 test cases - Create get-calendar-event-details-output-pipe.spec.ts with 35 test cases - Follow event-types transformer test patterns with separate describe blocks - Cover all transformation functions including edge cases and null handling - Test attendee preservation, deletion, host management, and status transformations - Ensure comprehensive coverage for sophisticated attendee update logic Co-Authored-By: somay@cal.com * refactor: replace optional flag with organizer property in calendar event attendees * refactor: remove organizer field from calendar event attendee input * fix: remove invalid optional properties from calendar pipe tests - Remove optional: false from line 85 in 'should transform attendees without existing event' test case - Remove optional: true from line 388 in 'should update existing attendee' test case - Remove optional: false from line 421 in 'should add new attendee' test case - Update expected outputs to match actual pipe implementation behavior - All 30 tests now pass locally Co-Authored-By: somay@cal.com * fix: complete shared Google event data with required properties for test suites - Add missing required properties to sharedGoogleEvent in both test files - Fix TypeScript compilation errors in calendar transformation pipe tests - Correct test assertion for attendees filtering logic in output pipe - All 11 test suites now pass with 199 tests total Co-Authored-By: somay@cal.com * fix: resolve TypeScript compilation errors in calendar transformation pipe tests - Add comprehensive Jest mocks for @calcom/prisma/client, @calcom/dayjs, CalendarManager, and delegationCredential - Fix RedisService AbortSignal.timeout() usage - Update UserAvailabilityService import path to use @calcom/lib/getUserAvailability - Configure Jest moduleNameMapper to handle ES module imports and package.json mocking - All 11 test suites now pass with 199 tests total Co-Authored-By: somay@cal.com * fix: use proper CacheService dependency injection in AvailableSlotsService - Replace direct CacheService instantiation with dependency injection - Update CacheService import path to use correct calendar-cache module - Fix repository and service dependencies for proper type safety - Resolves TypeScript compilation errors in slots service tests Co-Authored-By: somay@cal.com * fix: remove duplicate test file causing TypeScript compilation error Co-Authored-By: somay@cal.com * undo extra changes * undo extra changes * fix: remove the action: "delete" key from attendees * fix: simplify tests * update docs * undo: remove hosts * Update pre-commit * feat: add alternate route for calendar event retrieval and simplify test fixtures * remove userId -- unused * undo --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: somay@cal.com Co-authored-by: Somay Chauhan Co-authored-by: Volnei Munhoz --- .../event-types-private-links.controller.ts | 5 +- .../event-types-private-links.module.ts | 12 +- .../private-links.repository.ts | 12 +- .../services/private-links-output.service.ts | 9 +- .../services/private-links.service.ts | 15 +- .../controllers/event-types.controller.ts | 2 - .../v2/src/ee/platform-endpoints-module.ts | 2 +- .../cal-unified-calendars.controller.ts | 54 +- .../update-unified-calendar-event.input.ts | 134 + ...s => get-unified-calendar-event.output.ts} | 34 + .../google-calendar-event.fixture.ts | 103 + ...calendar-event-details-output-pipe.spec.ts | 201 + .../get-calendar-event-details-output-pipe.ts | 13 +- .../pipes/google-calendar-event-input-pipe.ts | 121 + .../google-calendar-event-input.pipe.spec.ts | 222 + .../services/google-calendar.service.ts | 41 +- .../guards/event-type-ownership.guard.ts | 2 - apps/api/v2/swagger/documentation.json | 181 +- docs/api-reference/v2/openapi.json | 4579 ++++------------- .../bookings/lib/getCalEventResponses.ts | 2 +- packages/lib/EventManager.ts | 4 +- .../examples/base/playwright.config.ts | 26 +- .../create-event-type.e2e.ts | 20 +- .../outputs/private-link.output.ts | 2 - 24 files changed, 2158 insertions(+), 3638 deletions(-) create mode 100644 apps/api/v2/src/modules/cal-unified-calendars/inputs/update-unified-calendar-event.input.ts rename apps/api/v2/src/modules/cal-unified-calendars/outputs/{get-unified-calendar-event.ts => get-unified-calendar-event.output.ts} (91%) create mode 100644 apps/api/v2/src/modules/cal-unified-calendars/pipes/__fixtures__/google-calendar-event.fixture.ts create mode 100644 apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.spec.ts create mode 100644 apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input-pipe.ts create mode 100644 apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input.pipe.spec.ts diff --git a/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts index cd77067666..d0a384be66 100644 --- a/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts +++ b/apps/api/v2/src/ee/event-types-private-links/controllers/event-types-private-links.controller.ts @@ -67,10 +67,9 @@ export class EventTypesPrivateLinksController { @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @ApiOperation({ summary: "Get all private links for an event type" }) async getPrivateLinks( - @Param("eventTypeId", ParseIntPipe) eventTypeId: number, - @GetUser("id") userId: number + @Param("eventTypeId", ParseIntPipe) eventTypeId: number ): Promise { - const privateLinks = await this.privateLinksService.getPrivateLinks(eventTypeId, userId); + const privateLinks = await this.privateLinksService.getPrivateLinks(eventTypeId); return { status: SUCCESS_STATUS, diff --git a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts index 4b9643fc76..6bd91072d7 100644 --- a/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts +++ b/apps/api/v2/src/ee/event-types-private-links/event-types-private-links.module.ts @@ -1,15 +1,15 @@ -import { Module } from "@nestjs/common"; -import { TokensModule } from "@/modules/tokens/tokens.module"; -import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; -import { PrismaModule } from "@/modules/prisma/prisma.module"; import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { EventTypeOwnershipGuard } from "@/modules/event-types/guards/event-type-ownership.guard"; +import { OAuthClientModule } from "@/modules/oauth-clients/oauth-client.module"; +import { PrismaModule } from "@/modules/prisma/prisma.module"; +import { TokensModule } from "@/modules/tokens/tokens.module"; +import { Module } from "@nestjs/common"; import { EventTypesPrivateLinksController } from "./controllers/event-types-private-links.controller"; +import { PrivateLinksRepository } from "./private-links.repository"; import { PrivateLinksInputService } from "./services/private-links-input.service"; import { PrivateLinksOutputService } from "./services/private-links-output.service"; import { PrivateLinksService } from "./services/private-links.service"; -import { PrivateLinksRepository } from "./private-links.repository"; @Module({ imports: [TokensModule, OAuthClientModule, PrismaModule, EventTypesModule_2024_06_14], @@ -23,5 +23,3 @@ import { PrivateLinksRepository } from "./private-links.repository"; ], }) export class EventTypesPrivateLinksModule {} - - diff --git a/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts b/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts index 4f6dde61b1..09cb2cdf9d 100644 --- a/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts +++ b/apps/api/v2/src/ee/event-types-private-links/private-links.repository.ts @@ -25,7 +25,10 @@ export class PrivateLinksRepository { }); } - async create(eventTypeId: number, link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null }) { + async create( + eventTypeId: number, + link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null } + ) { return this.dbWrite.prisma.hashedLink.create({ data: { eventTypeId, @@ -36,7 +39,10 @@ export class PrivateLinksRepository { }); } - async update(eventTypeId: number, link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null }) { + async update( + eventTypeId: number, + link: { link: string; expiresAt: Date | null; maxUsageCount?: number | null } + ) { return this.dbWrite.prisma.hashedLink.updateMany({ where: { eventTypeId, link: link.link }, data: { @@ -50,5 +56,3 @@ export class PrivateLinksRepository { return this.dbWrite.prisma.hashedLink.deleteMany({ where: { eventTypeId, link: linkId } }); } } - - diff --git a/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts index 35ce974f53..508129e380 100644 --- a/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links-output.service.ts @@ -1,6 +1,12 @@ import { Injectable } from "@nestjs/common"; import { plainToClass } from "class-transformer"; +import { + PrivateLinkOutput, + TimeBasedPrivateLinkOutput, + UsageBasedPrivateLinkOutput, +} from "@calcom/platform-types"; + export type PrivateLinkData = { id: string; eventTypeId: number; @@ -10,7 +16,6 @@ export type PrivateLinkData = { maxUsageCount?: number | null; usageCount?: number; }; -import { PrivateLinkOutput, TimeBasedPrivateLinkOutput, UsageBasedPrivateLinkOutput } from "@calcom/platform-types"; @Injectable() export class PrivateLinksOutputService { @@ -39,5 +44,3 @@ export class PrivateLinksOutputService { return data.map((item) => this.transformToOutput(item)); } } - - diff --git a/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts index a9bd775828..73a2cf16f5 100644 --- a/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts +++ b/apps/api/v2/src/ee/event-types-private-links/services/private-links.service.ts @@ -1,14 +1,13 @@ -import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; - -import { generateHashedLink, isLinkExpired } from "@calcom/platform-libraries/private-links"; -import { CreatePrivateLinkInput, PrivateLinkOutput, UpdatePrivateLinkInput } from "@calcom/platform-types"; - +import { PrivateLinksRepository } from "@/ee/event-types-private-links/private-links.repository"; import { PrivateLinksInputService } from "@/ee/event-types-private-links/services/private-links-input.service"; import { PrivateLinksOutputService, type PrivateLinkData, } from "@/ee/event-types-private-links/services/private-links-output.service"; -import { PrivateLinksRepository } from "@/ee/event-types-private-links/private-links.repository"; +import { Injectable, NotFoundException, BadRequestException } from "@nestjs/common"; + +import { generateHashedLink, isLinkExpired } from "@calcom/platform-libraries/private-links"; +import { CreatePrivateLinkInput, PrivateLinkOutput, UpdatePrivateLinkInput } from "@calcom/platform-types"; @Injectable() export class PrivateLinksService { @@ -48,7 +47,7 @@ export class PrivateLinksService { } } - async getPrivateLinks(eventTypeId: number, userId: number): Promise { + async getPrivateLinks(eventTypeId: number): Promise { try { const links = await this.repo.listByEventTypeId(eventTypeId); const mapped: PrivateLinkData[] = links.map((l) => ({ @@ -124,5 +123,3 @@ export class PrivateLinksService { } } } - - diff --git a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts index 0a7eaf9f46..a9ac0d78ad 100644 --- a/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts +++ b/apps/api/v2/src/ee/event-types/event-types_2024_06_14/controllers/event-types.controller.ts @@ -6,7 +6,6 @@ import { UpdateEventTypeOutput_2024_06_14 } from "@/ee/event-types/event-types_2 import { EventTypeResponseTransformPipe } from "@/ee/event-types/event-types_2024_06_14/pipes/event-type-response.transformer"; import { EventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/event-types.service"; import { InputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/input-event-types.service"; - import { VERSION_2024_06_14_VALUE } from "@/lib/api-versions"; import { API_KEY_OR_ACCESS_TOKEN_HEADER } from "@/lib/docs/headers"; import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator"; @@ -42,7 +41,6 @@ import { GetEventTypesQuery_2024_06_14, CreateEventTypeInput_2024_06_14, EventTypeOutput_2024_06_14, - } from "@calcom/platform-types"; @Controller({ diff --git a/apps/api/v2/src/ee/platform-endpoints-module.ts b/apps/api/v2/src/ee/platform-endpoints-module.ts index 2f47ce64a2..e10450f628 100644 --- a/apps/api/v2/src/ee/platform-endpoints-module.ts +++ b/apps/api/v2/src/ee/platform-endpoints-module.ts @@ -1,6 +1,7 @@ import { BookingsModule_2024_04_15 } from "@/ee/bookings/2024-04-15/bookings.module"; import { BookingsModule_2024_08_13 } from "@/ee/bookings/2024-08-13/bookings.module"; import { CalendarsModule } from "@/ee/calendars/calendars.module"; +import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import { EventTypesModule_2024_04_15 } from "@/ee/event-types/event-types_2024_04_15/event-types.module"; import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module"; import { GcalModule } from "@/ee/gcal/gcal.module"; @@ -14,7 +15,6 @@ import { SlotsModule_2024_09_04 } from "@/modules/slots/slots-2024-09-04/slots.m import { TeamsEventTypesModule } from "@/modules/teams/event-types/teams-event-types.module"; import { TeamsMembershipsModule } from "@/modules/teams/memberships/teams-memberships.module"; import { TeamsModule } from "@/modules/teams/teams/teams.module"; -import { EventTypesPrivateLinksModule } from "@/ee/event-types-private-links/event-types-private-links.module"; import type { MiddlewareConsumer, NestModule } from "@nestjs/common"; import { Module } from "@nestjs/common"; diff --git a/apps/api/v2/src/modules/cal-unified-calendars/controllers/cal-unified-calendars.controller.ts b/apps/api/v2/src/modules/cal-unified-calendars/controllers/cal-unified-calendars.controller.ts index f4b35d0bb1..85b9a0a944 100644 --- a/apps/api/v2/src/modules/cal-unified-calendars/controllers/cal-unified-calendars.controller.ts +++ b/apps/api/v2/src/modules/cal-unified-calendars/controllers/cal-unified-calendars.controller.ts @@ -2,10 +2,21 @@ import { API_VERSIONS_VALUES } from "@/lib/api-versions"; import { API_KEY_OR_ACCESS_TOKEN_HEADER } from "@/lib/docs/headers"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; import { PermissionsGuard } from "@/modules/auth/guards/permissions/permissions.guard"; -import { GetUnifiedCalendarEventOutput } from "@/modules/cal-unified-calendars/outputs/get-unified-calendar-event"; +import { UpdateUnifiedCalendarEventInput } from "@/modules/cal-unified-calendars/inputs/update-unified-calendar-event.input"; +import { GetUnifiedCalendarEventOutput } from "@/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output"; import { GoogleCalendarEventOutputPipe } from "@/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe"; import { GoogleCalendarService } from "@/modules/cal-unified-calendars/services/google-calendar.service"; -import { Controller, Get, Param, UseGuards, HttpCode, HttpStatus, BadRequestException } from "@nestjs/common"; +import { + Controller, + Get, + Param, + UseGuards, + HttpCode, + HttpStatus, + BadRequestException, + Patch, + Body, +} from "@nestjs/common"; import { ApiTags as DocsTags, ApiParam, ApiHeader, ApiOperation } from "@nestjs/swagger"; import { GOOGLE_CALENDAR, SUCCESS_STATUS } from "@calcom/platform-constants"; @@ -30,6 +41,7 @@ export class CalUnifiedCalendarsController { type: String, }) @Get("/:calendar/event/:eventUid") + @Get("/:calendar/events/:eventUid") @HttpCode(HttpStatus.OK) @UseGuards(ApiAuthGuard, PermissionsGuard) @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) @@ -54,4 +66,42 @@ export class CalUnifiedCalendarsController { data: transformedEvent, }; } + + @ApiParam({ + name: "calendar", + enum: [GOOGLE_CALENDAR], + type: String, + }) + @ApiParam({ + name: "eventUid", + description: + "The Google Calendar event ID. You can retrieve this by getting booking references from the following endpoints:\n\n- For team events: https://cal.com/docs/api-reference/v2/orgs-teams-bookings/get-booking-references-for-a-booking\n\n- For user events: https://cal.com/docs/api-reference/v2/bookings/get-booking-references-for-a-booking", + type: String, + }) + @Patch("/:calendar/events/:eventUid") + @HttpCode(HttpStatus.OK) + @UseGuards(ApiAuthGuard, PermissionsGuard) + @ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER) + @ApiOperation({ + summary: "Update meeting details in calendar", + description: "Updates event information in the specified calendar provider", + }) + async updateCalendarEvent( + @Param("calendar") calendar: string, + @Param("eventUid") eventUid: string, + @Body() updateData: UpdateUnifiedCalendarEventInput + ): Promise { + if (calendar !== GOOGLE_CALENDAR) { + throw new BadRequestException("Event updates are currently only available for Google Calendar"); + } + + const updatedEvent = await this.googleCalendarService.updateEventDetails(eventUid, updateData); + + const transformedEvent = new GoogleCalendarEventOutputPipe().transform(updatedEvent); + + return { + status: SUCCESS_STATUS, + data: transformedEvent, + }; + } } diff --git a/apps/api/v2/src/modules/cal-unified-calendars/inputs/update-unified-calendar-event.input.ts b/apps/api/v2/src/modules/cal-unified-calendars/inputs/update-unified-calendar-event.input.ts new file mode 100644 index 0000000000..dc09c1c15d --- /dev/null +++ b/apps/api/v2/src/modules/cal-unified-calendars/inputs/update-unified-calendar-event.input.ts @@ -0,0 +1,134 @@ +import { ApiPropertyOptional } from "@nestjs/swagger"; +import { Type } from "class-transformer"; +import { IsISO8601, IsOptional, IsString, ValidateNested, IsEnum, IsArray } from "class-validator"; + +import { CalendarEventStatus, CalendarEventResponseStatus } from "../outputs/get-unified-calendar-event.output"; + +export class UpdateCalendarEventAttendee { + @IsString() + @ApiPropertyOptional({ + type: String, + description: "Email address of the attendee", + }) + email!: string; + + @IsString() + @IsOptional() + @ApiPropertyOptional({ + type: String, + description: "Display name of the attendee", + }) + name?: string; + + @IsEnum(CalendarEventResponseStatus) + @IsOptional() + @ApiPropertyOptional({ + enum: CalendarEventResponseStatus, + enumName: "CalendarEventResponseStatus", + nullable: true, + description: "Response status of the attendee", + }) + responseStatus?: CalendarEventResponseStatus | null; + + @IsOptional() + @ApiPropertyOptional({ + nullable: true, + description: "Indicates if this attendee is the current user", + }) + self?: boolean; + + @IsOptional() + @ApiPropertyOptional({ + nullable: true, + description: "Indicates if this attendee's attendance is optional", + }) + optional?: boolean; + + @IsOptional() + @ApiPropertyOptional({ + nullable: true, + description: "Indicates if this attendee is the host", + }) + host?: boolean; + +} + +export class UpdateDateTimeWithZone { + @IsISO8601() + @IsOptional() + @ApiPropertyOptional({ type: "string", format: "date-time" }) + time?: string; + + @IsString() + @IsOptional() + @ApiPropertyOptional() + timeZone?: string; +} + +export class UpdateUnifiedCalendarEventInput { + @ValidateNested() + @Type(() => UpdateDateTimeWithZone) + @IsOptional() + @ApiPropertyOptional({ + type: "object", + properties: { + time: { type: "string", format: "date-time" }, + timeZone: { type: "string" }, + }, + description: "Start date and time of the calendar event with timezone information", + }) + start?: UpdateDateTimeWithZone; + + @ValidateNested() + @Type(() => UpdateDateTimeWithZone) + @IsOptional() + @ApiPropertyOptional({ + type: "object", + properties: { + time: { type: "string", format: "date-time" }, + timeZone: { type: "string" }, + }, + description: "End date and time of the calendar event with timezone information", + }) + end?: UpdateDateTimeWithZone; + + @IsString() + @IsOptional() + @ApiPropertyOptional({ + type: String, + description: "Title of the calendar event", + }) + title?: string; + + @IsString() + @IsOptional() + @ApiPropertyOptional({ + type: String, + nullable: true, + description: "Detailed description of the calendar event", + }) + description?: string | null; + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => UpdateCalendarEventAttendee) + @ApiPropertyOptional({ + type: [UpdateCalendarEventAttendee], + nullable: true, + description: + "List of attendees. CAUTION: You must pass the entire array with all updated values. Any attendees not included in this array will be removed from the event.", + }) + attendees?: UpdateCalendarEventAttendee[]; + + @IsEnum(CalendarEventStatus) + @IsOptional() + @ApiPropertyOptional({ + enum: CalendarEventStatus, + enumName: "CalendarEventStatus", + nullable: true, + description: "Status of the event (accepted, pending, declined, cancelled)", + example: CalendarEventStatus.ACCEPTED, + }) + status?: CalendarEventStatus | null; +} diff --git a/apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.ts b/apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output.ts similarity index 91% rename from apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.ts rename to apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output.ts index 273cbcb76e..654936b4ca 100644 --- a/apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.ts +++ b/apps/api/v2/src/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output.ts @@ -225,6 +225,22 @@ export class CalendarEventHost { responseStatus!: CalendarEventResponseStatus | null; } +export class calendarEventOwner { + @IsString() + @ApiProperty({ + description: "Email address of the event host", + }) + email!: string; + + @IsString() + @IsOptional() + @ApiPropertyOptional({ + nullable: true, + description: "Display name of the event host", + }) + name?: string; +} + export class CalendarEventAttendee { @IsString() @ApiProperty({ @@ -264,6 +280,14 @@ export class CalendarEventAttendee { description: "Indicates if this attendee's attendance is optional", }) optional?: boolean; + + + @IsOptional() + @ApiPropertyOptional({ + nullable: true, + description: "Indicates if this attendee is the host", + }) + host?: boolean; } export class DateTimeWithZone { @@ -384,6 +408,16 @@ export class UnifiedCalendarEventOutput { }) hosts?: CalendarEventHost[]; + @IsOptional() + @ValidateNested({ each: true }) + @Type(() => calendarEventOwner) + @ApiPropertyOptional({ + type: calendarEventOwner, + nullable: true, + description: "The calendar account that owns this event. This is the primary calendar where the event is stored and cannot be modified without appropriate permissions. Changing this would require moving the event to a different calendar", + }) + calendarEventOwner?: calendarEventOwner; + @IsEnum(CALENDARS) @ApiProperty({ enum: CALENDARS, diff --git a/apps/api/v2/src/modules/cal-unified-calendars/pipes/__fixtures__/google-calendar-event.fixture.ts b/apps/api/v2/src/modules/cal-unified-calendars/pipes/__fixtures__/google-calendar-event.fixture.ts new file mode 100644 index 0000000000..dc9881e59b --- /dev/null +++ b/apps/api/v2/src/modules/cal-unified-calendars/pipes/__fixtures__/google-calendar-event.fixture.ts @@ -0,0 +1,103 @@ +import { GoogleCalendarEventResponse } from "../get-calendar-event-details-output-pipe"; + +export const createGoogleCalendarEventFixture = ( + overrides: Partial = {} +): GoogleCalendarEventResponse => { + const baseEvent: GoogleCalendarEventResponse = { + kind: "calendar#event", + etag: "test-etag", + id: "test-event-id", + status: "confirmed", + htmlLink: "https://calendar.google.com/event", + created: "2024-01-01T00:00:00Z", + updated: "2024-01-01T00:00:00Z", + summary: "Test Meeting", + description: "Test description", + creator: { + email: "creator@example.com", + displayName: "Creator Name", + }, + organizer: { + email: "organizer@example.com", + displayName: "Organizer Name", + }, + start: { + dateTime: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }, + end: { + dateTime: "2024-01-15T11:00:00Z", + timeZone: "America/New_York", + }, + iCalUID: "test-ical-uid", + sequence: 0, + attendees: [ + { + email: "attendee@example.com", + displayName: "Attendee Name", + responseStatus: "accepted", + organizer: false, + }, + { + email: "organizer@example.com", + displayName: "Organizer Name", + responseStatus: "accepted", + organizer: true, + }, + ], + conferenceData: { + conferenceId: "abc-def-ghi", + entryPoints: [ + { + entryPointType: "video", + uri: "https://meet.google.com/abc-def-ghi", + label: "meet.google.com/abc-def-ghi", + }, + ], + conferenceSolution: { + key: { + type: "hangoutsMeet", + }, + name: "Google Meet", + iconUri: + "https://fonts.gstatic.com/s/i/productlogos/meet_2020q4/v6/web-512dp/logo_meet_2020q4_color_2x_web_512dp.png", + }, + }, + hangoutLink: "https://meet.google.com/abc-def-ghi", + }; + + return { ...baseEvent, ...overrides }; +}; + +export const googleEventWithConferenceData = createGoogleCalendarEventFixture({ + conferenceData: { + conferenceId: "test-conference-id", + entryPoints: [ + { + entryPointType: "video", + uri: "https://meet.google.com/abc-def-ghi", + label: "Google Meet", + pin: "123456", + regionCode: "US", + }, + { + entryPointType: "phone", + uri: "tel:+1-555-123-4567", + label: "Phone", + pin: "789012", + }, + ], + }, +}); + +export const googleEventWithLocationOnly = createGoogleCalendarEventFixture({ + location: "123 Main St, City, State", + conferenceData: undefined, + hangoutLink: undefined, +}); + +export const googleEventWithHangoutLink = createGoogleCalendarEventFixture({ + hangoutLink: "https://hangouts.google.com/call/abc123", + conferenceData: undefined, + location: undefined, +}); diff --git a/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.spec.ts b/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.spec.ts new file mode 100644 index 0000000000..540fe98f3a --- /dev/null +++ b/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.spec.ts @@ -0,0 +1,201 @@ +import { + CalendarEventStatus, + CalendarEventResponseStatus, +} from "@/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output"; + +import { + createGoogleCalendarEventFixture, + googleEventWithConferenceData, + googleEventWithLocationOnly, + googleEventWithHangoutLink, +} from "./__fixtures__/google-calendar-event.fixture"; +import { + GoogleCalendarEventOutputPipe, + GoogleCalendarEventResponse, +} from "./get-calendar-event-details-output-pipe"; + +describe("GoogleCalendarEventOutputPipe", () => { + let pipe: GoogleCalendarEventOutputPipe; + let sharedGoogleEvent: GoogleCalendarEventResponse; + + beforeAll(() => { + sharedGoogleEvent = createGoogleCalendarEventFixture(); + }); + + beforeEach(() => { + pipe = new GoogleCalendarEventOutputPipe(); + }); + + describe("transform", () => { + it("should transform Google Calendar event to unified format", () => { + const result = pipe.transform(sharedGoogleEvent); + + expect(result.id).toBe("test-event-id"); + expect(result.title).toBe("Test Meeting"); + expect(result.description).toBe("Test description"); + expect(result.source).toBe("google"); + expect(result.status).toBe(CalendarEventStatus.ACCEPTED); + expect(result.start.time).toBe("2024-01-15T10:00:00Z"); + expect(result.start.timeZone).toBe("America/New_York"); + expect(result.end.time).toBe("2024-01-15T11:00:00Z"); + expect(result.end.timeZone).toBe("America/New_York"); + expect(result.attendees).toHaveLength(2); + }); + }); + + describe("transformDateTimeWithZone", () => { + it("should transform Google date time to unified format", () => { + const googleDateTime = { + dateTime: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }; + + const result = pipe["transformDateTimeWithZone"](googleDateTime); + + expect(result.time).toBe("2024-01-15T10:00:00Z"); + expect(result.timeZone).toBe("America/New_York"); + }); + }); + + describe("transformAttendeeResponseStatus", () => { + it("should transform accepted status", () => { + const result = pipe["transformAttendeeResponseStatus"]("accepted"); + expect(result).toBe(CalendarEventResponseStatus.ACCEPTED); + }); + + it("should transform tentative status", () => { + const result = pipe["transformAttendeeResponseStatus"]("tentative"); + expect(result).toBe(CalendarEventResponseStatus.PENDING); + }); + + it("should transform declined status", () => { + const result = pipe["transformAttendeeResponseStatus"]("declined"); + expect(result).toBe(CalendarEventResponseStatus.DECLINED); + }); + + it("should transform needsaction status", () => { + const result = pipe["transformAttendeeResponseStatus"]("needsaction"); + expect(result).toBe(CalendarEventResponseStatus.NEEDS_ACTION); + }); + + it("should handle case insensitive status", () => { + const result = pipe["transformAttendeeResponseStatus"]("ACCEPTED"); + expect(result).toBe(CalendarEventResponseStatus.ACCEPTED); + }); + + it("should handle unknown status", () => { + const result = pipe["transformAttendeeResponseStatus"]("unknown"); + expect(result).toBeNull(); + }); + + it("should handle null status", () => { + const result = pipe["transformAttendeeResponseStatus"](undefined); + expect(result).toBeNull(); + }); + }); + + describe("transformEventStatus", () => { + it("should transform confirmed status", () => { + const result = pipe["transformEventStatus"]("confirmed"); + expect(result).toBe(CalendarEventStatus.ACCEPTED); + }); + + it("should transform tentative status", () => { + const result = pipe["transformEventStatus"]("tentative"); + expect(result).toBe(CalendarEventStatus.PENDING); + }); + + it("should transform cancelled status", () => { + const result = pipe["transformEventStatus"]("cancelled"); + expect(result).toBe(CalendarEventStatus.CANCELLED); + }); + + it("should handle case insensitive status", () => { + const result = pipe["transformEventStatus"]("CONFIRMED"); + expect(result).toBe(CalendarEventStatus.ACCEPTED); + }); + + it("should handle unknown status", () => { + const result = pipe["transformEventStatus"]("unknown"); + expect(result).toBeNull(); + }); + + it("should handle null status", () => { + const result = pipe["transformEventStatus"](undefined); + expect(result).toBeNull(); + }); + }); + + describe("transformOrganizer", () => { + it("should return calendarEventOwner organizer exist", () => { + const eventWithoutOrganizerAttendees = createGoogleCalendarEventFixture({ + organizer: { email: "organizer@example.com" }, + attendees: [ + { + email: "attendee@example.com", + displayName: "Regular Attendee", + responseStatus: "accepted", + organizer: false, + }, + ], + }); + + const result = pipe.transform(eventWithoutOrganizerAttendees); + + expect(result?.calendarEventOwner?.email).toBe("organizer@example.com"); + }); + }); + + describe("transformLocations", () => { + it("should transform conference data entry points", () => { + const result = pipe["transformLocations"](googleEventWithConferenceData); + + expect(result).toHaveLength(2); + expect(result[0]).toEqual({ + type: "video", + url: "https://meet.google.com/abc-def-ghi", + label: "Google Meet", + pin: "123456", + regionCode: "US", + }); + expect(result[1]).toEqual({ + type: "phone", + url: "tel:+1-555-123-4567", + label: "Phone", + pin: "789012", + regionCode: undefined, + }); + }); + + it("should fallback to location field", () => { + const result = pipe["transformLocations"](googleEventWithLocationOnly); + + expect(result).toHaveLength(1); + expect(result[0]).toEqual({ + type: "video", + url: "123 Main St, City, State", + }); + }); + + it("should fallback to hangout link", () => { + const result = pipe["transformLocations"](googleEventWithHangoutLink); + + expect(result).toHaveLength(1); + expect(result[0]).toEqual({ + type: "video", + url: "https://hangouts.google.com/call/abc123", + }); + }); + + it("should return empty array when no location data", () => { + const eventWithoutLocation = createGoogleCalendarEventFixture({ + location: undefined, + conferenceData: undefined, + hangoutLink: undefined, + }); + + const result = pipe["transformLocations"](eventWithoutLocation); + expect(result).toEqual([]); + }); + }); +}); diff --git a/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.ts b/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.ts index 906dcc8b3d..40a2843a16 100644 --- a/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.ts +++ b/apps/api/v2/src/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe.ts @@ -3,7 +3,7 @@ import { CalendarEventStatus, DateTimeWithZone, UnifiedCalendarEventOutput, -} from "@/modules/cal-unified-calendars/outputs/get-unified-calendar-event"; +} from "@/modules/cal-unified-calendars/outputs/get-unified-calendar-event.output"; import { PipeTransform, Injectable } from "@nestjs/common"; export interface GoogleCalendarEventResponse { @@ -94,14 +94,12 @@ export class GoogleCalendarEventOutputPipe calendarEvent.locations = this.transformLocations(googleEvent); if (googleEvent.attendees && googleEvent.attendees.length > 0) { - calendarEvent.attendees = googleEvent.attendees - .filter((attendee) => !attendee.organizer) - .map((attendee) => { + calendarEvent.attendees = googleEvent.attendees.map((attendee) => { return { email: attendee.email, name: attendee.displayName, responseStatus: this.transformAttendeeResponseStatus(attendee.responseStatus), - organizer: attendee.organizer, + host: attendee.organizer, self: attendee.self, optional: attendee.optional, }; @@ -110,7 +108,8 @@ export class GoogleCalendarEventOutputPipe calendarEvent.status = this.transformEventStatus(googleEvent.status); - calendarEvent.hosts = this.transformHosts(googleEvent); + calendarEvent.calendarEventOwner = googleEvent.organizer + calendarEvent.hosts = this.transformHosts(googleEvent) calendarEvent.source = "google"; @@ -196,6 +195,8 @@ export class GoogleCalendarEventOutputPipe regionCode: entryPoint.regionCode, }; }); + } else if (googleEvent.location) { + return [{ type: "video", url: googleEvent.location }]; } else if (googleEvent.hangoutLink) { return [{ type: "video", url: googleEvent.hangoutLink }]; } diff --git a/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input-pipe.ts b/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input-pipe.ts new file mode 100644 index 0000000000..4a92a2918f --- /dev/null +++ b/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input-pipe.ts @@ -0,0 +1,121 @@ +import { GoogleCalendarEventResponse } from "@/modules/cal-unified-calendars/pipes/get-calendar-event-details-output-pipe"; +import { Injectable } from "@nestjs/common"; + +import { + UpdateUnifiedCalendarEventInput, + UpdateDateTimeWithZone, +} from "../inputs/update-unified-calendar-event.input"; +import { CalendarEventResponseStatus, CalendarEventStatus } from "../outputs/get-unified-calendar-event.output"; + +// Common interfaces for Google Calendar types +interface GoogleCalendarDateTime { + dateTime: string; + timeZone: string; +} + +interface GoogleCalendarAttendee { + email: string; + displayName?: string; + responseStatus: string; + organizer?: boolean; +} + +interface GoogleCalendarEventInputTransform { + transform( + updateData: UpdateUnifiedCalendarEventInput, + fetchedEvent?: GoogleCalendarEventResponse | null + ): any; +} + +@Injectable() +export class GoogleCalendarEventInputPipe implements GoogleCalendarEventInputTransform { + transform( + updateData: UpdateUnifiedCalendarEventInput, + ): any { + const updatePayload: any = {}; + + if (updateData.title !== undefined) { + updatePayload.summary = updateData.title; + } + + if (updateData.description !== undefined) { + updatePayload.description = updateData.description; + } + + if (updateData.start) { + updatePayload.start = this.transformDateTimeWithZone(updateData.start); + } + + if (updateData.end) { + updatePayload.end = this.transformDateTimeWithZone(updateData.end); + } + + if (updateData.attendees !== undefined) { + updatePayload.attendees = this.transformAttendees( + updateData.attendees, + ); + } + + if (updateData.status !== undefined) { + updatePayload.status = this.transformEventStatus(updateData.status); + } + + return updatePayload; + } + + private transformDateTimeWithZone(dateTime: UpdateDateTimeWithZone): GoogleCalendarDateTime { + return { + dateTime: dateTime.time || "", + timeZone: dateTime.timeZone || "", + }; + } + + private transformAttendees( + inputAttendees: NonNullable, + ): GoogleCalendarAttendee[] { + return inputAttendees.map((attendee) => { + return { + email: attendee.email, + displayName: attendee.name, + responseStatus: this.transformResponseStatus(attendee.responseStatus), + organizer: attendee.host, + self: attendee.self, + optional: attendee.optional, + }; + }); + } + + private transformResponseStatus(responseStatus?: CalendarEventResponseStatus | null): string { + if (!responseStatus) return "needsAction"; + + switch (responseStatus) { + case CalendarEventResponseStatus.ACCEPTED: + return "accepted"; + case CalendarEventResponseStatus.PENDING: + return "tentative"; + case CalendarEventResponseStatus.DECLINED: + return "declined"; + case CalendarEventResponseStatus.NEEDS_ACTION: + return "needsAction"; + default: + return "needsAction"; + } + } + + private transformEventStatus(status?: CalendarEventStatus | null): string { + if (!status) return "confirmed"; + + switch (status) { + case CalendarEventStatus.ACCEPTED: + return "confirmed"; + case CalendarEventStatus.PENDING: + return "tentative"; + case CalendarEventStatus.CANCELLED: + return "cancelled"; + case CalendarEventStatus.DECLINED: + return "cancelled"; + default: + return "confirmed"; + } + } +} diff --git a/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input.pipe.spec.ts b/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input.pipe.spec.ts new file mode 100644 index 0000000000..4221e5a648 --- /dev/null +++ b/apps/api/v2/src/modules/cal-unified-calendars/pipes/google-calendar-event-input.pipe.spec.ts @@ -0,0 +1,222 @@ +import { + UpdateUnifiedCalendarEventInput, + UpdateDateTimeWithZone, +} from "../inputs/update-unified-calendar-event.input"; +import { CalendarEventResponseStatus, CalendarEventStatus } from "../outputs/get-unified-calendar-event.output"; +import { GoogleCalendarEventResponse } from "./get-calendar-event-details-output-pipe"; +import { GoogleCalendarEventInputPipe } from "./google-calendar-event-input-pipe"; + +describe("GoogleCalendarEventInputPipe", () => { + let pipe: GoogleCalendarEventInputPipe; + let sharedGoogleEvent: GoogleCalendarEventResponse; + + beforeAll(() => { + sharedGoogleEvent = { + kind: "calendar#event", + etag: "test-etag", + id: "test-event-id", + status: "confirmed", + htmlLink: "https://calendar.google.com/event", + created: "2024-01-01T00:00:00Z", + updated: "2024-01-01T00:00:00Z", + summary: "Test Meeting", + description: "Test description", + start: { + dateTime: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }, + end: { + dateTime: "2024-01-15T11:00:00Z", + timeZone: "America/New_York", + }, + iCalUID: "test-ical-uid", + sequence: 0, + attendees: [ + { + email: "attendee1@example.com", + displayName: "Attendee One", + responseStatus: "accepted", + organizer: false, + }, + { + email: "attendee2@example.com", + displayName: "Attendee Two", + responseStatus: "needsAction", + organizer: false, + }, + { + email: "organizer@example.com", + displayName: "Organizer", + responseStatus: "accepted", + organizer: true, + }, + ], + creator: { + email: "organizer@example.com", + displayName: "Organizer", + }, + organizer: { + email: "organizer@example.com", + displayName: "Organizer", + }, + }; + }); + + beforeEach(() => { + pipe = new GoogleCalendarEventInputPipe(); + }); + + describe("transform", () => { + it("should transform basic event fields", () => { + const input: UpdateUnifiedCalendarEventInput = { + title: "Updated Meeting", + description: "Updated description", + start: { + time: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }, + end: { + time: "2024-01-15T11:00:00Z", + timeZone: "America/New_York", + }, + status: CalendarEventStatus.ACCEPTED, + }; + + const expectedOutput = { + summary: "Updated Meeting", + description: "Updated description", + start: { + dateTime: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }, + end: { + dateTime: "2024-01-15T11:00:00Z", + timeZone: "America/New_York", + }, + status: "confirmed", + }; + + const result = pipe.transform(input); + expect(result).toEqual(expectedOutput); + }); + + it("should handle partial updates", () => { + const input: UpdateUnifiedCalendarEventInput = { + title: "Only Title Update", + }; + + const expectedOutput = { + summary: "Only Title Update", + }; + + const result = pipe.transform(input); + expect(result).toEqual(expectedOutput); + }); + + it("should handle null description", () => { + const input: UpdateUnifiedCalendarEventInput = { + description: null, + }; + + const expectedOutput = { + description: null, + }; + + const result = pipe.transform(input); + expect(result).toEqual(expectedOutput); + }); + }); + + describe("transformDateTimeWithZone", () => { + it("should transform date time with timezone", () => { + const input: UpdateDateTimeWithZone = { + time: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }; + + const expectedOutput = { + dateTime: "2024-01-15T10:00:00Z", + timeZone: "America/New_York", + }; + + const result = pipe["transformDateTimeWithZone"](input); + expect(result).toEqual(expectedOutput); + }); + + it("should handle empty time and timezone", () => { + const input: UpdateDateTimeWithZone = {}; + + const expectedOutput = { + dateTime: "", + timeZone: "", + }; + + const result = pipe["transformDateTimeWithZone"](input); + expect(result).toEqual(expectedOutput); + }); + }); + + describe("transformResponseStatus", () => { + it("should transform ACCEPTED status", () => { + const result = pipe["transformResponseStatus"](CalendarEventResponseStatus.ACCEPTED); + expect(result).toBe("accepted"); + }); + + it("should transform PENDING status", () => { + const result = pipe["transformResponseStatus"](CalendarEventResponseStatus.PENDING); + expect(result).toBe("tentative"); + }); + + it("should transform DECLINED status", () => { + const result = pipe["transformResponseStatus"](CalendarEventResponseStatus.DECLINED); + expect(result).toBe("declined"); + }); + + it("should transform NEEDS_ACTION status", () => { + const result = pipe["transformResponseStatus"](CalendarEventResponseStatus.NEEDS_ACTION); + expect(result).toBe("needsAction"); + }); + + it("should handle null status", () => { + const result = pipe["transformResponseStatus"](null); + expect(result).toBe("needsAction"); + }); + + it("should handle undefined status", () => { + const result = pipe["transformResponseStatus"](undefined); + expect(result).toBe("needsAction"); + }); + }); + + describe("transformEventStatus", () => { + it("should transform ACCEPTED status", () => { + const result = pipe["transformEventStatus"](CalendarEventStatus.ACCEPTED); + expect(result).toBe("confirmed"); + }); + + it("should transform PENDING status", () => { + const result = pipe["transformEventStatus"](CalendarEventStatus.PENDING); + expect(result).toBe("tentative"); + }); + + it("should transform CANCELLED status", () => { + const result = pipe["transformEventStatus"](CalendarEventStatus.CANCELLED); + expect(result).toBe("cancelled"); + }); + + it("should transform DECLINED status", () => { + const result = pipe["transformEventStatus"](CalendarEventStatus.DECLINED); + expect(result).toBe("cancelled"); + }); + + it("should handle null status", () => { + const result = pipe["transformEventStatus"](null); + expect(result).toBe("confirmed"); + }); + + it("should handle undefined status", () => { + const result = pipe["transformEventStatus"](undefined); + expect(result).toBe("confirmed"); + }); + }); +}); diff --git a/apps/api/v2/src/modules/cal-unified-calendars/services/google-calendar.service.ts b/apps/api/v2/src/modules/cal-unified-calendars/services/google-calendar.service.ts index 78ea3b2588..c01bd9ece6 100644 --- a/apps/api/v2/src/modules/cal-unified-calendars/services/google-calendar.service.ts +++ b/apps/api/v2/src/modules/cal-unified-calendars/services/google-calendar.service.ts @@ -10,7 +10,8 @@ import { JWT } from "googleapis-common"; import { DelegationCredentialRepository, OAuth2UniversalSchema } from "@calcom/platform-libraries/app-store"; -import { UnifiedCalendarEventOutput } from "../outputs/get-unified-calendar-event"; +import { UpdateUnifiedCalendarEventInput } from "../inputs/update-unified-calendar-event.input"; +import { GoogleCalendarEventInputPipe } from "../pipes/google-calendar-event-input-pipe"; @Injectable() export class GoogleCalendarService { @@ -53,6 +54,44 @@ export class GoogleCalendarService { } } + async updateEventDetails( + eventUid: string, + updateData: UpdateUnifiedCalendarEventInput + ): Promise { + const bookingReference = + await this.bookingReferencesRepository.getBookingReferencesIncludeSensitiveCredentials(eventUid); + + if (!bookingReference) { + throw new NotFoundException("Booking reference not found"); + } + + const ownerUserEmail = bookingReference?.booking?.user?.email; + + const calendar = await this.getAuthorizedCalendarInstance( + ownerUserEmail, + bookingReference.credential?.key, + bookingReference.delegationCredential + ); + + + const updatePayload = new GoogleCalendarEventInputPipe().transform(updateData); + + try { + const event = await calendar.events.patch({ + calendarId: bookingReference?.externalCalendarId ?? "primary", + eventId: bookingReference?.uid, + requestBody: updatePayload, + }); + + if (!event.data) { + throw new NotFoundException("Failed to update meeting"); + } + return event.data as GoogleCalendarEventResponse; + } catch (error) { + throw new NotFoundException("Failed to update meeting details"); + } + } + /** * Gets an authorized Google Calendar instance * Tries delegation credentials first, falls back to direct OAuth diff --git a/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts b/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts index ea6a01cc85..ea745df74a 100644 --- a/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts +++ b/apps/api/v2/src/modules/event-types/guards/event-type-ownership.guard.ts @@ -40,5 +40,3 @@ export class EventTypeOwnershipGuard implements CanActivate { return true; } } - - diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 2719e583f0..0d4a9ac399 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -8563,6 +8563,69 @@ ] } }, + "/v2/calendars/{calendar}/events/{eventUid}": { + "patch": { + "operationId": "CalUnifiedCalendarsController_updateCalendarEvent", + "summary": "Update meeting details in calendar", + "description": "Updates event information in the specified calendar provider", + "parameters": [ + { + "name": "calendar", + "required": true, + "in": "path", + "schema": { + "enum": [ + "google" + ], + "type": "string" + } + }, + { + "name": "eventUid", + "required": true, + "in": "path", + "description": "The Google Calendar event ID. You can retrieve this by getting booking references from the following endpoints:\n\n- For team events: https://cal.com/docs/api-reference/v2/orgs-teams-bookings/get-booking-references-for-a-booking\n\n- For user events: https://cal.com/docs/api-reference/v2/bookings/get-booking-references-for-a-booking", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUnifiedCalendarEventInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUnifiedCalendarEventOutput" + } + } + } + } + }, + "tags": [ + "Cal Unified Calendars" + ] + } + }, "/v2/calendars/ics-feed/save": { "post": { "operationId": "CalendarsController_createIcsFeed", @@ -28782,7 +28845,7 @@ }, "CalendarEventResponseStatus": { "type": "string", - "description": "Host's response to the invitation", + "description": "Response status of the attendee", "enum": [ "accepted", "pending", @@ -28815,6 +28878,11 @@ "type": "boolean", "nullable": true, "description": "Indicates if this attendee's attendance is optional" + }, + "host": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the host" } }, "required": [ @@ -28853,6 +28921,23 @@ "email" ] }, + "calendarEventOwner": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address of the event host" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Display name of the event host" + } + }, + "required": [ + "email" + ] + }, "CalendarSource": { "type": "string", "description": "Calendar integration source (e.g., Google Calendar, Office 365, Apple Calendar). Currently only Google Calendar is supported.", @@ -28949,6 +29034,15 @@ "$ref": "#/components/schemas/CalendarEventHost" } }, + "calendarEventOwner": { + "nullable": true, + "description": "The calendar account that owns this event. This is the primary calendar where the event is stored and cannot be modified without appropriate permissions. Changing this would require moving the event to a different calendar", + "allOf": [ + { + "$ref": "#/components/schemas/calendarEventOwner" + } + ] + }, "source": { "example": "google", "$ref": "#/components/schemas/CalendarSource" @@ -28982,6 +29076,91 @@ "data" ] }, + "UpdateCalendarEventAttendee": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address of the attendee" + }, + "name": { + "type": "string", + "description": "Display name of the attendee" + }, + "responseStatus": { + "nullable": true, + "$ref": "#/components/schemas/CalendarEventResponseStatus" + }, + "self": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the current user" + }, + "optional": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee's attendance is optional" + }, + "host": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the host" + } + } + }, + "UpdateUnifiedCalendarEventInput": { + "type": "object", + "properties": { + "start": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + }, + "timeZone": { + "type": "string" + } + }, + "description": "Start date and time of the calendar event with timezone information" + }, + "end": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + }, + "timeZone": { + "type": "string" + } + }, + "description": "End date and time of the calendar event with timezone information" + }, + "title": { + "type": "string", + "description": "Title of the calendar event" + }, + "description": { + "type": "string", + "nullable": true, + "description": "Detailed description of the calendar event" + }, + "attendees": { + "nullable": true, + "description": "List of attendees. CAUTION: You must pass the entire array with all updated values. Any attendees not included in this array will be removed from the event.", + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateCalendarEventAttendee" + } + }, + "status": { + "nullable": true, + "example": "accepted", + "$ref": "#/components/schemas/CalendarEventStatus" + } + } + }, "RequestEmailVerificationInput": { "type": "object", "properties": { diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index 2719e583f0..718464697c 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -69,9 +69,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "post": { "operationId": "OAuthClientUsersController_createUser", @@ -117,9 +115,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/users/{userId}": { @@ -165,9 +161,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "patch": { "operationId": "OAuthClientUsersController_updateUser", @@ -221,9 +215,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] }, "delete": { "operationId": "OAuthClientUsersController_deleteUser", @@ -267,9 +259,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/users/{userId}/force-refresh": { @@ -316,9 +306,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth/{clientId}/refresh": { @@ -367,9 +355,7 @@ } } }, - "tags": [ - "Platform / Managed Users" - ] + "tags": ["Platform / Managed Users"] } }, "/v2/oauth-clients/{clientId}/webhooks": { @@ -417,9 +403,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhooks", @@ -480,9 +464,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteAllOAuthClientWebhooks", @@ -518,9 +500,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] } }, "/v2/oauth-clients/{clientId}/webhooks/{webhookId}": { @@ -568,9 +548,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "get": { "operationId": "OAuthClientWebhooksController_getOAuthClientWebhook", @@ -598,9 +576,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] }, "delete": { "operationId": "OAuthClientWebhooksController_deleteOAuthClientWebhook", @@ -628,9 +604,7 @@ } } }, - "tags": [ - "Platform / Webhooks" - ] + "tags": ["Platform / Webhooks"] } }, "/v2/organizations/{orgId}/attributes": { @@ -693,9 +667,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "post": { "operationId": "OrganizationsAttributesController_createOrganizationAttribute", @@ -741,9 +713,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}": { @@ -789,9 +759,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "patch": { "operationId": "OrganizationsAttributesController_updateOrganizationAttribute", @@ -845,9 +813,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] }, "delete": { "operationId": "OrganizationsAttributesController_deleteOrganizationAttribute", @@ -891,9 +857,7 @@ } } }, - "tags": [ - "Orgs / Attributes" - ] + "tags": ["Orgs / Attributes"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options": { @@ -949,9 +913,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptions", @@ -995,9 +957,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/{optionId}": { @@ -1051,9 +1011,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "patch": { "operationId": "OrganizationsAttributesOptionsController_updateOrganizationAttributeOption", @@ -1115,9 +1073,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/{attributeId}/options/assigned": { @@ -1207,9 +1163,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/slugs/{attributeSlug}/options/assigned": { @@ -1299,9 +1253,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/options/{userId}": { @@ -1357,9 +1309,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] }, "get": { "operationId": "OrganizationsAttributesOptionsController_getOrganizationAttributeOptionsForUser", @@ -1403,9 +1353,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/attributes/options/{userId}/{attributeOptionId}": { @@ -1459,9 +1407,7 @@ } } }, - "tags": [ - "Orgs / Attributes / Options" - ] + "tags": ["Orgs / Attributes / Options"] } }, "/v2/organizations/{orgId}/bookings": { @@ -1506,13 +1452,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -1653,10 +1593,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -1667,10 +1604,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -1681,10 +1615,7 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -1695,10 +1626,7 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -1755,9 +1683,7 @@ } } }, - "tags": [ - "Orgs / Bookings" - ] + "tags": ["Orgs / Bookings"] } }, "/v2/organizations/{orgId}/delegation-credentials": { @@ -1823,9 +1749,7 @@ } } }, - "tags": [ - "Orgs / Delegation Credentials" - ] + "tags": ["Orgs / Delegation Credentials"] } }, "/v2/organizations/{orgId}/delegation-credentials/{credentialId}": { @@ -1899,9 +1823,7 @@ } } }, - "tags": [ - "Orgs / Delegation Credentials" - ] + "tags": ["Orgs / Delegation Credentials"] } }, "/v2/organizations/{orgId}/memberships": { @@ -1982,9 +1904,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "post": { "operationId": "OrganizationsMembershipsController_createMembership", @@ -2048,9 +1968,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] } }, "/v2/organizations/{orgId}/memberships/{membershipId}": { @@ -2114,9 +2032,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "delete": { "operationId": "OrganizationsMembershipsController_deleteMembership", @@ -2178,9 +2094,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] }, "patch": { "operationId": "OrganizationsMembershipsController_updateMembership", @@ -2252,9 +2166,7 @@ } } }, - "tags": [ - "Orgs / Memberships" - ] + "tags": ["Orgs / Memberships"] } }, "/v2/organizations/{orgId}/routing-forms": { @@ -2303,10 +2215,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2316,10 +2225,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2398,9 +2304,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses": { @@ -2457,10 +2361,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2470,10 +2371,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -2539,9 +2437,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] }, "post": { "operationId": "OrganizationsRoutingFormsResponsesController_createRoutingFormResponse", @@ -2619,10 +2515,7 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": [ - "range", - "time" - ], + "enum": ["range", "time"], "type": "string" } }, @@ -2659,9 +2552,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -2725,9 +2616,7 @@ } } }, - "tags": [ - "Orgs / Routing forms" - ] + "tags": ["Orgs / Routing forms"] } }, "/v2/organizations/{orgId}/schedules": { @@ -2808,9 +2697,7 @@ } } }, - "tags": [ - "Orgs / Schedules" - ] + "tags": ["Orgs / Schedules"] } }, "/v2/organizations/{orgId}/teams": { @@ -2891,9 +2778,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "post": { "operationId": "OrganizationsTeamsController_createTeam", @@ -2957,9 +2842,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/me": { @@ -3040,9 +2923,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/{teamId}": { @@ -3090,9 +2971,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "delete": { "operationId": "OrganizationsTeamsController_deleteTeam", @@ -3154,9 +3033,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] }, "patch": { "operationId": "OrganizationsTeamsController_updateTeam", @@ -3228,9 +3105,7 @@ } } }, - "tags": [ - "Orgs / Teams" - ] + "tags": ["Orgs / Teams"] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings": { @@ -3275,13 +3150,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -3352,10 +3221,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -3366,10 +3232,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -3380,10 +3243,7 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -3439,9 +3299,7 @@ } } }, - "tags": [ - "Orgs / Teams / Bookings" - ] + "tags": ["Orgs / Teams / Bookings"] } }, "/v2/organizations/{orgId}/teams/{teamId}/bookings/{bookingUid}/references": { @@ -3515,9 +3373,7 @@ } } }, - "tags": [ - "Orgs / Teams / Bookings" - ] + "tags": ["Orgs / Teams / Bookings"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/connect": { @@ -3547,9 +3403,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet" - ], + "enum": ["google-meet"], "type": "string" } } @@ -3566,9 +3420,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/auth-url": { @@ -3606,10 +3458,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -3642,9 +3491,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing": { @@ -3673,9 +3520,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/default": { @@ -3697,12 +3542,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } } @@ -3719,9 +3559,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/default": { @@ -3743,12 +3581,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } } @@ -3765,9 +3598,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/disconnect": { @@ -3789,11 +3620,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams" - ], + "enum": ["google-meet", "zoom", "msteams"], "type": "string" } } @@ -3810,9 +3637,7 @@ } } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/conferencing/{app}/oauth/callback": { @@ -3866,9 +3691,7 @@ "description": "" } }, - "tags": [ - "Orgs / Teams / Conferencing" - ] + "tags": ["Orgs / Teams / Conferencing"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types": { @@ -3942,9 +3765,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "get": { "operationId": "OrganizationsEventTypesController_getTeamEventTypes", @@ -4016,9 +3837,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}": { @@ -4082,9 +3901,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "patch": { "operationId": "OrganizationsEventTypesController_updateTeamEventType", @@ -4156,9 +3973,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] }, "delete": { "operationId": "OrganizationsEventTypesController_deleteTeamEventType", @@ -4220,9 +4035,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -4296,9 +4109,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/event-types": { @@ -4379,9 +4190,7 @@ } } }, - "tags": [ - "Orgs / Teams / Event Types" - ] + "tags": ["Orgs / Teams / Event Types"] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships": { @@ -4470,9 +4279,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "post": { "operationId": "OrganizationsTeamsMembershipsController_createOrgTeamMembership", @@ -4544,9 +4351,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] } }, "/v2/organizations/{orgId}/teams/{teamId}/memberships/{membershipId}": { @@ -4618,9 +4423,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "delete": { "operationId": "OrganizationsTeamsMembershipsController_deleteOrgTeamMembership", @@ -4690,9 +4493,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] }, "patch": { "operationId": "OrganizationsTeamsMembershipsController_updateOrgTeamMembership", @@ -4772,9 +4573,7 @@ } } }, - "tags": [ - "Orgs / Teams / Memberships" - ] + "tags": ["Orgs / Teams / Memberships"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms": { @@ -4831,10 +4630,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4844,10 +4640,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4913,9 +4706,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms" - ] + "tags": ["Orgs / Teams / Routing forms"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses": { @@ -4980,10 +4771,7 @@ "in": "query", "description": "Sort by creation time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -4993,10 +4781,7 @@ "in": "query", "description": "Sort by update time", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -5062,9 +4847,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] }, "post": { "operationId": "OrganizationsTeamsRoutingFormsResponsesController_createRoutingFormResponse", @@ -5150,10 +4933,7 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": [ - "range", - "time" - ], + "enum": ["range", "time"], "type": "string" } }, @@ -5190,9 +4970,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] } }, "/v2/organizations/{orgId}/teams/{teamId}/routing-forms/{routingFormId}/responses/{responseId}": { @@ -5256,9 +5034,7 @@ } } }, - "tags": [ - "Orgs / Teams / Routing forms / Responses" - ] + "tags": ["Orgs / Teams / Routing forms / Responses"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/connect": { @@ -5319,9 +5095,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/check": { @@ -5350,9 +5124,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/stripe/save": { @@ -5397,9 +5169,7 @@ } } }, - "tags": [ - "Orgs / Teams / Stripe" - ] + "tags": ["Orgs / Teams / Stripe"] } }, "/v2/organizations/{orgId}/teams/{teamId}/users/{userId}/schedules": { @@ -5455,9 +5225,7 @@ } } }, - "tags": [ - "Orgs / Teams / Users / Schedules" - ] + "tags": ["Orgs / Teams / Users / Schedules"] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows": { @@ -5546,9 +5314,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "post": { "operationId": "OrganizationTeamWorkflowsController_createWorkflow", @@ -5612,9 +5378,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] } }, "/v2/organizations/{orgId}/teams/{teamId}/workflows/{workflowId}": { @@ -5678,9 +5442,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "patch": { "operationId": "OrganizationTeamWorkflowsController_updateWorkflow", @@ -5752,9 +5514,7 @@ } } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] }, "delete": { "operationId": "OrganizationTeamWorkflowsController_deleteWorkflow", @@ -5809,9 +5569,7 @@ "description": "" } }, - "tags": [ - "Orgs / Teams / Workflows" - ] + "tags": ["Orgs / Teams / Workflows"] } }, "/v2/organizations/{orgId}/users": { @@ -5910,11 +5668,7 @@ "example": "NONE", "schema": { "default": "AND", - "enum": [ - "OR", - "AND", - "NONE" - ], + "enum": ["OR", "AND", "NONE"], "type": "string" } }, @@ -5944,9 +5698,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] }, "post": { "operationId": "OrganizationsUsersController_createOrganizationUser", @@ -6002,9 +5754,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] } }, "/v2/organizations/{orgId}/users/{userId}": { @@ -6078,9 +5828,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] }, "delete": { "operationId": "OrganizationsUsersController_deleteOrganizationUser", @@ -6142,9 +5890,7 @@ } } }, - "tags": [ - "Orgs / Users" - ] + "tags": ["Orgs / Users"] } }, "/v2/organizations/{orgId}/users/{userId}/bookings": { @@ -6205,13 +5951,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -6352,10 +6092,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6366,10 +6103,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6380,10 +6114,7 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6394,10 +6125,7 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6429,9 +6157,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / Bookings" - ] + "tags": ["Orgs / Users / Bookings"] } }, "/v2/organizations/{orgId}/users/{userId}/ooo": { @@ -6506,10 +6232,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6520,10 +6243,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } } @@ -6533,9 +6253,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] }, "post": { "operationId": "OrganizationsUsersOOOController_createOrganizationUserOOO", @@ -6592,9 +6310,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/users/{userId}/ooo/{oooId}": { @@ -6661,9 +6377,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] }, "delete": { "operationId": "OrganizationsUsersOOOController_deleteOrganizationUserOOO", @@ -6710,9 +6424,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/ooo": { @@ -6787,10 +6499,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6801,10 +6510,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -6824,9 +6530,7 @@ "description": "" } }, - "tags": [ - "Orgs / Users / OOO" - ] + "tags": ["Orgs / Users / OOO"] } }, "/v2/organizations/{orgId}/users/{userId}/schedules": { @@ -6892,9 +6596,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "get": { "operationId": "OrganizationsSchedulesController_getUserSchedules", @@ -6948,9 +6650,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] } }, "/v2/organizations/{orgId}/users/{userId}/schedules/{scheduleId}": { @@ -7014,9 +6714,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "patch": { "operationId": "OrganizationsSchedulesController_updateUserSchedule", @@ -7088,9 +6786,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] }, "delete": { "operationId": "OrganizationsSchedulesController_deleteUserSchedule", @@ -7152,9 +6848,7 @@ } } }, - "tags": [ - "Orgs / Users / Schedules" - ] + "tags": ["Orgs / Users / Schedules"] } }, "/v2/organizations/{orgId}/webhooks": { @@ -7235,9 +6929,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "post": { "operationId": "OrganizationsWebhooksController_createOrganizationWebhook", @@ -7301,9 +6993,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] } }, "/v2/organizations/{orgId}/webhooks/{webhookId}": { @@ -7359,9 +7049,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "delete": { "operationId": "OrganizationsWebhooksController_deleteWebhook", @@ -7415,9 +7103,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] }, "patch": { "operationId": "OrganizationsWebhooksController_updateOrgWebhook", @@ -7481,9 +7167,7 @@ } } }, - "tags": [ - "Orgs / Webhooks" - ] + "tags": ["Orgs / Webhooks"] } }, "/v2/api-keys/refresh": { @@ -7524,9 +7208,7 @@ } } }, - "tags": [ - "Api Keys" - ] + "tags": ["Api Keys"] } }, "/v2/bookings": { @@ -7579,9 +7261,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] }, "get": { "operationId": "BookingsController_2024_08_13_getBookings", @@ -7607,13 +7287,7 @@ "type": "array", "items": { "type": "string", - "enum": [ - "upcoming", - "recurring", - "past", - "cancelled", - "unconfirmed" - ] + "enum": ["upcoming", "recurring", "past", "cancelled", "unconfirmed"] } } }, @@ -7754,10 +7428,7 @@ "description": "Sort results by their start time in ascending or descending order.", "example": "?sortStart=asc OR ?sortStart=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -7768,10 +7439,7 @@ "description": "Sort results by their end time in ascending or descending order.", "example": "?sortEnd=asc OR ?sortEnd=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -7782,10 +7450,7 @@ "description": "Sort results by their creation time (when booking was made) in ascending or descending order.", "example": "?sortCreated=asc OR ?sortCreated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -7796,10 +7461,7 @@ "description": "Sort results by their updated time (for example when booking status changes) in ascending or descending order.", "example": "?sortUpdated=asc OR ?sortUpdated=desc", "schema": { - "enum": [ - "asc", - "desc" - ], + "enum": ["asc", "desc"], "type": "string" } }, @@ -7847,9 +7509,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}": { @@ -7889,9 +7549,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/recordings": { @@ -7931,9 +7589,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/transcripts": { @@ -7973,9 +7629,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reschedule": { @@ -8033,9 +7687,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/cancel": { @@ -8093,9 +7745,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/mark-absent": { @@ -8154,9 +7804,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reassign": { @@ -8205,9 +7853,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/reassign/{userId}": { @@ -8274,9 +7920,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/confirm": { @@ -8325,9 +7969,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/decline": { @@ -8386,9 +8028,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/calendar-links": { @@ -8437,9 +8077,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/bookings/{bookingUid}/references": { @@ -8505,9 +8143,7 @@ } } }, - "tags": [ - "Bookings" - ] + "tags": ["Bookings"] } }, "/v2/calendars/{calendar}/event/{eventUid}": { @@ -8521,9 +8157,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "google" - ], + "enum": ["google"], "type": "string" } }, @@ -8558,9 +8192,66 @@ } } }, - "tags": [ - "Cal Unified Calendars" - ] + "tags": ["Cal Unified Calendars"] + } + }, + "/v2/calendars/{calendar}/events/{eventUid}": { + "patch": { + "operationId": "CalUnifiedCalendarsController_updateCalendarEvent", + "summary": "Update meeting details in calendar", + "description": "Updates event information in the specified calendar provider", + "parameters": [ + { + "name": "calendar", + "required": true, + "in": "path", + "schema": { + "enum": ["google"], + "type": "string" + } + }, + { + "name": "eventUid", + "required": true, + "in": "path", + "description": "The Google Calendar event ID. You can retrieve this by getting booking references from the following endpoints:\n\n- For team events: https://cal.com/docs/api-reference/v2/orgs-teams-bookings/get-booking-references-for-a-booking\n\n- For user events: https://cal.com/docs/api-reference/v2/bookings/get-booking-references-for-a-booking", + "schema": { + "type": "string" + } + }, + { + "name": "Authorization", + "in": "header", + "description": "value must be `Bearer ` where `` is api key prefixed with cal_ or managed user access token", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateUnifiedCalendarEventInput" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GetUnifiedCalendarEventOutput" + } + } + } + } + }, + "tags": ["Cal Unified Calendars"] } }, "/v2/calendars/ics-feed/save": { @@ -8600,9 +8291,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/ics-feed/check": { @@ -8632,9 +8321,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/busy-times": { @@ -8711,9 +8398,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars": { @@ -8743,9 +8428,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/connect": { @@ -8767,10 +8450,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "office365", - "google" - ], + "enum": ["office365", "google"], "type": "string" } }, @@ -8804,9 +8484,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/save": { @@ -8835,10 +8513,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "office365", - "google" - ], + "enum": ["office365", "google"], "type": "string" } } @@ -8848,9 +8523,7 @@ "description": "" } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/credentials": { @@ -8863,9 +8536,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple" - ], + "enum": ["apple"], "type": "string" } }, @@ -8894,9 +8565,7 @@ "description": "" } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/check": { @@ -8909,11 +8578,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple", - "google", - "office365" - ], + "enum": ["apple", "google", "office365"], "type": "string" } }, @@ -8939,9 +8604,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/calendars/{calendar}/disconnect": { @@ -8954,11 +8617,7 @@ "required": true, "in": "path", "schema": { - "enum": [ - "apple", - "google", - "office365" - ], + "enum": ["apple", "google", "office365"], "type": "string" } }, @@ -8994,9 +8653,7 @@ } } }, - "tags": [ - "Calendars" - ] + "tags": ["Calendars"] } }, "/v2/conferencing/{app}/connect": { @@ -9010,9 +8667,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet" - ], + "enum": ["google-meet"], "type": "string" } }, @@ -9038,9 +8693,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/oauth/auth-url": { @@ -9063,10 +8716,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -9099,9 +8749,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/oauth/callback": { @@ -9123,10 +8771,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "zoom", - "msteams" - ], + "enum": ["zoom", "msteams"], "type": "string" } }, @@ -9144,9 +8789,7 @@ "description": "" } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing": { @@ -9176,9 +8819,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/default": { @@ -9192,12 +8833,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams", - "daily-video" - ], + "enum": ["google-meet", "zoom", "msteams", "daily-video"], "type": "string" } }, @@ -9223,9 +8859,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/default": { @@ -9255,9 +8889,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/conferencing/{app}/disconnect": { @@ -9271,11 +8903,7 @@ "in": "path", "description": "Conferencing application type", "schema": { - "enum": [ - "google-meet", - "zoom", - "msteams" - ], + "enum": ["google-meet", "zoom", "msteams"], "type": "string" } }, @@ -9301,9 +8929,7 @@ } } }, - "tags": [ - "Conferencing" - ] + "tags": ["Conferencing"] } }, "/v2/destination-calendars": { @@ -9343,9 +8969,7 @@ } } }, - "tags": [ - "Destination Calendars" - ] + "tags": ["Destination Calendars"] } }, "/v2/event-types": { @@ -9395,9 +9019,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "get": { "operationId": "EventTypesController_2024_06_14_getEventTypes", @@ -9471,9 +9093,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] } }, "/v2/event-types/{eventTypeId}": { @@ -9521,9 +9141,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "patch": { "operationId": "EventTypesController_2024_06_14_updateEventType", @@ -9579,9 +9197,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] }, "delete": { "operationId": "EventTypesController_2024_06_14_deleteEventType", @@ -9627,9 +9243,7 @@ } } }, - "tags": [ - "Event Types" - ] + "tags": ["Event Types"] } }, "/v2/event-types/{eventTypeId}/webhooks": { @@ -9677,9 +9291,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhooks", @@ -9740,9 +9352,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "delete": { "operationId": "EventTypeWebhooksController_deleteAllEventTypeWebhooks", @@ -9778,9 +9388,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] } }, "/v2/event-types/{eventTypeId}/webhooks/{webhookId}": { @@ -9828,9 +9436,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "get": { "operationId": "EventTypeWebhooksController_getEventTypeWebhook", @@ -9858,9 +9464,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] }, "delete": { "operationId": "EventTypeWebhooksController_deleteEventTypeWebhook", @@ -9888,9 +9492,7 @@ } } }, - "tags": [ - "Event Types / Webhooks" - ] + "tags": ["Event Types / Webhooks"] } }, "/v2/event-types/{eventTypeId}/private-links": { @@ -9938,9 +9540,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "get": { "operationId": "EventTypesPrivateLinksController_getPrivateLinks", @@ -9976,9 +9576,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/event-types/{eventTypeId}/private-links/{linkId}": { @@ -10034,9 +9632,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] }, "delete": { "operationId": "EventTypesPrivateLinksController_deletePrivateLink", @@ -10080,9 +9676,7 @@ } } }, - "tags": [ - "Event Types Private Links" - ] + "tags": ["Event Types Private Links"] } }, "/v2/organizations/{orgId}/organizations": { @@ -10140,9 +9734,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "get": { "operationId": "OrganizationsOrganizationsController_getOrganizations", @@ -10243,9 +9835,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] } }, "/v2/organizations/{orgId}/organizations/{managedOrganizationId}": { @@ -10293,9 +9883,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "patch": { "operationId": "OrganizationsOrganizationsController_updateOrganization", @@ -10359,9 +9947,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] }, "delete": { "operationId": "OrganizationsOrganizationsController_deleteOrganization", @@ -10407,9 +9993,7 @@ } } }, - "tags": [ - "Managed Orgs" - ] + "tags": ["Managed Orgs"] } }, "/v2/me": { @@ -10439,9 +10023,7 @@ } } }, - "tags": [ - "Me" - ] + "tags": ["Me"] }, "patch": { "operationId": "MeController_updateMe", @@ -10479,9 +10061,7 @@ } } }, - "tags": [ - "Me" - ] + "tags": ["Me"] } }, "/v2/oauth-clients": { @@ -10521,9 +10101,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "get": { "operationId": "OAuthClientsController_getOAuthClients", @@ -10551,9 +10129,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] } }, "/v2/oauth-clients/{clientId}": { @@ -10591,9 +10167,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "patch": { "operationId": "OAuthClientsController_updateOAuthClient", @@ -10639,9 +10213,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] }, "delete": { "operationId": "OAuthClientsController_deleteOAuthClient", @@ -10677,9 +10249,7 @@ } } }, - "tags": [ - "OAuth Clients" - ] + "tags": ["OAuth Clients"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -10720,9 +10290,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -10763,9 +10331,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -10814,9 +10380,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -10865,9 +10429,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails": { @@ -10930,9 +10492,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones": { @@ -10995,9 +10555,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/emails/{id}": { @@ -11043,9 +10601,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/organizations/{orgId}/teams/{teamId}/verified-resources/phones/{id}": { @@ -11091,9 +10647,7 @@ } } }, - "tags": [ - "Organization Team Verified Resources" - ] + "tags": ["Organization Team Verified Resources"] } }, "/v2/routing-forms/{routingFormId}/calculate-slots": { @@ -11158,10 +10712,7 @@ "description": "Format of slot times in response. Use 'range' to get start and end times.", "example": "range", "schema": { - "enum": [ - "range", - "time" - ], + "enum": ["range", "time"], "type": "string" } }, @@ -11196,9 +10747,7 @@ } } }, - "tags": [ - "Routing forms" - ] + "tags": ["Routing forms"] } }, "/v2/schedules": { @@ -11249,9 +10798,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "get": { "operationId": "SchedulesController_2024_06_11_getSchedules", @@ -11290,9 +10837,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/schedules/default": { @@ -11333,9 +10878,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/schedules/{scheduleId}": { @@ -11383,9 +10926,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "patch": { "operationId": "SchedulesController_2024_06_11_updateSchedule", @@ -11441,9 +10982,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] }, "delete": { "operationId": "SchedulesController_2024_06_11_deleteSchedule", @@ -11489,9 +11028,7 @@ } } }, - "tags": [ - "Schedules" - ] + "tags": ["Schedules"] } }, "/v2/selected-calendars": { @@ -11531,9 +11068,7 @@ } } }, - "tags": [ - "Selected Calendars" - ] + "tags": ["Selected Calendars"] }, "delete": { "operationId": "SelectedCalendarsController_deleteSelectedCalendar", @@ -11593,9 +11128,7 @@ } } }, - "tags": [ - "Selected Calendars" - ] + "tags": ["Selected Calendars"] } }, "/v2/slots": { @@ -11798,9 +11331,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/slots/reservations": { @@ -11860,9 +11391,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/slots/reservations/{uid}": { @@ -11901,9 +11430,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] }, "patch": { "operationId": "SlotsController_2024_09_04_updateReservedSlot", @@ -11950,9 +11477,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] }, "delete": { "operationId": "SlotsController_2024_09_04_deleteReservedSlot", @@ -11992,9 +11517,7 @@ } } }, - "tags": [ - "Slots" - ] + "tags": ["Slots"] } }, "/v2/stripe/connect": { @@ -12024,9 +11547,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/stripe/save": { @@ -12063,9 +11584,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/stripe/check": { @@ -12095,9 +11614,7 @@ } } }, - "tags": [ - "Stripe" - ] + "tags": ["Stripe"] } }, "/v2/teams": { @@ -12137,9 +11654,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "get": { "operationId": "TeamsController_getTeams", @@ -12167,9 +11682,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] } }, "/v2/teams/{teamId}": { @@ -12207,9 +11720,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "patch": { "operationId": "TeamsController_updateTeam", @@ -12255,9 +11766,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] }, "delete": { "operationId": "TeamsController_deleteTeam", @@ -12293,9 +11802,7 @@ } } }, - "tags": [ - "Teams" - ] + "tags": ["Teams"] } }, "/v2/teams/{teamId}/event-types": { @@ -12343,9 +11850,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "get": { "operationId": "TeamsEventTypesController_getTeamEventTypes", @@ -12390,9 +11895,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}": { @@ -12438,9 +11941,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "patch": { "operationId": "TeamsEventTypesController_updateTeamEventType", @@ -12494,9 +11995,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] }, "delete": { "operationId": "TeamsEventTypesController_deleteTeamEventType", @@ -12540,9 +12039,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/event-types/{eventTypeId}/create-phone-call": { @@ -12598,9 +12095,7 @@ } } }, - "tags": [ - "Teams / Event Types" - ] + "tags": ["Teams / Event Types"] } }, "/v2/teams/{teamId}/memberships": { @@ -12648,9 +12143,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "get": { "operationId": "TeamsMembershipsController_getTeamMemberships", @@ -12711,9 +12204,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] } }, "/v2/teams/{teamId}/memberships/{membershipId}": { @@ -12759,9 +12250,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "patch": { "operationId": "TeamsMembershipsController_updateTeamMembership", @@ -12815,9 +12304,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] }, "delete": { "operationId": "TeamsMembershipsController_deleteTeamMembership", @@ -12861,9 +12348,7 @@ } } }, - "tags": [ - "Teams / Memberships" - ] + "tags": ["Teams / Memberships"] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/request": { @@ -12904,9 +12389,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/request": { @@ -12947,9 +12430,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails/verification-code/verify": { @@ -12998,9 +12479,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/verification-code/verify": { @@ -13049,9 +12528,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails": { @@ -13114,9 +12591,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones": { @@ -13179,9 +12654,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/emails/{id}": { @@ -13227,9 +12700,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/teams/{teamId}/verified-resources/phones/{id}": { @@ -13275,9 +12746,7 @@ } } }, - "tags": [ - "Teams Verified Resources" - ] + "tags": ["Teams Verified Resources"] } }, "/v2/verified-resources/emails/verification-code/request": { @@ -13318,9 +12787,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/verification-code/request": { @@ -13361,9 +12828,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails/verification-code/verify": { @@ -13404,9 +12869,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/verification-code/verify": { @@ -13447,9 +12910,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails": { @@ -13504,9 +12965,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones": { @@ -13561,9 +13020,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/emails/{id}": { @@ -13601,9 +13058,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/verified-resources/phones/{id}": { @@ -13641,9 +13096,7 @@ } } }, - "tags": [ - "Verified Resources" - ] + "tags": ["Verified Resources"] } }, "/v2/webhooks": { @@ -13683,9 +13136,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "get": { "operationId": "WebhooksController_getWebhooks", @@ -13739,9 +13190,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] } }, "/v2/webhooks/{webhookId}": { @@ -13789,9 +13238,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "get": { "operationId": "WebhooksController_getWebhook", @@ -13819,9 +13266,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] }, "delete": { "operationId": "WebhooksController_deleteWebhook", @@ -13857,9 +13302,7 @@ } } }, - "tags": [ - "Webhooks" - ] + "tags": ["Webhooks"] } } }, @@ -14002,10 +13445,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -14014,10 +13454,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateManagedUserInput": { "type": "object", @@ -14033,25 +13470,14 @@ }, "timeFormat": { "type": "number", - "enum": [ - 12, - 24 - ], + "enum": [12, 24], "example": 12, "description": "Must be a number 12 or 24" }, "weekStart": { "type": "string", "example": "Monday", - "enum": [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" - ] + "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] }, "timeZone": { "type": "string", @@ -14125,10 +13551,7 @@ } } }, - "required": [ - "email", - "name" - ] + "required": ["email", "name"] }, "CreateManagedUserData": { "type": "object", @@ -14151,13 +13574,7 @@ "type": "number" } }, - "required": [ - "accessToken", - "refreshToken", - "user", - "accessTokenExpiresAt", - "refreshTokenExpiresAt" - ] + "required": ["accessToken", "refreshToken", "user", "accessTokenExpiresAt", "refreshTokenExpiresAt"] }, "CreateManagedUserOutput": { "type": "object", @@ -14165,10 +13582,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/CreateManagedUserData" @@ -14177,10 +13591,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetManagedUserOutput": { "type": "object", @@ -14188,19 +13599,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ManagedUserOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateManagedUserInput": { "type": "object", @@ -14213,10 +13618,7 @@ }, "timeFormat": { "type": "number", - "enum": [ - 12, - 24 - ], + "enum": [12, 24], "example": 12, "description": "Must be 12 or 24" }, @@ -14225,15 +13627,7 @@ }, "weekStart": { "type": "string", - "enum": [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" - ], + "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], "example": "Monday" }, "timeZone": { @@ -14325,12 +13719,7 @@ "type": "number" } }, - "required": [ - "accessToken", - "refreshToken", - "accessTokenExpiresAt", - "refreshTokenExpiresAt" - ] + "required": ["accessToken", "refreshToken", "accessTokenExpiresAt", "refreshTokenExpiresAt"] }, "KeysResponseDto": { "type": "object", @@ -14338,19 +13727,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/KeysDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOAuthClientInput": { "type": "object", @@ -14410,11 +13793,7 @@ "description": "If true and if managed user has calendar connected, calendar events will be created. Disable it if you manually create calendar events. Default to true." } }, - "required": [ - "name", - "redirectUris", - "permissions" - ] + "required": ["name", "redirectUris", "permissions"] }, "CreateOAuthClientOutput": { "type": "object", @@ -14428,20 +13807,14 @@ "example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoib2F1dGgtY2xpZW50Iiwi" } }, - "required": [ - "clientId", - "clientSecret" - ] + "required": ["clientId", "clientSecret"] }, "CreateOAuthClientResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { @@ -14456,10 +13829,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "PlatformOAuthClientDto": { "type": "object", @@ -14494,19 +13864,14 @@ "PROFILE_WRITE" ] }, - "example": [ - "BOOKING_READ", - "BOOKING_WRITE" - ] + "example": ["BOOKING_READ", "BOOKING_WRITE"] }, "logo": { "type": "object", "example": "https://example.com/logo.png" }, "redirectUris": { - "example": [ - "https://example.com/callback" - ], + "example": ["https://example.com/callback"], "type": "array", "items": { "type": "string" @@ -14567,10 +13932,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -14579,10 +13941,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetOAuthClientResponseDto": { "type": "object", @@ -14590,19 +13949,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/PlatformOAuthClientDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOAuthClientInput": { "type": "object", @@ -14649,9 +14002,7 @@ "description": "Managed user's refresh token." } }, - "required": [ - "refreshToken" - ] + "required": ["refreshToken"] }, "RefreshApiKeyInput": { "type": "object", @@ -14677,9 +14028,7 @@ "type": "string" } }, - "required": [ - "apiKey" - ] + "required": ["apiKey"] }, "RefreshApiKeyOutput": { "type": "object", @@ -14687,48 +14036,31 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ApiKeyOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "BookerLayouts_2024_06_14": { "type": "object", "properties": { "defaultLayout": { "type": "string", - "enum": [ - "month", - "week", - "column" - ] + "enum": ["month", "week", "column"] }, "enabledLayouts": { "type": "array", "description": "Array of valid layouts - month, week or column", "items": { "type": "string", - "enum": [ - "month", - "week", - "column" - ] + "enum": ["month", "week", "column"] } } }, - "required": [ - "defaultLayout", - "enabledLayouts" - ] + "required": ["defaultLayout", "enabledLayouts"] }, "EventTypeColor_2024_06_14": { "type": "object", @@ -14744,10 +14076,7 @@ "example": "#fafafa" } }, - "required": [ - "lightThemeHex", - "darkThemeHex" - ] + "required": ["lightThemeHex", "darkThemeHex"] }, "DestinationCalendar_2024_06_14": { "type": "object", @@ -14761,10 +14090,7 @@ "description": "The external ID of the destination calendar. Refer to the /api/v2/calendars endpoint to retrieve the external IDs of your connected calendars." } }, - "required": [ - "integration", - "externalId" - ] + "required": ["integration", "externalId"] }, "InputAddressLocation_2024_06_14": { "type": "object", @@ -14782,11 +14108,7 @@ "type": "boolean" } }, - "required": [ - "type", - "address", - "public" - ] + "required": ["type", "address", "public"] }, "InputLinkLocation_2024_06_14": { "type": "object", @@ -14804,11 +14126,7 @@ "type": "boolean" } }, - "required": [ - "type", - "link", - "public" - ] + "required": ["type", "link", "public"] }, "InputIntegrationLocation_2024_06_14": { "type": "object", @@ -14821,18 +14139,10 @@ "integration": { "type": "string", "example": "cal-video", - "enum": [ - "cal-video", - "google-meet", - "office365-video", - "zoom" - ] + "enum": ["cal-video", "google-meet", "office365-video", "zoom"] } }, - "required": [ - "type", - "integration" - ] + "required": ["type", "integration"] }, "InputPhoneLocation_2024_06_14": { "type": "object", @@ -14850,11 +14160,7 @@ "type": "boolean" } }, - "required": [ - "type", - "phone", - "public" - ] + "required": ["type", "phone", "public"] }, "PhoneFieldInput_2024_06_14": { "type": "object", @@ -14887,14 +14193,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "AddressFieldInput_2024_06_14": { "type": "object", @@ -14929,14 +14228,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "TextFieldInput_2024_06_14": { "type": "object", @@ -14971,14 +14263,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "NumberFieldInput_2024_06_14": { "type": "object", @@ -15013,14 +14298,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "TextAreaFieldInput_2024_06_14": { "type": "object", @@ -15055,14 +14333,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "SelectFieldInput_2024_06_14": { "type": "object", @@ -15089,10 +14360,7 @@ "example": "Select..." }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -15107,15 +14375,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "options", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "options", "hidden"] }, "MultiSelectFieldInput_2024_06_14": { "type": "object", @@ -15138,10 +14398,7 @@ "type": "boolean" }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -15156,14 +14413,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden" - ] + "required": ["type", "slug", "label", "required", "options", "hidden"] }, "MultiEmailFieldInput_2024_06_14": { "type": "object", @@ -15198,14 +14448,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "CheckboxGroupFieldInput_2024_06_14": { "type": "object", @@ -15228,10 +14471,7 @@ "type": "boolean" }, "options": { - "example": [ - "Checkbox 1", - "Checkbox 2" - ], + "example": ["Checkbox 1", "Checkbox 2"], "type": "array", "items": { "type": "string" @@ -15246,14 +14486,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden" - ] + "required": ["type", "slug", "label", "required", "options", "hidden"] }, "RadioGroupFieldInput_2024_06_14": { "type": "object", @@ -15276,10 +14509,7 @@ "type": "boolean" }, "options": { - "example": [ - "Radio 1", - "Radio 2" - ], + "example": ["Radio 1", "Radio 2"], "type": "array", "items": { "type": "string" @@ -15294,14 +14524,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden" - ] + "required": ["type", "slug", "label", "required", "options", "hidden"] }, "BooleanFieldInput_2024_06_14": { "type": "object", @@ -15332,13 +14555,7 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden" - ] + "required": ["type", "slug", "label", "required", "hidden"] }, "UrlFieldInput_2024_06_14": { "type": "object", @@ -15373,25 +14590,14 @@ "description": "If true show under event type settings but don't show this booking field in the Booker. If false show in both." } }, - "required": [ - "type", - "slug", - "label", - "required", - "placeholder", - "hidden" - ] + "required": ["type", "slug", "label", "required", "placeholder", "hidden"] }, "BusinessDaysWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": [ - "businessDays", - "calendarDays", - "range" - ], + "enum": ["businessDays", "calendarDays", "range"], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { @@ -15405,21 +14611,14 @@ "description": "\n Determines the behavior of the booking window:\n - If **true**, the window is rolling. This means the number of available days will always be equal the specified 'value' \n and adjust dynamically as bookings are made. For example, if 'value' is 3 and availability is only on Mondays, \n a booker attempting to schedule on November 10 will see slots on November 11, 18, and 25. As one of these days \n becomes fully booked, a new day (e.g., December 2) will open up to ensure 3 available days are always visible.\n - If **false**, the window is fixed. This means the booking window only considers the next 'value' days from the\n moment someone is trying to book. For example, if 'value' is 3, availability is only on Mondays, and the current \n date is November 10, the booker will only see slots on November 11 because the window is restricted to the next \n 3 calendar days (November 10–12).\n " } }, - "required": [ - "type", - "value" - ] + "required": ["type", "value"] }, "CalendarDaysWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": [ - "businessDays", - "calendarDays", - "range" - ], + "enum": ["businessDays", "calendarDays", "range"], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { @@ -15433,28 +14632,18 @@ "description": "\n Determines the behavior of the booking window:\n - If **true**, the window is rolling. This means the number of available days will always be equal the specified 'value' \n and adjust dynamically as bookings are made. For example, if 'value' is 3 and availability is only on Mondays, \n a booker attempting to schedule on November 10 will see slots on November 11, 18, and 25. As one of these days \n becomes fully booked, a new day (e.g., December 2) will open up to ensure 3 available days are always visible.\n - If **false**, the window is fixed. This means the booking window only considers the next 'value' days from the\n moment someone is trying to book. For example, if 'value' is 3, availability is only on Mondays, and the current \n date is November 10, the booker will only see slots on November 11 because the window is restricted to the next \n 3 calendar days (November 10–12).\n " } }, - "required": [ - "type", - "value" - ] + "required": ["type", "value"] }, "RangeWindow_2024_06_14": { "type": "object", "properties": { "type": { "type": "string", - "enum": [ - "businessDays", - "calendarDays", - "range" - ], + "enum": ["businessDays", "calendarDays", "range"], "description": "Whether the window should be business days, calendar days or a range of dates" }, "value": { - "example": [ - "2030-09-05", - "2030-09-09" - ], + "example": ["2030-09-05", "2030-09-09"], "description": "Date range for when this event can be booked.", "type": "array", "items": { @@ -15462,10 +14651,7 @@ } } }, - "required": [ - "type", - "value" - ] + "required": ["type", "value"] }, "BaseBookingLimitsCount_2024_06_14": { "type": "object", @@ -15506,9 +14692,7 @@ "default": false } }, - "required": [ - "disabled" - ] + "required": ["disabled"] }, "BaseBookingLimitsDuration_2024_06_14": { "type": "object", @@ -15550,18 +14734,10 @@ }, "frequency": { "type": "string", - "enum": [ - "yearly", - "monthly", - "weekly" - ] + "enum": ["yearly", "monthly", "weekly"] } }, - "required": [ - "interval", - "occurrences", - "frequency" - ] + "required": ["interval", "occurrences", "frequency"] }, "NoticeThreshold_2024_06_14": { "type": "object", @@ -15577,10 +14753,7 @@ "example": 30 } }, - "required": [ - "unit", - "count" - ] + "required": ["unit", "count"] }, "BaseConfirmationPolicy_2024_06_14": { "type": "object", @@ -15588,10 +14761,7 @@ "type": { "type": "string", "description": "The policy that determines when confirmation is required", - "enum": [ - "always", - "time" - ], + "enum": ["always", "time"], "example": "always" }, "noticeThreshold": { @@ -15607,10 +14777,7 @@ "description": "Unconfirmed bookings still block calendar slots." } }, - "required": [ - "type", - "blockUnconfirmedBookingsInBooker" - ] + "required": ["type", "blockUnconfirmedBookingsInBooker"] }, "Seats_2024_06_14": { "type": "object", @@ -15631,11 +14798,7 @@ "example": true } }, - "required": [ - "seatsPerTimeSlot", - "showAttendeeInfo", - "showAvailabilityCount" - ] + "required": ["seatsPerTimeSlot", "showAttendeeInfo", "showAvailabilityCount"] }, "InputAttendeeAddressLocation_2024_06_14": { "type": "object", @@ -15646,9 +14809,7 @@ "description": "only allowed value for type is `attendeeAddress`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "InputAttendeePhoneLocation_2024_06_14": { "type": "object", @@ -15659,9 +14820,7 @@ "description": "only allowed value for type is `attendeePhone`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "InputAttendeeDefinedLocation_2024_06_14": { "type": "object", @@ -15672,9 +14831,7 @@ "description": "only allowed value for type is `attendeeDefined`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "NameDefaultFieldInput_2024_06_14": { "type": "object", @@ -15695,11 +14852,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&name=bob`, the name field will be prefilled with this value and disabled. In case of Booker atom need to pass 'name' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{name: 'bob'}}`. See guide https://cal.com/docs/platform/guides/booking-fields" } }, - "required": [ - "type", - "label", - "placeholder" - ] + "required": ["type", "label", "placeholder"] }, "EmailDefaultFieldInput_2024_06_14": { "type": "object", @@ -15728,11 +14881,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&email=bob@gmail.com`, the email field will be prefilled with this value and disabled. In case of Booker atom need to pass 'email' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{email: 'bob@gmail.com'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": [ - "type", - "label", - "placeholder" - ] + "required": ["type", "label", "placeholder"] }, "TitleDefaultFieldInput_2024_06_14": { "type": "object", @@ -15760,9 +14909,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&title=journey`, the title field will be prefilled with this value and disabled. In case of Booker atom need to pass 'title' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{title: 'very important meeting'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "LocationDefaultFieldInput_2024_06_14": { "type": "object", @@ -15776,9 +14923,7 @@ "type": "string" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "NotesDefaultFieldInput_2024_06_14": { "type": "object", @@ -15806,9 +14951,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `¬es=journey`, the notes field will be prefilled with this value and disabled. In case of Booker atom need to pass 'notes' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{notes: 'bring notebook and paper'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "GuestsDefaultFieldInput_2024_06_14": { "type": "object", @@ -15836,9 +14979,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&guests=bob@cal.com`, the guests field will be prefilled with this value and disabled. In case of Booker atom need to pass 'guests' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{guests: ['bob@gmail.com', 'alice@gmail.com']}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "RescheduleReasonDefaultFieldInput_2024_06_14": { "type": "object", @@ -15866,9 +15007,7 @@ "description": "Disable this booking field if the URL contains query parameter with key equal to the slug and prefill it with the provided value. For example, if URL contains query parameter `&rescheduleReason=travel`, the rescheduleReason field will be prefilled with this value and disabled. In case of Booker atom need to pass 'rescheduleReason' to defaultFormValues prop with the desired value e.g. `defaultFormValues={{rescheduleReason: 'bob'}}`. See guide https://cal.com/docs/platform/guides/booking-field" } }, - "required": [ - "slug" - ] + "required": ["slug"] }, "InputOrganizersDefaultApp_2024_06_14": { "type": "object", @@ -15879,9 +15018,7 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "CalVideoSettings": { "type": "object", @@ -15912,11 +15049,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -16185,11 +15318,7 @@ } } }, - "required": [ - "lengthInMinutes", - "title", - "slug" - ] + "required": ["lengthInMinutes", "title", "slug"] }, "OutputAddressLocation_2024_06_14": { "type": "object", @@ -16218,11 +15347,7 @@ "type": "boolean" } }, - "required": [ - "type", - "address", - "public" - ] + "required": ["type", "address", "public"] }, "OutputLinkLocation_2024_06_14": { "type": "object", @@ -16250,11 +15375,7 @@ "type": "boolean" } }, - "required": [ - "type", - "link", - "public" - ] + "required": ["type", "link", "public"] }, "OutputIntegrationLocation_2024_06_14": { "type": "object", @@ -16320,10 +15441,7 @@ "description": "Credential ID associated with the integration" } }, - "required": [ - "type", - "integration" - ] + "required": ["type", "integration"] }, "OutputPhoneLocation_2024_06_14": { "type": "object", @@ -16351,11 +15469,7 @@ "type": "boolean" } }, - "required": [ - "type", - "phone", - "public" - ] + "required": ["type", "phone", "public"] }, "OutputOrganizersDefaultAppLocation_2024_06_14": { "type": "object", @@ -16378,9 +15492,7 @@ "description": "only allowed value for type is `organizersDefaultApp`" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OutputUnknownLocation_2024_06_14": { "type": "object", @@ -16406,10 +15518,7 @@ "type": "string" } }, - "required": [ - "type", - "location" - ] + "required": ["type", "location"] }, "EmailDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16466,11 +15575,7 @@ "default": "email" } }, - "required": [ - "type", - "isDefault", - "slug" - ] + "required": ["type", "isDefault", "slug"] }, "NameDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16521,12 +15626,7 @@ "type": "boolean" } }, - "required": [ - "type", - "isDefault", - "slug", - "required" - ] + "required": ["type", "isDefault", "slug", "required"] }, "LocationDefaultFieldOutput_2024_06_14": { "type": "object", @@ -16557,26 +15657,14 @@ "type": "string" } }, - "required": [ - "isDefault", - "slug", - "type", - "required", - "hidden" - ] + "required": ["isDefault", "slug", "type", "required", "hidden"] }, "RescheduleReasonDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": [ - "title", - "location", - "notes", - "guests", - "rescheduleReason" - ], + "enum": ["title", "location", "notes", "guests", "rescheduleReason"], "example": "rescheduleReason", "description": "only allowed value for type is `rescheduleReason`", "default": "rescheduleReason" @@ -16609,24 +15697,14 @@ "default": "textarea" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "required": ["slug", "isDefault", "type"] }, "TitleDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": [ - "title", - "location", - "notes", - "guests", - "rescheduleReason" - ], + "enum": ["title", "location", "notes", "guests", "rescheduleReason"], "example": "title", "description": "only allowed value for type is `title`", "default": "title" @@ -16659,24 +15737,14 @@ "default": "text" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "required": ["slug", "isDefault", "type"] }, "NotesDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": [ - "title", - "location", - "notes", - "guests", - "rescheduleReason" - ], + "enum": ["title", "location", "notes", "guests", "rescheduleReason"], "example": "notes", "description": "only allowed value for type is `notes`", "default": "notes" @@ -16709,24 +15777,14 @@ "default": "textarea" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "required": ["slug", "isDefault", "type"] }, "GuestsDefaultFieldOutput_2024_06_14": { "type": "object", "properties": { "slug": { "type": "string", - "enum": [ - "title", - "location", - "notes", - "guests", - "rescheduleReason" - ], + "enum": ["title", "location", "notes", "guests", "rescheduleReason"], "example": "guests", "description": "only allowed value for type is `guests`", "default": "guests" @@ -16759,11 +15817,7 @@ "default": "multiemail" } }, - "required": [ - "slug", - "isDefault", - "type" - ] + "required": ["slug", "isDefault", "type"] }, "AddressFieldOutput_2024_06_14": { "type": "object", @@ -16820,14 +15874,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "BooleanFieldOutput_2024_06_14": { "type": "object", @@ -16880,14 +15927,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "CheckboxGroupFieldOutput_2024_06_14": { "type": "object", @@ -16926,10 +15966,7 @@ "type": "boolean" }, "options": { - "example": [ - "Checkbox 1", - "Checkbox 2" - ], + "example": ["Checkbox 1", "Checkbox 2"], "type": "array", "items": { "type": "string" @@ -16950,15 +15987,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "MultiEmailFieldOutput_2024_06_14": { "type": "object", @@ -17015,14 +16044,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "MultiSelectFieldOutput_2024_06_14": { "type": "object", @@ -17061,10 +16083,7 @@ "type": "boolean" }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -17085,15 +16104,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "UrlFieldOutput_2024_06_14": { "type": "object", @@ -17150,14 +16161,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "NumberFieldOutput_2024_06_14": { "type": "object", @@ -17214,14 +16218,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "PhoneFieldOutput_2024_06_14": { "type": "object", @@ -17276,14 +16273,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "RadioGroupFieldOutput_2024_06_14": { "type": "object", @@ -17322,10 +16312,7 @@ "type": "boolean" }, "options": { - "example": [ - "Radio 1", - "Radio 2" - ], + "example": ["Radio 1", "Radio 2"], "type": "array", "items": { "type": "string" @@ -17346,15 +16333,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "SelectFieldOutput_2024_06_14": { "type": "object", @@ -17397,10 +16376,7 @@ "example": "Select..." }, "options": { - "example": [ - "Option 1", - "Option 2" - ], + "example": ["Option 1", "Option 2"], "type": "array", "items": { "type": "string" @@ -17421,15 +16397,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "options", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "options", "hidden", "isDefault"] }, "TextAreaFieldOutput_2024_06_14": { "type": "object", @@ -17486,14 +16454,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "TextFieldOutput_2024_06_14": { "type": "object", @@ -17550,14 +16511,7 @@ "example": false } }, - "required": [ - "type", - "slug", - "label", - "required", - "hidden", - "isDefault" - ] + "required": ["type", "slug", "label", "required", "hidden", "isDefault"] }, "EventTypeOutput_2024_06_14": { "type": "object", @@ -17571,11 +16525,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -17855,30 +16805,21 @@ "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { "$ref": "#/components/schemas/EventTypeOutput_2024_06_14" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetEventTypeOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { @@ -17890,20 +16831,14 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetEventTypesOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { @@ -17913,10 +16848,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateEventTypeInput_2024_06_14": { "type": "object", @@ -17926,11 +16858,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -18202,20 +17130,14 @@ "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { "$ref": "#/components/schemas/EventTypeOutput_2024_06_14" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteData_2024_06_14": { "type": "object", @@ -18236,32 +17158,21 @@ "type": "string" } }, - "required": [ - "id", - "lengthInMinutes", - "title", - "slug" - ] + "required": ["id", "lengthInMinutes", "title", "slug"] }, "DeleteEventTypeOutput_2024_06_14": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ], + "enum": ["success", "error"], "example": "success" }, "data": { "$ref": "#/components/schemas/DeleteData_2024_06_14" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SelectedCalendarsInputDto": { "type": "object", @@ -18279,11 +17190,7 @@ "type": "string" } }, - "required": [ - "integration", - "externalId", - "credentialId" - ] + "required": ["integration", "externalId", "credentialId"] }, "SelectedCalendarOutputDto": { "type": "object", @@ -18302,12 +17209,7 @@ "nullable": true } }, - "required": [ - "userId", - "integration", - "externalId", - "credentialId" - ] + "required": ["userId", "integration", "externalId", "credentialId"] }, "SelectedCalendarOutputResponseDto": { "type": "object", @@ -18315,19 +17217,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/SelectedCalendarOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgTeamOutputDto": { "type": "object", @@ -18403,11 +17299,7 @@ "default": "Sunday" } }, - "required": [ - "id", - "name", - "isOrganization" - ] + "required": ["id", "name", "isOrganization"] }, "OrgTeamsOutputResponseDto": { "type": "object", @@ -18415,10 +17307,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18427,10 +17316,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgMeTeamsOutputResponseDto": { "type": "object", @@ -18438,10 +17324,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18450,10 +17333,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgTeamOutputResponseDto": { "type": "object", @@ -18461,19 +17341,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrgTeamOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrgTeamDto": { "type": "object", @@ -18638,40 +17512,19 @@ "description": "If you are a platform customer, don't pass 'false', because then team creator won't be able to create team event types." } }, - "required": [ - "name" - ] + "required": ["name"] }, "ScheduleAvailabilityInput_2024_06_11": { "type": "object", "properties": { "days": { "type": "array", - "enum": [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" - ], - "example": [ - "Monday", - "Tuesday" - ], + "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + "example": ["Monday", "Tuesday"], "description": "Array of days when schedule is active.", "items": { "type": "string", - "enum": [ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" - ] + "enum": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] } }, "startTime": { @@ -18687,11 +17540,7 @@ "description": "endTime must be a valid time in format HH:MM e.g. 15:00" } }, - "required": [ - "days", - "startTime", - "endTime" - ] + "required": ["days", "startTime", "endTime"] }, "ScheduleOverrideInput_2024_06_11": { "type": "object", @@ -18713,11 +17562,7 @@ "description": "endTime must be a valid time in format HH:MM e.g. 13:00" } }, - "required": [ - "date", - "startTime", - "endTime" - ] + "required": ["date", "startTime", "endTime"] }, "ScheduleOutput_2024_06_11": { "type": "object", @@ -18741,18 +17586,12 @@ "availability": { "example": [ { - "days": [ - "Monday", - "Tuesday" - ], + "days": ["Monday", "Tuesday"], "startTime": "17:00", "endTime": "19:00" }, { - "days": [ - "Wednesday", - "Thursday" - ], + "days": ["Wednesday", "Thursday"], "startTime": "16:00", "endTime": "20:00" } @@ -18780,15 +17619,7 @@ } } }, - "required": [ - "id", - "ownerId", - "name", - "timeZone", - "availability", - "isDefault", - "overrides" - ] + "required": ["id", "ownerId", "name", "timeZone", "availability", "isDefault", "overrides"] }, "GetSchedulesOutput_2024_06_11": { "type": "object", @@ -18796,10 +17627,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -18811,10 +17639,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateScheduleInput_2024_06_11": { "type": "object", @@ -18832,18 +17657,12 @@ "description": "Each object contains days and times when the user is available. If not passed, the default availability is Monday to Friday from 09:00 to 17:00.", "example": [ { - "days": [ - "Monday", - "Tuesday" - ], + "days": ["Monday", "Tuesday"], "startTime": "17:00", "endTime": "19:00" }, { - "days": [ - "Wednesday", - "Thursday" - ], + "days": ["Wednesday", "Thursday"], "startTime": "16:00", "endTime": "20:00" } @@ -18873,11 +17692,7 @@ } } }, - "required": [ - "name", - "timeZone", - "isDefault" - ] + "required": ["name", "timeZone", "isDefault"] }, "CreateScheduleOutput_2024_06_11": { "type": "object", @@ -18885,19 +17700,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetScheduleOutput_2024_06_11": { "type": "object", @@ -18905,10 +17714,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -18922,10 +17728,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateScheduleInput_2024_06_11": { "type": "object", @@ -18941,10 +17744,7 @@ "availability": { "example": [ { - "days": [ - "Monday", - "Tuesday" - ], + "days": ["Monday", "Tuesday"], "startTime": "09:00", "endTime": "10:00" } @@ -18979,10 +17779,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" @@ -18991,10 +17788,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteScheduleOutput_2024_06_11": { "type": "object", @@ -19002,15 +17796,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "ProfileOutput": { "type": "object", @@ -19037,11 +17826,7 @@ "example": "john_doe" } }, - "required": [ - "id", - "organizationId", - "userId" - ] + "required": ["id", "organizationId", "userId"] }, "GetOrgUsersWithProfileOutput": { "type": "object", @@ -19183,15 +17968,7 @@ ] } }, - "required": [ - "id", - "email", - "timeZone", - "weekStart", - "hideBranding", - "createdDate", - "profile" - ] + "required": ["id", "email", "timeZone", "weekStart", "hideBranding", "createdDate", "profile"] }, "GetOrganizationUsersResponseDTO": { "type": "object", @@ -19199,10 +17976,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -19211,10 +17985,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrganizationUserInput": { "type": "object", @@ -19304,20 +18075,14 @@ "organizationRole": { "type": "string", "default": "MEMBER", - "enum": [ - "MEMBER", - "ADMIN", - "OWNER" - ] + "enum": ["MEMBER", "ADMIN", "OWNER"] }, "autoAccept": { "type": "boolean", "default": true } }, - "required": [ - "email" - ] + "required": ["email"] }, "GetOrganizationUserOutput": { "type": "object", @@ -19325,19 +18090,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/GetOrgUsersWithProfileOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrganizationUserInput": { "type": "object", @@ -19353,10 +18112,7 @@ "type": "string" } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "TextAttribute": { "type": "object", @@ -19377,13 +18133,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "NumberAttribute": { "type": "object", @@ -19404,13 +18154,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "SingleSelectAttribute": { "type": "object", @@ -19431,13 +18175,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "type", - "option", - "optionId" - ] + "required": ["id", "name", "type", "option", "optionId"] }, "MultiSelectAttributeOption": { "type": "object", @@ -19449,10 +18187,7 @@ "type": "string" } }, - "required": [ - "optionId", - "option" - ] + "required": ["optionId", "option"] }, "MultiSelectAttribute": { "type": "object", @@ -19473,12 +18208,7 @@ } } }, - "required": [ - "id", - "name", - "type", - "options" - ] + "required": ["id", "name", "type", "options"] }, "MembershipUserOutputDto": { "type": "object", @@ -19505,9 +18235,7 @@ } } }, - "required": [ - "email" - ] + "required": ["email"] }, "OrganizationMembershipOutput": { "type": "object", @@ -19526,11 +18254,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -19558,15 +18282,7 @@ } } }, - "required": [ - "id", - "userId", - "teamId", - "accepted", - "role", - "user", - "attributes" - ] + "required": ["id", "userId", "teamId", "accepted", "role", "user", "attributes"] }, "GetAllOrgMemberships": { "type": "object", @@ -19574,19 +18290,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrgMembershipDto": { "type": "object", @@ -19601,11 +18311,7 @@ "role": { "type": "string", "default": "MEMBER", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ], + "enum": ["MEMBER", "OWNER", "ADMIN"], "description": "If you are platform customer then managed users should only have MEMBER role." }, "disableImpersonation": { @@ -19613,10 +18319,7 @@ "default": false } }, - "required": [ - "userId", - "role" - ] + "required": ["userId", "role"] }, "CreateOrgMembershipOutput": { "type": "object", @@ -19624,19 +18327,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetOrgMembership": { "type": "object", @@ -19644,19 +18341,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteOrgMembership": { "type": "object", @@ -19664,19 +18355,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrgMembershipDto": { "type": "object", @@ -19686,11 +18371,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -19703,19 +18384,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OrganizationMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "Host": { "type": "object", @@ -19730,18 +18405,10 @@ }, "priority": { "type": "string", - "enum": [ - "lowest", - "low", - "medium", - "high", - "highest" - ] + "enum": ["lowest", "low", "medium", "high", "highest"] } }, - "required": [ - "userId" - ] + "required": ["userId"] }, "CreateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -19751,11 +18418,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -19996,11 +18659,7 @@ }, "schedulingType": { "type": "string", - "enum": [ - "collective", - "roundRobin", - "managed" - ], + "enum": ["collective", "roundRobin", "managed"], "example": "collective", "description": "The scheduling type for the team event - collective, roundRobin or managed." }, @@ -20048,12 +18707,7 @@ } } }, - "required": [ - "lengthInMinutes", - "title", - "slug", - "schedulingType" - ] + "required": ["lengthInMinutes", "title", "slug", "schedulingType"] }, "CreateTeamEventTypeOutput": { "type": "object", @@ -20061,10 +18715,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -20080,10 +18731,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamEventTypeResponseHost": { "type": "object", @@ -20100,13 +18748,7 @@ "priority": { "type": "string", "default": "medium", - "enum": [ - "lowest", - "low", - "medium", - "high", - "highest" - ] + "enum": ["lowest", "low", "medium", "high", "highest"] }, "name": { "type": "string", @@ -20122,11 +18764,7 @@ "example": "https://cal.com/api/avatar/d95949bc-ccb1-400f-acf6-045c51a16856.png" } }, - "required": [ - "userId", - "name", - "username" - ] + "required": ["userId", "name", "username"] }, "EventTypeTeam": { "type": "object", @@ -20159,9 +18797,7 @@ "type": "string" } }, - "required": [ - "id" - ] + "required": ["id"] }, "TeamEventTypeOutput_2024_06_14": { "type": "object", @@ -20176,11 +18812,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -20451,11 +19083,7 @@ }, "schedulingType": { "type": "string", - "enum": [ - "roundRobin", - "collective", - "managed" - ] + "enum": ["roundRobin", "collective", "managed"] }, "team": { "$ref": "#/components/schemas/EventTypeTeam" @@ -20491,19 +19119,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamEventTypeOutput_2024_06_14" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreatePhoneCallInput": { "type": "object", @@ -20529,10 +19151,7 @@ }, "templateType": { "default": "CUSTOM_TEMPLATE", - "enum": [ - "CHECK_IN_APPOINTMENT", - "CUSTOM_TEMPLATE" - ], + "enum": ["CHECK_IN_APPOINTMENT", "CUSTOM_TEMPLATE"], "type": "string", "description": "Template type" }, @@ -20561,13 +19180,7 @@ "description": "General prompt" } }, - "required": [ - "yourPhoneNumber", - "numberToCall", - "calApiKey", - "enabled", - "templateType" - ] + "required": ["yourPhoneNumber", "numberToCall", "calApiKey", "enabled", "templateType"] }, "Data": { "type": "object", @@ -20579,9 +19192,7 @@ "type": "string" } }, - "required": [ - "callId" - ] + "required": ["callId"] }, "CreatePhoneCallOutput": { "type": "object", @@ -20589,19 +19200,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/Data" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetTeamEventTypesOutput": { "type": "object", @@ -20609,10 +19214,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -20621,10 +19223,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateTeamEventTypeInput_2024_06_14": { "type": "object", @@ -20634,11 +19233,7 @@ "example": 60 }, "lengthInMinutesOptions": { - "example": [ - 15, - 30, - 60 - ], + "example": [15, 30, 60], "description": "If you want that user can choose between different lengths of the event you can specify them here. Must include the provided `lengthInMinutes`.", "type": "array", "items": { @@ -20924,10 +19519,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -20943,10 +19535,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteTeamEventTypeOutput": { "type": "object", @@ -20954,19 +19543,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamMembershipOutput": { "type": "object", @@ -20985,11 +19568,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -20998,14 +19577,7 @@ "$ref": "#/components/schemas/MembershipUserOutputDto" } }, - "required": [ - "id", - "userId", - "teamId", - "accepted", - "role", - "user" - ] + "required": ["id", "userId", "teamId", "accepted", "role", "user"] }, "OrgTeamMembershipsOutputResponseDto": { "type": "object", @@ -21013,10 +19585,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21025,10 +19594,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OrgTeamMembershipOutputResponseDto": { "type": "object", @@ -21036,19 +19602,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrgTeamMembershipDto": { "type": "object", @@ -21058,11 +19618,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -21082,21 +19638,14 @@ "role": { "type": "string", "default": "MEMBER", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean", "default": false } }, - "required": [ - "userId", - "role" - ] + "required": ["userId", "role"] }, "Attribute": { "type": "object", @@ -21114,12 +19663,7 @@ "type": { "type": "string", "description": "The type of the attribute", - "enum": [ - "TEXT", - "NUMBER", - "SINGLE_SELECT", - "MULTI_SELECT" - ] + "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] }, "name": { "type": "string", @@ -21142,14 +19686,7 @@ "example": true } }, - "required": [ - "id", - "teamId", - "type", - "name", - "slug", - "enabled" - ] + "required": ["id", "teamId", "type", "name", "slug", "enabled"] }, "GetOrganizationAttributesOutput": { "type": "object", @@ -21157,10 +19694,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21169,10 +19703,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetSingleAttributeOutput": { "type": "object", @@ -21180,10 +19711,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -21194,10 +19722,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrganizationAttributeOptionInput": { "type": "object", @@ -21209,10 +19734,7 @@ "type": "string" } }, - "required": [ - "value", - "slug" - ] + "required": ["value", "slug"] }, "CreateOrganizationAttributeInput": { "type": "object", @@ -21225,12 +19747,7 @@ }, "type": { "type": "string", - "enum": [ - "TEXT", - "NUMBER", - "SINGLE_SELECT", - "MULTI_SELECT" - ] + "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] }, "options": { "type": "array", @@ -21242,12 +19759,7 @@ "type": "boolean" } }, - "required": [ - "name", - "slug", - "type", - "options" - ] + "required": ["name", "slug", "type", "options"] }, "CreateOrganizationAttributesOutput": { "type": "object", @@ -21255,19 +19767,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrganizationAttributeInput": { "type": "object", @@ -21280,12 +19786,7 @@ }, "type": { "type": "string", - "enum": [ - "TEXT", - "NUMBER", - "SINGLE_SELECT", - "MULTI_SELECT" - ] + "enum": ["TEXT", "NUMBER", "SINGLE_SELECT", "MULTI_SELECT"] }, "enabled": { "type": "boolean" @@ -21298,19 +19799,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteOrganizationAttributesOutput": { "type": "object", @@ -21318,19 +19813,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/Attribute" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OptionOutput": { "type": "object", @@ -21356,12 +19845,7 @@ "example": "option-slug" } }, - "required": [ - "id", - "attributeId", - "value", - "slug" - ] + "required": ["id", "attributeId", "value", "slug"] }, "CreateAttributeOptionOutput": { "type": "object", @@ -21369,19 +19853,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteAttributeOptionOutput": { "type": "object", @@ -21389,19 +19867,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateOrganizationAttributeOptionInput": { "type": "object", @@ -21420,19 +19892,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OptionOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetAllAttributeOptionOutput": { "type": "object", @@ -21440,10 +19906,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21452,10 +19915,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "AssignedOptionOutput": { "type": "object", @@ -21482,23 +19942,14 @@ }, "assignedUserIds": { "description": "Ids of the users assigned to the attribute option.", - "example": [ - 124, - 224 - ], + "example": [124, 224], "type": "array", "items": { "type": "string" } } }, - "required": [ - "id", - "attributeId", - "value", - "slug", - "assignedUserIds" - ] + "required": ["id", "attributeId", "value", "slug", "assignedUserIds"] }, "GetAllAttributeAssignedOptionOutput": { "type": "object", @@ -21506,10 +19957,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21518,10 +19966,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "AssignOrganizationAttributeOptionToUserInput": { "type": "object", @@ -21536,9 +19981,7 @@ "type": "string" } }, - "required": [ - "attributeId" - ] + "required": ["attributeId"] }, "AssignOptionUserOutputData": { "type": "object", @@ -21556,11 +19999,7 @@ "description": "The value of the option" } }, - "required": [ - "id", - "memberId", - "attributeOptionId" - ] + "required": ["id", "memberId", "attributeOptionId"] }, "AssignOptionUserOutput": { "type": "object", @@ -21568,19 +20007,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/AssignOptionUserOutputData" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UnassignOptionUserOutput": { "type": "object", @@ -21588,19 +20021,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/AssignOptionUserOutputData" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetOptionUserOutputData": { "type": "object", @@ -21622,12 +20049,7 @@ "description": "The slug of the option" } }, - "required": [ - "id", - "attributeId", - "value", - "slug" - ] + "required": ["id", "attributeId", "value", "slug"] }, "GetOptionUserOutput": { "type": "object", @@ -21635,10 +20057,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21647,10 +20066,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamWebhookOutputDto": { "type": "object", @@ -21682,14 +20098,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "teamId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "teamId", "id", "triggers", "subscriberUrl", "active"] }, "TeamWebhooksOutputResponseDto": { "type": "object", @@ -21697,10 +20106,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -21709,10 +20115,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateWebhookInputDto": { "type": "object", @@ -21765,11 +20168,7 @@ "type": "string" } }, - "required": [ - "active", - "subscriberUrl", - "triggers" - ] + "required": ["active", "subscriberUrl", "triggers"] }, "TeamWebhookOutputResponseDto": { "type": "object", @@ -21777,19 +20176,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamWebhookOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateWebhookInputDto": { "type": "object", @@ -21872,19 +20265,10 @@ "type": "string", "description": "the reason for the out of office entry, if applicable", "example": "vacation", - "enum": [ - "unspecified", - "vacation", - "travel", - "sick", - "public_holiday" - ] + "enum": ["unspecified", "vacation", "travel", "sick", "public_holiday"] } }, - "required": [ - "start", - "end" - ] + "required": ["start", "end"] }, "UpdateOutOfOfficeEntryDto": { "type": "object", @@ -21915,13 +20299,7 @@ "type": "string", "description": "the reason for the out of office entry, if applicable", "example": "vacation", - "enum": [ - "unspecified", - "vacation", - "travel", - "sick", - "public_holiday" - ] + "enum": ["unspecified", "vacation", "travel", "sick", "public_holiday"] } } }, @@ -21936,10 +20314,7 @@ }, "activeOnEventTypeIds": { "description": "List of Event Type IDs the workflow is specifically active on (if not active on all)", - "example": [ - 698191, - 698192 - ], + "example": [698191, 698192], "type": "array", "items": { "type": "number" @@ -21959,17 +20334,10 @@ "type": "string", "description": "Unit for the offset time", "example": "hour", - "enum": [ - "hour", - "minute", - "day" - ] + "enum": ["hour", "minute", "day"] } }, - "required": [ - "value", - "unit" - ] + "required": ["value", "unit"] }, "WorkflowTriggerOutputDto": { "type": "object", @@ -21997,9 +20365,7 @@ ] } }, - "required": [ - "type" - ] + "required": ["type"] }, "WorkflowMessageOutputDto": { "type": "object", @@ -22020,9 +20386,7 @@ "example": "Reminder for {EVENT_NAME}." } }, - "required": [ - "subject" - ] + "required": ["subject"] }, "WorkflowStepOutputDto": { "type": "object", @@ -22056,12 +20420,7 @@ "type": "string", "description": "Intended recipient type", "example": "const", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "email": { "type": "string", @@ -22076,14 +20435,7 @@ "type": "string", "description": "Template type used", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "includeCalendarEvent": { "type": "object", @@ -22105,15 +20457,7 @@ ] } }, - "required": [ - "id", - "stepNumber", - "action", - "recipient", - "template", - "sender", - "message" - ] + "required": ["id", "stepNumber", "action", "recipient", "template", "sender", "message"] }, "WorkflowOutput": { "type": "object", @@ -22172,13 +20516,7 @@ "example": "2024-05-12T11:30:00.000Z" } }, - "required": [ - "id", - "name", - "activation", - "trigger", - "steps" - ] + "required": ["id", "name", "activation", "trigger", "steps"] }, "GetWorkflowsOutput": { "type": "object", @@ -22187,10 +20525,7 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "description": "List of workflows", @@ -22200,10 +20535,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetWorkflowOutput": { "type": "object", @@ -22212,10 +20544,7 @@ "type": "string", "description": "Indicates the status of the response", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "description": "workflow", @@ -22225,10 +20554,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "WorkflowTriggerOffsetDto": { "type": "object", @@ -22244,10 +20570,7 @@ "example": "hour" } }, - "required": [ - "value", - "unit" - ] + "required": ["value", "unit"] }, "OnBeforeEventTriggerDto": { "type": "object", @@ -22267,10 +20590,7 @@ "example": "beforeEvent" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnAfterEventTriggerDto": { "type": "object", @@ -22290,10 +20610,7 @@ "example": "afterEvent" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnCancelTriggerDto": { "type": "object", @@ -22304,9 +20621,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnCreationTriggerDto": { "type": "object", @@ -22317,9 +20632,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnRescheduleTriggerDto": { "type": "object", @@ -22330,9 +20643,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "OnAfterCalVideoGuestsNoShowTriggerDto": { "type": "object", @@ -22352,10 +20663,7 @@ "example": "afterGuestsCalVideoNoShow" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "OnAfterCalVideoHostsNoShowTriggerDto": { "type": "object", @@ -22375,10 +20683,7 @@ "example": "afterHostsCalVideoNoShow" } }, - "required": [ - "offset", - "type" - ] + "required": ["offset", "type"] }, "HtmlWorkflowMessageDto": { "type": "object", @@ -22394,10 +20699,7 @@ "example": "

This is a reminder from {ORGANIZER} of {EVENT_NAME} to {ATTENDEE} starting here {LOCATION} {MEETING_URL} at {START_TIME_h:mma} {TIMEZONE}.

" } }, - "required": [ - "subject", - "html" - ] + "required": ["subject", "html"] }, "WorkflowEmailAddressStepDto": { "type": "object", @@ -22427,25 +20729,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22513,25 +20803,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22590,25 +20868,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22653,10 +20919,7 @@ "example": "This is a reminder message from {ORGANIZER} of {EVENT_NAME} to {ATTENDEE} starting here {LOCATION} {MEETING_URL} at {START_TIME_h:mma} {TIMEZONE}." } }, - "required": [ - "subject", - "text" - ] + "required": ["subject", "text"] }, "WorkflowPhoneWhatsAppAttendeeStepDto": { "type": "object", @@ -22686,25 +20949,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22719,14 +20970,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "WorkflowPhoneWhatsAppNumberStepDto": { "type": "object", @@ -22756,25 +21000,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22797,15 +21029,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "WorkflowPhoneNumberStepDto": { "type": "object", @@ -22835,25 +21059,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22876,15 +21088,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "WorkflowPhoneAttendeeStepDto": { "type": "object", @@ -22914,25 +21118,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -22951,14 +21143,7 @@ ] } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "BaseWorkflowTriggerDto": { "type": "object", @@ -22968,9 +21153,7 @@ "description": "Trigger type for the workflow" } }, - "required": [ - "type" - ] + "required": ["type"] }, "WorkflowActivationDto": { "type": "object", @@ -22984,18 +21167,14 @@ "activeOnEventTypeIds": { "default": [], "description": "List of event-types IDs the workflow applies to, required if isActiveOnAllEventTypes is false", - "example": [ - 698191 - ], + "example": [698191], "type": "array", "items": { "type": "number" } } }, - "required": [ - "isActiveOnAllEventTypes" - ] + "required": ["isActiveOnAllEventTypes"] }, "CreateWorkflowDto": { "type": "object", @@ -23069,12 +21248,7 @@ } } }, - "required": [ - "name", - "activation", - "trigger", - "steps" - ] + "required": ["name", "activation", "trigger", "steps"] }, "UpdateEmailAddressWorkflowStepDto": { "type": "object", @@ -23104,25 +21278,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23195,25 +21357,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23277,25 +21427,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23359,25 +21497,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23401,14 +21527,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "UpdatePhoneWhatsAppNumberWorkflowStepDto": { "type": "object", @@ -23438,25 +21557,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23484,15 +21591,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "UpdateWhatsAppAttendeePhoneWorkflowStepDto": { "type": "object", @@ -23522,25 +21621,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23560,14 +21647,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "message"] }, "UpdatePhoneNumberWorkflowStepDto": { "type": "object", @@ -23597,25 +21677,13 @@ "type": "string", "description": "Recipient type", "example": "attendee", - "enum": [ - "const", - "attendee", - "email", - "phone_number" - ] + "enum": ["const", "attendee", "email", "phone_number"] }, "template": { "type": "string", "description": "Template type for the step", "example": "reminder", - "enum": [ - "reminder", - "custom", - "rescheduled", - "completed", - "rating", - "cancelled" - ] + "enum": ["reminder", "custom", "rescheduled", "completed", "rating", "cancelled"] }, "sender": { "type": "string", @@ -23643,15 +21711,7 @@ "example": 67244 } }, - "required": [ - "action", - "stepNumber", - "recipient", - "template", - "sender", - "verifiedPhoneId", - "message" - ] + "required": ["action", "stepNumber", "recipient", "template", "sender", "verifiedPhoneId", "message"] }, "UpdateWorkflowDto": { "type": "object", @@ -23733,9 +21793,7 @@ "type": "string" } }, - "required": [ - "authUrl" - ] + "required": ["authUrl"] }, "StripConnectOutputResponseDto": { "type": "object", @@ -23743,19 +21801,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/StripConnectOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "StripCredentialsSaveOutputResponseDto": { "type": "object", @@ -23764,9 +21816,7 @@ "type": "string" } }, - "required": [ - "url" - ] + "required": ["url"] }, "StripCredentialsCheckOutputResponseDto": { "type": "object", @@ -23776,9 +21826,7 @@ "example": "success" } }, - "required": [ - "status" - ] + "required": ["status"] }, "GetDefaultScheduleOutput_2024_06_11": { "type": "object", @@ -23786,19 +21834,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput_2024_06_11" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateTeamInput": { "type": "object", @@ -23882,9 +21924,7 @@ "description": "If you are a platform customer, don't pass 'false', because then team creator won't be able to create team event types." } }, - "required": [ - "name" - ] + "required": ["name"] }, "CreateTeamOutput": { "type": "object", @@ -23892,10 +21932,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -23909,10 +21946,7 @@ "description": "Either an Output object or a TeamOutputDto." } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamOutputDto": { "type": "object", @@ -23988,11 +22022,7 @@ "default": "Sunday" } }, - "required": [ - "id", - "name", - "isOrganization" - ] + "required": ["id", "name", "isOrganization"] }, "GetTeamOutput": { "type": "object", @@ -24000,19 +22030,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetTeamsOutput": { "type": "object", @@ -24020,10 +22044,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -24032,10 +22053,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateTeamOutput": { "type": "object", @@ -24043,19 +22061,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ConferencingAppsOutputDto": { "type": "object", @@ -24080,30 +22092,20 @@ "description": "Whether if the connection is working or not." } }, - "required": [ - "id", - "type", - "userId" - ] + "required": ["id", "type", "userId"] }, "ConferencingAppOutputResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ConferencingAppsOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetConferencingAppsOauthUrlResponseDto": { "type": "object", @@ -24111,25 +22113,17 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "ConferencingAppsOutputResponseDto": { "type": "object", "properties": { "status": { "type": "string", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -24138,10 +22132,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SetDefaultConferencingAppOutputResponseDto": { "type": "object", @@ -24149,15 +22140,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "DefaultConferencingAppsOutputDto": { "type": "object", @@ -24176,18 +22162,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DefaultConferencingAppsOutputDto" } }, - "required": [ - "status" - ] + "required": ["status"] }, "DisconnectConferencingAppOutputResponseDto": { "type": "object", @@ -24195,15 +22176,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "GoogleServiceAccountKeyInput": { "type": "object", @@ -24218,11 +22194,7 @@ "type": "string" } }, - "required": [ - "private_key", - "client_email", - "client_id" - ] + "required": ["private_key", "client_email", "client_id"] }, "CreateDelegationCredentialInput": { "type": "object", @@ -24247,11 +22219,7 @@ } } }, - "required": [ - "workspacePlatformSlug", - "domain", - "serviceAccountKey" - ] + "required": ["workspacePlatformSlug", "domain", "serviceAccountKey"] }, "WorkspacePlatformDto": { "type": "object", @@ -24263,10 +22231,7 @@ "type": "string" } }, - "required": [ - "name", - "slug" - ] + "required": ["name", "slug"] }, "DelegationCredentialOutput": { "type": "object", @@ -24311,19 +22276,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DelegationCredentialOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateDelegationCredentialInput": { "type": "object", @@ -24352,29 +22311,20 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DelegationCredentialOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateIcsFeedInputDto": { "type": "object", "properties": { "urls": { "type": "array", - "example": [ - "https://cal.com/ics/feed.ics", - "http://cal.com/ics/feed.ics" - ], + "example": ["https://cal.com/ics/feed.ics", "http://cal.com/ics/feed.ics"], "description": "An array of ICS URLs", "items": { "type": "string", @@ -24388,9 +22338,7 @@ "description": "Whether to allowing writing to the calendar or not" } }, - "required": [ - "urls" - ] + "required": ["urls"] }, "CreateIcsFeedOutput": { "type": "object", @@ -24430,14 +22378,7 @@ "description": "Whether the calendar credentials are valid or not" } }, - "required": [ - "id", - "type", - "userId", - "teamId", - "appId", - "invalid" - ] + "required": ["id", "type", "userId", "teamId", "appId", "invalid"] }, "CreateIcsFeedOutputResponseDto": { "type": "object", @@ -24445,19 +22386,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/CreateIcsFeedOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "BusyTimesOutput": { "type": "object", @@ -24475,10 +22410,7 @@ "nullable": true } }, - "required": [ - "start", - "end" - ] + "required": ["start", "end"] }, "GetBusyTimesOutput": { "type": "object", @@ -24486,10 +22418,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -24498,10 +22427,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "Integration": { "type": "object", @@ -24610,13 +22536,7 @@ "nullable": true } }, - "required": [ - "externalId", - "primary", - "readOnly", - "isSelected", - "credentialId" - ] + "required": ["externalId", "primary", "readOnly", "isSelected", "credentialId"] }, "Calendar": { "type": "object", @@ -24651,12 +22571,7 @@ "nullable": true } }, - "required": [ - "externalId", - "readOnly", - "isSelected", - "credentialId" - ] + "required": ["externalId", "readOnly", "isSelected", "credentialId"] }, "ConnectedCalendar": { "type": "object", @@ -24681,10 +22596,7 @@ } } }, - "required": [ - "integration", - "credentialId" - ] + "required": ["integration", "credentialId"] }, "DestinationCalendar": { "type": "object", @@ -24758,10 +22670,7 @@ "$ref": "#/components/schemas/DestinationCalendar" } }, - "required": [ - "connectedCalendars", - "destinationCalendar" - ] + "required": ["connectedCalendars", "destinationCalendar"] }, "ConnectedCalendarsOutput": { "type": "object", @@ -24769,19 +22678,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ConnectedCalendarsData" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateCalendarCredentialsInput": { "type": "object", @@ -24793,10 +22696,7 @@ "type": "string" } }, - "required": [ - "username", - "password" - ] + "required": ["username", "password"] }, "DeleteCalendarCredentialsInputBodyDto": { "type": "object", @@ -24807,9 +22707,7 @@ "description": "Credential ID of the calendar to delete, as returned by the /calendars endpoint" } }, - "required": [ - "id" - ] + "required": ["id"] }, "DeletedCalendarCredentialsOutputDto": { "type": "object", @@ -24837,14 +22735,7 @@ "nullable": true } }, - "required": [ - "id", - "type", - "userId", - "teamId", - "appId", - "invalid" - ] + "required": ["id", "type", "userId", "teamId", "appId", "invalid"] }, "DeletedCalendarCredentialsOutputResponseDto": { "type": "object", @@ -24852,19 +22743,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DeletedCalendarCredentialsOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateOrganizationInput": { "type": "object", @@ -24900,9 +22785,7 @@ } } }, - "required": [ - "name" - ] + "required": ["name"] }, "ManagedOrganizationWithApiKeyOutput": { "type": "object", @@ -24927,11 +22810,7 @@ "type": "string" } }, - "required": [ - "id", - "name", - "apiKey" - ] + "required": ["id", "name", "apiKey"] }, "CreateManagedOrganizationOutput": { "type": "object", @@ -24939,19 +22818,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ManagedOrganizationWithApiKeyOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ManagedOrganizationOutput": { "type": "object", @@ -24973,10 +22846,7 @@ } } }, - "required": [ - "id", - "name" - ] + "required": ["id", "name"] }, "GetManagedOrganizationOutput": { "type": "object", @@ -24984,19 +22854,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ManagedOrganizationOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "PaginationMetaDto": { "type": "object", @@ -25064,10 +22928,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -25079,11 +22940,7 @@ "$ref": "#/components/schemas/PaginationMetaDto" } }, - "required": [ - "status", - "data", - "pagination" - ] + "required": ["status", "data", "pagination"] }, "UpdateOrganizationInput": { "type": "object", @@ -25132,14 +22989,7 @@ "type": "string" } }, - "required": [ - "id", - "formId", - "formFillerId", - "routedToBookingUid", - "response", - "createdAt" - ] + "required": ["id", "formId", "formFillerId", "routedToBookingUid", "response", "createdAt"] }, "GetRoutingFormResponsesOutput": { "type": "object", @@ -25147,19 +22997,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/RoutingFormResponseOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "Routing": { "type": "object", @@ -25178,10 +23022,7 @@ }, "teamMemberIds": { "description": "Array of team member IDs that were routed to handle this booking.", - "example": [ - 101, - 102 - ], + "example": [101, 102], "type": "array", "items": { "type": "number" @@ -25208,9 +23049,7 @@ "example": "Account" } }, - "required": [ - "teamMemberIds" - ] + "required": ["teamMemberIds"] }, "CreateRoutingFormResponseOutputData": { "type": "object", @@ -25225,10 +23064,7 @@ "example": { "eventTypeId": 123, "routing": { - "teamMemberIds": [ - 101, - 102 - ], + "teamMemberIds": [101, 102], "teamMemberEmail": "john.doe@example.com", "skipContactOwner": true } @@ -25267,19 +23103,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/CreateRoutingFormResponseOutputData" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateRoutingFormResponseInput": { "type": "object", @@ -25296,19 +23126,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/RoutingFormResponseOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "RoutingFormOutput": { "type": "object", @@ -25384,10 +23208,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -25396,10 +23217,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "SlotsOutput_2024_09_04": { "type": "object", @@ -25426,10 +23244,7 @@ ] } }, - "required": [ - "eventTypeId", - "slots" - ] + "required": ["eventTypeId", "slots"] }, "ResponseSlotsOutput": { "type": "object", @@ -25437,19 +23252,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ResponseSlotsOutputData" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ReserveSlotInput_2024_09_04": { "type": "object", @@ -25475,10 +23284,7 @@ "description": "ONLY for authenticated requests with api key, access token or OAuth credentials (ID + secret).\n \n For how many minutes the slot should be reserved - for this long time noone else can book this event type at `start` time. If not provided, defaults to 5 minutes." } }, - "required": [ - "eventTypeId", - "slotStart" - ] + "required": ["eventTypeId", "slotStart"] }, "ReserveSlotOutput_2024_09_04": { "type": "object", @@ -25535,19 +23341,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ReserveSlotOutput_2024_09_04" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetReservedSlotOutput_2024_09_04": { "type": "object", @@ -25555,10 +23355,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "nullable": true, @@ -25569,10 +23366,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "MeOrgOutput": { "type": "object", @@ -25584,10 +23378,7 @@ "type": "number" } }, - "required": [ - "isPlatform", - "id" - ] + "required": ["isPlatform", "id"] }, "MeOutput": { "type": "object", @@ -25639,19 +23430,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/MeOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateMeOutput": { "type": "object", @@ -25659,19 +23444,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/MeOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "BookingInputAddressLocation_2024_08_13": { "type": "object", @@ -25682,9 +23461,7 @@ "description": "only allowed value for type is `address` - it refers to address defined by the organizer." } }, - "required": [ - "type" - ] + "required": ["type"] }, "BookingInputAttendeeAddressLocation_2024_08_13": { "type": "object", @@ -25699,10 +23476,7 @@ "example": "123 Example St, City, Country" } }, - "required": [ - "type", - "address" - ] + "required": ["type", "address"] }, "BookingInputAttendeeDefinedLocation_2024_08_13": { "type": "object", @@ -25717,10 +23491,7 @@ "example": "321 Example St, City, Country" } }, - "required": [ - "type", - "location" - ] + "required": ["type", "location"] }, "BookingInputAttendeePhoneLocation_2024_08_13": { "type": "object", @@ -25735,10 +23506,7 @@ "example": "+37120993151" } }, - "required": [ - "type", - "phone" - ] + "required": ["type", "phone"] }, "BookingInputIntegrationLocation_2024_08_13": { "type": "object", @@ -25784,10 +23552,7 @@ ] } }, - "required": [ - "type", - "integration" - ] + "required": ["type", "integration"] }, "BookingInputLinkLocation_2024_08_13": { "type": "object", @@ -25798,9 +23563,7 @@ "description": "only allowed value for type is `link` - it refers to link defined by the organizer." } }, - "required": [ - "type" - ] + "required": ["type"] }, "BookingInputPhoneLocation_2024_08_13": { "type": "object", @@ -25811,9 +23574,7 @@ "description": "only allowed value for type is `phone` - it refers to phone defined by the organizer." } }, - "required": [ - "type" - ] + "required": ["type"] }, "BookingInputOrganizersDefaultAppLocation_2024_08_13": { "type": "object", @@ -25824,9 +23585,7 @@ "description": "only available for team event types and the only allowed value for type is `organizersDefaultApp` - it refers to the default app defined by the organizer." } }, - "required": [ - "type" - ] + "required": ["type"] }, "ValidateBookingLocation_2024_08_13": { "type": "object", @@ -25907,10 +23666,7 @@ "default": "en" } }, - "required": [ - "name", - "timeZone" - ] + "required": ["name", "timeZone"] }, "CreateBookingInput_2024_08_13": { "type": "object", @@ -25962,10 +23718,7 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26022,10 +23775,7 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [ - 101, - 102 - ] + "teamMemberIds": [101, 102] }, "allOf": [ { @@ -26034,10 +23784,7 @@ ] } }, - "required": [ - "start", - "attendee" - ] + "required": ["start", "attendee"] }, "CreateInstantBookingInput_2024_08_13": { "type": "object", @@ -26089,10 +23836,7 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26149,10 +23893,7 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [ - 101, - 102 - ] + "teamMemberIds": [101, 102] }, "allOf": [ { @@ -26166,11 +23907,7 @@ "example": true } }, - "required": [ - "start", - "attendee", - "instant" - ] + "required": ["start", "attendee", "instant"] }, "CreateRecurringBookingInput_2024_08_13": { "type": "object", @@ -26222,10 +23959,7 @@ }, "guests": { "description": "An optional list of guest emails attending the event.", - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26282,10 +24016,7 @@ "description": "Routing information from routing forms that determined the booking assignment. Both responseId and teamMemberIds are required if provided.", "example": { "responseId": 123, - "teamMemberIds": [ - 101, - 102 - ] + "teamMemberIds": [101, 102] }, "allOf": [ { @@ -26299,10 +24030,7 @@ "example": 5 } }, - "required": [ - "start", - "attendee" - ] + "required": ["start", "attendee"] }, "BookingHost": { "type": "object", @@ -26328,13 +24056,7 @@ "example": "America/Los_Angeles" } }, - "required": [ - "id", - "name", - "email", - "username", - "timeZone" - ] + "required": ["id", "name", "email", "username", "timeZone"] }, "EventType": { "type": "object", @@ -26348,10 +24070,7 @@ "example": "some-event" } }, - "required": [ - "id", - "slug" - ] + "required": ["id", "slug"] }, "BookingAttendee": { "type": "object", @@ -26426,12 +24145,7 @@ "example": "+1234567890" } }, - "required": [ - "name", - "email", - "timeZone", - "absent" - ] + "required": ["name", "email", "timeZone", "absent"] }, "BookingOutput_2024_08_13": { "type": "object", @@ -26460,12 +24174,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -26559,10 +24268,7 @@ } }, "guests": { - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26623,12 +24329,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -26722,10 +24423,7 @@ } }, "guests": { - "example": [ - "guest1@example.com", - "guest2@example.com" - ], + "example": ["guest1@example.com", "guest2@example.com"], "type": "array", "items": { "type": "string" @@ -26854,14 +24552,7 @@ } } }, - "required": [ - "name", - "email", - "timeZone", - "absent", - "seatUid", - "bookingFieldsResponses" - ] + "required": ["name", "email", "timeZone", "absent", "seatUid", "bookingFieldsResponses"] }, "CreateSeatedBookingOutput_2024_08_13": { "type": "object", @@ -26890,12 +24581,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27040,12 +24726,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27174,10 +24855,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27203,10 +24881,7 @@ "description": "Booking data, which can be either a BookingOutput object or an array of RecurringBookingOutput objects" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetSeatedBookingOutput_2024_08_13": { "type": "object", @@ -27235,12 +24910,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27380,12 +25050,7 @@ }, "status": { "type": "string", - "enum": [ - "cancelled", - "accepted", - "rejected", - "pending" - ], + "enum": ["cancelled", "accepted", "rejected", "pending"], "example": "accepted" }, "cancellationReason": { @@ -27509,10 +25174,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27547,10 +25209,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "RecordingItem": { "type": "object", @@ -27594,14 +25253,7 @@ "example": "Error message" } }, - "required": [ - "id", - "roomName", - "startTs", - "status", - "duration", - "shareToken" - ] + "required": ["id", "roomName", "startTs", "status", "duration", "shareToken"] }, "GetBookingRecordingsOutput": { "type": "object", @@ -27609,10 +25261,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "error": { "type": "object" @@ -27624,10 +25273,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetBookingTranscriptsOutput": { "type": "object", @@ -27635,16 +25281,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { - "example": [ - "https://transcript1.com", - "https://transcript2.com" - ], + "example": ["https://transcript1.com", "https://transcript2.com"], "type": "array", "items": { "type": "string" @@ -27654,10 +25294,7 @@ "type": "object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetBookingsOutput_2024_08_13": { "type": "object", @@ -27665,10 +25302,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -27697,11 +25331,7 @@ "type": "object" } }, - "required": [ - "status", - "data", - "pagination" - ] + "required": ["status", "data", "pagination"] }, "RescheduleBookingInput_2024_08_13": { "type": "object", @@ -27721,9 +25351,7 @@ "description": "Reason for rescheduling the booking" } }, - "required": [ - "start" - ] + "required": ["start"] }, "RescheduleSeatedBookingInput_2024_08_13": { "type": "object", @@ -27743,10 +25371,7 @@ "description": "Uid of the specific seat within booking." } }, - "required": [ - "start", - "seatUid" - ] + "required": ["start", "seatUid"] }, "RescheduleBookingOutput_2024_08_13": { "type": "object", @@ -27754,10 +25379,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27777,10 +25399,7 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CancelBookingInput_2024_08_13": { "type": "object", @@ -27804,9 +25423,7 @@ "description": "Uid of the specific seat within booking." } }, - "required": [ - "seatUid" - ] + "required": ["seatUid"] }, "CancelBookingOutput_2024_08_13": { "type": "object", @@ -27814,10 +25431,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27849,10 +25463,7 @@ "description": "Booking data, which can be either a BookingOutput object, a RecurringBookingOutput object, or an array of RecurringBookingOutput objects" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "MarkAbsentAttendee": { "type": "object", @@ -27864,10 +25475,7 @@ "type": "boolean" } }, - "required": [ - "email", - "absent" - ] + "required": ["email", "absent"] }, "MarkAbsentBookingInput_2024_08_13": { "type": "object", @@ -27891,10 +25499,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27908,10 +25513,7 @@ "description": "Booking data, which can be either a BookingOutput object or a RecurringBookingOutput object" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ReassignedToDto": { "type": "object", @@ -27929,11 +25531,7 @@ "example": "john.doe@example.com" } }, - "required": [ - "id", - "name", - "email" - ] + "required": ["id", "name", "email"] }, "ReassignBookingOutput_2024_08_13": { "type": "object", @@ -27941,10 +25539,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "oneOf": [ @@ -27960,10 +25555,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "ReassignToUserBookingInput_2024_08_13": { "type": "object", @@ -27997,10 +25589,7 @@ "description": "The link to the calendar" } }, - "required": [ - "label", - "link" - ] + "required": ["label", "link"] }, "CalendarLinksOutput_2024_08_13": { "type": "object", @@ -28018,10 +25607,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "BookingReference": { "type": "object", @@ -28044,12 +25630,7 @@ "description": "The id of the booking reference" } }, - "required": [ - "type", - "eventUid", - "destinationCalendarId", - "id" - ] + "required": ["type", "eventUid", "destinationCalendarId", "id"] }, "BookingReferencesOutput_2024_08_13": { "type": "object", @@ -28067,10 +25648,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreateTeamMembershipInput": { "type": "object", @@ -28085,20 +25663,14 @@ "role": { "type": "string", "default": "MEMBER", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean", "default": false } }, - "required": [ - "userId" - ] + "required": ["userId"] }, "CreateTeamMembershipOutput": { "type": "object", @@ -28106,19 +25678,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetTeamMembershipOutput": { "type": "object", @@ -28126,19 +25692,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetTeamMembershipsOutput": { "type": "object", @@ -28146,19 +25706,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdateTeamMembershipInput": { "type": "object", @@ -28168,11 +25722,7 @@ }, "role": { "type": "string", - "enum": [ - "MEMBER", - "OWNER", - "ADMIN" - ] + "enum": ["MEMBER", "OWNER", "ADMIN"] }, "disableImpersonation": { "type": "boolean" @@ -28185,19 +25735,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteTeamMembershipOutput": { "type": "object", @@ -28205,19 +25749,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/TeamMembershipOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CreatePrivateLinkInput": { "type": "object", @@ -28268,13 +25806,7 @@ "example": "2025-12-31T23:59:59.000Z" } }, - "required": [ - "linkId", - "eventTypeId", - "isExpired", - "bookingUrl", - "expiresAt" - ] + "required": ["linkId", "eventTypeId", "isExpired", "bookingUrl", "expiresAt"] }, "UsageBasedPrivateLinkOutput": { "type": "object", @@ -28311,14 +25843,7 @@ "example": 3 } }, - "required": [ - "linkId", - "eventTypeId", - "isExpired", - "bookingUrl", - "maxUsageCount", - "usageCount" - ] + "required": ["linkId", "eventTypeId", "isExpired", "bookingUrl", "maxUsageCount", "usageCount"] }, "CreatePrivateLinkOutput": { "type": "object", @@ -28340,10 +25865,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "GetPrivateLinksOutput": { "type": "object", @@ -28368,10 +25890,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UpdatePrivateLinkBody": { "type": "object", @@ -28410,10 +25929,7 @@ ] } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeletePrivateLinkOutput": { "type": "object", @@ -28438,10 +25954,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UserWebhookOutputDto": { "type": "object", @@ -28473,14 +25986,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "userId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "userId", "id", "triggers", "subscriberUrl", "active"] }, "UserWebhookOutputResponseDto": { "type": "object", @@ -28488,19 +25994,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/UserWebhookOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UserWebhooksOutputResponseDto": { "type": "object", @@ -28508,10 +26008,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28520,10 +26017,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "EventTypeWebhookOutputDto": { "type": "object", @@ -28555,14 +26049,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "eventTypeId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "eventTypeId", "id", "triggers", "subscriberUrl", "active"] }, "EventTypeWebhookOutputResponseDto": { "type": "object", @@ -28570,19 +26057,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/EventTypeWebhookOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "EventTypeWebhooksOutputResponseDto": { "type": "object", @@ -28590,10 +26071,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28602,10 +26080,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DeleteManyWebhooksOutputResponseDto": { "type": "object", @@ -28613,19 +26088,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "string" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OAuthClientWebhookOutputDto": { "type": "object", @@ -28657,14 +26126,7 @@ "type": "string" } }, - "required": [ - "payloadTemplate", - "oAuthClientId", - "id", - "triggers", - "subscriberUrl", - "active" - ] + "required": ["payloadTemplate", "oAuthClientId", "id", "triggers", "subscriberUrl", "active"] }, "OAuthClientWebhookOutputResponseDto": { "type": "object", @@ -28672,19 +26134,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/OAuthClientWebhookOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "OAuthClientWebhooksOutputResponseDto": { "type": "object", @@ -28692,10 +26148,7 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "type": "array", @@ -28704,10 +26157,7 @@ } } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "DestinationCalendarsInputBodyDto": { "type": "object", @@ -28716,11 +26166,7 @@ "type": "string", "example": "apple_calendar", "description": "The calendar service you want to integrate, as returned by the /calendars endpoint", - "enum": [ - "apple_calendar", - "google_calendar", - "office365_calendar" - ] + "enum": ["apple_calendar", "google_calendar", "office365_calendar"] }, "externalId": { "type": "string", @@ -28731,10 +26177,7 @@ "type": "string" } }, - "required": [ - "integration", - "externalId" - ] + "required": ["integration", "externalId"] }, "DestinationCalendarsOutputDto": { "type": "object", @@ -28753,12 +26196,7 @@ "nullable": true } }, - "required": [ - "userId", - "integration", - "externalId", - "credentialId" - ] + "required": ["userId", "integration", "externalId", "credentialId"] }, "DestinationCalendarsOutputResponseDto": { "type": "object", @@ -28766,29 +26204,18 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/DestinationCalendarsOutputDto" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "CalendarEventResponseStatus": { "type": "string", - "description": "Host's response to the invitation", - "enum": [ - "accepted", - "pending", - "declined", - "needsAction" - ] + "description": "Response status of the attendee", + "enum": ["accepted", "pending", "declined", "needsAction"] }, "CalendarEventAttendee": { "type": "object", @@ -28815,21 +26242,19 @@ "type": "boolean", "nullable": true, "description": "Indicates if this attendee's attendance is optional" + }, + "host": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the host" } }, - "required": [ - "email" - ] + "required": ["email"] }, "CalendarEventStatus": { "type": "string", "description": "Status of the event (accepted, pending, declined, cancelled)", - "enum": [ - "accepted", - "pending", - "declined", - "cancelled" - ] + "enum": ["accepted", "pending", "declined", "cancelled"] }, "CalendarEventHost": { "type": "object", @@ -28849,18 +26274,27 @@ "$ref": "#/components/schemas/CalendarEventResponseStatus" } }, - "required": [ - "email" - ] + "required": ["email"] + }, + "calendarEventOwner": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address of the event host" + }, + "name": { + "type": "string", + "nullable": true, + "description": "Display name of the event host" + } + }, + "required": ["email"] }, "CalendarSource": { "type": "string", "description": "Calendar integration source (e.g., Google Calendar, Office 365, Apple Calendar). Currently only Google Calendar is supported.", - "enum": [ - "google", - "office365", - "apple" - ] + "enum": ["google", "office365", "apple"] }, "UnifiedCalendarEventOutput": { "type": "object", @@ -28949,18 +26383,21 @@ "$ref": "#/components/schemas/CalendarEventHost" } }, + "calendarEventOwner": { + "nullable": true, + "description": "The calendar account that owns this event. This is the primary calendar where the event is stored and cannot be modified without appropriate permissions. Changing this would require moving the event to a different calendar", + "allOf": [ + { + "$ref": "#/components/schemas/calendarEventOwner" + } + ] + }, "source": { "example": "google", "$ref": "#/components/schemas/CalendarSource" } }, - "required": [ - "start", - "end", - "id", - "title", - "source" - ] + "required": ["start", "end", "id", "title", "source"] }, "GetUnifiedCalendarEventOutput": { "type": "object", @@ -28968,19 +26405,98 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/UnifiedCalendarEventOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] + }, + "UpdateCalendarEventAttendee": { + "type": "object", + "properties": { + "email": { + "type": "string", + "description": "Email address of the attendee" + }, + "name": { + "type": "string", + "description": "Display name of the attendee" + }, + "responseStatus": { + "nullable": true, + "$ref": "#/components/schemas/CalendarEventResponseStatus" + }, + "self": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the current user" + }, + "optional": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee's attendance is optional" + }, + "host": { + "type": "boolean", + "nullable": true, + "description": "Indicates if this attendee is the host" + } + } + }, + "UpdateUnifiedCalendarEventInput": { + "type": "object", + "properties": { + "start": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + }, + "timeZone": { + "type": "string" + } + }, + "description": "Start date and time of the calendar event with timezone information" + }, + "end": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "date-time" + }, + "timeZone": { + "type": "string" + } + }, + "description": "End date and time of the calendar event with timezone information" + }, + "title": { + "type": "string", + "description": "Title of the calendar event" + }, + "description": { + "type": "string", + "nullable": true, + "description": "Detailed description of the calendar event" + }, + "attendees": { + "nullable": true, + "description": "List of attendees. CAUTION: You must pass the entire array with all updated values. Any attendees not included in this array will be removed from the event.", + "type": "array", + "items": { + "$ref": "#/components/schemas/UpdateCalendarEventAttendee" + } + }, + "status": { + "nullable": true, + "example": "accepted", + "$ref": "#/components/schemas/CalendarEventStatus" + } + } }, "RequestEmailVerificationInput": { "type": "object", @@ -28991,9 +26507,7 @@ "example": "acme@example.com" } }, - "required": [ - "email" - ] + "required": ["email"] }, "RequestEmailVerificationOutput": { "type": "object", @@ -29001,15 +26515,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "RequestPhoneVerificationInput": { "type": "object", @@ -29020,9 +26529,7 @@ "example": "+372 5555 6666" } }, - "required": [ - "phone" - ] + "required": ["phone"] }, "RequestPhoneVerificationOutput": { "type": "object", @@ -29030,15 +26537,10 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] } }, - "required": [ - "status" - ] + "required": ["status"] }, "VerifyEmailInput": { "type": "object", @@ -29054,10 +26556,7 @@ "example": "1ABG2C" } }, - "required": [ - "email", - "code" - ] + "required": ["email", "code"] }, "WorkingHours": { "type": "object", @@ -29079,11 +26578,7 @@ "nullable": true } }, - "required": [ - "days", - "startTime", - "endTime" - ] + "required": ["days", "startTime", "endTime"] }, "AvailabilityModel": { "type": "object", @@ -29123,12 +26618,7 @@ "nullable": true } }, - "required": [ - "id", - "days", - "startTime", - "endTime" - ] + "required": ["id", "days", "startTime", "endTime"] }, "ScheduleOutput": { "type": "object", @@ -29198,19 +26688,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "VerifyPhoneInput": { "type": "object", @@ -29226,10 +26710,7 @@ "example": "1ABG2C" } }, - "required": [ - "phone", - "code" - ] + "required": ["phone", "code"] }, "UserVerifiedPhoneOutput": { "type": "object", @@ -29237,19 +26718,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UserVerifiedEmailsOutput": { "type": "object", @@ -29257,19 +26732,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "UserVerifiedPhonesOutput": { "type": "object", @@ -29277,19 +26746,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamVerifiedEmailOutput": { "type": "object", @@ -29297,19 +26760,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamVerifiedPhoneOutput": { "type": "object", @@ -29317,19 +26774,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamVerifiedEmailsOutput": { "type": "object", @@ -29337,19 +26788,13 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] }, "TeamVerifiedPhonesOutput": { "type": "object", @@ -29357,20 +26802,14 @@ "status": { "type": "string", "example": "success", - "enum": [ - "success", - "error" - ] + "enum": ["success", "error"] }, "data": { "$ref": "#/components/schemas/ScheduleOutput" } }, - "required": [ - "status", - "data" - ] + "required": ["status", "data"] } } } -} \ No newline at end of file +} diff --git a/packages/features/bookings/lib/getCalEventResponses.ts b/packages/features/bookings/lib/getCalEventResponses.ts index a87b6fb8de..21a0318e4e 100644 --- a/packages/features/bookings/lib/getCalEventResponses.ts +++ b/packages/features/bookings/lib/getCalEventResponses.ts @@ -5,9 +5,9 @@ import { SystemField } from "@calcom/features/bookings/lib/SystemField"; import type { bookingResponsesDbSchema } from "@calcom/features/bookings/lib/getBookingResponsesSchema"; import { contructEmailFromPhoneNumber } from "@calcom/lib/contructEmailFromPhoneNumber"; import { getBookingWithResponses } from "@calcom/lib/getBooking"; +import { HttpError } from "@calcom/lib/http-error"; import { eventTypeBookingFields } from "@calcom/prisma/zod-utils"; import type { CalendarEvent } from "@calcom/types/Calendar"; -import { HttpError } from "@calcom/lib/http-error"; export const getCalEventResponses = ({ bookingFields, diff --git a/packages/lib/EventManager.ts b/packages/lib/EventManager.ts index 8ef382295d..1faf98f3c8 100644 --- a/packages/lib/EventManager.ts +++ b/packages/lib/EventManager.ts @@ -327,7 +327,9 @@ export default class EventManager { } const isDedicated = evt.location ? isDedicatedIntegration(evt.location) : null; - const isMSTeamsWithOutlookCalendar = evt.location === MSTeamsLocationType && mainHostDestinationCalendar?.integration === "office365_calendar"; + const isMSTeamsWithOutlookCalendar = + evt.location === MSTeamsLocationType && + mainHostDestinationCalendar?.integration === "office365_calendar"; const results: Array>> = []; diff --git a/packages/platform/examples/base/playwright.config.ts b/packages/platform/examples/base/playwright.config.ts index 02dcec57fc..65c28ab65a 100644 --- a/packages/platform/examples/base/playwright.config.ts +++ b/packages/platform/examples/base/playwright.config.ts @@ -1,4 +1,4 @@ -import { defineConfig, devices } from '@playwright/test'; +import { defineConfig, devices } from "@playwright/test"; const DEFAULT_EXPECT_TIMEOUT = process.env.CI ? 30000 : 120000; const DEFAULT_TEST_TIMEOUT = process.env.CI ? 60000 : 240000; @@ -12,35 +12,35 @@ export default defineConfig({ timeout: DEFAULT_TEST_TIMEOUT, fullyParallel: true, reporter: [ - ['list'], - ['html', { outputFolder: './test-results/reports/playwright-html-report', open: 'never' }], + ["list"], + ["html", { outputFolder: "./test-results/reports/playwright-html-report", open: "never" }], ], - outputDir: './test-results/results', + outputDir: "./test-results/results", use: { - baseURL: 'http://localhost:4322', - locale: 'en-US', - trace: 'retain-on-failure', + baseURL: "http://localhost:4322", + locale: "en-US", + trace: "retain-on-failure", headless, }, projects: [ { - name: '@calcom/base', - testDir: './tests', + name: "@calcom/base", + testDir: "./tests", testMatch: /.*\.e2e\.tsx?/, expect: { timeout: DEFAULT_EXPECT_TIMEOUT, }, use: { - ...devices['Desktop Chrome'], - locale: 'en-US', + ...devices["Desktop Chrome"], + locale: "en-US", }, }, ], webServer: { - command: process.env.CI + command: process.env.CI ? `yarn workspace @calcom/atoms dev-on && yarn workspace @calcom/atoms build && rm -f prisma/dev.db && yarn prisma db push && NEXT_PUBLIC_IS_E2E=1 NODE_ENV=test NEXT_PUBLIC_X_CAL_ID="${process.env.ATOMS_E2E_OAUTH_CLIENT_ID}" X_CAL_SECRET_KEY="${process.env.ATOMS_E2E_OAUTH_CLIENT_SECRET}" NEXT_PUBLIC_CALCOM_API_URL="${process.env.ATOMS_E2E_API_URL}" VITE_BOOKER_EMBED_OAUTH_CLIENT_ID="${process.env.ATOMS_E2E_OAUTH_CLIENT_ID_BOOKER_EMBED}" VITE_BOOKER_EMBED_API_URL="${process.env.ATOMS_E2E_API_URL}" ORGANIZATION_ID=${process.env.ATOMS_E2E_ORG_ID} yarn dev:e2e` : `rm -f prisma/dev.db && yarn prisma db push && yarn dev:e2e`, - url: 'http://localhost:4322', + url: "http://localhost:4322", timeout: 600_000, reuseExistingServer: !process.env.CI, }, diff --git a/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts b/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts index 54af2fe69f..05ec70f96f 100644 --- a/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts +++ b/packages/platform/examples/base/tests/create-event-type-atom/create-event-type.e2e.ts @@ -1,19 +1,19 @@ -import { test, expect } from '@playwright/test'; +import { test, expect } from "@playwright/test"; -test('create event type using CreateEventTypeAtom', async ({ page }) => { - await page.goto('/'); +test("create event type using CreateEventTypeAtom", async ({ page }) => { + await page.goto("/"); - await page.goto('/event-types'); + await page.goto("/event-types"); - await expect(page).toHaveURL('/event-types'); - - await expect(page.locator('body')).toBeVisible(); + await expect(page).toHaveURL("/event-types"); - await page.fill('[data-testid="event-type-quick-chat"]', 'e2e event'); + await expect(page.locator("body")).toBeVisible(); - await page.fill('textarea[placeholder="A quick video meeting."]', 'This is an e2e test event description'); + await page.fill('[data-testid="event-type-quick-chat"]', "e2e event"); - await page.waitForSelector('button[type="submit"]:has-text("Continue")', { state: 'visible' }); + await page.fill('textarea[placeholder="A quick video meeting."]', "This is an e2e test event description"); + + await page.waitForSelector('button[type="submit"]:has-text("Continue")', { state: "visible" }); await page.click('button[type="submit"]:has-text("Continue")'); await expect(page.locator('h1:has-text("E2e Event")')).toBeVisible(); diff --git a/packages/platform/types/event-types/outputs/private-link.output.ts b/packages/platform/types/event-types/outputs/private-link.output.ts index 984add1df5..f1c25aeba9 100644 --- a/packages/platform/types/event-types/outputs/private-link.output.ts +++ b/packages/platform/types/event-types/outputs/private-link.output.ts @@ -128,5 +128,3 @@ export class DeletePrivateLinkOutput { message: string; }; } - -