feat(260924-m4n): Bilderrahmen Stufe 2 - alte Bildspalte data entfernt, storagePath Pflicht

- Migration 20260924120000_dashboard_image_drop_data: Schutzpruefung
  (bricht ab, solange eine Zeile ohne storagePath existiert; row_security
  aus, damit ein Eigentuemer ohne BYPASSRLS nicht still 0 Zeilen sieht),
  dann NOT NULL, DROP COLUMN data, DROP POLICY system_read_policy
- Dienst: Bootstrap-Umzug samt forSystem() und Selbstheilung aus data
  entfernt; Upload vergibt die UUID selbst, Zeile gleich mit Pfad
- FORSYSTEM_ALLOWED_CALL_SITES, Tests, Zugriffsklassifikation (per
  Gate-Schleife gemessen: 61/213/6) nachgezogen
- Betriebshandbuch Kap. 4: Hinweis und Wiederherstellungsweg bei Abbruch
- Todo 2026-09-22 nach completed/

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-24 16:09:36 +02:00
parent b10734f382
commit dd54ec5d42
9 changed files with 230 additions and 288 deletions
@@ -80,3 +80,21 @@ nichts. Der Gewinn der Umstellung (kleiner `pg_dump`) ist bereits da, weil
neue Uploads keine Bytes mehr in die Zeile schreiben. Nur die Bytes der
ALTEN Bilder bleiben bis dahin doppelt vorhanden — einmal in der Datei,
einmal in der Spalte.
## Erledigt in quick-260924-m4n (24.09.2026)
- Migration heißt `20260924120000_dashboard_image_drop_data` (nicht
`20260922120100`: sie muss hinter allen vorhandenen Migrationen liegen).
Sie prüft zuerst, dass keine Zeile ohne `storagePath` existiert, und bricht
sonst mit Meldung ab, bevor sie etwas ändert; `row_security` ist für die
Prüfung aus, damit ein Eigentümer ohne BYPASSRLS nicht still 0 Zeilen sieht
(lokal nachgewiesen). Danach `storagePath` NOT NULL, `DROP COLUMN "data"`,
`DROP POLICY IF EXISTS system_read_policy ON "DashboardImage"`.
- Dienst: Bootstrap-Umzug, `forSystem()` und die Selbstheilung aus `data`
entfernt; der Upload vergibt die UUID selbst und legt die Zeile gleich mit
Pfad an. Erlaubnisliste, Tests (10b, 10c, 18, 21–23 entfallen) und
Zugriffsklassifikation nachgezogen (Zahlen mit der Gate-Schleife gemessen).
- Wiederherstellungsweg nach einem Abbruch (fehlgeschlagene Migration als
zurückgenommen vermerken, 1.3.1 laufen lassen, erneut einspielen) in
`docs/anleitung-betrieb.md` Kapitel 4, in einer Wegwerf-Datenbank
durchgespielt.