From 044df04d3f9b663835eb9d06254a8fc68063b321 Mon Sep 17 00:00:00 2001 From: Lauris Skraucis Date: Thu, 29 May 2025 13:58:40 +0200 Subject: [PATCH] feat: v2 return team event type hosts username (#21617) * feat: return team event type hosts username * docs: team event types hosts username in return --- .../organizations-event-types.e2e-spec.ts | 17 +++++++++++++++++ .../event-types/services/output.service.ts | 13 ++++++++++--- .../teams-event-types.controller.e2e-spec.ts | 17 +++++++++++++++++ apps/api/v2/swagger/documentation.json | 7 ++++++- docs/api-reference/v2/openapi.json | 6 +++++- .../outputs/event-type.output.ts | 4 ++++ 6 files changed, 59 insertions(+), 5 deletions(-) diff --git a/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts index 21b25a0011..32fbd4a924 100644 --- a/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts +++ b/apps/api/v2/src/modules/organizations/event-types/organizations-event-types.e2e-spec.ts @@ -89,11 +89,13 @@ describe("Organizations Event Types Endpoints", () => { teammate1 = await userRepositoryFixture.create({ email: teammate1Email, username: teammate1Email, + name: "alice", }); teammate2 = await userRepositoryFixture.create({ email: teammate2Email, username: teammate2Email, + name: "bob", }); falseTestUser = await userRepositoryFixture.create({ @@ -432,6 +434,21 @@ describe("Organizations Event Types Endpoints", () => { const responseTeamEvent = responseBody.data.find((event) => event.teamId === team.id); expect(responseTeamEvent).toBeDefined(); + expect(responseTeamEvent?.hosts).toEqual([ + { + userId: teammate1.id, + name: teammate1.name, + username: teammate1.username, + avatarUrl: teammate1.avatarUrl, + }, + { + userId: teammate2.id, + name: teammate2.name, + username: teammate2.username, + avatarUrl: teammate2.avatarUrl, + }, + ]); + if (!responseTeamEvent) { throw new Error("Team event not found"); } diff --git a/apps/api/v2/src/modules/organizations/event-types/services/output.service.ts b/apps/api/v2/src/modules/organizations/event-types/services/output.service.ts index 9941b03191..427c616310 100644 --- a/apps/api/v2/src/modules/organizations/event-types/services/output.service.ts +++ b/apps/api/v2/src/modules/organizations/event-types/services/output.service.ts @@ -93,7 +93,7 @@ export class OutputOrganizationsEventTypesService { const hosts = databaseEventType.schedulingType === "MANAGED" ? await this.getManagedEventTypeHosts(databaseEventType.id) - : await this.transformHosts(databaseEventType.hosts, databaseEventType.schedulingType); + : await this.getNonManagedEventTypeHosts(databaseEventType.hosts, databaseEventType.schedulingType); return { ...rest, @@ -138,13 +138,18 @@ export class OutputOrganizationsEventTypesService { for (const child of children) { if (child.userId) { const user = await this.usersRepository.findById(child.userId); - transformedHosts.push({ userId: child.userId, name: user?.name || "" }); + transformedHosts.push({ + userId: child.userId, + name: user?.name || "", + username: user?.username || "", + avatarUrl: user?.avatarUrl, + }); } } return transformedHosts; } - async transformHosts( + async getNonManagedEventTypeHosts( databaseHosts: Host[], schedulingType: SchedulingType | null ): Promise { @@ -160,6 +165,7 @@ export class OutputOrganizationsEventTypesService { transformedHosts.push({ userId: databaseHost.userId, name: databaseUser?.name || "", + username: databaseUser?.username || "", mandatory: !!databaseHost.isFixed, priority: getPriorityLabel(databaseHost.priority || 2), avatarUrl: databaseUser?.avatarUrl, @@ -168,6 +174,7 @@ export class OutputOrganizationsEventTypesService { transformedHosts.push({ userId: databaseHost.userId, name: databaseUser?.name || "", + username: databaseUser?.username || "", avatarUrl: databaseUser?.avatarUrl, }); } diff --git a/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.e2e-spec.ts b/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.e2e-spec.ts index 492aaaaa42..a41173d2a4 100644 --- a/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/teams/event-types/controllers/teams-event-types.controller.e2e-spec.ts @@ -85,11 +85,13 @@ describe("Organizations Event Types Endpoints", () => { teamMember1 = await userRepositoryFixture.create({ email: teammate1Email, username: teammate1Email, + name: "alice", }); teamMember2 = await userRepositoryFixture.create({ email: teammate2Email, username: teammate2Email, + name: "bob", }); falseTestUser = await userRepositoryFixture.create({ @@ -403,6 +405,21 @@ describe("Organizations Event Types Endpoints", () => { const responseTeamEvent = responseBody.data.find((event) => event.teamId === team.id); expect(responseTeamEvent).toBeDefined(); + expect(responseTeamEvent?.hosts).toEqual([ + { + userId: teamMember1.id, + name: teamMember1.name, + username: teamMember1.username, + avatarUrl: teamMember1.avatarUrl, + }, + { + userId: teamMember2.id, + name: teamMember2.name, + username: teamMember2.username, + avatarUrl: teamMember2.avatarUrl, + }, + ]); + if (!responseTeamEvent) { throw new Error("Team event not found"); } diff --git a/apps/api/v2/swagger/documentation.json b/apps/api/v2/swagger/documentation.json index 7e36b9b43f..5c49dd1317 100644 --- a/apps/api/v2/swagger/documentation.json +++ b/apps/api/v2/swagger/documentation.json @@ -19060,6 +19060,10 @@ "type": "string", "example": "John Doe" }, + "username": { + "type": "string", + "example": "john-doe" + }, "avatarUrl": { "type": "string", "nullable": true, @@ -19068,7 +19072,8 @@ }, "required": [ "userId", - "name" + "name", + "username" ] }, "EventTypeTeam": { diff --git a/docs/api-reference/v2/openapi.json b/docs/api-reference/v2/openapi.json index a005beaa7d..5c30d732ec 100644 --- a/docs/api-reference/v2/openapi.json +++ b/docs/api-reference/v2/openapi.json @@ -17679,13 +17679,17 @@ "type": "string", "example": "John Doe" }, + "username": { + "type": "string", + "example": "john-doe" + }, "avatarUrl": { "type": "string", "nullable": true, "example": "https://cal.com/api/avatar/d95949bc-ccb1-400f-acf6-045c51a16856.png" } }, - "required": ["userId", "name"] + "required": ["userId", "name", "username"] }, "EventTypeTeam": { "type": "object", diff --git a/packages/platform/types/event-types/event-types_2024_06_14/outputs/event-type.output.ts b/packages/platform/types/event-types/event-types_2024_06_14/outputs/event-type.output.ts index eec7a98dd6..93c75db88d 100644 --- a/packages/platform/types/event-types/event-types_2024_06_14/outputs/event-type.output.ts +++ b/packages/platform/types/event-types/event-types_2024_06_14/outputs/event-type.output.ts @@ -436,6 +436,10 @@ export class TeamEventTypeResponseHost extends TeamEventTypeHostInput { @DocsProperty({ example: "John Doe" }) name!: string; + @IsString() + @DocsProperty({ example: "john-doe" }) + username!: string; + @IsString() @IsOptional() @ApiPropertyOptional({