feat(web): DELETE /api/requests/[id] to remove a queued item
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,37 @@
|
|||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { DELETE } from "./route";
|
||||||
|
import { prisma } from "@/lib/db";
|
||||||
|
import type { Prisma } from "@prisma/client";
|
||||||
|
|
||||||
|
function del(id: string) {
|
||||||
|
return new Request(`http://localhost/api/requests/${id}`, { method: "DELETE" });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function seed(jobData: Prisma.JobCreateWithoutRequestInput) {
|
||||||
|
return prisma.request.create({
|
||||||
|
data: { artist: "A", album: "B", status: "pending", job: { create: jobData } },
|
||||||
|
include: { job: true },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("remove request API", () => {
|
||||||
|
it("deletes a queued request and cascades its job", async () => {
|
||||||
|
const created = await seed({ state: "requested" });
|
||||||
|
const res = await DELETE(del(created.id), { params: Promise.resolve({ id: created.id }) });
|
||||||
|
expect(res.status).toBe(200);
|
||||||
|
expect(await prisma.request.findUnique({ where: { id: created.id } })).toBeNull();
|
||||||
|
expect(await prisma.job.findUnique({ where: { id: created.job!.id } })).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("refuses to remove an in-flight job", async () => {
|
||||||
|
const created = await seed({ state: "downloading" });
|
||||||
|
const res = await DELETE(del(created.id), { params: Promise.resolve({ id: created.id }) });
|
||||||
|
expect(res.status).toBe(400);
|
||||||
|
expect(await prisma.request.findUnique({ where: { id: created.id } })).not.toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("404s for a missing request", async () => {
|
||||||
|
const res = await DELETE(del("nope"), { params: Promise.resolve({ id: "nope" }) });
|
||||||
|
expect(res.status).toBe(404);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { prisma } from "@/lib/db";
|
||||||
|
|
||||||
|
export async function DELETE(_request: Request, { params }: { params: Promise<{ id: string }> }) {
|
||||||
|
const { id } = await params;
|
||||||
|
|
||||||
|
const req = await prisma.request.findUnique({ where: { id }, include: { job: true } });
|
||||||
|
if (!req) {
|
||||||
|
return Response.json({ error: "not found" }, { status: 404 });
|
||||||
|
}
|
||||||
|
if (req.job && req.job.state !== "requested") {
|
||||||
|
return Response.json({ error: "only queued items can be removed" }, { status: 400 });
|
||||||
|
}
|
||||||
|
|
||||||
|
await prisma.request.delete({ where: { id } }); // cascades Job + Candidates
|
||||||
|
return Response.json({ ok: true });
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user