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.
75 lines
1.9 KiB
TypeScript
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,
|
|
},
|
|
];
|
|
}
|
|
}
|