feat(discovery): GET /api/discover feed
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,24 @@
|
|||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { prisma } from "@/lib/db";
|
||||||
|
import { GET } from "./route";
|
||||||
|
|
||||||
|
describe("discover feed API", () => {
|
||||||
|
it("returns pending artists and albums split, highest score first, excluding non-pending", async () => {
|
||||||
|
await prisma.discoverySuggestion.createMany({
|
||||||
|
data: [
|
||||||
|
{ kind: "artist", artistMbid: "a1", artistName: "Low", score: 0.2, seedCount: 1,
|
||||||
|
sources: ["listenbrainz"], secondaryTypes: [], dedupeKey: "artist:a1:" },
|
||||||
|
{ kind: "artist", artistMbid: "a2", artistName: "High", score: 0.9, seedCount: 2,
|
||||||
|
sources: ["listenbrainz"], secondaryTypes: [], dedupeKey: "artist:a2:" },
|
||||||
|
{ kind: "album", artistMbid: "a3", artistName: "Band", rgMbid: "rg1", album: "Rec",
|
||||||
|
score: 0.5, seedCount: 1, sources: ["listenbrainz"], secondaryTypes: [], dedupeKey: "album:a3:rg1" },
|
||||||
|
{ kind: "artist", artistMbid: "a4", artistName: "Gone", score: 5, seedCount: 1,
|
||||||
|
sources: ["listenbrainz"], secondaryTypes: [], status: "dismissed", dedupeKey: "artist:a4:" },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
const body = await (await GET()).json();
|
||||||
|
expect(body.artists.map((a: any) => a.artistName)).toEqual(["High", "Low"]); // dismissed excluded
|
||||||
|
expect(body.albums.map((a: any) => a.album)).toEqual(["Rec"]);
|
||||||
|
expect(body.artists[0]).toMatchObject({ artistMbid: "a2", seedCount: 2, sources: ["listenbrainz"] });
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { prisma } from "@/lib/db";
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
const rows = await prisma.discoverySuggestion.findMany({
|
||||||
|
where: { status: "pending" },
|
||||||
|
orderBy: [{ score: "desc" }, { createdAt: "asc" }],
|
||||||
|
});
|
||||||
|
const map = (r: (typeof rows)[number]) => ({
|
||||||
|
id: r.id,
|
||||||
|
artistMbid: r.artistMbid,
|
||||||
|
artistName: r.artistName,
|
||||||
|
rgMbid: r.rgMbid,
|
||||||
|
album: r.album,
|
||||||
|
primaryType: r.primaryType,
|
||||||
|
secondaryTypes: r.secondaryTypes,
|
||||||
|
firstReleaseDate: r.firstReleaseDate,
|
||||||
|
score: r.score,
|
||||||
|
seedCount: r.seedCount,
|
||||||
|
sources: r.sources,
|
||||||
|
});
|
||||||
|
return Response.json({
|
||||||
|
artists: rows.filter((r) => r.kind === "artist").map(map),
|
||||||
|
albums: rows.filter((r) => r.kind === "album").map(map),
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user