diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.e2e-spec.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.e2e-spec.ts index 75dbe65785..d0df40af54 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.e2e-spec.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.e2e-spec.ts @@ -16,6 +16,7 @@ import { Test } from "@nestjs/testing"; import { PlatformOAuthClient, Team, User, EventType } from "@prisma/client"; import * as request from "supertest"; import { EventTypesRepositoryFixture } from "test/fixtures/repository/event-types.repository.fixture"; +import { MembershipRepositoryFixture } from "test/fixtures/repository/membership.repository.fixture"; import { OAuthClientRepositoryFixture } from "test/fixtures/repository/oauth-client.repository.fixture"; import { ProfileRepositoryFixture } from "test/fixtures/repository/profiles.repository.fixture"; import { SchedulesRepositoryFixture } from "test/fixtures/repository/schedules.repository.fixture"; @@ -79,6 +80,7 @@ describe("OAuth Client Users Endpoints", () => { let eventTypesRepositoryFixture: EventTypesRepositoryFixture; let schedulesRepositoryFixture: SchedulesRepositoryFixture; let profilesRepositoryFixture: ProfileRepositoryFixture; + let membershipsRepositoryFixture: MembershipRepositoryFixture; let postResponseData: CreateManagedUserOutput["data"]; @@ -103,26 +105,33 @@ describe("OAuth Client Users Endpoints", () => { eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); schedulesRepositoryFixture = new SchedulesRepositoryFixture(moduleRef); profilesRepositoryFixture = new ProfileRepositoryFixture(moduleRef); + membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); platformAdmin = await userRepositoryFixture.create({ email: platformAdminEmail }); - organization = await teamRepositoryFixture.create({ name: "organization" }); + organization = await teamRepositoryFixture.create({ + name: "organization", + isPlatform: true, + isOrganization: true, + }); oAuthClient = await createOAuthClient(organization.id); await profilesRepositoryFixture.create({ - uid: "asd-asd", + uid: "asd1qwwqeqw-asddsadasd", username: platformAdminEmail, organization: { connect: { id: organization.id } }, - movedFromUser: { - connect: { - id: platformAdmin.id, - }, - }, user: { connect: { id: platformAdmin.id }, }, }); + await membershipsRepositoryFixture.create({ + role: "OWNER", + user: { connect: { id: platformAdmin.id } }, + team: { connect: { id: organization.id } }, + accepted: true, + }); + await app.init(); }); @@ -370,7 +379,7 @@ describe("OAuth Client Users Endpoints", () => { let teamRepositoryFixture: TeamRepositoryFixture; let eventTypesRepositoryFixture: EventTypesRepositoryFixture; let profileRepositoryFixture: ProfileRepositoryFixture; - + let membershipsRepositoryFixture: MembershipRepositoryFixture; let postResponseData: CreateManagedUserOutput["data"]; const userEmail = "oauth-client-users-user@gmail.com"; @@ -390,10 +399,11 @@ describe("OAuth Client Users Endpoints", () => { teamRepositoryFixture = new TeamRepositoryFixture(moduleRef); eventTypesRepositoryFixture = new EventTypesRepositoryFixture(moduleRef); profileRepositoryFixture = new ProfileRepositoryFixture(moduleRef); - + membershipsRepositoryFixture = new MembershipRepositoryFixture(moduleRef); organization = await teamRepositoryFixture.create({ name: "Testy Organization", isOrganization: true, + isPlatform: true, }); owner = await userRepositoryFixture.create({ @@ -417,6 +427,13 @@ describe("OAuth Client Users Endpoints", () => { }, }); + await membershipsRepositoryFixture.create({ + role: "OWNER", + user: { connect: { id: owner.id } }, + team: { connect: { id: organization.id } }, + accepted: true, + }); + oAuthClient1 = await createOAuthClient(organization.id); oAuthClient2 = await createOAuthClient(organization.id); diff --git a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts index 6f4b89f5af..1cc0d18264 100644 --- a/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts +++ b/apps/api/v2/src/modules/oauth-clients/controllers/oauth-client-users/oauth-client-users.controller.ts @@ -1,6 +1,8 @@ import { API_VERSIONS_VALUES } from "@/lib/api-versions"; import { Locales } from "@/lib/enums/locales"; +import { MembershipRoles } from "@/modules/auth/decorators/roles/membership-roles.decorator"; import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard"; +import { OrganizationRolesGuard } from "@/modules/auth/guards/organization-roles/organization-roles.guard"; import { CreateManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/create-managed-user.output"; import { GetManagedUserOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-user.output"; import { GetManagedUsersOutput } from "@/modules/oauth-clients/controllers/oauth-client-users/outputs/get-managed-users.output"; @@ -29,7 +31,7 @@ import { NotFoundException, } from "@nestjs/common"; import { ApiOperation, ApiTags as DocsTags } from "@nestjs/swagger"; -import { User } from "@prisma/client"; +import { User, MembershipRole } from "@prisma/client"; import { SUCCESS_STATUS } from "@calcom/platform-constants"; import { Pagination } from "@calcom/platform-types"; @@ -38,7 +40,7 @@ import { Pagination } from "@calcom/platform-types"; path: "/v2/oauth-clients/:clientId/users", version: API_VERSIONS_VALUES, }) -@UseGuards(ApiAuthGuard, OAuthClientGuard) +@UseGuards(ApiAuthGuard, OAuthClientGuard, OrganizationRolesGuard) @DocsTags("Platform / Managed Users") export class OAuthClientUsersController { private readonly logger = new Logger("UserController"); @@ -52,6 +54,7 @@ export class OAuthClientUsersController { @Get("/") @ApiOperation({ summary: "Get all managed users" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async getManagedUsers( @Param("clientId") oAuthClientId: string, @Query() queryParams: Pagination @@ -73,6 +76,7 @@ export class OAuthClientUsersController { @Post("/") @ApiOperation({ summary: "Create a managed user" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async createUser( @Param("clientId") oAuthClientId: string, @Body() body: CreateManagedUserInput @@ -104,6 +108,7 @@ export class OAuthClientUsersController { @Get("/:userId") @HttpCode(HttpStatus.OK) @ApiOperation({ summary: "Get a managed user" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async getUserById( @Param("clientId") clientId: string, @Param("userId") userId: number @@ -119,6 +124,7 @@ export class OAuthClientUsersController { @Patch("/:userId") @HttpCode(HttpStatus.OK) @ApiOperation({ summary: "Update a managed user" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async updateUser( @Param("clientId") clientId: string, @Param("userId") userId: number, @@ -138,6 +144,7 @@ export class OAuthClientUsersController { @Delete("/:userId") @HttpCode(HttpStatus.OK) @ApiOperation({ summary: "Delete a managed user" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async deleteUser( @Param("clientId") clientId: string, @Param("userId") userId: number @@ -156,6 +163,7 @@ export class OAuthClientUsersController { @Post("/:userId/force-refresh") @HttpCode(HttpStatus.OK) @ApiOperation({ summary: "Force refresh tokens" }) + @MembershipRoles([MembershipRole.ADMIN, MembershipRole.OWNER]) async forceRefresh( @Param("userId") userId: number, @Param("clientId") oAuthClientId: string