feat(admin): ban appeals, photos polish, economy adjust, staff smoke
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m17s
CI / check (push) Successful in 25s
CI / deploy (push) Failing after 11s

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-07-30 20:23:03 +02:00
1 parent fe46bd0544
commit 3ad3f9512c
36 files changed
+1185 -293

No files matched your search

+25 -3
View File
@@ -3,6 +3,7 @@ import { getTranslations } from "next-intl/server";
import { TicketQueueBanner } from "@/components/admin/ticket-queue-banner";
import { getMinStaffRank } from "@/lib/admin/min-staff-rank";
import { positiveBigInt } from "@/lib/api";
import { activeBanWhere } from "@/lib/bans";
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma";
import { AdminHelpTicketDetail } from "./admin-help-ticket-detail";
@@ -29,6 +30,7 @@ export default async function AdminHelpTicketDetailPage({
select: {
id: true,
userId: true,
categoryId: true,
title: true,
content: true,
open: true,
@@ -57,9 +59,9 @@ export default async function AdminHelpTicketDetailPage({
]),
];
const users =
const [users, category, activeBan] = await Promise.all([
authorIds.length > 0
? await prisma.user.findMany({
? prisma.user.findMany({
where: { id: { in: authorIds } },
select: {
id: true,
@@ -68,7 +70,20 @@ export default async function AdminHelpTicketDetailPage({
mail: true,
},
})
: [];
: Promise.resolve([]),
ticket.categoryId != null
? prisma.websiteHelpCenterCategories.findUnique({
where: { id: ticket.categoryId },
select: { name: true },
})
: Promise.resolve(null),
ticket.userId != null
? prisma.ban.findFirst({
where: { userId: ticket.userId, ...activeBanWhere() },
select: { id: true },
})
: Promise.resolve(null),
]);
const userById = new Map(users.map((u) => [u.id, u]));
const openerId = ticket.userId;
@@ -104,6 +119,10 @@ export default async function AdminHelpTicketDetailPage({
const creator = openerId != null ? userById.get(openerId) : undefined;
const canEdit = canAccess(permissions, PERMS.TICKETS_EDIT, session.user.rank);
const canLiftBan = canAccess(permissions, PERMS.USERS_BAN, session.user.rank);
const isBanAppeal =
/ban\s*appeal/i.test(ticket.title) ||
/ban\s*appeal/i.test(category?.name ?? "");
return (
<div className="space-y-6">
@@ -119,6 +138,7 @@ export default async function AdminHelpTicketDetailPage({
open: ticket.open,
createdAt: (ticket.createdAt ?? new Date()).toISOString(),
updatedAt: (ticket.updatedAt ?? new Date()).toISOString(),
categoryName: category?.name ?? (isBanAppeal ? "Ban appeal" : null),
creator: creator
? {
id: creator.id,
@@ -130,6 +150,8 @@ export default async function AdminHelpTicketDetailPage({
}}
messages={messages}
canEdit={canEdit}
canLiftBan={canLiftBan}
hasActiveBan={!!activeBan}
/>
</div>
);