Skip to content

Commit e669996

Browse files
authored
fix: Inconsistent Location Handling for Event Types API - Map office365-video to msteams in Validation Handling (calcom#21255)
* refactor: rename office365-video to msteams across API and platform code * Revert "refactor: rename office365-video to msteams across API and platform code" This reverts commit 7a823ab. * Fix: inconsistency in default location values for create and update event-types
1 parent 0e6f365 commit e669996

6 files changed

Lines changed: 309 additions & 266 deletions

File tree

apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { InputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_
88
import { OutputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/output-event-types.service";
99
import { SchedulesRepository_2024_06_11 } from "@/ee/schedules/schedules_2024_06_11/schedules.repository";
1010
import { AppsRepository } from "@/modules/apps/apps.repository";
11-
import { ConferencingModule } from "@/modules/conferencing/conferencing.module";
1211
import { CredentialsRepository } from "@/modules/credentials/credentials.repository";
1312
import { MembershipsModule } from "@/modules/memberships/memberships.module";
1413
import { PrismaModule } from "@/modules/prisma/prisma.module";
@@ -19,7 +18,7 @@ import { UsersRepository } from "@/modules/users/users.repository";
1918
import { Module } from "@nestjs/common";
2019

2120
@Module({
22-
imports: [PrismaModule, MembershipsModule, TokensModule, SelectedCalendarsModule, ConferencingModule],
21+
imports: [PrismaModule, MembershipsModule, TokensModule, SelectedCalendarsModule],
2322
providers: [
2423
EventTypesRepository_2024_06_14,
2524
EventTypesService_2024_06_14,

apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/input-event-types.service.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import { ConferencingService } from "@/modules/conferencing/services/conferencin
55
import { UserWithProfile } from "@/modules/users/users.repository";
66
import { Injectable, BadRequestException } from "@nestjs/common";
77

8+
import { CONFERENCING_APPS } from "@calcom/platform-constants";
9+
import { getUsersCredentials } from "@calcom/platform-libraries";
10+
import { getApps } from "@calcom/platform-libraries/app-store";
811
import {
912
transformBookingFieldsApiToInternal,
1013
transformLocationsApiToInternal,
@@ -50,8 +53,7 @@ interface ValidationContext {
5053
export class InputEventTypesService_2024_06_14 {
5154
constructor(
5255
private readonly eventTypesRepository: EventTypesRepository_2024_06_14,
53-
private readonly calendarsService: CalendarsService,
54-
private readonly conferencingService: ConferencingService
56+
private readonly calendarsService: CalendarsService
5557
) {}
5658

5759
async transformAndValidateCreateEventTypeInput(
@@ -457,10 +459,32 @@ export class InputEventTypesService_2024_06_14 {
457459
if (location.type === "integration") {
458460
// cal-video is global, so we can skip this check
459461
if (location.integration !== "cal-video") {
460-
await this.conferencingService.checkAppIsValidAndConnected(user, location.integration);
462+
await this.checkAppIsValidAndConnected(user, location.integration);
461463
}
462464
}
463465
}) ?? []
464466
);
465467
}
468+
469+
async checkAppIsValidAndConnected(user: UserWithProfile, appSlug: string) {
470+
const conferencingApps = ["google-meet", "office365-video", "zoom"];
471+
if (!conferencingApps.includes(appSlug)) {
472+
throw new BadRequestException("Invalid app, available apps are: ", conferencingApps.join(", "));
473+
}
474+
475+
if (appSlug === "office365-video") {
476+
appSlug = "msteams";
477+
}
478+
479+
const credentials = await getUsersCredentials(user);
480+
481+
const foundApp = getApps(credentials, true).filter((app) => app.slug === appSlug)[0];
482+
483+
const appLocation = foundApp?.appData?.location;
484+
485+
if (!foundApp || !appLocation) {
486+
throw new BadRequestException(`${appSlug} not connected.`);
487+
}
488+
return foundApp.credential;
489+
}
466490
}

apps/api/v2/src/modules/organizations/event-types/services/input.service.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InputEventTypesService_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/services/input-event-types.service";
2+
import { ConferencingRepository } from "@/modules/conferencing/repositories/conferencing.repository";
23
import { OrganizationsConferencingService } from "@/modules/organizations/conferencing/services/organizations-conferencing.service";
34
import { TeamsEventTypesRepository } from "@/modules/teams/event-types/teams-event-types.repository";
45
import { TeamsRepository } from "@/modules/teams/teams/teams.repository";
@@ -27,7 +28,8 @@ export class InputOrganizationsEventTypesService {
2728
private readonly teamsRepository: TeamsRepository,
2829
private readonly usersRepository: UsersRepository,
2930
private readonly teamsEventTypesRepository: TeamsEventTypesRepository,
30-
private readonly conferencingService: OrganizationsConferencingService
31+
private readonly conferencingService: OrganizationsConferencingService,
32+
private readonly conferencingRepository: ConferencingRepository
3133
) {}
3234
async transformAndValidateCreateTeamEventTypeInput(
3335
userId: number,
@@ -306,6 +308,22 @@ export class InputOrganizationsEventTypesService {
306308
}) ?? []
307309
);
308310
}
311+
312+
async checkAppIsValidAndConnected(teamId: number, app: string) {
313+
const conferencingApps = ["google-meet", "office365-video", "zoom"];
314+
if (!conferencingApps.includes(app)) {
315+
throw new BadRequestException("Invalid app, available apps are: ", conferencingApps.join(", "));
316+
}
317+
if (app === "office365-video") {
318+
app = "msteams";
319+
}
320+
const credential = await this.conferencingRepository.findTeamConferencingApp(teamId, app);
321+
322+
if (!credential) {
323+
throw new BadRequestException(`${app} not connected.`);
324+
}
325+
return credential;
326+
}
309327
}
310328

311329
function getPriorityValue(priority: keyof typeof HostPriority): number {

apps/api/v2/src/modules/teams/event-types/teams-event-types.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { EventTypesModule_2024_06_14 } from "@/ee/event-types/event-types_2024_06_14/event-types.module";
2+
import { ConferencingRepository } from "@/modules/conferencing/repositories/conferencing.repository";
23
import { MembershipsModule } from "@/modules/memberships/memberships.module";
34
import { OrganizationsConferencingModule } from "@/modules/organizations/conferencing/organizations-conferencing.module";
45
import { OutputTeamEventTypesResponsePipe } from "@/modules/organizations/event-types/pipes/team-event-types-response.transformer";
@@ -31,6 +32,7 @@ import { Module } from "@nestjs/common";
3132
OrganizationsTeamsRepository,
3233
OutputTeamEventTypesResponsePipe,
3334
OutputOrganizationsEventTypesService,
35+
ConferencingRepository,
3436
],
3537
exports: [TeamsEventTypesRepository, TeamsEventTypesService],
3638
controllers: [TeamsEventTypesController],

0 commit comments

Comments
 (0)