/** * Plugin Karbé — hooks d'activation/désactivation par plugin. * * Chaque plugin peut déclarer un `onEnable` et/ou `onDisable` ici. Exemples * d'usage : seed initial des carbets démo (au enable), soft-delete des * carbets démo (au disable). Les hooks ne sont **pas** des migrations DB — * pour ça on passe par les fichiers prisma/migrations. */ export type PluginHook = () => Promise; export interface PluginHookSet { onEnable?: PluginHook; onDisable?: PluginHook; } 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"; import { deactivatePirogueProviders, seedPirogueProviders, } from "./seeds/pirogue-providers-default"; import { seedEnglishContentPages } from "./seeds/content-pages-en"; import { prisma } from "@/lib/prisma"; // Mutuelle exclusion theme-guyane / theme-aquarelle : activer l'un // désactive automatiquement l'autre. async function disableOtherTheme(currentKey: string): Promise { const other = currentKey === "theme-guyane" ? "theme-aquarelle" : "theme-guyane"; const row = await prisma.plugin.findUnique({ where: { key: other } }); if (row?.enabled) { await prisma.plugin.update({ where: { key: other }, data: { enabled: false, lastDisabledAt: new Date() }, }); console.log(`[plugin ${currentKey}] désactive ${other} (mutual exclusion)`); } } export const pluginHooks: Record = { "demo-carbets-seed": { onEnable: async () => { const { created, existing } = await seedDemoCarbets(); console.log( `[plugin demo-carbets-seed] seed terminé : ${created} créés, ${existing} déjà présents`, ); }, onDisable: async () => { const archived = await archiveDemoCarbets(); console.log( `[plugin demo-carbets-seed] disable : ${archived} carbets démo archivés`, ); }, }, "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`); }, }, "pirogue-providers": { onEnable: async () => { const { providers, carbets } = await seedPirogueProviders(); console.log( `[plugin pirogue-providers] seed: ${providers} partenaires, ${carbets} carbets attachés`, ); }, onDisable: async () => { const count = await deactivatePirogueProviders(); console.log(`[plugin pirogue-providers] disable: ${count} partenaires désactivés`); }, }, // Quand i18n est activé, on seed les pages content + legal en EN. // Désactiver n'efface pas les EN pages (elles dorment juste, fallback FR // reprend la main au prochain getContentPage). "i18n-fr-en": { onEnable: async () => { const count = await seedEnglishContentPages(); console.log(`[plugin i18n-fr-en] seed: ${count} pages EN`); }, }, // Themes : mutuellement exclusifs (un seul actif à la fois). "theme-guyane": { onEnable: async () => { await disableOtherTheme("theme-guyane"); }, }, "theme-aquarelle": { onEnable: async () => { await disableOtherTheme("theme-aquarelle"); }, }, };