Files
buzz-sheet/lib/commission/tickets.ts
T
2026-10-02 17:33:14 +07:00

47 lines
2.5 KiB
TypeScript

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, authorImage: users.image }).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)),
]);
const reactionsByMessage = new Map<string, typeof commissionReactions.$inferSelect[]>();
for (const { reaction, messageId } of reactions) {
const group = reactionsByMessage.get(messageId) ?? [];
group.push(reaction);
reactionsByMessage.set(messageId, group);
}
return { ...row, messages: messages.map(({ message, authorName, authorImage }) => ({ ...message, authorName,
authorImage, reactions: reactionsByMessage.get(message.id) ?? [] })),
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 };
}