import { NextResponse } from "next/server"; interface Project { slug: string; updated_at?: string; // Optional timestamp for last modification } interface ProjectsData { posts: Project[]; } export const dynamic = "force-dynamic"; export const runtime = "nodejs"; // Force Node runtime const GHOST_API_URL = process.env.GHOST_API_URL || "http://192.168.179.31:2368"; const GHOST_API_KEY = process.env.GHOST_API_KEY; // Funktion, um die XML für die Sitemap zu generieren function generateXml(sitemapRoutes: { url: string; lastModified: string }[]) { const xmlHeader = ''; const urlsetOpen = ''; const urlsetClose = ""; const urlEntries = sitemapRoutes .map( (route) => ` ${route.url} ${route.lastModified} monthly 0.8 `, ) .join(""); return `${xmlHeader}${urlsetOpen}${urlEntries}${urlsetClose}`; } export async function GET() { const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://dki.one"; // Statische Routen const staticRoutes = [ { url: `${baseUrl}/`, lastModified: new Date().toISOString(), priority: 1, changeFreq: "weekly", }, { url: `${baseUrl}/legal-notice`, lastModified: new Date().toISOString(), priority: 0.5, changeFreq: "yearly", }, { url: `${baseUrl}/privacy-policy`, lastModified: new Date().toISOString(), priority: 0.5, changeFreq: "yearly", }, ]; try { const response = await fetch( `${GHOST_API_URL}/ghost/api/content/posts/?key=${GHOST_API_KEY}&limit=all`, ); if (!response.ok) { console.error(`Failed to fetch posts: ${response.statusText}`); return new NextResponse(generateXml(staticRoutes), { headers: { "Content-Type": "application/xml" }, }); } const projectsData = (await response.json()) as ProjectsData; const projects = projectsData.posts; // Dynamische Projekt-Routen generieren const sitemapRoutes = projects.map((project) => { const lastModified = project.updated_at || new Date().toISOString(); return { url: `${baseUrl}/projects/${project.slug}`, lastModified, priority: 0.8, changeFreq: "monthly", }; }); const allRoutes = [...staticRoutes, ...sitemapRoutes]; // Rückgabe der Sitemap im XML-Format return new NextResponse(generateXml(allRoutes), { headers: { "Content-Type": "application/xml" }, }); } catch (error) { console.log("Failed to fetch posts from Ghost:", error); // Rückgabe der statischen Routen, falls Fehler auftritt return new NextResponse(generateXml(staticRoutes), { headers: { "Content-Type": "application/xml" }, }); } }