From b7cf893169e16a6e7f8178ab53c229748a2a7f4b Mon Sep 17 00:00:00 2001 From: Eunjae Lee Date: Mon, 29 Sep 2025 09:59:23 +0200 Subject: [PATCH] refactor: replace checkAdminOrOwner with PBAC availability.read permission (#24115) - Replace role-based check with PermissionCheckService - Use availability.read permission with OWNER/ADMIN fallback roles - Maintain existing privacy logic for organizations - Follow established PBAC pattern from bookings implementation Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../(main-nav)/availability/page.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx b/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx index b1cae6c72a..3e20456820 100644 --- a/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx +++ b/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx @@ -5,10 +5,11 @@ import { unstable_cache } from "next/cache"; import { cookies, headers } from "next/headers"; import { redirect } from "next/navigation"; -import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; +import { PermissionCheckService } from "@calcom/features/pbac/services/permission-check.service"; import { AvailabilitySliderTable } from "@calcom/features/timezone-buddy/components/AvailabilitySliderTable"; import { OrganizationRepository } from "@calcom/lib/server/repository/organization"; +import { MembershipRole } from "@calcom/prisma/enums"; import { availabilityRouter } from "@calcom/trpc/server/routers/viewer/availability/_router"; import { buildLegacyRequest } from "@lib/buildLegacyCtx"; @@ -72,8 +73,14 @@ const Page = async ({ searchParams: _searchParams }: PageProps) => { orgId: organizationId, }) : false; - const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role); - const canViewTeamAvailability = isOrgAdminOrOwner || !isOrgPrivate; + + const permissionService = new PermissionCheckService(); + const teamIdsWithPermission = await permissionService.getTeamIdsWithPermission({ + userId: session.user.id, + permission: "availability.read", + fallbackRoles: [MembershipRole.OWNER, MembershipRole.ADMIN], + }); + const canViewTeamAvailability = teamIdsWithPermission.length > 0 || !isOrgPrivate; return (