diff --git a/web/src/app/api/discover/run/route.test.ts b/web/src/app/api/discover/run/route.test.ts new file mode 100644 index 0000000..5b8682a --- /dev/null +++ b/web/src/app/api/discover/run/route.test.ts @@ -0,0 +1,21 @@ +import { describe, it, expect } from "vitest"; +import { prisma } from "@/lib/db"; +import { POST, GET } from "./route"; + +describe("discover run API", () => { + it("POST sets discover.requested and GET reflects it", async () => { + const res = await POST(new Request("http://localhost/api/discover/run", { method: "POST" })); + expect(res.status).toBe(202); + expect((await res.json()).requested).toBe(true); + expect((await prisma.config.findUnique({ where: { key: "discover.requested" } }))?.value).toBe("true"); + + const body = await (await GET()).json(); + expect(body.requested).toBe(true); + expect(body.result).toBeNull(); + }); + + it("GET returns discover.result when the worker has written it", async () => { + await prisma.config.create({ data: { key: "discover.result", value: "artists 3, albums 1" } }); + expect((await (await GET()).json()).result).toBe("artists 3, albums 1"); + }); +}); diff --git a/web/src/app/api/discover/run/route.ts b/web/src/app/api/discover/run/route.ts new file mode 100644 index 0000000..8aadfad --- /dev/null +++ b/web/src/app/api/discover/run/route.ts @@ -0,0 +1,21 @@ +import { prisma } from "@/lib/db"; + +export async function POST(_request: Request) { + await prisma.config.upsert({ + where: { key: "discover.requested" }, + create: { key: "discover.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: "discover.requested" } }), + prisma.config.findUnique({ where: { key: "discover.result" } }), + ]); + return Response.json({ + requested: requested?.value === "true", + result: result?.value ?? null, + }); +}