#!/usr/bin/env tsx /** * Eine Beispielvorlage fuer die Screenshots des Editors (#010). * * Der Editor laesst sich nur mit Inhalt zeigen, und die sieben echten Vorlagen * kommen erst mit #017. Bis dahin legt dieses Skript eine Vorlage mit * veroeffentlichter Version 1 **und** einem offenen Entwurf an — also genau die * Lage, die die Oberflaeche unterscheiden muss. * * Es geht durch die echten Dienste aus `src/server/services/vorlagen.ts`, nicht * an ihnen vorbei: waeren die Regeln anders als hier angenommen, schlaegt es * fehl, statt eine Lage herzustellen, die es in der Anwendung nie gibt. * * Idempotent: ein zweiter Lauf legt nichts Neues an. * * pnpm beispiel:vorlage * * Mit #017 wird das Skript geloescht. */ import "dotenv/config"; import { prisma } from "../src/lib/db.js"; import type { AbschnittEingabe, StrukturEingabe, VariableEingabe } from "../src/lib/vorlagen-format.js"; import { entwurfHolenOderErzeugen, entwurfSpeichern, versionVeroeffentlichen, vorlageAnlegen, } from "../src/server/services/vorlagen.js"; const NAME = "PC-Neuinstallation (Beispiel)"; const VARIABLEN: VariableEingabe[] = [ { schluessel: "os_version", beschriftung: "Betriebssystem", typ: "AUSWAHL", optionen: ["Windows 11 Pro 24H2", "Windows 11 Enterprise 24H2"], pflicht: true, }, { schluessel: "join_typ", beschriftung: "Einbindung", typ: "AUSWAHL", optionen: ["Active Directory", "Entra ID"], pflicht: true, }, { schluessel: "arbeitsspeicher", beschriftung: "Arbeitsspeicher in GB", typ: "ZAHL" }, ]; const ABSCHNITTE: AbschnittEingabe[] = [ { titel: "Vorbereitung", schritte: [ { titel: "Ticket und Endbenutzer im Lauf erfasst", pflicht: true }, { titel: "Datensicherung geprüft", hilfetext: "Auch nach Daten **außerhalb** des Profils fragen: Desktop, `D:\\`, lokale Outlook-Archive.\n\n" + "- OneDrive-Status prüfen\n- lokale Archive suchen", pflicht: true, }, { titel: "Gerätedaten notiert", typ: "TEXT", hilfetext: "Seriennummer steht auf der Unterseite.", konfig: { mehrzeilig: false }, dokuUrl: "https://intern.example/geraetedaten", }, ], }, { titel: "Installation", schritte: [ { titel: "{{os_version}} installiert", pflicht: true, hilfetext: "Vom vorbereiteten Stick starten, keine Datenträgerverschlüsselung aktivieren.", }, { titel: "Rechner umbenannt", typ: "BEFEHL", pflicht: true, konfig: { shell: "powershell", befehl: 'Rename-Computer -NewName "{{hostname}}" -Restart', }, }, { titel: "Arbeitsspeicher geprüft", typ: "ZAHL", konfig: { min: 8, max: 128, einheit: "GB" }, }, { titel: "Übergabe am {{datum}} bestätigt", typ: "DATUM", pflicht: true }, ], }, ]; const VEROEFFENTLICHT: StrukturEingabe = { variablen: VARIABLEN, abschnitte: ABSCHNITTE }; /** Der Entwurf zeigt, wie eine Weiterentwicklung aussieht: ein Abschnitt mehr. */ const ENTWURF: StrukturEingabe = { variablen: VARIABLEN, abschnitte: [ ...ABSCHNITTE, { titel: "Abschluss", schritte: [ { titel: "Konto angelegt", typ: "BEFEHL", pflicht: true, konfig: { shell: "powershell", befehl: 'New-ADUser -Name "{{mitarbeiter}}" -UserPrincipalName "{{upn}}" ' + '-SamAccountName "{{sam}}" -Path "{{ou}}" ' + '-AccountPassword (ConvertTo-SecureString "{{generiertes_passwort}}" -AsPlainText -Force) -Enabled $true', }, }, { titel: "Endgerät übergeben", typ: "AUSWAHL", konfig: { optionen: ["persönlich", "per Post", "über Kollegen"] }, }, ], }, ], }; const admin = await prisma.benutzer.findFirst({ where: { rolle: "ADMIN" }, orderBy: { erstelltAm: "asc" }, select: { id: true }, }); if (!admin) { throw new Error("Es gibt keinen Administrator. Erst pnpm db:seed laufen lassen."); } const vorhanden = await prisma.vorlage.findFirst({ where: { name: NAME }, select: { id: true } }); if (vorhanden) { console.log(`„${NAME}“ gibt es schon – nichts zu tun.`); } else { const { vorlage, version } = await vorlageAnlegen( { name: NAME, beschreibung: "Neuaufsetzen eines Arbeitsplatzrechners, von der Sicherung bis zur Übergabe.", kategorie: "Client", schlagworte: ["windows", "arbeitsplatz"], }, admin.id, ); await entwurfSpeichern(version.id, VEROEFFENTLICHT); await versionVeroeffentlichen(version.id, "Erste Fassung nach der Abstimmung im Team.", admin.id); const entwurf = await entwurfHolenOderErzeugen(vorlage.id, admin.id); await entwurfSpeichern(entwurf.id, ENTWURF); console.log(`„${NAME}“ angelegt: v1 veröffentlicht, v2 als Entwurf.`); } await prisma.$disconnect();