feat(catalog): Spiele zusammenführen per Admin-Funktion (KAT-05, 2b) #56

Merged
cschlaefke merged 4 commits from feature/2b-katalog-zusammenfuehren into main 2026-11-04 00:17:33 +00:00
Owner

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

Spec: docs/specs/2-katalog-daten.md § 3.3, § 4.4 (freigegeben). Teil 2b (R1.2 „Zusammenführen“) nach 2a (#52, #53, gemergt). Danach folgt 2c (Meldungen), das auf diesem Branch aufbaut.

Inhalt

  • Migration 20261103193928_catalog_merge.sql (nur additiv, keine neue Tabelle): repoint_game_references(p_from, p_to) (intern) und admin_merge_games(p_source, p_target); Ausführung nur postgres/supabase_admin (revoke … from public, anon, authenticated, service_role), security invoker, leerer search_path.
    • Umhängen von Sammlung, Favoriten, Partien (Edition) und Wertungsbögen; Kollisionsregel Spec-F1 (Ziel bleibt, Quelle füllt leere Felder, Listenrang owned > wishlist > shopping).
    • Variantenfall: Katalog→Katalog kopiert, privat→Katalog kopiert nicht (Edition auf gleichnamige Zielvariante, sonst null; feste Auswahlregel: älteste, dann kleinste id).
    • bgg_id/source_* werden aufs Ziel übertragen, Konflikte mit alten Werten im Ergebnis-JSON; Quelle wird ausgeblendet und verwiesen, nie gelöscht; Ketten werden geglättet.
  • pgTAP 07_catalog_merge.test.sql (107 Tests), Runbook docs/katalog-pflege.md § 5 (Bausteine per id, wörtlich im Test), docs/datenmodell-r1.md, supabase/README.md, Spec-Nachtrag § 10.

Review

code-reviewer: kein Fehler im Code, kein Fall von stillem Datenverlust; CHANGES REQUESTED wegen Testlücken (überlebende Mutanten für Spec-F1-Edition und variants_cleared, Wächter auf game_variants) – eingearbeitet in 127f765. Mutationsprüfung der neuen Tests laut Entwickler: alle neuen Tests werden rot; ein Mutant (Null-Check) ist äquivalent. Die Nacharbeit hat kein Reviewer erneut gelesen.

Bitte bestätigen (Abweichungen)

  • Branchname feature/2b-katalog-zusammenfuehren; Zeitstempel 20261103193928.
  • Schlüssel des Ergebnis-JSON festgelegt (u. a. favorite_games, favorite_conflicts, score_sheets, chain_flattened, source_conflict.source_synced_at).
  • variants_cleared zählt Verweise (Sammlungseinträge + Partien), nicht Varianten; für #13 (N15) nützlicher.
  • Variantenzuordnung als jsonb in der Funktion statt temporärer Tabelle; Kollisionsregel füllt nur note, acquired_on, variant_id.

Offene Entscheidung (Issue #2, Kommentar #834, Label needs-clarification)

Zusammengeführte Spiele bleiben per ID referenzierbar: ein veralteter Client oder eine offline erfasste Partie kann sich nach dem Merge noch an die Quelle hängen, ein Nachziehen scheitert mit merge_source_already_merged. Empfehlung: erneuten Aufruf mit demselben Ziel erlauben. Bis zur Entscheidung gilt die Spec-Fassung; die Lücke steht im Runbook als Einschränkung.

Nicht geprüft

  • CI-Lauf (noch nicht angesehen), echte Nebenläufigkeit mit zwei Sitzungen (nur Analyse/EXPLAIN), Lauf als supabase_admin, Verhalten im Studio-SQL-Editor, Staging/Prod, Performance bei sehr vielen Verweisen.
  • Lokal laut Entwickler: 418 pgTAP-Tests (Reviewer hatte die Vorstufe mit 400 selbst ausgeführt), 32 Deno-Tests.

🤖 Generated with Claude Code

Refs #2 (kein `Closes`: #2 schließt Chris nach Go-live-Check C1 und KAT-02 #4) Spec: `docs/specs/2-katalog-daten.md` § 3.3, § 4.4 (freigegeben). Teil 2b (R1.2 „Zusammenführen“) nach 2a (#52, #53, gemergt). Danach folgt 2c (Meldungen), das auf diesem Branch aufbaut. ## Inhalt - Migration `20261103193928_catalog_merge.sql` (nur additiv, keine neue Tabelle): `repoint_game_references(p_from, p_to)` (intern) und `admin_merge_games(p_source, p_target)`; Ausführung nur `postgres`/`supabase_admin` (`revoke … from public, anon, authenticated, service_role`), `security invoker`, leerer `search_path`. - Umhängen von Sammlung, Favoriten, Partien (Edition) und Wertungsbögen; Kollisionsregel Spec-F1 (Ziel bleibt, Quelle füllt leere Felder, Listenrang `owned` > `wishlist` > `shopping`). - Variantenfall: Katalog→Katalog kopiert, privat→Katalog kopiert nicht (Edition auf gleichnamige Zielvariante, sonst `null`; feste Auswahlregel: älteste, dann kleinste `id`). - `bgg_id`/`source_*` werden aufs Ziel übertragen, Konflikte mit alten Werten im Ergebnis-JSON; Quelle wird ausgeblendet und verwiesen, nie gelöscht; Ketten werden geglättet. - pgTAP `07_catalog_merge.test.sql` (107 Tests), Runbook `docs/katalog-pflege.md` § 5 (Bausteine per `id`, wörtlich im Test), `docs/datenmodell-r1.md`, `supabase/README.md`, Spec-Nachtrag § 10. ## Review `code-reviewer`: kein Fehler im Code, kein Fall von stillem Datenverlust; CHANGES REQUESTED wegen Testlücken (überlebende Mutanten für Spec-F1-Edition und `variants_cleared`, Wächter auf `game_variants`) – eingearbeitet in 127f765. Mutationsprüfung der neuen Tests laut Entwickler: alle neuen Tests werden rot; ein Mutant (Null-Check) ist äquivalent. Die Nacharbeit hat kein Reviewer erneut gelesen. ## Bitte bestätigen (Abweichungen) - Branchname `feature/2b-katalog-zusammenfuehren`; Zeitstempel 20261103193928. - Schlüssel des Ergebnis-JSON festgelegt (u. a. `favorite_games`, `favorite_conflicts`, `score_sheets`, `chain_flattened`, `source_conflict.source_synced_at`). - `variants_cleared` zählt Verweise (Sammlungseinträge + Partien), nicht Varianten; für #13 (N15) nützlicher. - Variantenzuordnung als jsonb in der Funktion statt temporärer Tabelle; Kollisionsregel füllt nur `note`, `acquired_on`, `variant_id`. ## Offene Entscheidung (Issue #2, Kommentar #834, Label `needs-clarification`) Zusammengeführte Spiele bleiben per ID referenzierbar: ein veralteter Client oder eine offline erfasste Partie kann sich nach dem Merge noch an die Quelle hängen, ein Nachziehen scheitert mit `merge_source_already_merged`. Empfehlung: erneuten Aufruf mit demselben Ziel erlauben. Bis zur Entscheidung gilt die Spec-Fassung; die Lücke steht im Runbook als Einschränkung. ## Nicht geprüft - CI-Lauf (noch nicht angesehen), echte Nebenläufigkeit mit zwei Sitzungen (nur Analyse/`EXPLAIN`), Lauf als `supabase_admin`, Verhalten im Studio-SQL-Editor, Staging/Prod, Performance bei sehr vielen Verweisen. - Lokal laut Entwickler: 418 pgTAP-Tests (Reviewer hatte die Vorstufe mit 400 selbst ausgeführt), 32 Deno-Tests. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 3 commits 2026-11-03 20:04:43 +00:00
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
test(db): close surviving mutants in merge tests, extend runbook (KAT-05, 2b)
All checks were successful
CI / flutter (pull_request) Successful in 1m20s
CI / web-build (pull_request) Successful in 1m2s
CI / supabase (pull_request) Successful in 8s
CI / supabase-tests (pull_request) Successful in 31s
CI / e2e (pull_request) Successful in 3m1s
127f765d85
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke added the
status/ready-for-merge
label 2026-11-03 20:34:08 +00:00
cschlaefke added 1 commit 2026-11-03 23:24:52 +00:00
docs(db): late references to merged source as known limitation, with test (KAT-05, 2b)
All checks were successful
CI / flutter (pull_request) Successful in 1m34s
CI / web-build (pull_request) Successful in 58s
CI / supabase (pull_request) Successful in 9s
CI / supabase-tests (pull_request) Successful in 36s
CI / e2e (pull_request) Successful in 2m55s
500763d5ca
Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke merged commit 9a1d216f40 into main 2026-11-04 00:17:33 +00:00
cschlaefke deleted branch feature/2b-katalog-zusammenfuehren 2026-11-04 00:17:34 +00:00
Sign in to join this conversation.
No description provided.