Files
EpicNext-Cms/src/app/admin/moderation/cfh/[id]/page.tsx
T
openhands 2e4ed76121
Local Build and Deploy / deploy (push) Successful in 49s
style: format code with prettier
2026-07-12 21:07:34 +02:00

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