diff --git a/web/src/app/api/releases/[id]/search/route.test.ts b/web/src/app/api/releases/[id]/search/route.test.ts index 4861a54..688fd60 100644 --- a/web/src/app/api/releases/[id]/search/route.test.ts +++ b/web/src/app/api/releases/[id]/search/route.test.ts @@ -23,4 +23,17 @@ describe("POST /api/releases/[id]/search", () => { it("404s an unknown release", async () => { expect((await POST(new Request("http://localhost/x", { method: "POST" }), ctx("nope"))).status).toBe(404); }); + + it("does not enqueue a duplicate while a non-terminal job is active", async () => { + const r = await prisma.monitoredRelease.create({ + data: { artistMbid: "a1", artistName: "John Mayer", rgMbid: "rg-dup", album: "Continuum", secondaryTypes: [], monitored: true }, + }); + const first = await POST(new Request("http://localhost/x", { method: "POST" }), ctx(r.id)); + expect((await first.json()).enqueued).toBe(true); + // the first job is in a non-terminal state ('requested'); a second search must no-op + const second = await POST(new Request("http://localhost/x", { method: "POST" }), ctx(r.id)); + expect(second.status).toBe(202); + expect((await second.json()).enqueued).toBe(false); + expect(await prisma.request.count({ where: { monitoredReleaseId: r.id } })).toBe(1); + }); }); diff --git a/web/src/app/api/releases/[id]/search/route.ts b/web/src/app/api/releases/[id]/search/route.ts index 3e8e07f..5882c5a 100644 --- a/web/src/app/api/releases/[id]/search/route.ts +++ b/web/src/app/api/releases/[id]/search/route.ts @@ -5,6 +5,16 @@ export async function POST(_request: Request, { params }: { params: Promise<{ id const release = await prisma.monitoredRelease.findUnique({ where: { id } }); if (!release) return Response.json({ error: "not found" }, { status: 404 }); + const activeJob = await prisma.job.findFirst({ + where: { + request: { monitoredReleaseId: release.id }, + state: { notIn: ["imported", "needs_attention"] }, + }, + }); + if (activeJob) { + return Response.json({ enqueued: false }, { status: 202 }); + } + await prisma.request.create({ data: { artist: release.artistName,