import "server-only"; import { asc, eq } from "drizzle-orm"; import { getDb } from "@/db"; import { commissionCheckouts, commissionMessages, commissionPayments, commissionReactions, commissionTickets, users } from "@/db/schema"; import { requireCommissionUser } from "./server"; import { HttpError } from "@/lib/security/http"; export async function getCommissionTicket(id: string) { const user = await requireCommissionUser(); const [row] = await getDb().select({ ticket: commissionTickets, checkout: commissionCheckouts, customerName: users.name, payment: commissionPayments }) .from(commissionTickets) .innerJoin(commissionCheckouts, eq(commissionTickets.checkoutId, commissionCheckouts.id)) .innerJoin(users, eq(commissionTickets.userId, users.id)) .innerJoin(commissionPayments, eq(commissionPayments.ticketId, commissionTickets.id)) .where(eq(commissionTickets.id, id)).limit(1); if (!row || (user.role !== "admin" || !user.emailVerified) && row.ticket.userId !== user.id) throw new HttpError(404, "ticket-not-found"); const [messages, reactions] = await Promise.all([ getDb().select({ message: commissionMessages, authorName: users.name }).from(commissionMessages) .innerJoin(users, eq(commissionMessages.authorId, users.id)) .where(eq(commissionMessages.ticketId, id)).orderBy(asc(commissionMessages.createdAt)), getDb().select({ reaction: commissionReactions, messageId: commissionMessages.id }) .from(commissionReactions) .innerJoin(commissionMessages, eq(commissionReactions.messageId, commissionMessages.id)) .where(eq(commissionMessages.ticketId, id)), ]); return { ...row, messages: messages.map(({ message, authorName }) => ({ ...message, authorName, reactions: reactions.filter(({ messageId }) => messageId === message.id).map(({ reaction }) => reaction) })), currentUserId: user.id }; } export async function authorizeTicket(id: string) { const user = await requireCommissionUser(); const [ticket] = await getDb().select().from(commissionTickets).where(eq(commissionTickets.id, id)).limit(1); if (!ticket || ((user.role !== "admin" || !user.emailVerified) && ticket.userId !== user.id)) throw new HttpError(404, "ticket-not-found"); return { ticket, user }; }