diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx index fbb4f962cb..db05b796d3 100644 --- a/apps/web/pages/event-types/index.tsx +++ b/apps/web/pages/event-types/index.tsx @@ -394,7 +394,9 @@ export const EventTypeList = ({ data, readonly }: EventTypeListProps): JSX.Eleme const isChildrenManagedEventType = !!eventType.parentId; const isReadOnly = readonly || isChildrenManagedEventType; - + const hosts = !!eventType?.hosts?.length + ? eventType?.hosts.map((user) => user.user) + : eventType.users; return (
  • @@ -413,15 +415,13 @@ export const EventTypeList = ({ data, readonly }: EventTypeListProps): JSX.Eleme className="relative right-3 top-1" size="sm" truncateAfter={4} - items={eventType.users.map( - (organizer: { name: string | null; username: string | null }) => ({ - alt: organizer.name || "", - image: `${orgBranding?.fullDomain ?? WEBAPP_URL}/${ - organizer.username - }/avatar.png`, - title: organizer.name || "", - }) - )} + items={hosts.map((organizer: { name: string | null; username: string | null }) => ({ + alt: organizer.name || "", + image: `${orgBranding?.fullDomain ?? WEBAPP_URL}/${ + organizer.username + }/avatar.png`, + title: organizer.name || "", + }))} /> )} {isManagedEventType && eventType.children?.length > 0 && ( diff --git a/packages/prisma/seed-event-types-and-teams.ts b/packages/prisma/seed-event-types-and-teams.ts index 0c941c5209..87d929d8e0 100644 --- a/packages/prisma/seed-event-types-and-teams.ts +++ b/packages/prisma/seed-event-types-and-teams.ts @@ -26,36 +26,54 @@ async function createEventTypesForUserAndForTeams() { } async function createManyEventTypes({ userId, teamId }: { userId?: number; teamId?: number }) { - const eventTypes: Prisma.EventTypeUncheckedCreateInput[] = []; - for (let i = 0; i < 20; i++) { - eventTypes.push({ - title: `Event Type ${i + 1}`, - slug: `event-type-${teamId ? `team-${teamId}` : ""}${i + 1}`, - userId: teamId ? null : userId, - teamId: teamId ? teamId : null, - length: 30, - description: "This is a description", - }); + // If teamId is provided then we fetch membership users from that team + + const membershipUsers: number[] = []; + if (teamId) { + const memberships = await prisma.membership.findMany({ where: { teamId } }); + for (const membership of memberships) { + if (!membership.userId) { + // Do nothing + } else { + membershipUsers.push(membership.userId); + } + } } - await prisma.eventType.createMany({ - data: eventTypes, - }); + const eventTypesPromises: Promise< + Prisma.EventTypeGetPayload<{ + select: { + id: true; + schedulingType: true; + teamId: true; + }; + }> + >[] = []; - // Load event types recently created - const eventTypesFound = await prisma.eventType.findMany({ - where: { - slug: { - startsWith: `event-type-${teamId ? "teams-" : ""}`, - }, - }, - select: { - id: true, - }, - }); + for (let i = 0; i < 20; i++) { + const schedulingType = randomSchedulingType(); + eventTypesPromises.push( + prisma.eventType.create({ + data: { + title: `${schedulingType.toLowerCase() ?? ""} Event Type ${i + 1} - ${ + teamId ? `Team ${teamId}` : "" + }`, + slug: `event-type-${teamId ? `team-${teamId}` : ""}${i + 1}`, + userId: teamId ? null : userId, + teamId: teamId ? teamId : null, + length: 30, + description: "This is a description", + ...(teamId ? { schedulingType: schedulingType } : {}), + }, + }) + ); + } + + const resultEventTypes = await Promise.all(eventTypesPromises); const updateRelationships: Promise[] = []; - for (const eventType of eventTypesFound) { + for (const eventType of resultEventTypes) { + const schedulingType = eventType.schedulingType; updateRelationships.push( prisma.eventType.update({ where: { @@ -67,6 +85,16 @@ async function createManyEventTypes({ userId, teamId }: { userId?: number; teamI id: userId, }, }, + ...(schedulingType === "COLLECTIVE" || schedulingType === "ROUND_ROBIN" + ? { + hosts: { + create: membershipUsers.map((userId) => ({ + userId, + isFixed: schedulingType === "COLLECTIVE" ? true : false, + })), + }, + } + : {}), }, }) ); @@ -75,42 +103,53 @@ async function createManyEventTypes({ userId, teamId }: { userId?: number; teamI } async function createManyTeams(userId: number) { - const teams: Prisma.TeamUncheckedCreateInput[] = []; + const teamsPromises: Promise< + Prisma.TeamGetPayload<{ + select: { + id: true; + }; + }> + >[] = []; for (let i = 0; i < 20; i++) { - teams.push({ - name: `Team ${i + 1}`, - slug: `team-${i + 1}`, - }); + teamsPromises.push( + prisma.team.create({ + data: { + name: `Team ${i + 1}`, + slug: `team-${i + 1}`, + }, + }) + ); } - const createdTeams = await prisma.team.createMany({ - data: teams, - }); - - if (!createdTeams.count) { - throw new Error("No team created"); + const result = await Promise.all(teamsPromises); + if (result.length > 0) { + console.log(`👥 Created ${result.length} teams`); } + const teamIds = result.map((team) => team.id); - // Load teams recently created - const teamsFound = await prisma.team.findMany({ - where: { - slug: { - startsWith: "team-", - }, - }, - select: { - id: true, - }, - }); + const usersForTeam = await createManyUsers(); + + if (usersForTeam.length > 0) { + console.log(`👥 Created ${usersForTeam.length} users for teams`); + } // Create memberships for the user const memberships: Prisma.MembershipUncheckedCreateInput[] = []; - for (const team of teamsFound) { + for (const teamId of teamIds) { + for (const userId of usersForTeam) { + memberships.push({ + userId: userId, + teamId: teamId, + role: randomTeamRole(), + accepted: true, + }); + } + // Add main user to all teams as Owner memberships.push({ - userId, - teamId: team.id, - role: "ADMIN", + userId: userId, + teamId: teamId, + role: "OWNER", accepted: true, }); } @@ -139,4 +178,44 @@ async function createManyTeams(userId: number) { } } +async function createManyUsers() { + const userPromises: Promise< + Prisma.UserGetPayload<{ + select: { id: true }; + }> + >[] = []; + for (let i = 0; i < 20; i++) { + userPromises.push( + prisma.user.create({ + data: { + username: `user-${i + 1}`, + email: `user-${i + 1}`, + password: "password", + name: `User ${i + 1}`, + role: randomUserRole(), + completedOnboarding: true, + }, + }) + ); + } + + const result = await Promise.all(userPromises); + return result.map((user) => user.id); +} + createEventTypesForUserAndForTeams(); + +function randomUserRole(): any { + const roles = ["USER", "ADMIN"]; + return roles[Math.floor(Math.random() * roles.length)]; +} + +function randomTeamRole(): any { + const roles = ["ADMIN", "OWNER", "MEMBER"]; + return roles[Math.floor(Math.random() * roles.length)]; +} + +function randomSchedulingType(): any { + const roles = ["MANAGED", "COLLECTIVE", "ROUND_ROBIN"]; + return roles[Math.floor(Math.random() * roles.length)]; +} diff --git a/packages/trpc/server/routers/viewer/eventTypes/infiniteEventTypes.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/infiniteEventTypes.handler.ts index a96a10d607..f70eb6f390 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/infiniteEventTypes.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/infiniteEventTypes.handler.ts @@ -63,6 +63,17 @@ export const paginateHandler = async ({ ctx, input }: EventTypesPaginateProps) = name: true, }, }, + hosts: { + select: { + user: { + select: { + id: true, + username: true, + name: true, + }, + }, + }, + }, children: { select: { id: true,