import { listPapersAdmin, publishRun } from "@autoscholar/publisher"; import { z } from "zod"; import { handler, json, parseBody } from "@/lib/server/api"; import { db, storage } from "@/lib/server/db"; import { requireAdmin } from "@/lib/server/session"; export const runtime = "nodejs"; export const GET = handler(async (req) => { await requireAdmin(req); return json({ papers: await listPapersAdmin(db()) }); }); /** Idempotent manual release (for awaiting_approval / ready_to_publish runs). */ export const POST = handler(async (req) => { const sess = await requireAdmin(req, { mutation: true }); const body = await parseBody( req, z.object({ runId: z.string().uuid(), correctsPaperId: z.string().uuid().optional(), changelog: z.string().max(2000).optional(), overrideRationale: z.string().max(2000).optional(), }), ); const res = await publishRun(db(), storage(), body.runId, { actor: { type: "admin", id: sess.userId, ip: sess.ip }, correctsPaperId: body.correctsPaperId, changelog: body.changelog, override: body.overrideRationale ? { rationale: body.overrideRationale } : undefined, }); return json(res, { status: res.alreadyPublished ? 200 : 201 }); });