Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
f60f01c
Fix membership deletion handling and add tests
hariombalhara Jul 30, 2025
d97ae91
fixes
hariombalhara Jul 30, 2025
262ffe4
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Jul 30, 2025
8a7b758
revert api-v2 specific changes
hariombalhara Jul 30, 2025
5cd93f3
Add more tests
hariombalhara Jul 30, 2025
867d295
refactor: Move removeMember function into TeamService as private stat…
hariombalhara Jul 31, 2025
9fec1bc
refactor: Rename memberId to userId in TeamService methods
hariombalhara Jul 31, 2025
3fef285
test: add service unit tests and simplify e2e tests for membership de…
hariombalhara Jul 31, 2025
e653219
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Jul 31, 2025
02f82e1
package.json version
hariombalhara Jul 31, 2025
add44b5
fix unit teswtes
hariombalhara Jul 31, 2025
0f6ec3f
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Jul 31, 2025
0d1c0f9
No specs file
hariombalhara Jul 31, 2025
d705d2a
fix unit tests
hariombalhara Aug 1, 2025
d5a04db
fix: Add platform-libraries build step to E2E API v2 workflow
devin-ai-integration[bot] Aug 1, 2025
f9a932c
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Aug 1, 2025
4042c66
Merge branch 'fix-api-v2-org-user-membership-deletion' of https://git…
hariombalhara Aug 1, 2025
7b50b3e
Making tests clearer and easier to undestand
hariombalhara Aug 4, 2025
c54a3f0
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Aug 4, 2025
1c22f42
Merge branch 'main' into fix-api-v2-org-user-membership-deletion
hariombalhara Aug 5, 2025
a7b14e3
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Aug 14, 2025
3d1d820
Merge branch 'main' into fix-api-v2-org-user-membership-deletion
ThyMinimalDev Aug 14, 2025
73c7c13
chore: bump platform libs
ThyMinimalDev Aug 14, 2025
de66e05
Merge branch 'main' into fix-api-v2-org-user-membership-deletion
ThyMinimalDev Aug 14, 2025
8e3bf68
chore: bump platform libs
ThyMinimalDev Aug 14, 2025
de7ca2e
Merge branch 'main' into fix-api-v2-org-user-membership-deletion
hariombalhara Aug 18, 2025
729861b
Merge remote-tracking branch 'origin/main' into fix-api-v2-org-user-m…
hariombalhara Aug 18, 2025
07bd81c
chore: bump platform library
ThyMinimalDev Aug 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/api/v2/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"@axiomhq/winston": "^1.2.0",
"@calcom/platform-constants": "*",
"@calcom/platform-enums": "*",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.312",
"@calcom/platform-libraries": "npm:@calcom/platform-libraries@0.0.314",
"@calcom/platform-types": "*",
"@calcom/platform-utils": "*",
"@calcom/prisma": "*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { CreateOrgMembershipDto } from "@/modules/organizations/memberships/inpu
import { OrganizationsMembershipRepository } from "@/modules/organizations/memberships/organizations-membership.repository";
import { Injectable, NotFoundException } from "@nestjs/common";

import { TeamService } from "@calcom/platform-libraries";

import { UpdateOrgMembershipDto } from "../inputs/update-organization-membership.input";
import { OrganizationsMembershipOutputService } from "./organizations-membership-output.service";

Expand Down Expand Up @@ -62,10 +64,24 @@ export class OrganizationsMembershipService {
}

async deleteOrgMembership(organizationId: number, membershipId: number) {
const membership = await this.organizationsMembershipRepository.deleteOrgMembership(
// Get the membership first to get the userId
const membership = await this.organizationsMembershipRepository.findOrgMembership(
organizationId,
membershipId
);

if (!membership) {
throw new NotFoundException(
`Membership with id ${membershipId} within organization id ${organizationId} not found`
);
}

await TeamService.removeMembers({
teamIds: [organizationId],
userIds: [membership.userId],
isOrg: true,
});

return this.organizationsMembershipOutputService.getOrgMembershipOutput(membership);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import {
OrgTeamMembershipOutputResponseDto,
} from "@/modules/organizations/teams/memberships/outputs/organization-teams-memberships.output";
import { OrganizationsTeamsMembershipsService } from "@/modules/organizations/teams/memberships/services/organizations-teams-memberships.service";
import { TeamsEventTypesService } from "@/modules/teams/event-types/services/teams-event-types.service";
import { TeamMembershipOutput } from "@/modules/teams/memberships/outputs/team-membership.output";
import {
Controller,
Expand Down Expand Up @@ -59,7 +58,6 @@ export class OrganizationsTeamsMembershipsController {

constructor(
private organizationsTeamsMembershipsService: OrganizationsTeamsMembershipsService,
private teamsEventTypesService: TeamsEventTypesService,
private readonly organizationsRepository: OrganizationsRepository
) {}

Expand Down Expand Up @@ -127,8 +125,6 @@ export class OrganizationsTeamsMembershipsController {
membershipId
);

await this.teamsEventTypesService.deleteUserTeamEventTypesAndHosts(membership.userId, teamId);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Controller shouldn't orchestrate service calls, so it is hanlded inside deleteOrgTeamMembership and that too via TeamService.removeMembers, that makes it consistent with webapp


return {
status: SUCCESS_STATUS,
data: plainToClass(TeamMembershipOutput, membership, { strategy: "excludeAll" }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { UpdateOrgTeamMembershipDto } from "@/modules/organizations/teams/member
import { OrganizationsTeamsMembershipsRepository } from "@/modules/organizations/teams/memberships/organizations-teams-memberships.repository";
import { Injectable, NotFoundException } from "@nestjs/common";

import { TeamService } from "@calcom/platform-libraries";

@Injectable()
export class OrganizationsTeamsMembershipsService {
constructor(
Expand Down Expand Up @@ -58,11 +60,21 @@ export class OrganizationsTeamsMembershipsService {
}

async deleteOrgTeamMembership(organizationId: number, teamId: number, membershipId: number) {
const teamMembership = await this.organizationsTeamsMembershipsRepository.deleteOrgTeamMembershipById(
// First get the membership to get the userId
const teamMembership = await this.organizationsTeamsMembershipsRepository.findOrgTeamMembership(
organizationId,
teamId,
membershipId
);

if (!teamMembership) {
throw new NotFoundException(
`Membership with id ${membershipId} not found in team ${teamId} of organization ${organizationId}`
);
}

await TeamService.removeMembers({ teamIds: [teamId], userIds: [teamMembership.userId], isOrg: false });

return teamMembership;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -156,17 +156,4 @@ export class TeamsEventTypesService {

return this.eventTypesRepository.deleteEventType(eventTypeId);
}

async deleteUserTeamEventTypesAndHosts(userId: number, teamId: number) {
try {
await this.teamsEventTypesRepository.deleteUserManagedTeamEventTypes(userId, teamId);
await this.teamsEventTypesRepository.removeUserFromTeamEventTypesHosts(userId, teamId);
} catch (err) {
this.logger.error("Could not remove user from all team event-types.", {
error: err,
userId,
teamId,
});
}
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We use TeamService.removeMembers now

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { API_KEY_HEADER } from "@/lib/docs/headers";
import { Roles } from "@/modules/auth/decorators/roles/roles.decorator";
import { ApiAuthGuard } from "@/modules/auth/guards/api-auth/api-auth.guard";
import { RolesGuard } from "@/modules/auth/guards/roles/roles.guard";
import { TeamsEventTypesService } from "@/modules/teams/event-types/services/teams-event-types.service";
import { CreateTeamMembershipInput } from "@/modules/teams/memberships/inputs/create-team-membership.input";
import { UpdateTeamMembershipInput } from "@/modules/teams/memberships/inputs/update-team-membership.input";
import { CreateTeamMembershipOutput } from "@/modules/teams/memberships/outputs/create-team-membership.output";
Expand Down Expand Up @@ -45,10 +44,7 @@ import { SkipTakePagination } from "@calcom/platform-types";
export class TeamsMembershipsController {
private logger = new Logger("TeamsMembershipsController");

constructor(
private teamsMembershipsService: TeamsMembershipsService,
private teamsEventTypesService: TeamsEventTypesService
) {}
constructor(private teamsMembershipsService: TeamsMembershipsService) {}

@Roles("TEAM_ADMIN")
@Post("/")
Expand Down Expand Up @@ -127,7 +123,6 @@ export class TeamsMembershipsController {
membershipId,
body
);

if (!currentMembership.accepted && updatedMembership.accepted) {
try {
await updateNewTeamMemberEventTypes(updatedMembership.userId, teamId);
Expand All @@ -151,8 +146,6 @@ export class TeamsMembershipsController {
): Promise<DeleteTeamMembershipOutput> {
const membership = await this.teamsMembershipsService.deleteTeamMembership(teamId, membershipId);

await this.teamsEventTypesService.deleteUserTeamEventTypesAndHosts(membership.userId, teamId);

return {
status: SUCCESS_STATUS,
data: plainToClass(TeamMembershipOutput, membership, { strategy: "excludeAll" }),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { UpdateTeamMembershipInput } from "@/modules/teams/memberships/inputs/up
import { TeamsMembershipsRepository } from "@/modules/teams/memberships/teams-memberships.repository";
import { Injectable, NotFoundException } from "@nestjs/common";

import { TeamService } from "@calcom/platform-libraries";

@Injectable()
export class TeamsMembershipsService {
constructor(private readonly teamsMembershipsRepository: TeamsMembershipsRepository) {}
Expand Down Expand Up @@ -41,10 +43,15 @@ export class TeamsMembershipsService {
}

async deleteTeamMembership(teamId: number, membershipId: number) {
const teamMembership = await this.teamsMembershipsRepository.deleteTeamMembershipById(
teamId,
membershipId
);
// First get the membership to get the userId
const teamMembership = await this.teamsMembershipsRepository.findTeamMembership(teamId, membershipId);

if (!teamMembership) {
throw new NotFoundException(`Membership with id ${membershipId} not found in team ${teamId}`);
}

await TeamService.removeMembers({ teamIds: [teamId], userIds: [teamMembership.userId], isOrg: false });

return teamMembership;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,8 @@ export class EventTypesRepositoryFixture {
async delete(eventTypeId: EventType["id"]) {
return this.prismaWriteClient.eventType.delete({ where: { id: eventTypeId } });
}

async findById(eventTypeId: EventType["id"]) {
return this.prismaReadClient.eventType.findUnique({ where: { id: eventTypeId } });
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ export class MembershipRepositoryFixture {
await this.prismaWriteClient.user.update({ where: { id: user.id }, data: { organizationId: org.id } });
return membership;
}

async findById(membershipId: Membership["id"]) {
return this.prismaReadClient.membership.findUnique({ where: { id: membershipId } });
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { _generateMetadata } from "app/_utils";
import { notFound } from "next/navigation";

import { FeaturesRepository } from "@calcom/features/flags/features.repository";
Expand Down
2 changes: 1 addition & 1 deletion packages/features/bookings/Booker/components/EventMeta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export const EventMeta = ({
timeZones,
children,
selectedTimeslot,
roundRobinHideOrgAndTeam
roundRobinHideOrgAndTeam,
}: {
event?: Pick<
BookerEvent,
Expand Down
8 changes: 2 additions & 6 deletions packages/features/ee/dsync/lib/removeUserFromOrg.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import removeMember from "@calcom/features/ee/teams/lib/removeMember";
import { TeamService } from "@calcom/lib/server/service/teamService";

const removeUserFromOrg = async ({ userId, orgId }: { userId: number; orgId: number }) => {
return removeMember({
memberId: userId,
teamId: orgId,
isOrg: true,
});
return TeamService.removeMembers({ teamIds: [orgId], userIds: [userId], isOrg: true });
};

export default removeUserFromOrg;
141 changes: 0 additions & 141 deletions packages/features/ee/teams/lib/removeMember.ts

This file was deleted.

Loading
Loading