Skip to content

Commit 5aa24c8

Browse files
fix: event-type permissions (calcom#24318)
* New permission function * Update permission check service to have fall backs Update event type create permission procedure to also have org heigharchy * Update get eventType handler to use new procedure * Type check * Type fix * Update packages/features/pbac/lib/event-type-permissions.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Fix type errorr --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 8277ce9 commit 5aa24c8

8 files changed

Lines changed: 1481 additions & 147 deletions

File tree

apps/web/app/(use-page-wrapper)/event-types/[type]/page.tsx

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import { z } from "zod";
88

99
import { EventTypeWebWrapper } from "@calcom/atoms/event-types/wrappers/EventTypeWebWrapper";
1010
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
11-
import { Resource } from "@calcom/features/pbac/domain/types/permission-registry";
12-
import { getResourcePermissions } from "@calcom/features/pbac/lib/resource-permissions";
13-
import { prisma } from "@calcom/prisma";
14-
import { MembershipRole } from "@calcom/prisma/enums";
11+
import { getEventTypePermissions } from "@calcom/features/pbac/lib/event-type-permissions";
1512
import { eventTypesRouter } from "@calcom/trpc/server/routers/viewer/eventTypes/_router";
1613

1714
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
@@ -44,95 +41,6 @@ const getCachedEventType = unstable_cache(
4441
{ revalidate: 3600 } // Cache for 1 hour
4542
);
4643

47-
const getEventPermissions = async (userId: number, teamId: number | null) => {
48-
// Personal event - has all perms
49-
if (!teamId)
50-
return {
51-
eventTypes: {
52-
canRead: true,
53-
canCreate: true,
54-
canUpdate: true,
55-
canDelete: true,
56-
},
57-
workflows: {
58-
canRead: true,
59-
canCreate: true,
60-
canUpdate: true,
61-
canDelete: true,
62-
},
63-
};
64-
65-
const membership = await prisma.membership.findFirst({
66-
where: {
67-
userId,
68-
teamId,
69-
},
70-
select: {
71-
role: true,
72-
},
73-
});
74-
75-
if (!membership) throw new Error("Membership not found");
76-
77-
const [eventTypePermissions, workflowPermissions] = await Promise.all([
78-
getResourcePermissions({
79-
userId,
80-
teamId,
81-
resource: Resource.EventType,
82-
userRole: membership.role,
83-
fallbackRoles: {
84-
read: {
85-
roles: [MembershipRole.MEMBER, MembershipRole.ADMIN, MembershipRole.OWNER],
86-
},
87-
update: {
88-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
89-
},
90-
delete: {
91-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
92-
},
93-
create: {
94-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
95-
},
96-
},
97-
}),
98-
getResourcePermissions({
99-
userId,
100-
teamId,
101-
resource: Resource.Workflow,
102-
userRole: membership.role,
103-
fallbackRoles: {
104-
read: {
105-
roles: [MembershipRole.MEMBER, MembershipRole.ADMIN, MembershipRole.OWNER],
106-
},
107-
update: {
108-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
109-
},
110-
delete: {
111-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
112-
},
113-
create: {
114-
roles: [MembershipRole.ADMIN, MembershipRole.OWNER],
115-
},
116-
},
117-
}),
118-
]);
119-
120-
return {
121-
eventTypes: {
122-
canRead: eventTypePermissions.canRead,
123-
canCreate: eventTypePermissions.canCreate,
124-
canUpdate: eventTypePermissions.canEdit,
125-
canDelete: eventTypePermissions.canDelete,
126-
},
127-
workflows: {
128-
canRead: workflowPermissions.canRead,
129-
canCreate: workflowPermissions.canCreate,
130-
canUpdate: workflowPermissions.canEdit,
131-
canDelete: workflowPermissions.canDelete,
132-
},
133-
};
134-
};
135-
13644
const ServerPage = async ({ params }: PageProps) => {
13745
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
13846
if (!session?.user?.id) {
@@ -153,7 +61,7 @@ const ServerPage = async ({ params }: PageProps) => {
15361
}
15462

15563
// Fetch permissions for the event type's team
156-
const permissions = await getEventPermissions(session.user.id, data.eventType.teamId);
64+
const permissions = await getEventTypePermissions(session.user.id, data.eventType.teamId);
15765

15866
return <EventTypeWebWrapper data={data} id={eventTypeId} permissions={permissions} />;
15967
};

0 commit comments

Comments
 (0)