81 lines
2.4 KiB
TypeScript
81 lines
2.4 KiB
TypeScript
import { notFound, redirect } from "next/navigation";
|
|
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
|
|
import { prisma } from "@/lib/prisma";
|
|
import { CfhDetail } from "./cfh-detail";
|
|
|
|
export default async function CfhDetailPage({ params }: { params: Promise<{ id: string }> }) {
|
|
const { session, permissions } = await getAdminContext();
|
|
if (!canAccess(permissions, PERMS.MODERATION_VIEW, session.user.rank)) redirect("/admin");
|
|
|
|
const { id } = await params;
|
|
const ticketId = Number(id);
|
|
if (Number.isNaN(ticketId)) notFound();
|
|
|
|
const ticket = await prisma.supportTickets.findUnique({ where: { id: ticketId } });
|
|
if (!ticket) notFound();
|
|
|
|
const canEdit = canAccess(permissions, PERMS.MODERATION_EDIT, session.user.rank);
|
|
|
|
// Fetch sender, reported, mod info
|
|
const userIds = [ticket.senderId, ticket.reportedId, ticket.modId].filter(Boolean);
|
|
const users =
|
|
userIds.length > 0
|
|
? await prisma.user.findMany({
|
|
where: { id: { in: userIds } },
|
|
select: {
|
|
id: true,
|
|
username: true,
|
|
look: true,
|
|
rank: true,
|
|
online: true,
|
|
ipRegister: true,
|
|
mail: true,
|
|
},
|
|
})
|
|
: [];
|
|
const userMap = Object.fromEntries(users.map((u) => [u.id, u]));
|
|
|
|
// Get ban/mute history for reported user
|
|
const reportedId = ticket.reportedId;
|
|
const [banCount, recentBans] = reportedId
|
|
? await Promise.all([
|
|
prisma.ban.count({ where: { userId: reportedId } }),
|
|
prisma.ban.findMany({
|
|
where: { userId: reportedId },
|
|
orderBy: { id: "desc" },
|
|
take: 5,
|
|
}),
|
|
])
|
|
: [0, []];
|
|
|
|
return (
|
|
<CfhDetail
|
|
ticket={{
|
|
id: ticket.id,
|
|
state: ticket.state,
|
|
type: ticket.type,
|
|
timestamp: ticket.timestamp,
|
|
issue: ticket.issue,
|
|
roomId: ticket.roomId,
|
|
category: ticket.category,
|
|
score: ticket.score,
|
|
}}
|
|
sender={userMap[ticket.senderId] ?? null}
|
|
reported={userMap[ticket.reportedId] ?? null}
|
|
moderator={userMap[ticket.modId] ?? null}
|
|
banHistory={{
|
|
count: banCount,
|
|
recent: recentBans.map((b) => ({
|
|
id: b.id,
|
|
reason: b.banReason,
|
|
type: b.type,
|
|
staff: `Staff #${b.userStaffId}`,
|
|
timestamp: b.timestamp,
|
|
})),
|
|
}}
|
|
canEdit={canEdit}
|
|
currentUserId={session.user.id}
|
|
/>
|
|
);
|
|
}
|