- Modèle Prisma Plugin (key, name, description, category, version, enabled, config JSONB, migrationsApplied, timestamps) + migration SQL - PluginRegistry (src/lib/plugins/registry.ts) avec 12 plugins déclarés : visuels (theme-guyane, landing-hero, landing-sections, image-gallery-seed, demo-carbets-seed), métier (access-type, seasonality, pirogue-providers, min-stay), contenus (content-pages, legal-pages), i18n (i18n-fr-en) - Server helpers (server.ts) : sync, isEnabled, getEnabledKeys, toggle avec hooks onEnable/onDisable, updateConfig, cache 5s - Client bridge (client.tsx) : PluginProvider + useIsPluginEnabled - Composant <IfPluginEnabled plugin=... fallback=...> - Guard requirePluginOr404 pour pages et routes - Page admin /admin/plugins avec table toggle par catégorie + édition config - Route PATCH /api/admin/plugins/[key] + GET - Layout async qui sync registry + passe enabledKeys au PluginProvider Tous plugins en enabled=false par défaut, activation pilotée depuis l'admin.
26 lines
997 B
TypeScript
26 lines
997 B
TypeScript
import { requireRole } from "@/lib/authorization";
|
|
import { UserRole } from "@/generated/prisma/enums";
|
|
import { listAllPlugins, syncPluginsFromRegistry } from "@/lib/plugins/server";
|
|
import PluginToggleTable from "./_components/PluginToggleTable";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export default async function PluginsAdminPage() {
|
|
await requireRole([UserRole.ADMIN]);
|
|
// S'assure que tous les plugins du registry sont en DB.
|
|
await syncPluginsFromRegistry();
|
|
const plugins = await listAllPlugins();
|
|
|
|
return (
|
|
<div className="mx-auto max-w-5xl px-4 py-8 sm:px-6 lg:px-8">
|
|
<h1 className="text-2xl font-semibold">Plugins Karbé</h1>
|
|
<p className="mt-2 text-sm text-gray-600">
|
|
Active ou désactive chaque module. Les changements prennent effet immédiatement (cache 5 s).
|
|
L'onEnable/onDisable est exécuté avant la bascule.
|
|
</p>
|
|
<div className="mt-6">
|
|
<PluginToggleTable plugins={plugins} />
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|