49 lines
1.6 KiB
TypeScript
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];
|
|
}
|