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>
59 lines
2.7 KiB
TypeScript
59 lines
2.7 KiB
TypeScript
// 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());
|