import { db } from "@/lib/db/client" export interface AdminDashboardMetrics { totalInvitations: number totalMembers: number attendingMembers: number declinedMembers: number pendingMembers: number submittedInvitations: number pendingInvitations: number uploadedPhotos: number pendingToastRequests: number } function toNumber(value: string | number | bigint | null | undefined) { return Number(value ?? 0) } export async function getAdminDashboardMetrics(): Promise { const [ totalInvitations, totalMembers, attendingMembers, declinedMembers, pendingMembers, submittedInvitations, uploadedPhotos, pendingToastRequests, ] = await Promise.all([ db .selectFrom("invitations") .select((eb) => eb.fn.countAll().as("count")) .executeTakeFirstOrThrow(), db .selectFrom("invitation_members") .select((eb) => eb.fn.countAll().as("count")) .executeTakeFirstOrThrow(), db .selectFrom("invitation_members") .select((eb) => eb.fn.countAll().as("count")) .where("attending", "=", true) .executeTakeFirstOrThrow(), db .selectFrom("invitation_members") .select((eb) => eb.fn.countAll().as("count")) .where("attending", "=", false) .executeTakeFirstOrThrow(), db .selectFrom("invitation_members") .select((eb) => eb.fn.countAll().as("count")) .where("attending", "is", null) .executeTakeFirstOrThrow(), db .selectFrom("invitation_responses") .select((eb) => eb.fn.countAll().as("count")) .where("submitted_at", "is not", null) .executeTakeFirstOrThrow(), db .selectFrom("photo_uploads") .select((eb) => eb.fn.countAll().as("count")) .executeTakeFirstOrThrow(), db .selectFrom("toast_requests") .select((eb) => eb.fn.countAll().as("count")) .where("status", "=", "pending") .executeTakeFirstOrThrow(), ]) const invitationsCount = toNumber(totalInvitations.count) const submittedInvitationsCount = toNumber(submittedInvitations.count) return { totalInvitations: invitationsCount, totalMembers: toNumber(totalMembers.count), attendingMembers: toNumber(attendingMembers.count), declinedMembers: toNumber(declinedMembers.count), pendingMembers: toNumber(pendingMembers.count), submittedInvitations: submittedInvitationsCount, pendingInvitations: Math.max(invitationsCount - submittedInvitationsCount, 0), uploadedPhotos: toNumber(uploadedPhotos.count), pendingToastRequests: toNumber(pendingToastRequests.count), } }