* WIP * Locked fields manager * Leftovers * Bad merge fix * Type import fix * Moving away from classes * Progress refactoring locked logic * Covering apps, webhooks and workflows * Supporting webhooks and workflows (TBT) * Restoring yarn.lock * Progress * Refactoring code, adding default values * Fixing CRUD for children * Connect app link and case-sensitive lib renaming * Translation missing * Locked indicators, empty screens, locations * Member card and hidden status + missing i18n * Missing existent children shown * Showing preview for already created children * Email notification almost in place * Making progress over notif email * Fixing nodemailer by mixed FE/BE mixup * Delete dialog * Adding tests * New test * Reverting unneeded change * Removed console.log * Tweaking email * Reverting not applicable webhook changes * Reverting dev email api * Fixing last changes due to tests * Changing user-evType relationship * Availability and slug replacement tweaks * Fixing event type delete * Sometimes slug is not there... * Removing old webhooks references Changed slug hint * Fixing types * Fixing hiding event types actions * Changing delete dialog text * Removing unneeded code * Applying feedback * Update yarn.lock * Making sure locked fields values are static * Applying feedback * Feedback + relying on children list, not users * Removing console.log * PR Feedback * Telemetry for slug replacement action * More unit tests * Relying on schedule and editor tweaks * Fixing conteiner classname * PR Feedback * PR Feedback * Updating unit tests * Moving stuff to ee, added feature flag * type fix * Including e2e * Reverting unneeded changes in EmptyScreen * Fixing some UI issues after merging tokens * Fixing missing disabled locked fields * Theme fixes + e2e potential fix * Fixing e2e * Fixing login relying on network * Tweaking e2e * Removing unneeded code --------- Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: zomars <zomars@me.com>
114 lines
2.6 KiB
TypeScript
114 lines
2.6 KiB
TypeScript
import { Prisma, SchedulingType } from "@prisma/client";
|
|
|
|
import prisma, { baseEventTypeSelect } from "@calcom/prisma";
|
|
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils";
|
|
|
|
import { WEBAPP_URL } from "../../../constants";
|
|
|
|
export type TeamWithMembers = Awaited<ReturnType<typeof getTeamWithMembers>>;
|
|
export async function getTeamWithMembers(id?: number, slug?: string, userId?: number) {
|
|
const userSelect = Prisma.validator<Prisma.UserSelect>()({
|
|
username: true,
|
|
email: true,
|
|
name: true,
|
|
id: true,
|
|
bio: true,
|
|
});
|
|
const teamSelect = Prisma.validator<Prisma.TeamSelect>()({
|
|
id: true,
|
|
name: true,
|
|
slug: true,
|
|
logo: true,
|
|
bio: true,
|
|
hideBranding: true,
|
|
hideBookATeamMember: true,
|
|
metadata: true,
|
|
members: {
|
|
select: {
|
|
accepted: true,
|
|
role: true,
|
|
disableImpersonation: true,
|
|
user: {
|
|
select: userSelect,
|
|
},
|
|
},
|
|
},
|
|
theme: true,
|
|
brandColor: true,
|
|
darkBrandColor: true,
|
|
eventTypes: {
|
|
where: {
|
|
hidden: false,
|
|
schedulingType: {
|
|
not: SchedulingType.MANAGED,
|
|
},
|
|
},
|
|
select: {
|
|
users: {
|
|
select: userSelect,
|
|
},
|
|
metadata: true,
|
|
...baseEventTypeSelect,
|
|
},
|
|
},
|
|
});
|
|
|
|
const where: Prisma.TeamFindFirstArgs["where"] = {};
|
|
|
|
if (userId) where.members = { some: { userId } };
|
|
if (id) where.id = id;
|
|
if (slug) where.slug = slug;
|
|
|
|
const team = await prisma.team.findFirst({
|
|
where,
|
|
select: teamSelect,
|
|
});
|
|
|
|
if (!team) return null;
|
|
const members = team.members.map((obj) => {
|
|
return {
|
|
...obj.user,
|
|
role: obj.role,
|
|
accepted: obj.accepted,
|
|
disableImpersonation: obj.disableImpersonation,
|
|
avatar: `${WEBAPP_URL}/${obj.user.username}/avatar.png`,
|
|
};
|
|
});
|
|
|
|
const eventTypes = team.eventTypes.map((eventType) => ({
|
|
...eventType,
|
|
metadata: EventTypeMetaDataSchema.parse(eventType.metadata),
|
|
}));
|
|
return { ...team, eventTypes, members };
|
|
}
|
|
// also returns team
|
|
export async function isTeamAdmin(userId: number, teamId: number) {
|
|
return (
|
|
(await prisma.membership.findFirst({
|
|
where: {
|
|
userId,
|
|
teamId,
|
|
OR: [{ role: "ADMIN" }, { role: "OWNER" }],
|
|
},
|
|
})) || false
|
|
);
|
|
}
|
|
export async function isTeamOwner(userId: number, teamId: number) {
|
|
return !!(await prisma.membership.findFirst({
|
|
where: {
|
|
userId,
|
|
teamId,
|
|
role: "OWNER",
|
|
},
|
|
}));
|
|
}
|
|
|
|
export async function isTeamMember(userId: number, teamId: number) {
|
|
return !!(await prisma.membership.findFirst({
|
|
where: {
|
|
userId,
|
|
teamId,
|
|
},
|
|
}));
|
|
}
|