From 9748d55dc1bd08cabe82e55d6aba43b90b03aa03 Mon Sep 17 00:00:00 2001 From: hbjORbj Date: Thu, 25 Sep 2025 17:20:54 +0900 Subject: [PATCH 1/4] Remove isTeamMember --- packages/features/ee/teams/lib/queries.ts | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/packages/features/ee/teams/lib/queries.ts b/packages/features/ee/teams/lib/queries.ts index a90f4a1d508736..cb3e10d9260dcd 100644 --- a/packages/features/ee/teams/lib/queries.ts +++ b/packages/features/ee/teams/lib/queries.ts @@ -385,27 +385,6 @@ export async function getTeamWithoutMembers(args: { }; } -export async function isTeamOwner(userId: number, teamId: number) { - return !!(await prisma.membership.findFirst({ - where: { - userId, - teamId, - accepted: true, - role: "OWNER", - }, - })); -} - -export async function isTeamMember(userId: number, teamId: number) { - return !!(await prisma.membership.findFirst({ - where: { - userId, - teamId, - accepted: true, - }, - })); -} - export function generateNewChildEventTypeDataForDB({ eventType, userId, From 45f02e8d91343b3152a4ea52e9f39606cdfcf5d9 Mon Sep 17 00:00:00 2001 From: hbjORbj Date: Thu, 25 Sep 2025 17:20:57 +0900 Subject: [PATCH 2/4] updates --- .../viewer/teams/getInternalNotesPresets.handler.ts | 11 ++++++++--- .../viewer/teams/getMemberAvailability.handler.ts | 12 +++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts b/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts index 389697de15f8eb..319892592d2d6b 100644 --- a/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts @@ -1,4 +1,4 @@ -import { isTeamMember } from "@calcom/features/ee/teams/lib/queries"; +import { MembershipRepository } from "@calcom/lib/server/repository/membership"; import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/types"; @@ -14,8 +14,13 @@ type UpdateMembershipOptions = { }; export const getInternalNotesPresetsHandler = async ({ ctx, input }: UpdateMembershipOptions) => { - if (!(await isTeamMember(ctx.user?.id, input.teamId))) { - throw new TRPCError({ code: "UNAUTHORIZED" }); + const membership = await MembershipRepository.findUniqueByUserIdAndTeamId({ + userId: ctx.user.id, + teamId: input.teamId, + }); + + if (!membership) { + throw new TRPCError({ code: "UNAUTHORIZED", message: "User is not a member of this team" }); } return await prisma.internalNotePreset.findMany({ diff --git a/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts b/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts index 4c42c41b89fb05..0bb368b9c540b3 100644 --- a/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts @@ -1,6 +1,5 @@ import { enrichUserWithDelegationCredentialsIncludeServiceAccountKey } from "@calcom/lib/delegationCredential/server"; import { getUserAvailabilityService } from "@calcom/lib/di/containers/GetUserAvailability"; -import { isTeamMember } from "@calcom/features/ee/teams/lib/queries"; import { MembershipRepository } from "@calcom/lib/server/repository/membership"; import type { TrpcSessionUser } from "@calcom/trpc/server/types"; @@ -17,8 +16,15 @@ type GetMemberAvailabilityOptions = { export const getMemberAvailabilityHandler = async ({ ctx, input }: GetMemberAvailabilityOptions) => { const userAvailabilityService = getUserAvailabilityService(); - const team = await isTeamMember(ctx.user?.id, input.teamId); - if (!team) throw new TRPCError({ code: "UNAUTHORIZED" }); + + const membership = await MembershipRepository.findUniqueByUserIdAndTeamId({ + userId: ctx.user.id, + teamId: input.teamId, + }); + + if (!membership) { + throw new TRPCError({ code: "UNAUTHORIZED", message: "User is not a member of this team" }); + } // verify member is in team const members = await MembershipRepository.findByTeamIdForAvailability({ teamId: input.teamId }); From 34f60c6d4eb707b11df9c33df7c94bb31744b752 Mon Sep 17 00:00:00 2001 From: hbjORbj Date: Thu, 25 Sep 2025 17:22:43 +0900 Subject: [PATCH 3/4] revert --- packages/features/ee/teams/lib/queries.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/features/ee/teams/lib/queries.ts b/packages/features/ee/teams/lib/queries.ts index cb3e10d9260dcd..dbfcf562d74560 100644 --- a/packages/features/ee/teams/lib/queries.ts +++ b/packages/features/ee/teams/lib/queries.ts @@ -385,6 +385,17 @@ export async function getTeamWithoutMembers(args: { }; } +export async function isTeamOwner(userId: number, teamId: number) { + return !!(await prisma.membership.findFirst({ + where: { + userId, + teamId, + accepted: true, + role: "OWNER", + }, + })); +} + export function generateNewChildEventTypeDataForDB({ eventType, userId, From 0bd9f8e37a06670edacbbefad4bd082974b43dfc Mon Sep 17 00:00:00 2001 From: hbjORbj Date: Thu, 25 Sep 2025 17:25:51 +0900 Subject: [PATCH 4/4] better --- packages/lib/server/repository/membership.ts | 11 ++++++++++- .../viewer/teams/getInternalNotesPresets.handler.ts | 1 + .../viewer/teams/getMemberAvailability.handler.ts | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/lib/server/repository/membership.ts b/packages/lib/server/repository/membership.ts index aad4979c6016d6..6b22a782828854 100644 --- a/packages/lib/server/repository/membership.ts +++ b/packages/lib/server/repository/membership.ts @@ -303,13 +303,22 @@ export class MembershipRepository { }); } - static async findUniqueByUserIdAndTeamId({ userId, teamId }: { userId: number; teamId: number }) { + static async findUniqueByUserIdAndTeamId({ + userId, + teamId, + accepted, + }: { + userId: number; + teamId: number; + accepted?: boolean; + }) { return await prisma.membership.findUnique({ where: { userId_teamId: { userId, teamId, }, + accepted, }, }); } diff --git a/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts b/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts index 319892592d2d6b..f0ab930a98acad 100644 --- a/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts @@ -17,6 +17,7 @@ export const getInternalNotesPresetsHandler = async ({ ctx, input }: UpdateMembe const membership = await MembershipRepository.findUniqueByUserIdAndTeamId({ userId: ctx.user.id, teamId: input.teamId, + accepted: true, }); if (!membership) { diff --git a/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts b/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts index 0bb368b9c540b3..c4ad472929478e 100644 --- a/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/getMemberAvailability.handler.ts @@ -20,6 +20,7 @@ export const getMemberAvailabilityHandler = async ({ ctx, input }: GetMemberAvai const membership = await MembershipRepository.findUniqueByUserIdAndTeamId({ userId: ctx.user.id, teamId: input.teamId, + accepted: true, }); if (!membership) {