41 lines
2.2 KiB
TypeScript
41 lines
2.2 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 }).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 };
|
|
}
|