feat(catalog): Katalog-Fundament, Rechte und Startbestand-Werkzeug (KAT-05, 2a Backend) #53

Merged
cschlaefke merged 5 commits from feature/2a-katalog-datenmodell into main 2026-11-03 18:46:43 +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 (freigegeben). Teil 2a Backend; das GameCover-Widget ist separat in #52.

Inhalt

  • Migration 20261103142204_catalog_foundation.sql: catalog_sources, publishers, game_publishers, neue games-Spalten, Trigger (games_mark_manual_fields, game_links_mark_manual, games_merged_into_catalog), View catalog_games (security_invoker), RLS, Spaltenrechte, revoke execute auch für service_role.
  • pgTAP 06_catalog_foundation.test.sql (148 Tests) inkl. Runbook-Bausteine; 00_schema auf 20 Tabellen.
  • Startbestand-Werkzeug supabase/catalog/ (Deno, 32 Tests): Prüfregeln, UUID v5, idempotentes SQL, checks.sql, vocabulary.sql. startbestand.csv enthält nur die Kopfzeile, keine Spieldaten.
  • config.toml sql_paths; Genre/Mechanik-Inserts aus seed.sql entfernt.
  • Doku: docs/katalog-pflege.md, docs/datenmodell-r1.md, Spec-Nachtrag § 10.
  • CI: Deno (gepinnt 2.9.8, SHA256-geprüft), deno test, Prüfung generierter Dateien, „keys wächst nur“, Vokabular-Assert, checks.sql-Smoke.

Review

code-reviewer: keine Sicherheitsbefunde; zwei Scheintests, Runbook über Titel statt ID und fehlender Vokabular-Assert in CI wurden behoben (9952efa). Nacharbeit nicht erneut von einem Reviewer gelesen.

Bitte bestätigen (Spec-Abweichungen)

  1. Branchname feature/2a-katalog-datenmodell statt feature/2-katalog-fundament.
  2. games_visibility_immutable liegt wie in Spec § 3.4 in 2c.
  3. Schreibversuche auf die View scheitern mit 55000, nicht 42501 (Schutz = Grant-Prüfung).
  4. Link-Trigger prüft vorab per select, ob ein Katalogspiel vorliegt. Folge (R8): Der is_admin()-Zweig der game_*_write-Policies greift für Katalogspiele faktisch nicht mehr (relevant für QUE-08).
  5. created_at/updated_at sind für Clients nicht mehr schreibbar (42501). app/ ist nicht betroffen; Merkpunkt für #3/#13: kein ungefiltertes toJson() an insert/update.
  6. Zusätze: Wächter-Block in startbestand.sql, testdata/, tests/support/*.inc, checks.sql-Schritt in CI.
  7. SB1 zeigt lokal „Verstoß“ (0 von 180), nur Information.

Freigabe C0 (Chris): Vokabular

Vor Staging/Prod nötig. Quelle: supabase/catalog/vocabulary.csv. Einige name_de sind Lehnwörter („Engine Building“, „Drafting“).

Genres (14): strategy Strategiespiel · family Familienspiel · party Partyspiel · cooperative Kooperatives Spiel · card-game Kartenspiel · abstract Abstraktes Spiel · thematic Thematisches Spiel · economic Wirtschaftsspiel · wargame Kriegsspiel · kids Kinderspiel · word Wortspiel · deduction Deduktionsspiel · dexterity Geschicklichkeitsspiel · trivia Quizspiel

Mechaniken (30): worker-placement Arbeitereinsatz · deck-building Deckbau · hand-management Handkartenmanagement · dice-rolling Würfeln · tile-placement Plättchenlegen · set-collection Sets sammeln · drafting Drafting · area-control Gebietsmehrheit · auction Bieten und Versteigern · trading Handel · negotiation Verhandlung · route-building Streckenbau · engine-building Engine Building · pick-up-and-deliver Abholen und Liefern · trick-taking Stichspiel · push-your-luck Glück herausfordern · bluffing Bluffen · hidden-roles Verdeckte Rollen · variable-powers Variable Spielerfähigkeiten · grid-movement Bewegung auf Raster · pattern-building Muster bauen · real-time Echtzeit · memory Gedächtnis · roll-and-write Würfeln und Notieren · campaign Kampagne · action-points Aktionspunkte · resource-management Ressourcenmanagement · storytelling Erzählen · take-that Gegenseitig ärgern · player-elimination Spieler scheiden aus

(englische Namen siehe CSV)

Nicht getestet / offen

  • CI-Lauf auf dem Forgejo-Runner (Deno-Download von github.com, SHA-Prüfung, neue Schritte) – noch nicht gelaufen.
  • Ob supabase start die sql_paths-Seeds lädt (Runbook 2.7: „nicht geprüft“); Wächter-Block nur manuell geprüft.
  • Frisches supabase db reset durch den Reviewer; Nit-Test für anon/authenticated auf catalog_games.
  • D1 (Infrastruktur, Studio-Rolle, Release-Checkliste mit checks.sql) nicht Teil dieses PR.
  • Lokal: 311 pgTAP-Tests und 32 Deno-Tests grün (Angabe backend-dev, Reviewer hat die Vorstufe selbst ausgeführt).

🤖 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` (freigegeben). Teil 2a Backend; das GameCover-Widget ist separat in #52. ## Inhalt - Migration `20261103142204_catalog_foundation.sql`: `catalog_sources`, `publishers`, `game_publishers`, neue `games`-Spalten, Trigger (`games_mark_manual_fields`, `game_links_mark_manual`, `games_merged_into_catalog`), View `catalog_games` (`security_invoker`), RLS, Spaltenrechte, `revoke execute` auch für `service_role`. - pgTAP `06_catalog_foundation.test.sql` (148 Tests) inkl. Runbook-Bausteine; `00_schema` auf 20 Tabellen. - Startbestand-Werkzeug `supabase/catalog/` (Deno, 32 Tests): Prüfregeln, UUID v5, idempotentes SQL, `checks.sql`, `vocabulary.sql`. `startbestand.csv` enthält nur die Kopfzeile, **keine Spieldaten**. - `config.toml` `sql_paths`; Genre/Mechanik-Inserts aus `seed.sql` entfernt. - Doku: `docs/katalog-pflege.md`, `docs/datenmodell-r1.md`, Spec-Nachtrag § 10. - CI: Deno (gepinnt 2.9.8, SHA256-geprüft), `deno test`, Prüfung generierter Dateien, „keys wächst nur“, Vokabular-Assert, `checks.sql`-Smoke. ## Review `code-reviewer`: keine Sicherheitsbefunde; zwei Scheintests, Runbook über Titel statt ID und fehlender Vokabular-Assert in CI wurden behoben (9952efa). Nacharbeit nicht erneut von einem Reviewer gelesen. ## Bitte bestätigen (Spec-Abweichungen) 1. Branchname `feature/2a-katalog-datenmodell` statt `feature/2-katalog-fundament`. 2. `games_visibility_immutable` liegt wie in Spec § 3.4 in 2c. 3. Schreibversuche auf die View scheitern mit 55000, nicht 42501 (Schutz = Grant-Prüfung). 4. Link-Trigger prüft vorab per `select`, ob ein Katalogspiel vorliegt. Folge (R8): Der `is_admin()`-Zweig der `game_*_write`-Policies greift für Katalogspiele faktisch nicht mehr (relevant für QUE-08). 5. `created_at`/`updated_at` sind für Clients nicht mehr schreibbar (42501). `app/` ist nicht betroffen; Merkpunkt für #3/#13: kein ungefiltertes `toJson()` an insert/update. 6. Zusätze: Wächter-Block in `startbestand.sql`, `testdata/`, `tests/support/*.inc`, `checks.sql`-Schritt in CI. 7. SB1 zeigt lokal „Verstoß“ (0 von 180), nur Information. ## Freigabe C0 (Chris): Vokabular Vor Staging/Prod nötig. Quelle: `supabase/catalog/vocabulary.csv`. Einige `name_de` sind Lehnwörter („Engine Building“, „Drafting“). **Genres (14):** strategy Strategiespiel · family Familienspiel · party Partyspiel · cooperative Kooperatives Spiel · card-game Kartenspiel · abstract Abstraktes Spiel · thematic Thematisches Spiel · economic Wirtschaftsspiel · wargame Kriegsspiel · kids Kinderspiel · word Wortspiel · deduction Deduktionsspiel · dexterity Geschicklichkeitsspiel · trivia Quizspiel **Mechaniken (30):** worker-placement Arbeitereinsatz · deck-building Deckbau · hand-management Handkartenmanagement · dice-rolling Würfeln · tile-placement Plättchenlegen · set-collection Sets sammeln · drafting Drafting · area-control Gebietsmehrheit · auction Bieten und Versteigern · trading Handel · negotiation Verhandlung · route-building Streckenbau · engine-building Engine Building · pick-up-and-deliver Abholen und Liefern · trick-taking Stichspiel · push-your-luck Glück herausfordern · bluffing Bluffen · hidden-roles Verdeckte Rollen · variable-powers Variable Spielerfähigkeiten · grid-movement Bewegung auf Raster · pattern-building Muster bauen · real-time Echtzeit · memory Gedächtnis · roll-and-write Würfeln und Notieren · campaign Kampagne · action-points Aktionspunkte · resource-management Ressourcenmanagement · storytelling Erzählen · take-that Gegenseitig ärgern · player-elimination Spieler scheiden aus (englische Namen siehe CSV) ## Nicht getestet / offen - CI-Lauf auf dem Forgejo-Runner (Deno-Download von github.com, SHA-Prüfung, neue Schritte) – noch nicht gelaufen. - Ob `supabase start` die `sql_paths`-Seeds lädt (Runbook 2.7: „nicht geprüft“); Wächter-Block nur manuell geprüft. - Frisches `supabase db reset` durch den Reviewer; Nit-Test für anon/authenticated auf `catalog_games`. - D1 (Infrastruktur, Studio-Rolle, Release-Checkliste mit `checks.sql`) nicht Teil dieses PR. - Lokal: 311 pgTAP-Tests und 32 Deno-Tests grün (Angabe backend-dev, Reviewer hat die Vorstufe selbst ausgeführt). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 5 commits 2026-11-03 17:19:24 +00:00
Sources, publishers, hidden/merged columns, manual_fields triggers, catalog_games view and column grants on games (KAT-05, PR 2a). Fixtures for the tests are generated from supabase/catalog/testdata.

Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Deno script validates vocabulary.csv and startbestand.csv and generates the idempotent SQL, key list and checks.sql. startbestand.csv stays header-only; vocabulary.csv is a proposal pending approval (C0). seed.sql no longer inserts genres and mechanics.

Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Includes the checked CLI assumptions (sql_paths, begin/commit) and implementation notes in the spec.

Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Adds the checks.sql smoke step, the verified CLI result for generated seed content and the created_at/updated_at note for the API.

Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
test(catalog): address review findings on PR 2a
All checks were successful
CI / flutter (pull_request) Successful in 1m28s
CI / web-build (pull_request) Successful in 59s
CI / supabase (pull_request) Successful in 9s
CI / supabase-tests (pull_request) Successful in 34s
CI / e2e (pull_request) Successful in 3m2s
9952efa2fe
Replace tests that could not fail (manual_fields stability, no-op update), select runbook games by id, add grant matrix and forged-admin tests, assert vocabulary seeding and Deno checksum in CI, clarify the set local convention and API notes.

Refs #2

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke merged commit 4536e4d027 into main 2026-11-03 18:46:43 +00:00
cschlaefke deleted branch feature/2a-katalog-datenmodell 2026-11-03 18:46:43 +00:00
Sign in to join this conversation.
No description provided.