Files
portfolio/app/sitemap.tsx
Denshooter 588dfb912b feat(sitemap): enhance sitemap generation and error handling
Add optional `updated_at` field to the Project interface for 
tracking last modification. Update base URL to use an 
environment variable for better configurability. Improve 
error handling during sitemap data fetching by logging 
errors and returning static routes as a fallback. 
Refactor change frequency and priority logic for clarity 
and maintainability.
2025-02-12 18:31:13 +01:00

75 lines
1.9 KiB
TypeScript

import type { MetadataRoute } from "next";
interface SitemapRoute {
url: string;
lastModified: string;
changeFrequency?:
| "always"
| "hourly"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "never";
priority?: number;
}
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const baseUrl = "https://dki.one";
try {
const response = await fetch(`${baseUrl}/api/sitemap`);
if (!response.ok) {
throw new Error(`Failed to fetch sitemap: ${response.statusText}`);
}
const sitemapData = (await response.json()) as SitemapRoute[];
return sitemapData.map((route) => {
const config: Record<
string,
{ changeFrequency: SitemapRoute["changeFrequency"]; priority: number }
> = {
[`${baseUrl}/`]: { changeFrequency: "weekly", priority: 1.0 },
};
if (route.url.startsWith(`${baseUrl}/projects`)) {
config[route.url] = { changeFrequency: "monthly", priority: 0.8 };
} else if (route.url.startsWith(`${baseUrl}/blog`)) {
config[route.url] = { changeFrequency: "weekly", priority: 0.6 };
} else {
config[route.url] = { changeFrequency: "monthly", priority: 0.5 };
}
return {
url: route.url,
lastModified: route.lastModified,
...config[route.url],
};
});
} catch (error) {
console.error("Failed to fetch dynamic sitemap, using fallback:", error);
return [
{
url: `${baseUrl}/`,
lastModified: new Date().toISOString(),
changeFrequency: "weekly",
priority: 1.0,
},
{
url: `${baseUrl}/privacy-policy`,
lastModified: new Date().toISOString(),
changeFrequency: "yearly",
priority: 0.3,
},
{
url: `${baseUrl}/legal-notice`,
lastModified: new Date().toISOString(),
changeFrequency: "yearly",
priority: 0.3,
},
];
}
}