32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
/**
|
|
* /api/graph/seed — initial node set + internal edges for the force-directed graph view.
|
|
*
|
|
* GET /api/graph/seed?limit=80&min_weight=2&classes=person,organization
|
|
*/
|
|
import { NextRequest } from "next/server";
|
|
import { getGraphSeed } from "@/lib/retrieval/graph";
|
|
|
|
export const runtime = "nodejs";
|
|
export const dynamic = "force-dynamic";
|
|
|
|
function json(data: unknown, status = 200) {
|
|
return new Response(JSON.stringify(data), {
|
|
status,
|
|
headers: { "content-type": "application/json" },
|
|
});
|
|
}
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const u = new URL(req.url);
|
|
const limit = Math.min(Number(u.searchParams.get("limit") ?? 80), 300);
|
|
const minWeight = Number(u.searchParams.get("min_weight") ?? 2);
|
|
const classesParam = u.searchParams.get("classes");
|
|
const classes = classesParam ? classesParam.split(",").filter(Boolean) : undefined;
|
|
|
|
try {
|
|
const { nodes, links } = await getGraphSeed({ limit, minWeight, classes });
|
|
return json({ nodes, links, total: nodes.length });
|
|
} catch (e) {
|
|
return json({ error: "graph_unavailable", message: (e as Error).message }, 503);
|
|
}
|
|
}
|