feat(catalog): Meldungen und Sichtbarkeitsschutz (KAT-05, 2c) #57

Merged
cschlaefke merged 6 commits from feature/2c-katalog-meldungen into main 2026-11-04 00:18:36 +00:00
Owner

Refs #2 (kein Closes: #2 schließt Chris nach Go-live-Check C1 und KAT-02 #4)

Gestapelt auf PR #56 (2b). Basis dieses PR ist der Branch feature/2b-katalog-zusammenfuehren, damit der Diff nur 2c zeigt. Reihenfolge: #56 zuerst mergen; den 2b-Branch nach dem Merge nicht löschen, bevor die Basis dieses PR auf main umgestellt ist (sonst schließt Forgejo ihn). 2c muss vor #13 gemergt sein (Spec E12).

Spec: docs/specs/2-katalog-daten.md § 3.4, § 4.4, § 8.3 (freigegeben).

Inhalt

  • Migration 20261103195151_game_reports.sql:
    • Trigger games_visibility_immutable (wirkt für alle Rollen inkl. postgres, Fehler P0001 visibility_immutable).
    • Tabelle game_reports (Status offen/freigegeben/abgelehnt/zusammengeführt, Zieleintrag, vorläufiger Eintrag); RLS: Nutzer lesen nur eigene, is_admin()-Leserecht (R4), keine Schreibrechte für anon/authenticated; eindeutiger Teilindex auf provisional_game_id.
    • admin_resolve_report(p_report, p_status, p_target): nur postgres/supabase_admin, security invoker; approved/merged hängen über repoint_game_references um und blenden den vorläufigen Eintrag aus, rejected speichert höchstens den Verweis; sperrt Meldung, Ziel und vorläufigen Eintrag in id-Reihenfolge.
    • admin_merge_games per create or replace erweitert (Schritt 4: game_reports.target_game_id umhängen, reports_repointed im JSON); Diff gegen 2b zeigt nur das. revoke execute … from public, anon, authenticated, service_role für alle drei Funktionen wiederholt.
  • pgTAP 08_game_reports.test.sql (157 Tests), Anpassungen in 07/00 (21 Tabellen), Runbook § 6 (12 Bausteine wörtlich im Test), docs/datenmodell-r1.md, supabase/README.md, Spec-Nachtrag § 10.

Review

code-reviewer (eigener Wegwerf-Container, alle 571 Tests grün): kein Blocker; CHANGES REQUESTED. Behoben in 119267b: admin_resolve_report prüft jetzt, dass der vorläufige Eintrag dem Meldenden gehört (Fehler report_provisional_not_private; nachgewiesen: sonst hätte eine Meldung auf fremdes privates Spiel dessen Daten umgehängt), Test gegen späteres Update-Recht auf provisional_game_id, weitere Testlücken, Runbook-Ergänzungen. 25+ Mutanten werden von 08 erkannt. Die Nacharbeit hat kein Reviewer erneut gelesen.

Bitte bestätigen (Abweichungen)

  • Zusatzfehler report_provisional_not_private; Zielprüfung report_target_not_listed auch bei rejected.
  • Ergebnis-JSON von admin_resolve_report (report_id, status, target_id, provisional_game_id, repointed + Zähler); reports_repointed steht immer im Ergebnis von admin_merge_games.
  • API-Änderung: Wer visibility ändert, bekommt P0001 (HTTP 400) statt 42501.

Offene Entscheidung vor dem Merge (Spec #13, Spec-F6)

Soll game_reports.editions_cleared (Zähler geleerter Editionen, gesetzt von admin_resolve_report) schon in 2c angelegt werden? Empfehlung in Spec #13: ja, solange 2b/2c nicht gemergt sind (sonst muss admin_resolve_report später erneut ersetzt werden). Ohne Entscheidung bleibt 2c wie gebaut; result_seen_at kommt in 13a.

Nicht geprüft

CI (nicht angesehen), echte Nebenläufigkeit (Deadlock zwischen adopt_report_target in #13 und admin_merge_games ist als Merkpunkt in Spec #13), Lauf als supabase_admin, Studio-SQL-Editor, Staging/Prod. Optionaler Check-Trigger für target_game_id nur als Merkpunkt, nicht gebaut. Lokal laut Entwickler 575 pgTAP-Tests; deno test nach dem letzten Commit nicht erneut gelaufen (Diff berührt supabase/catalog/ nicht).

🤖 Generated with Claude Code

Refs #2 (kein `Closes`: #2 schließt Chris nach Go-live-Check C1 und KAT-02 #4) **Gestapelt auf PR #56 (2b).** Basis dieses PR ist der Branch `feature/2b-katalog-zusammenfuehren`, damit der Diff nur 2c zeigt. Reihenfolge: #56 zuerst mergen; **den 2b-Branch nach dem Merge nicht löschen**, bevor die Basis dieses PR auf `main` umgestellt ist (sonst schließt Forgejo ihn). 2c muss vor #13 gemergt sein (Spec E12). Spec: `docs/specs/2-katalog-daten.md` § 3.4, § 4.4, § 8.3 (freigegeben). ## Inhalt - Migration `20261103195151_game_reports.sql`: - Trigger `games_visibility_immutable` (wirkt für alle Rollen inkl. `postgres`, Fehler `P0001 visibility_immutable`). - Tabelle `game_reports` (Status offen/freigegeben/abgelehnt/zusammengeführt, Zieleintrag, vorläufiger Eintrag); RLS: Nutzer lesen nur eigene, `is_admin()`-Leserecht (R4), keine Schreibrechte für `anon`/`authenticated`; eindeutiger Teilindex auf `provisional_game_id`. - `admin_resolve_report(p_report, p_status, p_target)`: nur `postgres`/`supabase_admin`, `security invoker`; `approved`/`merged` hängen über `repoint_game_references` um und blenden den vorläufigen Eintrag aus, `rejected` speichert höchstens den Verweis; sperrt Meldung, Ziel und vorläufigen Eintrag in `id`-Reihenfolge. - `admin_merge_games` per `create or replace` erweitert (Schritt 4: `game_reports.target_game_id` umhängen, `reports_repointed` im JSON); Diff gegen 2b zeigt nur das. `revoke execute … from public, anon, authenticated, service_role` für alle drei Funktionen wiederholt. - pgTAP `08_game_reports.test.sql` (157 Tests), Anpassungen in `07`/`00` (21 Tabellen), Runbook § 6 (12 Bausteine wörtlich im Test), `docs/datenmodell-r1.md`, `supabase/README.md`, Spec-Nachtrag § 10. ## Review `code-reviewer` (eigener Wegwerf-Container, alle 571 Tests grün): kein Blocker; CHANGES REQUESTED. Behoben in 119267b: `admin_resolve_report` prüft jetzt, dass der vorläufige Eintrag dem Meldenden gehört (Fehler `report_provisional_not_private`; nachgewiesen: sonst hätte eine Meldung auf fremdes privates Spiel dessen Daten umgehängt), Test gegen späteres Update-Recht auf `provisional_game_id`, weitere Testlücken, Runbook-Ergänzungen. 25+ Mutanten werden von `08` erkannt. Die Nacharbeit hat kein Reviewer erneut gelesen. ## Bitte bestätigen (Abweichungen) - Zusatzfehler `report_provisional_not_private`; Zielprüfung `report_target_not_listed` auch bei `rejected`. - Ergebnis-JSON von `admin_resolve_report` (`report_id`, `status`, `target_id`, `provisional_game_id`, `repointed` + Zähler); `reports_repointed` steht immer im Ergebnis von `admin_merge_games`. - API-Änderung: Wer `visibility` ändert, bekommt `P0001` (HTTP 400) statt `42501`. ## Offene Entscheidung vor dem Merge (Spec #13, Spec-F6) Soll `game_reports.editions_cleared` (Zähler geleerter Editionen, gesetzt von `admin_resolve_report`) schon in 2c angelegt werden? Empfehlung in Spec #13: ja, solange 2b/2c nicht gemergt sind (sonst muss `admin_resolve_report` später erneut ersetzt werden). Ohne Entscheidung bleibt 2c wie gebaut; `result_seen_at` kommt in 13a. ## Nicht geprüft CI (nicht angesehen), echte Nebenläufigkeit (Deadlock zwischen `adopt_report_target` in #13 und `admin_merge_games` ist als Merkpunkt in Spec #13), Lauf als `supabase_admin`, Studio-SQL-Editor, Staging/Prod. Optionaler Check-Trigger für `target_game_id` nur als Merkpunkt, nicht gebaut. Lokal laut Entwickler 575 pgTAP-Tests; `deno test` nach dem letzten Commit nicht erneut gelaufen (Diff berührt `supabase/catalog/` nicht). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 4 commits 2026-11-03 20:23:43 +00:00
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
fix(db): check owner of provisional game in admin_resolve_report, harden report tests (KAT-05 2c review) Refs #2
All checks were successful
CI / flutter (pull_request) Successful in 1m18s
CI / web-build (pull_request) Successful in 57s
CI / supabase (pull_request) Successful in 9s
CI / supabase-tests (pull_request) Successful in 33s
CI / e2e (pull_request) Successful in 2m52s
119267bb26
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Hinweis zum Merge: Vor dem Merge dieses PR ist die Entscheidung zu Spec #13 Spec-F6 nötig (Spalte game_reports.editions_cleared, gesetzt in admin_resolve_report aus variants_cleared). Empfehlung: ja, dann ergänzt backend-dev 2c noch um die Spalte; sonst bleibt 2c wie gebaut und 13a muss admin_resolve_report später per create or replace erneut ersetzen (Risiko, Schritt 4 von admin_merge_games zu verlieren). Details: Spec #13 § 9.2 (siehe Spec-PR zu #13).

Hinweis zum Merge: Vor dem Merge dieses PR ist die Entscheidung zu **Spec #13 Spec-F6** nötig (Spalte `game_reports.editions_cleared`, gesetzt in `admin_resolve_report` aus `variants_cleared`). Empfehlung: ja, dann ergänzt backend-dev 2c noch um die Spalte; sonst bleibt 2c wie gebaut und 13a muss `admin_resolve_report` später per `create or replace` erneut ersetzen (Risiko, Schritt 4 von `admin_merge_games` zu verlieren). Details: Spec #13 § 9.2 (siehe Spec-PR zu #13).
cschlaefke added the
status/ready-for-merge
label 2026-11-03 20:34:08 +00:00
cschlaefke added 1 commit 2026-11-03 23:15:49 +00:00
feat(db): store cleared editions count in game_reports.editions_cleared (KAT-05 2c, Spec-F6) Refs #2
All checks were successful
CI / flutter (pull_request) Successful in 1m16s
CI / web-build (pull_request) Successful in 57s
CI / supabase (pull_request) Successful in 8s
CI / supabase-tests (pull_request) Successful in 31s
CI / e2e (pull_request) Successful in 2m50s
de830a7148
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added 1 commit 2026-11-03 23:26:24 +00:00
Merge origin/feature/2b-katalog-zusammenfuehren into feature/2c-katalog-meldungen
All checks were successful
CI / flutter (pull_request) Successful in 1m22s
CI / web-build (pull_request) Successful in 58s
CI / supabase (pull_request) Successful in 8s
CI / supabase-tests (pull_request) Successful in 32s
CI / e2e (pull_request) Successful in 2m54s
9a63985d74
cschlaefke changed target branch from feature/2b-katalog-zusammenfuehren to main 2026-11-04 00:17:34 +00:00
Author
Owner

#56 (2b) ist gemergt (9a1d216); die Basis dieses PR ist auf main umgestellt. Der Hinweis „gestapelt“ im Text oben ist damit erledigt; der Diff zeigt nur 2c (8 Dateien). Die CI auf dem Branch (9a63985, grün) lief vor der Umstellung; Spec-F6 (editions_cleared) ist umgesetzt (de830a7).

#56 (2b) ist gemergt (9a1d216); die Basis dieses PR ist auf `main` umgestellt. Der Hinweis „gestapelt“ im Text oben ist damit erledigt; der Diff zeigt nur 2c (8 Dateien). Die CI auf dem Branch (9a63985, grün) lief vor der Umstellung; Spec-F6 (`editions_cleared`) ist umgesetzt (de830a7).
cschlaefke merged commit 76d54adbd1 into main 2026-11-04 00:18:36 +00:00
cschlaefke deleted branch feature/2c-katalog-meldungen 2026-11-04 00:18:36 +00:00
Sign in to join this conversation.
No description provided.