Skip to content

Commit fe190f2

Browse files
refactor: replace isTeamAdminOrOwner with PBAC permissions (calcom#24037)
* refactor: replace isTeamAdminOrOwner with PBAC permissions - Remove isTeamAdminOrOwner from team-members-view.tsx, rely on server-side permissions - Replace role checks in addMembersToEventTypes.handler.ts with eventType.update permission - Follow PBAC refactoring guide patterns for consistent permission checking - Fix TypeScript any type usage and unused variable warnings Co-Authored-By: eunjae@cal.com <hey@eunjae.dev> * use enum --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 96855ea commit fe190f2

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

apps/web/modules/teams/team-members-view.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import { useState } from "react";
44

5-
import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner";
65
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
76
import { MemberInvitationModalWithoutMembers } from "@calcom/features/ee/teams/components/MemberInvitationModal";
87
import MemberList from "@calcom/features/ee/teams/components/MemberList";
@@ -23,18 +22,23 @@ interface TeamMembersViewProps {
2322
}[];
2423
}[];
2524
};
26-
attributes?: any[];
25+
attributes?: {
26+
id: string;
27+
name: string;
28+
options: {
29+
value: string;
30+
}[];
31+
}[];
2732
permissions: MemberPermissions;
2833
}
2934

3035
export const TeamMembersView = ({ team, facetedTeamValues, permissions }: TeamMembersViewProps) => {
3136
const { t } = useLocale();
3237
const [showMemberInvitationModal, setShowMemberInvitationModal] = useState(false);
33-
const [showInviteLinkSettingsModal, setShowInviteLinkSettingsModal] = useState(false);
38+
const [_showInviteLinkSettingsModal, setShowInviteLinkSettingsModal] = useState(false);
3439

35-
// Use PBAC permissions if available, otherwise fall back to role-based check
36-
const isTeamAdminOrOwner = checkAdminOrOwner(team.membership.role);
37-
const canLoggedInUserSeeMembers = permissions?.canListMembers ?? (!team.isPrivate || isTeamAdminOrOwner);
40+
// Use PBAC permissions - server-side permission check should be done in parent component
41+
const canLoggedInUserSeeMembers = permissions?.canListMembers ?? false;
3842

3943
return (
4044
<LicenseRequired>

packages/trpc/server/routers/viewer/teams/addMembersToEventTypes.handler.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { isTeamAdmin, isTeamOwner } from "@calcom/features/ee/teams/lib/queries";
2-
import prisma from "@calcom/prisma";
1+
import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service";
2+
import { prisma } from "@calcom/prisma";
33
import type { Prisma } from "@calcom/prisma/client";
4+
import { MembershipRole } from "@calcom/prisma/enums";
45

56
import { TRPCError } from "@trpc/server";
67

@@ -17,11 +18,16 @@ type AddBulkToEventTypeHandler = {
1718
export async function addMembersToEventTypesHandler({ ctx, input }: AddBulkToEventTypeHandler) {
1819
const { eventTypeIds, userIds, teamId } = input;
1920

20-
const isTeamAdminOrOwner =
21-
(await isTeamAdmin(ctx.user.id, teamId)) || (await isTeamOwner(ctx.user.id, teamId));
21+
const permissionCheckService = new PermissionCheckService();
22+
const hasPermission = await permissionCheckService.checkPermission({
23+
userId: ctx.user.id,
24+
teamId,
25+
permission: "eventType.update",
26+
fallbackRoles: [MembershipRole.ADMIN, MembershipRole.OWNER],
27+
});
2228

23-
// check if user is admin or owner of team
24-
if (!isTeamAdminOrOwner) throw new TRPCError({ code: "UNAUTHORIZED" });
29+
// check if user has eventType.update permission
30+
if (!hasPermission) throw new TRPCError({ code: "UNAUTHORIZED" });
2531

2632
const data: Prisma.HostCreateManyInput[] = eventTypeIds.flatMap((eventId) =>
2733
userIds.map((userId) => ({

0 commit comments

Comments
 (0)