diff --git a/app/api/sitemap/route.tsx b/app/api/sitemap/route.tsx
index 374dbc4..d49062e 100644
--- a/app/api/sitemap/route.tsx
+++ b/app/api/sitemap/route.tsx
@@ -9,52 +9,78 @@ interface ProjectsData {
posts: Project[];
}
-interface SitemapRoute {
- url: string;
- lastModified: string;
+export const runtime = "nodejs"; // Force Node runtime
+
+const GHOST_API_URL = "http://big-bear-ghost: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}`;
}
-const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "https://dki.one";
-
-const generateSitemap = async (): Promise => {
- try {
- const response = await fetch(`${baseUrl}/api/fetchAllProjects`, {
- headers: {"Cache-Control": "no-cache"},
- });
-
- if (!response.ok) {
- console.error(`Failed to fetch projects: ${response.statusText}`);
- return [];
- }
-
- const projectsData = (await response.json()) as ProjectsData;
-
- // Dynamische Projekt-Routen generieren
- const projectRoutes: SitemapRoute[] = projectsData.posts.map((project) => ({
- url: `${baseUrl}/projects/${project.slug}`,
- lastModified: project.updated_at
- ? new Date(project.updated_at).toISOString()
- : new Date().toISOString(),
- }));
-
- return [...projectRoutes];
- } catch (error) {
- console.error("Failed to generate sitemap:", error);
- return [];
- }
-};
-
export async function GET() {
+ const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000";
+
+ // 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 sitemap = await generateSitemap();
- return NextResponse.json(sitemap, {
- headers: {"Cache-Control": "no-cache"},
- });
- } catch (error) {
- console.error("Failed to generate sitemap:", error);
- return NextResponse.json(
- {error: "Failed to generate sitemap"},
- {status: 500},
+ 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.error("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"},
+ });
}
}
diff --git a/app/sitemap.xml/route.tsx b/app/sitemap.xml/route.tsx
index 76dfe0b..b302bab 100644
--- a/app/sitemap.xml/route.tsx
+++ b/app/sitemap.xml/route.tsx
@@ -1,58 +1,26 @@
import {NextResponse} from "next/server";
-interface SitemapRoute {
- url: string;
- lastModified: string;
- changeFrequency?:
- | "always"
- | "hourly"
- | "daily"
- | "weekly"
- | "monthly"
- | "yearly"
- | "never";
- priority?: number;
-}
-
-const baseUrl = "https://dki.one";
-
export async function GET() {
+ const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000"; // Stelle sicher, dass die Base-URL korrekt ist
+ const apiUrl = `${baseUrl}/api/sitemap`; // Verwende die vollständige URL zur API
+
try {
- const response = await fetch(`${baseUrl}/api/sitemap`);
- if (!response.ok) {
- console.error(`Failed to fetch dynamic routes: ${response.statusText}`);
+ // Holt die Sitemap-Daten von der API
+ const res = await fetch(apiUrl);
+
+ if (!res.ok) {
+ console.error(`Failed to fetch sitemap: ${res.statusText}`);
+ return new NextResponse("Failed to fetch sitemap", {status: 500});
}
- const dynamicRoutes = (await response.json()) as SitemapRoute[];
- const sitemap = [...dynamicRoutes];
+ const xml = await res.text();
- return new NextResponse(generateXml(sitemap), {
+ // Gibt die XML mit dem richtigen Content-Type zurück
+ return new NextResponse(xml, {
headers: {"Content-Type": "application/xml"},
});
} catch (error) {
- console.error("Error fetching dynamic routes, using fallback:", error);
- return new NextResponse(generateXml([]), {
- headers: {"Content-Type": "application/xml"},
- });
+ console.error("Error fetching sitemap:", error);
+ return new NextResponse("Error fetching sitemap", {status: 500});
}
}
-
-function generateXml(routes: SitemapRoute[]): string {
- const xmlHeader = '';
- const urlsetOpen = '';
- const urlsetClose = '';
-
- const urlEntries = routes
- .map(
- (route) => `
-
- ${route.url}
- ${route.lastModified}
- ${route.changeFrequency ? `${route.changeFrequency}` : ""}
- ${route.priority ? `${route.priority}` : ""}
- `
- )
- .join("");
-
- return `${xmlHeader}${urlsetOpen}${urlEntries}${urlsetClose}`;
-}