import { NextResponse } from "next/server"; // The article body for the reader pane. Public (no auth), zero LLM. // Mongo first (the crawler warms it on the tick), publisher fetch on a miss. export const dynamic = "force-dynamic"; export const maxDuration = 60; export async function GET(req) { const q = new URL(req.url).searchParams; const url = q.get("url") || ""; if (!/^https?:\/\//i.test(url)) return NextResponse.json({ ok: false, error: "url required" }, { status: 400 }); try { const { getArticle } = await import("../../../lib/article"); const a = await getArticle({ url, force: q.get("force") === "1" }); const { story, realUrl, ...article } = a; return NextResponse.json({ ok: true, url, realUrl: realUrl || url, article, story: story || null }); } catch (e) { console.warn("[bama] /api/article failed:", String((e && e.message) || e).slice(0, 160)); return NextResponse.json({ ok: false, error: "article unavailable" }, { status: 500 }); } }