Files
NianAIGC/app/api/v1/jobs/route.ts
2026-05-29 12:32:02 +08:00

66 lines
2.4 KiB
TypeScript

import { listGenerationJobsFiltered } from "@/lib/server/data-store";
import { jsonOk, readJsonBody } from "@/lib/server/api";
import { authenticatePublicApiRequest } from "@/lib/server/public-api-auth";
import { createPublicGenerationJob, type PublicJobCreateBody } from "@/lib/server/public-api-jobs";
import { publicApiError } from "@/lib/server/public-api-response";
import { DEFAULT_OWNER_ID, requestOrigin } from "@/lib/server/runtime";
import type { GenerationCapability, GenerationStatus } from "@/lib/types";
export const runtime = "nodejs";
export async function GET(request: Request) {
try {
const client = authenticatePublicApiRequest(request);
const url = new URL(request.url);
const jobs = await listGenerationJobsFiltered({
ownerId: DEFAULT_OWNER_ID,
externalClientId: client.id,
status: parseStatus(url.searchParams.get("status")),
capability: parseCapability(url.searchParams.get("capability")),
limit: parseLimit(url.searchParams.get("limit")),
before: url.searchParams.get("before") || undefined
});
return jsonOk({ jobs });
} catch (error) {
return publicApiError(error);
}
}
export async function POST(request: Request) {
try {
const client = authenticatePublicApiRequest(request);
const body = await readJsonBody<PublicJobCreateBody>(request);
const result = await createPublicGenerationJob({
client,
body,
request,
origin: requestOrigin(request)
});
return jsonOk({ job: result.job, reused: result.reused }, { status: result.reused ? 200 : 202 });
} catch (error) {
return publicApiError(error);
}
}
function parseStatus(value: string | null): GenerationStatus | undefined {
if (!value) return undefined;
if (["queued", "running", "succeeded", "failed", "expired", "cancelled"].includes(value)) {
return value as GenerationStatus;
}
throw new Error(`Unsupported status filter: ${value}`);
}
function parseCapability(value: string | null): GenerationCapability | undefined {
if (!value) return undefined;
if (["image.generate", "image.inpaint", "image.upscale", "video.generate"].includes(value)) {
return value as GenerationCapability;
}
throw new Error(`Unsupported capability filter: ${value}`);
}
function parseLimit(value: string | null): number {
const parsed = Number(value || 50);
if (!Number.isFinite(parsed)) return 50;
return Math.max(1, Math.min(200, Math.trunc(parsed)));
}