← Code-Übersicht

0008_system_seed.sql

Pfad: migrations/0008_system_seed.sql

Ext: sql

Größe: 18107 Bytes

Geändert: 2026-07-16 16:59:35+02

-- Migration 0008: Vollständiger System-Seed. Ersetzt 0006.
-- Alle 16 realen Prozesse (8 HTTP + 8 DB-Automatik) mit real existierenden
-- Artefakten (Routen, Dateien, Tabellen, DB-Funktionen) + Systemdokumentation.
-- Eine Transaktion (deferred I1/I2 am Commit). Bezeichner/Slugs sind Identifier.
DO $$
DECLARE
    base text := '';
    a_bes bigint; a_app bigint; a_db bigint; sy_web bigint; sy_pg bigint;
    adb bigint; tdok bigint; tpro bigint; tps bigint; tart bigint; thist bigint;
    r0 bigint; rh bigint; rdl bigint; rdd bigint; rds bigint; rpl bigint; rpd bigint; rab bigint;
    fwh bigint; fto bigint; foc bigint; fsvc bigint; fah bigint; fka bigint; fpsa bigint; fpaa bigint;
    idx bigint; rtr bigint; home bigint; health bigint; hpr bigint; dla bigint; drepo bigint;
    dda bigint; m2h bigint; dsa bigint; h2m bigint; pla bigint; prepo bigint; pda bigint;
    flay bigint; svg bigint; aba bigint; pkat bigint; sreal bigint;
    p bigint; x1 bigint; x2 bigint; x3 bigint;
BEGIN
    IF EXISTS (SELECT 1 FROM prozesse) OR EXISTS (SELECT 1 FROM dokumentation) THEN
        RAISE EXCEPTION '0008 ist ein Initialseed und darf nur auf leeren Fachtabellen laufen';
    END IF;

    INSERT INTO akteur(name) VALUES('Besucher') RETURNING id INTO a_bes;
    INSERT INTO akteur(name) VALUES('Anwendung') RETURNING id INTO a_app;
    INSERT INTO akteur(name) VALUES('Datenbank') RETURNING id INTO a_db;
    INSERT INTO system(name) VALUES('demo.karlkratz.com') RETURNING id INTO sy_web;
    INSERT INTO system(name) VALUES('PostgreSQL') RETURNING id INTO sy_pg;

    INSERT INTO artefakt(typ,bezeichner) VALUES('datenbank','demo_karlkratz_com') RETURNING id INTO adb;
    INSERT INTO artefakt(typ,bezeichner,parent_id) VALUES('tabelle','public.dokumentation',adb) RETURNING id INTO tdok;
    INSERT INTO artefakt(typ,bezeichner,parent_id) VALUES('tabelle','public.prozesse',adb) RETURNING id INTO tpro;
    INSERT INTO artefakt(typ,bezeichner,parent_id) VALUES('tabelle','public.prozess_schritt',adb) RETURNING id INTO tps;
    INSERT INTO artefakt(typ,bezeichner,parent_id) VALUES('tabelle','public.artefakt',adb) RETURNING id INTO tart;
    INSERT INTO artefakt(typ,bezeichner,parent_id) VALUES('tabelle','public.history_dokumentation',adb) RETURNING id INTO thist;

    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /') RETURNING id INTO r0;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /health') RETURNING id INTO rh;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /doku') RETURNING id INTO rdl;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /doku/{slug}') RETURNING id INTO rdd;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','POST /doku/{slug}') RETURNING id INTO rds;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /prozesse') RETURNING id INTO rpl;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /prozesse/{slug}') RETURNING id INTO rpd;
    INSERT INTO artefakt(typ,bezeichner) VALUES('schnittstelle','GET /abgleich') RETURNING id INTO rab;

    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','audit.fn_write_history') RETURNING id INTO fwh;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','audit.fn_touch_updated_at') RETURNING id INTO fto;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','audit.fn_on_create_table') RETURNING id INTO foc;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','public.fn_schritt_vorgaenger_check') RETURNING id INTO fsvc;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','public.fn_artefakt_hierarchie') RETURNING id INTO fah;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','public.fn_komposition_azyklik') RETURNING id INTO fka;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','public.fn_pruef_schritt_abdeckung') RETURNING id INTO fpsa;
    INSERT INTO artefakt(typ,bezeichner) VALUES('db_funktion','public.fn_pruef_artefakt_abdeckung') RETURNING id INTO fpaa;

    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'public/index.php') RETURNING id INTO idx;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/Router.php') RETURNING id INTO rtr;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/HomeAction.php') RETURNING id INTO home;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/HealthAction.php') RETURNING id INTO health;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Persistence/PostgresHealthProbe.php') RETURNING id INTO hpr;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/DokuListeAction.php') RETURNING id INTO dla;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Persistence/PostgresDokumentationRepository.php') RETURNING id INTO drepo;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/DokuDetailAction.php') RETURNING id INTO dda;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Content/MarkdownToHtml.php') RETURNING id INTO m2h;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/DokuSpeichernAction.php') RETURNING id INTO dsa;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Content/HtmlToMarkdown.php') RETURNING id INTO h2m;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/ProzessListeAction.php') RETURNING id INTO pla;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Persistence/PostgresProzessRepository.php') RETURNING id INTO prepo;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/ProzessDetailAction.php') RETURNING id INTO pda;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Flow/FlussLayout.php') RETURNING id INTO flay;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Flow/SvgFluss.php') RETURNING id INTO svg;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Http/AbgleichAction.php') RETURNING id INTO aba;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Persistence/PostgresArtefaktKatalog.php') RETURNING id INTO pkat;
    INSERT INTO artefakt(typ,bezeichner) VALUES('datei',base||'src/Infrastructure/Reconcile/SystemRealitaet.php') RETURNING id INTO sreal;

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('startseite','Startseite (GET /)',E'Bereichs-Übersicht rendern.',ARRAY['http']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET / empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,r0,'eingabe'),(x1,idx,'beruehrt'),(x1,rtr,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Startseite-Action rendern',a_app,sy_web) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,home,'ausgabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('health','Health-Check (GET /health)',E'DB-Erreichbarkeit prüfen.',ARRAY['http']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /health empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rh,'eingabe'),(x1,health,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Datenbank prüfen',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,hpr,'beruehrt'),(x2,adb,'eingabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('doku-lesen','Dokumentation: Übersicht (GET /doku)',E'Liste aller Dokumentationen.',ARRAY['http','doku']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /doku empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rdl,'eingabe'),(x1,dla,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Dokumentationen laden',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,drepo,'beruehrt'),(x2,tdok,'eingabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('doku-anzeigen','Dokumentation anzeigen (GET /doku/{slug})',E'Markdown als HTML anzeigen.',ARRAY['http','doku']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /doku/{slug} empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rdd,'eingabe'),(x1,dda,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Laden und Markdown rendern',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,drepo,'beruehrt'),(x2,m2h,'beruehrt'),(x2,tdok,'eingabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('doku-speichern','Dokumentation speichern (POST /doku/{slug})',E'HTML sanitisieren, als Markdown speichern.',ARRAY['http','doku']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'POST /doku/{slug} empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rds,'eingabe'),(x1,dsa,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'HTML zu Markdown wandeln',a_app,sy_web) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,h2m,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Persistieren',a_app,sy_pg) RETURNING id INTO x3;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x3,drepo,'beruehrt'),(x3,tdok,'ausgabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1),(x3,x2);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('prozesse-lesen','Prozesse: Übersicht (GET /prozesse)',E'Liste aller Prozesse.',ARRAY['http']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /prozesse empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rpl,'eingabe'),(x1,pla,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Prozesse laden',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,prepo,'beruehrt'),(x2,tpro,'eingabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('prozess-detail','Prozess-Detail mit Fluss (GET /prozesse/{slug})',E'Schritte laden und als SVG-Fluss rendern.',ARRAY['http']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /prozesse/{slug} empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rpd,'eingabe'),(x1,pda,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Aggregat laden',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,prepo,'beruehrt'),(x2,tps,'eingabe');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Fluss berechnen und rendern',a_app,sy_web) RETURNING id INTO x3;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x3,flay,'beruehrt'),(x3,svg,'ausgabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1),(x3,x2);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('abgleich','Katalog-Abgleich (GET /abgleich)',E'Artefakt-Katalog gegen die Realität prüfen.',ARRAY['http','governance']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'GET /abgleich empfangen',a_bes,sy_web) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,rab,'eingabe'),(x1,aba,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Katalog lesen',a_app,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,pkat,'beruehrt'),(x2,tart,'eingabe');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Realität prüfen',a_app,sy_pg) RETURNING id INTO x3;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x3,sreal,'beruehrt');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1),(x3,x2);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('versionierung','Versionierung (Trigger)',E'Alten Zeilenzustand als JSONB sichern.',ARRAY['db','automatik']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'AFTER UPDATE/DELETE feuert',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fwh,'beruehrt');
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'OLD in history schreiben',a_db,sy_pg) RETURNING id INTO x2;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x2,thist,'ausgabe');
    INSERT INTO schritt_vorgaenger(schritt_id,vorgaenger_id) VALUES(x2,x1);

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('updated-at','updated_at pflegen (Trigger)',E'Änderungszeit setzen.',ARRAY['db','automatik']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'BEFORE UPDATE setzt updated_at',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fto,'beruehrt');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('auto-historisierung','Auto-Historisierung (Event-Trigger)',E'Neue Tabellen automatisch versionieren.',ARRAY['db','automatik']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'CREATE TABLE provisioniert history_',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,foc,'beruehrt');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('integritaet-ablauf','Integrität: Ablauf azyklisch (I3)',E'Zyklen und Fremd-Prozess verhindern.',ARRAY['db','integrität']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Kante prüfen',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fsvc,'beruehrt'),(x1,tps,'eingabe');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('integritaet-hierarchie','Integrität: Artefakt-Hierarchie (I4)',E'Eltern-Typ erzwingen.',ARRAY['db','integrität']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Hierarchie prüfen',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fah,'beruehrt'),(x1,tart,'eingabe');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('integritaet-komposition','Integrität: Komposition azyklisch (I5)',E'Zyklische Teilprozess-Aufrufe verhindern.',ARRAY['db','integrität']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Komposition prüfen',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fka,'beruehrt');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('abdeckung-schritt','Abdeckung: Schritt hat Artefakt (I1)',E'Deferred Pflichtabdeckung je Schritt.',ARRAY['db','integrität']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Schritt-Abdeckung prüfen',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fpsa,'beruehrt');

    INSERT INTO prozesse(slug,titel,beschreibung,tags) VALUES('abdeckung-artefakt','Abdeckung: Artefakt hat Schritt (I2)',E'Deferred Pflichtabdeckung je Artefakt.',ARRAY['db','integrität']) RETURNING id INTO p;
    INSERT INTO prozess_schritt(prozess_id,name,akteur_id,system_id) VALUES(p,'Artefakt-Abdeckung prüfen',a_db,sy_pg) RETURNING id INTO x1;
    INSERT INTO schritt_artefakt(schritt_id,artefakt_id,beziehung) VALUES(x1,fpaa,'beruehrt');

    INSERT INTO dokumentation(slug,titel,body,tags) VALUES
        ('system-ueberblick','System-Überblick',E'# demo.karlkratz.com\n\nHexagonale Vanilla-PHP-App. Bereiche: Dokumentation, Prozesse, Abgleich. 16 reale Prozesse (8 HTTP, 8 DB-Automatik) sind unter /prozesse abgebildet und via /abgleich gegen die Realität belegt.',ARRAY['system']);
    INSERT INTO dokumentation(slug,titel,body,tags)
        SELECT 'ueber-'||slug, 'Doku: '||titel, E'Verknüpfte Beschreibung zu diesem Prozess. Siehe /prozesse/'||slug||'.', ARRAY['prozess-doku']
        FROM prozesse;
    INSERT INTO doku_prozess(doku_id, prozess_id)
        SELECT d.id, pr.id FROM dokumentation d JOIN prozesse pr ON d.slug = 'ueber-'||pr.slug;
END $$;

Frühere Versionen

Version Zeitpunkt Operation
13 2026-07-16 19:01:40.808857+02 UPDATE