karbe/src/app/sitemap.ts
Claude Integration b1c2877e43 chore(sitemap): force dynamic + try/catch DB
Évite que le build échoue quand la DB n'est pas joignable au prerender.
2026-05-30 23:32:07 +00:00

49 lines
1.6 KiB
TypeScript

import type { MetadataRoute } from "next";
import { prisma } from "@/lib/prisma";
import { CarbetStatus } from "@/generated/prisma/enums";
// La sitemap interroge la DB → on force le rendu dynamique pour éviter le
// prerender au build (qui n'a pas accès à la DB de prod).
export const dynamic = "force-dynamic";
export const revalidate = 0;
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000";
function abs(path: string): string {
return `${siteUrl.replace(/\/+$/, "")}${path}`;
}
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const staticRoutes: MetadataRoute.Sitemap = [
{ url: abs("/"), changeFrequency: "weekly", priority: 1 },
{ url: abs("/carbets"), changeFrequency: "daily", priority: 0.9 },
{ url: abs("/cgv"), changeFrequency: "yearly", priority: 0.2 },
{ url: abs("/mentions-legales"), changeFrequency: "yearly", priority: 0.2 },
{
url: abs("/politique-de-confidentialite"),
changeFrequency: "yearly",
priority: 0.2,
},
];
let carbetRoutes: MetadataRoute.Sitemap = [];
try {
const carbets = await prisma.carbet.findMany({
where: { status: CarbetStatus.PUBLISHED },
select: { slug: true, updatedAt: true },
});
carbetRoutes = carbets.map((carbet) => ({
url: abs(`/carbets/${carbet.slug}`),
lastModified: carbet.updatedAt,
changeFrequency: "weekly",
priority: 0.7,
}));
} catch {
// DB indisponible (build statique, par ex.) — on retombe sur les routes
// statiques seules, plutôt que de faire échouer la génération.
carbetRoutes = [];
}
return [...staticRoutes, ...carbetRoutes];
}