fix: creating organization team should add owner (#15779)

* chore: platform libraries versions cleanup api v2

* fix: create membership to created org team apiv2

* chore: add test check owner membership

---------

Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
This commit is contained in:
Morgan
2024-07-16 10:31:29 +00:00
committed by GitHub
co-authored by Lauris Skraucis
parent 7046f6f80a
commit 9fec77e345
5 changed files with 39 additions and 6 deletions
@@ -1,6 +1,8 @@
import { PrismaReadService } from "@/modules/prisma/prisma-read.service";
import { Injectable } from "@nestjs/common";
import { MembershipRole } from "@calcom/prisma/client";
@Injectable()
export class MembershipsRepository {
constructor(private readonly dbRead: PrismaReadService) {}
@@ -47,4 +49,16 @@ export class MembershipsRepository {
return !!adminMembership;
}
async createMembership(teamId: number, userId: number, role: MembershipRole) {
const membership = await this.dbRead.prisma.membership.create({
data: {
role,
teamId,
userId,
},
});
return membership;
}
}
@@ -135,12 +135,17 @@ describe("Organizations Team Endpoints", () => {
name: "Team created via API",
} satisfies CreateOrgTeamDto)
.expect(201)
.then((response) => {
.then(async (response) => {
const responseBody: ApiSuccessResponse<Team> = response.body;
expect(responseBody.status).toEqual(SUCCESS_STATUS);
teamCreatedViaApi = responseBody.data;
expect(teamCreatedViaApi.name).toEqual("Team created via API");
expect(teamCreatedViaApi.parentId).toEqual(org.id);
const membership = await membershipsRepositoryFixture.getUserMembershipByTeamId(
user.id,
teamCreatedViaApi.id
);
expect(membership?.role ?? "").toEqual("OWNER");
});
});
@@ -1,5 +1,6 @@
import { API_VERSIONS_VALUES } from "@/lib/api-versions";
import { GetTeam } from "@/modules/auth/decorators/get-team/get-team.decorator";
import { GetUser } from "@/modules/auth/decorators/get-user/get-user.decorator";
import { Roles } from "@/modules/auth/decorators/roles/roles.decorator";
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
import { IsOrgGuard } from "@/modules/auth/guards/organizations/is-org.guard";
@@ -12,6 +13,7 @@ import {
OrgTeamsOutputResponseDto,
} from "@/modules/organizations/outputs/organization-team.output";
import { OrganizationsTeamsService } from "@/modules/organizations/services/organizations-teams.service";
import { UserWithProfile } from "@/modules/users/users.repository";
import {
Controller,
UseGuards,
@@ -99,14 +101,14 @@ export class OrganizationsTeamsController {
}
@Post()
@UseGuards()
@Roles("ORG_ADMIN")
@ApiOperation({ summary: "Create a team for an organization." })
async createTeam(
@Param("orgId", ParseIntPipe) orgId: number,
@Body() body: CreateOrgTeamDto
@Body() body: CreateOrgTeamDto,
@GetUser() user: UserWithProfile
): Promise<OrgTeamOutputResponseDto> {
const team = await this.organizationsTeamsService.createOrgTeam(orgId, body);
const team = await this.organizationsTeamsService.createOrgTeam(orgId, body, user);
return {
status: SUCCESS_STATUS,
data: plainToClass(OrgTeamOutputDto, team, { strategy: "excludeAll" }),
@@ -1,10 +1,15 @@
import { MembershipsRepository } from "@/modules/memberships/memberships.repository";
import { CreateOrgTeamDto } from "@/modules/organizations/inputs/create-organization-team.input";
import { OrganizationsTeamsRepository } from "@/modules/organizations/repositories/organizations-teams.repository";
import { UserWithProfile } from "@/modules/users/users.repository";
import { Injectable } from "@nestjs/common";
@Injectable()
export class OrganizationsTeamsService {
constructor(private readonly organizationsTeamRepository: OrganizationsTeamsRepository) {}
constructor(
private readonly organizationsTeamRepository: OrganizationsTeamsRepository,
private readonly membershipsRepository: MembershipsRepository
) {}
async getPaginatedOrgTeams(organizationId: number, skip = 0, take = 250) {
const teams = await this.organizationsTeamRepository.findOrgTeamsPaginated(organizationId, skip, take);
@@ -21,8 +26,11 @@ export class OrganizationsTeamsService {
return team;
}
async createOrgTeam(organizationId: number, data: CreateOrgTeamDto) {
async createOrgTeam(organizationId: number, data: CreateOrgTeamDto, user: UserWithProfile) {
const team = await this.organizationsTeamRepository.createOrgTeam(organizationId, data);
if (user.role !== "ADMIN") {
await this.membershipsRepository.createMembership(team.id, user.id, "OWNER");
}
return team;
}
}
@@ -24,6 +24,10 @@ export class MembershipRepositoryFixture {
return this.primaReadClient.membership.findFirst({ where: { id: membershipId } });
}
async getUserMembershipByTeamId(userId: User["id"], teamId: Team["id"]) {
return this.primaReadClient.membership.findFirst({ where: { teamId, userId } });
}
async addUserToOrg(user: User, org: Team, role: MembershipRole, accepted: boolean) {
const membership = await this.prismaWriteClient.membership.create({
data: { teamId: org.id, userId: user.id, role, accepted },