Files
calendar/packages/trpc/server/routers/viewer/teams/listMembers.handler.ts
T
e3b7264208 fix: filter and listMember handler (#14429)
* fix: filter and listMember handler

* Update packages/trpc/server/routers/viewer/teams/listMembers.handler.ts

Co-authored-by: Keith Williams <keithwillcode@gmail.com>

* Update packages/features/bookings/components/PeopleFilter.tsx

---------

Co-authored-by: Keith Williams <keithwillcode@gmail.com>
2024-04-05 11:51:22 -03:00

69 lines
1.7 KiB
TypeScript

import { UserRepository } from "@calcom/lib/server/repository/user";
import type { PrismaClient } from "@calcom/prisma";
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
import type { TListMembersInputSchema } from "./listMembers.schema";
type ListMembersOptions = {
ctx: {
user: NonNullable<TrpcSessionUser>;
prisma: PrismaClient;
};
input: TListMembersInputSchema;
};
export const listMembersHandler = async ({ ctx, input }: ListMembersOptions) => {
const { prisma } = ctx;
const { isOrgAdmin } = ctx.user.organization;
const hasPermsToView = !ctx.user.organization.isPrivate || isOrgAdmin;
if (!hasPermsToView) {
return [];
}
const teams = await prisma.team.findMany({
where: {
id: {
in: input.teamIds,
},
members: {
some: {
user: {
id: ctx.user.id,
},
accepted: true,
},
},
},
select: {
members: {
select: {
user: {
select: {
id: true,
name: true,
username: true,
},
},
accepted: true,
},
},
},
});
type UserMap = Record<number, (typeof teams)[number]["members"][number]["user"] & { accepted: boolean }>;
// flatten users to be unique by id
const users = teams
.flatMap((t) => t.members)
.reduce(
(acc, m) => (m.user.id in acc ? acc : { ...acc, [m.user.id]: { ...m.user, accepted: m.accepted } }),
{} as UserMap
);
return await Promise.all(
Object.values(users).map(async (u) => UserRepository.enrichUserWithItsProfile({ user: u }))
);
};
export default listMembersHandler;