diff --git a/web/src/app/api/scan/route.test.ts b/web/src/app/api/scan/route.test.ts new file mode 100644 index 0000000..0606567 --- /dev/null +++ b/web/src/app/api/scan/route.test.ts @@ -0,0 +1,25 @@ +import { describe, it, expect } from "vitest"; +import { prisma } from "@/lib/db"; +import { POST, GET } from "./route"; + +describe("scan API", () => { + it("POST sets scan.requested and GET reflects it", async () => { + const res = await POST(new Request("http://localhost/api/scan", { method: "POST" })); + expect(res.status).toBe(202); + expect((await res.json()).requested).toBe(true); + + const row = await prisma.config.findUnique({ where: { key: "scan.requested" } }); + expect(row?.value).toBe("true"); + + const g = await GET(); + const body = await g.json(); + expect(body.requested).toBe(true); + expect(body.result).toBeNull(); // no scan.result yet + }); + + it("GET returns the worker's scan.result when present", async () => { + await prisma.config.create({ data: { key: "scan.result", value: "imported 3, skipped 1" } }); + const body = await (await GET()).json(); + expect(body.result).toBe("imported 3, skipped 1"); + }); +}); diff --git a/web/src/app/api/scan/route.ts b/web/src/app/api/scan/route.ts new file mode 100644 index 0000000..e921c46 --- /dev/null +++ b/web/src/app/api/scan/route.ts @@ -0,0 +1,21 @@ +import { prisma } from "@/lib/db"; + +export async function POST(_request: Request) { + await prisma.config.upsert({ + where: { key: "scan.requested" }, + create: { key: "scan.requested", value: "true", secret: false }, + update: { value: "true" }, + }); + return Response.json({ requested: true }, { status: 202 }); +} + +export async function GET() { + const [requested, result] = await Promise.all([ + prisma.config.findUnique({ where: { key: "scan.requested" } }), + prisma.config.findUnique({ where: { key: "scan.result" } }), + ]); + return Response.json({ + requested: requested?.value === "true", + result: result?.value ?? null, + }); +}