feat(preview): POST /api/discover/want (want a release-group by metadata)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { prisma } from "@/lib/db";
|
||||
import { POST } from "./route";
|
||||
|
||||
function post(body: unknown) {
|
||||
return POST(new Request("http://localhost/api/discover/want", {
|
||||
method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body),
|
||||
}));
|
||||
}
|
||||
|
||||
describe("discover want API", () => {
|
||||
it("wants a release-group from metadata (201), idempotent re-want flips monitored", async () => {
|
||||
const res = await post({ rgMbid: "rg1", artistMbid: "a1", artistName: "Band", album: "Rec",
|
||||
primaryType: "Album", secondaryTypes: [], firstReleaseDate: "2020" });
|
||||
expect(res.status).toBe(201);
|
||||
expect(await prisma.monitoredRelease.findUnique({ where: { rgMbid: "rg1" } }))
|
||||
.toMatchObject({ album: "Rec", monitored: true, artistName: "Band" });
|
||||
|
||||
await prisma.monitoredRelease.update({ where: { rgMbid: "rg1" }, data: { monitored: false } });
|
||||
await post({ rgMbid: "rg1", artistMbid: "a1", artistName: "Band", album: "Rec" });
|
||||
expect((await prisma.monitoredRelease.findUnique({ where: { rgMbid: "rg1" } }))!.monitored).toBe(true);
|
||||
expect(await prisma.monitoredRelease.count({ where: { rgMbid: "rg1" } })).toBe(1);
|
||||
});
|
||||
|
||||
it("400s on a bad body", async () => {
|
||||
expect((await post({ rgMbid: "rg1" })).status).toBe(400);
|
||||
expect((await post({})).status).toBe(400);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,30 @@
|
||||
import { prisma } from "@/lib/db";
|
||||
|
||||
export async function POST(request: Request) {
|
||||
let body: unknown;
|
||||
try {
|
||||
body = await request.json();
|
||||
} catch {
|
||||
return Response.json({ error: "invalid JSON" }, { status: 400 });
|
||||
}
|
||||
const { rgMbid, artistMbid, artistName, album, primaryType, secondaryTypes, firstReleaseDate } =
|
||||
(body ?? {}) as Record<string, unknown>;
|
||||
if ([rgMbid, artistMbid, artistName, album].some((v) => typeof v !== "string" || !v.trim())) {
|
||||
return Response.json({ error: "rgMbid, artistMbid, artistName, album are required" }, { status: 400 });
|
||||
}
|
||||
const rel = await prisma.monitoredRelease.upsert({
|
||||
where: { rgMbid: rgMbid as string },
|
||||
create: {
|
||||
artistMbid: artistMbid as string,
|
||||
artistName: artistName as string,
|
||||
rgMbid: rgMbid as string,
|
||||
album: album as string,
|
||||
primaryType: typeof primaryType === "string" ? primaryType : null,
|
||||
secondaryTypes: Array.isArray(secondaryTypes) ? (secondaryTypes as string[]) : [],
|
||||
firstReleaseDate: typeof firstReleaseDate === "string" ? firstReleaseDate : null,
|
||||
monitored: true,
|
||||
},
|
||||
update: { monitored: true },
|
||||
});
|
||||
return Response.json({ id: rel.id, album: rel.album, monitored: rel.monitored }, { status: 201 });
|
||||
}
|
||||
Reference in New Issue
Block a user