feat(plugins): content-pages + legal-pages (Phase 4.1 + 4.3)

Plugin content-pages :
- Modèle Prisma ContentPage (slug PK, title, body markdown, category, published)
- lib/content-pages.ts : helpers upsert/get/list/unpublish
- lib/markdown.ts : mini-renderer markdown server-side sans deps externe
  (h1-h3, paragraphes, gras/italique, liens, listes ul/ol, hr, blockquote,
  échappement HTML)
- ContentPageRenderer server component, applique le theme Guyane (font-serif)
- 5 pages seedées : /a-propos, /faq, /comment-ca-marche,
  /pour-comites-entreprise, /devenir-loueur
- Routes publiques + force-dynamic + guard requirePluginOr404

Plugin legal-pages :
- Réutilise le même modèle ContentPage, catégorie 'legal'
- 3 pages seedées : /cgv, /mentions-legales, /politique-de-confidentialite
  (contenu de base, à valider par avocat avant prod réelle)

Admin :
- /admin/content-pages : table par catégorie, statut publié/dépublié
- /admin/content-pages/[slug] : éditeur markdown + toggle publié
- PATCH /api/admin/content-pages/[slug]

Hooks plugin :
- onEnable seed + republish toutes les pages
- onDisable dépublie toute la catégorie sans la supprimer (preserve les edits)
This commit is contained in:
Claude Integration 2026-05-31 10:12:13 +00:00
parent ae8f79b436
commit 68f37f554f
20 changed files with 1116 additions and 0 deletions

View file

@ -15,6 +15,16 @@ export interface PluginHookSet {
}
import { archiveDemoCarbets, seedDemoCarbets } from "./seeds/demo-carbets";
import {
republishContentPages,
seedContentPages,
unpublishContentPages,
} from "./seeds/content-pages-default";
import {
republishLegalPages,
seedLegalPages,
unpublishLegalPages,
} from "./seeds/legal-pages-default";
export const pluginHooks: Record<string, PluginHookSet | undefined> = {
"demo-carbets-seed": {
@ -31,4 +41,30 @@ export const pluginHooks: Record<string, PluginHookSet | undefined> = {
);
},
},
"content-pages": {
onEnable: async () => {
const seeded = await seedContentPages();
const republished = await republishContentPages();
console.log(
`[plugin content-pages] seed: ${seeded.created} pages, republished: ${republished}`,
);
},
onDisable: async () => {
const unpub = await unpublishContentPages();
console.log(`[plugin content-pages] disable: ${unpub} pages dépubliées`);
},
},
"legal-pages": {
onEnable: async () => {
const seeded = await seedLegalPages();
const republished = await republishLegalPages();
console.log(
`[plugin legal-pages] seed: ${seeded.created} pages, republished: ${republished}`,
);
},
onDisable: async () => {
const unpub = await unpublishLegalPages();
console.log(`[plugin legal-pages] disable: ${unpub} pages dépubliées`);
},
},
};