From 7cb99361a599087417621a8a8c8840157250cc4d Mon Sep 17 00:00:00 2001 From: Jonathan Date: Sat, 11 Jul 2026 17:11:42 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20/api/scan=20=E2=80=94=20request=20a=20l?= =?UTF-8?q?ibrary=20scan=20+=20read=20its=20result?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Type the POST request param (_request: Request) to match the test's call signature and keep tsc --noEmit clean, per Next.js route handler convention already used elsewhere in the codebase. --- web/src/app/api/scan/route.test.ts | 25 +++++++++++++++++++++++++ web/src/app/api/scan/route.ts | 21 +++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 web/src/app/api/scan/route.test.ts create mode 100644 web/src/app/api/scan/route.ts 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, + }); +}