import type { Group, PrismaClient } from '@generated/prisma/client'; import type { GroupWaitlistEntryDto, ProblemDetails, Result } from '@gruperly/shared'; import { err, ok } from '@gruperly/shared'; import { noGroupAccessProblem, notFoundResourceProblem } from '@/http/problem-builders'; export type GroupWaitlistEntryRecord = { id: string; groupId: string; fullName: string; phone: string; email: string | null; notes: string | null; status: GroupWaitlistEntryDto['status']; createdAt: Date; updatedAt: Date; }; export function toGroupWaitlistEntryDto(record: GroupWaitlistEntryRecord): GroupWaitlistEntryDto { return { id: record.id, groupId: record.groupId, fullName: record.fullName, phone: record.phone, email: record.email, notes: record.notes, status: record.status, createdAt: record.createdAt.toISOString(), updatedAt: record.updatedAt.toISOString(), }; } export async function findGroupForUser( db: Pick, groupId: string, userId: string, ): Promise> { const group = await db.group.findUnique({ where: { id: groupId }, include: { members: { where: { userId } } }, }); if (!group) { return err(notFoundResourceProblem('Group', groupId)); } const isOwner = group.createdById === userId; const isMember = group.members.length > 0; if (!isOwner && !isMember) { return err(noGroupAccessProblem()); } return ok(group); } export async function findGroupOwnedByUser( db: Pick, groupId: string, userId: string, ): Promise> { const group = await db.group.findUnique({ where: { id: groupId } }); if (!group) { return err(notFoundResourceProblem('Group', groupId)); } if (group.createdById !== userId) { return err(noGroupAccessProblem()); } return ok(group); }