56 lines
2.0 KiB
TypeScript
56 lines
2.0 KiB
TypeScript
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);
|
|
}
|