Files
craftvia/scripts/sync-policy-templates.ts
T
msolarczekandClaude Opus 5 c8e6f30a27
CI / build-and-check (push) Canceled after 0s
CI / audit (push) Canceled after 0s
CI / sbom (push) Canceled after 0s
Basis: Certvia dev@a48c5fb als Fundament für Craftvia
Unveränderter Stand von certvia/dev (a48c5fb) plus Craftvia-Spezifikation
und Brandbook unter docs/craftvia/. ISMS-Module werden im Folgecommit entfernt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 11:05:39 +02:00

59 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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());