import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { eq, desc } from "drizzle-orm"; import { db } from "@/db/client"; import { reports, moderationActions } from "@/db/schema"; import { assertSameOrigin, requireRole } from "@/lib/auth/session"; import { requireFreshMfa } from "@/lib/admin/mfa"; import { audit } from "@/lib/auth/audit"; import { handle, parseBody } from "@/lib/api"; export const dynamic = "force-dynamic"; export async function GET(req: NextRequest) { try { const u = await requireRole("MODERATOR"); requireFreshMfa(u); const status = req.nextUrl.searchParams.get("status") ?? "OPEN"; return NextResponse.json({ items: await db().select().from(reports).where(eq(reports.status, status)).orderBy(desc(reports.createdAt)).limit(300) }); } catch (e) { return handle(e); } } const Body = z.object({ id: z.string().uuid(), status: z.enum(["RESOLVED", "DISMISSED"]), note: z.string().max(500).optional() }); export async function POST(req: NextRequest) { try { await assertSameOrigin(); const u = await requireRole("MODERATOR"); requireFreshMfa(u); const b = await parseBody(req, Body); await db().update(reports).set({ status: b.status }).where(eq(reports.id, b.id)); await db().insert(moderationActions).values({ actorId: u.id, targetType: "REPORT", targetId: b.id, action: b.status, note: b.note ?? null }); await audit(`admin.report.${b.status.toLowerCase()}`, { actorId: u.id, objectType: "report", objectId: b.id }); return NextResponse.json({ ok: true }); } catch (e) { return handle(e); } }