Carbets publics — recherche + fiche SSR (SYS-5) #8

Merged
tarzzan merged 1 commit from feat/carbet-public into main 2026-05-29 22:28:30 +00:00
Owner

Résumé

Implémente SYS-5 : la marketplace publique pour découvrir les carbets fluviaux.

Périmètre

  • /carbets : page de recherche server-side avec filtres GET (fleuve, dates de séjour, capacité min.), grille de cartes (photo de couverture, titre, fleuve, capacité, durée pirogue).
  • /carbets/[slug] : fiche carbet SSR avec generateMetadata
    • title/description + OpenGraph + Twitter cards (cover image OG quand disponible)
    • galerie photo/vidéo (cover + vignettes)
    • description, équipements (catalogue), bloc accès (point d'embarquement, durée pirogue, coords GPS, capacité), prénom de l'hôte
  • SEO sitewide : robots.ts, sitemap.xml (inclut les carbets publiés), metadataBase + title.template au niveau du root layout, OG par défaut Karbé.
  • Home : lien Découvrir les carbets.
  • Helpers partagés : lib/carbet-search.ts (parsing + Prisma query, fenêtre d'Availability PUBLIC quand dates fournies), lib/carbet-public.ts (fetch SSR mémoïsé via cache() pour partage entre generateMetadata et la page), lib/format.ts (durée pirogue, troncature, coords).
  • Env : nouvelle variable NEXT_PUBLIC_SITE_URL (canonical/OG/sitemap), valeur par défaut http://localhost:3000.

Filtres /carbets

  • river : contains insensible à la casse, datalist alimentée par les fleuves distincts du catalogue.
  • startDate / endDate : honorés uniquement si les deux dates parsent et start ≤ end ; filtre une Availability PUBLIC + isAvailable + blockReason: NONE qui couvre l'intervalle.
  • capacity : entier 1–100, gte.

Les carbets DRAFT / ARCHIVED ne remontent jamais.

Vérifications

  • tsc --noEmit
  • next build ⚠️ — échec pré-existant sur la prerender de /_global-error (TypeError useContext sur null, environnement Next 16.2.6 + React 19.2.4). Reproductible sur origin/main sans mes changements. À traiter dans un ticket d'infra séparé ; le code SYS-5 lui-même compile et passe le typecheck.
  • Pas de Postgres / MinIO dans cet environnement → pas de test e2e local.

Notes de revue

  • Pour la home, la transition vers une vraie navigation (header global) viendra avec les pages de réservation/CE — j'ai gardé la home actuelle et ajouté seulement un CTA.
  • Les médias S3/MinIO sont rendus avec <img> / <video> natifs (pas de next/image car l'optimizer ne couvre pas l'endpoint MinIO ici).
  • Mémoïsation cache() partagée entre generateMetadata et la page : une seule requête Prisma par render.

Suivi

  • Build infra (/_global-error) : à créer en SYS séparé si pas déjà ouvert.
  • Réservation publique (capture lead → booking PENDING) : SYS-6 / suivant.
## Résumé Implémente SYS-5 : la marketplace publique pour découvrir les carbets fluviaux. ## Périmètre - **`/carbets`** : page de recherche server-side avec filtres GET (fleuve, dates de séjour, capacité min.), grille de cartes (photo de couverture, titre, fleuve, capacité, durée pirogue). - **`/carbets/[slug]`** : fiche carbet SSR avec `generateMetadata` - title/description + OpenGraph + Twitter cards (cover image OG quand disponible) - galerie photo/vidéo (cover + vignettes) - description, équipements (catalogue), bloc accès (point d'embarquement, durée pirogue, coords GPS, capacité), prénom de l'hôte - **SEO sitewide** : `robots.ts`, `sitemap.xml` (inclut les carbets publiés), `metadataBase` + `title.template` au niveau du root layout, OG par défaut Karbé. - **Home** : lien _Découvrir les carbets_. - **Helpers partagés** : `lib/carbet-search.ts` (parsing + Prisma query, fenêtre d'`Availability` PUBLIC quand dates fournies), `lib/carbet-public.ts` (fetch SSR mémoïsé via `cache()` pour partage entre `generateMetadata` et la page), `lib/format.ts` (durée pirogue, troncature, coords). - **Env** : nouvelle variable `NEXT_PUBLIC_SITE_URL` (canonical/OG/sitemap), valeur par défaut `http://localhost:3000`. ## Filtres `/carbets` - `river` : `contains` insensible à la casse, datalist alimentée par les fleuves distincts du catalogue. - `startDate` / `endDate` : honorés uniquement si les deux dates parsent et `start ≤ end` ; filtre une `Availability` `PUBLIC` + `isAvailable` + `blockReason: NONE` qui couvre l'intervalle. - `capacity` : entier 1–100, `gte`. Les carbets `DRAFT` / `ARCHIVED` ne remontent jamais. ## Vérifications - `tsc --noEmit` ✅ - `next build` ⚠️ — échec **pré-existant** sur la prerender de `/_global-error` (TypeError `useContext` sur null, environnement Next 16.2.6 + React 19.2.4). Reproductible sur `origin/main` _sans_ mes changements. À traiter dans un ticket d'infra séparé ; le code SYS-5 lui-même compile et passe le typecheck. - Pas de Postgres / MinIO dans cet environnement → pas de test e2e local. ## Notes de revue - Pour la home, la transition vers une vraie navigation (header global) viendra avec les pages de réservation/CE — j'ai gardé la home actuelle et ajouté seulement un CTA. - Les médias S3/MinIO sont rendus avec `<img>` / `<video>` natifs (pas de `next/image` car l'optimizer ne couvre pas l'endpoint MinIO ici). - Mémoïsation `cache()` partagée entre `generateMetadata` et la page : une seule requête Prisma par render. ## Suivi - Build infra (`/_global-error`) : à créer en SYS séparé si pas déjà ouvert. - Réservation publique (capture lead → booking PENDING) : SYS-6 / suivant.
tarzzan added 1 commit 2026-05-29 22:25:07 +00:00
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>
tarzzan merged commit ba0494611b into main 2026-05-29 22:28:30 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: tarzzan/karbe#8
No description provided.