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>
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
// 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());
|
||||
Reference in New Issue
Block a user