// Einmalige Synchronisierung des Datei-Vorlagenpakets in die globale DB-Vorlagenablage. // Überführt seed/isms-vorlagenpaket-v2/ (deutsch) in eine veröffentlichte // PolicyTemplateVersion. Danach ist die DB die Master-Quelle; der Plattform-Admin // bearbeitet Vorlagen/Versionen dort, der Mandanten-Import liest die veröffentlichte // Version. Idempotent: erneuter Lauf ersetzt die deutschen Inhalte der Version. // // Lauf (lokal): npx tsx scripts/sync-policy-templates.ts // Lauf (Deploy): im Container/Coolify mit gesetzter DATABASE_URL ausführen (einmalig // bzw. nach Paket-Updates, solange die Pflege noch datei-basiert erfolgt). import "dotenv/config"; import { join } from "node:path"; import { existsSync } from "node:fs"; import { PrismaClient, type Framework } from "@prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; import { parsePackageFiles, mappingFileFor } from "../prisma/import-policies"; import { syncTemplatesFromParsed } from "../prisma/template-store"; const prisma = new PrismaClient({ adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL }) }); const ROOT = join(process.cwd(), "seed"); // Sprache → Seed-Verzeichnis. EN nur, wenn vorhanden (Übersetzungspaket). const SOURCES: Array<{ locale: string; dir: string }> = [ { locale: "de", dir: join(ROOT, "isms-vorlagenpaket-v2") }, { locale: "en", dir: join(ROOT, "isms-vorlagenpaket-v2-en") }, ]; // AP1: beide Frameworks teilen den Dokumentensatz, nur das Mapping wechselt. Ein Sync // je (Framework × Sprache) — das ISO-Mapping nur, wenn die Datei existiert. const FRAMEWORKS: Framework[] = ["TISAX", "ISO_27001"]; async function main() { for (const { locale, dir } of SOURCES) { if (!existsSync(dir)) { console.log(`Sprache ${locale}: kein Verzeichnis (${dir}) — übersprungen.`); continue; } for (const framework of FRAMEWORKS) { const mappingFile = mappingFileFor(framework); if (!existsSync(join(dir, mappingFile))) { console.log(` ${framework}/${locale}: kein ${mappingFile} — übersprungen.`); continue; } const pkg = parsePackageFiles(dir, mappingFile); const { version } = await syncTemplatesFromParsed(prisma, pkg, locale, framework, { publish: true }); console.log( `Vorlagen-Sync (${framework}/${locale}) → Version ${version}: ` + `${pkg.documents.length} Dokumente, ${pkg.requirements.length} Anforderungen, ` + `${pkg.variables.length} Variablen, ${pkg.baseline.length} Baseline, ${pkg.evidence.length} Nachweise.`, ); } } } main() .catch((e) => { console.error("Vorlagen-Sync fehlgeschlagen:", e.message); process.exit(1); }) .finally(() => prisma.$disconnect());