Files
buzz-sheet/lib/commission/tickets.ts
T
gunshiz 0022625edb
CI / Verify (push) Successful in 3m14s
CI / Build immutable images and deploy (push) Successful in 4m0s
feat : big update
2026-10-01 18:37:15 +07:00

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 };
}