import type { PrismaClient } from "@calcom/prisma"; import type { TrpcSessionUser } from "../../../types"; import type { TAdminGetTeamsForFeatureSchema } from "./getTeamsForFeature.schema"; type GetTeamsOptions = { ctx: { user: NonNullable; prisma: PrismaClient; }; input: TAdminGetTeamsForFeatureSchema; }; export const getTeamsForFeatureHandler = async ({ ctx, input }: GetTeamsOptions) => { const { prisma } = ctx; const { featureId, limit = 10, cursor, searchTerm } = input; const whereClause = { isPlatform: false, ...(searchTerm ? { OR: [ { name: { contains: searchTerm, mode: "insensitive" as const } }, { slug: { contains: searchTerm, mode: "insensitive" as const } }, ], } : {}), }; const [teams, assignedTeams] = await Promise.all([ prisma.team.findMany({ where: whereClause, select: { id: true, name: true, slug: true, logoUrl: true, parentId: true, isOrganization: true, parent: { select: { name: true, logoUrl: true, }, }, }, orderBy: { name: "asc", }, take: limit + 1, ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}), }), prisma.teamFeatures.findMany({ where: { featureId, enabled: true, }, select: { teamId: true, }, }), ]); const assignedTeamIds = new Set(assignedTeams.map((tf) => tf.teamId)); let nextCursor: typeof cursor | undefined = undefined; if (teams.length > limit) { const nextItem = teams.pop(); nextCursor = nextItem?.id; } return { teams: teams.map((team) => ({ ...team, hasFeature: assignedTeamIds.has(team.id), })), nextCursor, }; }; export default getTeamsForFeatureHandler;