import { NextRequest, NextResponse } from "next/server"; import { assertLocalRequest } from "@/lib/api/localOnly"; import { enqueueJob, clearAllJobHistory, runRetentionSweep } from "@/lib/whisperjav/queue"; import { listJobsForCode } from "@/lib/whisperjav/db"; export const runtime = "nodejs"; export const dynamic = "force-dynamic"; export async function POST(req: NextRequest) { const blocked = assertLocalRequest(req); if (blocked) return blocked; const body = await req.json().catch(() => ({})); const code = typeof body.code === "string" ? body.code.trim() : ""; const rawPartIdx = typeof body.partIdx === "number" && Number.isFinite(body.partIdx) ? body.partIdx : 0; const partIdx = Math.max(0, Math.floor(rawPartIdx)); const overwrite = body.overwrite === true; if (!code) return NextResponse.json({ error: "Missing code" }, { status: 400 }); try { const result = await enqueueJob({ code, partIdx, overwrite }); if ("alreadyExists" in result) { return NextResponse.json(result, { status: 409 }); } return NextResponse.json(result, { status: 202 }); } catch (e) { return NextResponse.json({ error: (e as Error).message }, { status: 500 }); } } export async function GET(req: NextRequest) { const blocked = assertLocalRequest(req); if (blocked) return blocked; const code = req.nextUrl.searchParams.get("code") ?? ""; if (!code) return NextResponse.json({ jobs: [] }); const jobs = listJobsForCode(code, 5); return NextResponse.json({ jobs }); } /** Clear-all-history. Wipes every non-running row + every temp dir. */ export async function DELETE(req: NextRequest) { const blocked = assertLocalRequest(req); if (blocked) return blocked; const result = await clearAllJobHistory(); return NextResponse.json(result); } /** Manual retention sweep trigger. */ export async function PATCH(req: NextRequest) { const blocked = assertLocalRequest(req); if (blocked) return blocked; const result = await runRetentionSweep(); return NextResponse.json(result); }