import { NextResponse } from "next/server";
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { db } from "@/db";
import { menuFeedRequests } from "@/db/schema";
import { buildYandexFeed } from "@/lib/yandex-feed";
export const dynamic = "force-dynamic";
export const revalidate = 0;
const lastGoodPath = "data/feed/yandex-menu-last-good.xml";
export async function GET(request: Request) { try { const feed = await buildYandexFeed(); try { await mkdir("data/feed", { recursive: true }); await writeFile(lastGoodPath, feed.xml); } catch { /* read-only deployments can still serve the current feed */ } try { if (db) await db.insert(menuFeedRequests).values({ userAgent: request.headers.get("user-agent"), responseStatus: 200, itemsCount: feed.count, feedVersion: new Date().toISOString() }); } catch { /* observability must not break YML */ } return new NextResponse(feed.xml, { headers: { "Content-Type": "application/xml; charset=utf-8", "Cache-Control": "no-cache, max-age=0, must-revalidate" } }); } catch { try { const previous = await readFile(lastGoodPath, "utf8"); try { if (db) await db.insert(menuFeedRequests).values({ userAgent: request.headers.get("user-agent"), responseStatus: 200, itemsCount: 0, feedVersion: "previous" }); } catch { /* ignore log failure */ } return new NextResponse(previous, { headers: { "Content-Type": "application/xml; charset=utf-8", "Cache-Control": "no-cache, max-age=0, must-revalidate" } }); } catch { try { if (db) await db.insert(menuFeedRequests).values({ userAgent: request.headers.get("user-agent"), responseStatus: 500, itemsCount: 0, feedVersion: "error" }); } catch { /* ignore log failure */ } return new NextResponse("<?xml version=\"1.0\"?><error>Feed temporarily unavailable</error>", { status: 500, headers: { "Content-Type": "application/xml; charset=utf-8", "Cache-Control": "no-store" } }); } } }
