karbe/src/app/sitemap.ts
Karbé Architect c2df6722f2 feat(carbets): public search + carbet detail page (SSR/SEO)
Implémente SYS-5 : la marketplace publique pour découvrir les carbets
fluviaux publiés par les hôtes.

- /carbets : page de recherche server-side avec filtres GET
  (fleuve, dates de séjour, capacité min.), grille de résultats
  avec photo de couverture, fleuve, capacité, durée pirogue
- /carbets/[slug] : fiche carbet SSR
  - generateMetadata (title/description + OpenGraph/Twitter cards)
  - galerie médias (photo couverture + vignettes vidéo/photo)
  - description, équipements (catalogue), accès, coords GPS,
    capacité, prénom de l'hôte
- robots.ts + sitemap.xml (incluant les carbets publiés)
- metadataBase / title.template au niveau du root layout, OG par
  défaut Karbé
- Lien "Découvrir les carbets" sur la home
- Helpers partagés : lib/carbet-search.ts (parse filters + query),
  lib/carbet-public.ts (fetch SSR mémoïsé via React cache),
  lib/format.ts (durée pirogue, troncature, coords)
- Nouvelle variable d'env NEXT_PUBLIC_SITE_URL (canonical/OG/sitemap)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-29 22:24:25 +00:00

38 lines
1.2 KiB
TypeScript

import type { MetadataRoute } from "next";
import { prisma } from "@/lib/prisma";
import { CarbetStatus } from "@/generated/prisma/enums";
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,
},
];
const carbets = await prisma.carbet.findMany({
where: { status: CarbetStatus.PUBLISHED },
select: { slug: true, updatedAt: true },
});
const carbetRoutes: MetadataRoute.Sitemap = carbets.map((carbet) => ({
url: abs(`/carbets/${carbet.slug}`),
lastModified: carbet.updatedAt,
changeFrequency: "weekly",
priority: 0.7,
}));
return [...staticRoutes, ...carbetRoutes];
}