2
0

first commit

This commit is contained in:
2024-08-09 00:39:27 +02:00
commit 79688abe2e
5698 changed files with 497838 additions and 0 deletions

View File

@@ -0,0 +1,134 @@
import { prisma } from "@calcom/prisma";
import type { MembershipRole } from "@calcom/prisma/client";
import { Prisma } from "@calcom/prisma/client";
import logger from "../../logger";
import { safeStringify } from "../../safeStringify";
import { eventTypeSelect } from "../eventTypeSelect";
import { LookupTarget, ProfileRepository } from "./profile";
const log = logger.getSubLogger({ prefix: ["repository/membership"] });
type IMembership = {
teamId: number;
userId: number;
accepted: boolean;
role: MembershipRole;
};
const membershipSelect = Prisma.validator<Prisma.MembershipSelect>()({
id: true,
teamId: true,
userId: true,
accepted: true,
role: true,
disableImpersonation: true,
});
const teamParentSelect = Prisma.validator<Prisma.TeamSelect>()({
id: true,
name: true,
slug: true,
logoUrl: true,
parentId: true,
metadata: true,
});
const userSelect = Prisma.validator<Prisma.UserSelect>()({
name: true,
avatarUrl: true,
username: true,
id: true,
});
export class MembershipRepository {
static async create(data: IMembership) {
return await prisma.membership.create({
data,
});
}
static async createMany(data: IMembership[]) {
return await prisma.membership.createMany({
data,
});
}
/**
* TODO: Using a specific function for specific tasks so that we don't have to focus on TS magic at the moment. May be try to make it a a generic findAllByProfileId with various options.
*/
static async findAllByUpIdIncludeTeamWithMembersAndEventTypes(
{ upId }: { upId: string },
{ where }: { where?: Prisma.MembershipWhereInput } = {}
) {
const lookupTarget = ProfileRepository.getLookupTarget(upId);
let prismaWhere;
if (lookupTarget.type === LookupTarget.Profile) {
/**
* TODO: When we add profileId to membership, we lookup by profileId
* If the profile is movedFromUser, we lookup all memberships without profileId as well.
*/
const profile = await ProfileRepository.findById(lookupTarget.id);
if (!profile) {
return [];
}
prismaWhere = {
userId: profile.user.id,
...where,
};
} else {
prismaWhere = {
userId: lookupTarget.id,
...where,
};
}
log.debug(
"findAllByUpIdIncludeTeamWithMembersAndEventTypes",
safeStringify({
prismaWhere,
})
);
return await prisma.membership.findMany({
where: prismaWhere,
include: {
team: {
include: {
members: {
select: membershipSelect,
},
parent: {
select: teamParentSelect,
},
eventTypes: {
select: {
...eventTypeSelect,
hashedLink: true,
users: { select: userSelect },
children: {
include: {
users: { select: userSelect },
},
},
hosts: {
include: {
user: { select: userSelect },
},
},
},
// As required by getByViewHandler - Make it configurable
orderBy: [
{
position: "desc",
},
{
id: "asc",
},
],
},
},
},
},
});
}
}