Shuffle/supabase
cschlaefke 683b5c830e perf(db): set-based rank 4 and filters in search_catalog_games, harden tests (KAT-01, 3a)
Rank 4 and the genre/mechanic filters ran a correlated subplan per game
(13 s at 10 000 games). Now: one set-based word coverage, filters as one hashed
IN set, 'like all' patterns, similarity only for hits. Adds pgTAP cases found
by mutation testing (paging by relevance, alt title choice, duplicate words,
mechanic duplicates) and a Deno case for mark characters.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 01:40:43 +01:00
..
catalog perf(db): set-based rank 4 and filters in search_catalog_games, harden tests (KAT-01, 3a) 2026-11-04 01:40:43 +01:00
migrations perf(db): set-based rank 4 and filters in search_catalog_games, harden tests (KAT-01, 3a) 2026-11-04 01:40:43 +01:00
templates fix(db): trim all Unicode whitespace in display name, harden templates 2026-11-02 23:48:01 +01:00
tests perf(db): set-based rank 4 and filters in search_catalog_games, harden tests (KAT-01, 3a) 2026-11-04 01:40:43 +01:00
.gitignore chore(supabase): add config.toml and ignore app env files 2026-11-02 20:12:09 +01:00
config.toml feat(catalog): add starting-stock tool, vocabulary proposal and CI checks 2026-11-03 15:38:28 +01:00
README.md feat(db): reports tests, runbook section 6 and docs for KAT-05 2c Refs #2 2026-11-03 21:07:19 +01:00
seed.sql feat(catalog): add starting-stock tool, vocabulary proposal and CI checks 2026-11-03 15:38:28 +01:00

Supabase – Datenbank für Shuffle

Inhalt

Pfad Zweck
migrations/ Schema, Trigger und RLS-Policies für R1 (21 Tabellen, 3 Views). Nur additiv ändern, nie bestehende Dateien editieren.
tests/database/ pgTAP-Tests: Struktur-Regeln und Zugriffsrechte je Bereich.
templates/ Auth-Mailvorlagen (HTML, Go-Template) für Bestätigung und Passwort-Reset.
seed.sql Beispieldaten nur für die lokale Entwicklung.
catalog/ Katalog-Vokabular und Startbestand (CSV, Werkzeug build_startbestand.ts, erzeugte SQL-Dateien), siehe unten.

Lokal starten und testen

supabase start          # lokales Backend
supabase db reset       # Migrationen + Seed einspielen
supabase test db        # alle pgTAP-Tests ausführen

Registrierung (KTO-01)

  • Der Trigger handle_new_user erzwingt Altersbestätigung, Zustimmung, terms_version und Anzeigename (1–30 Zeichen). Fehlertexte: siehe docs/datenmodell-r1.md. Clients senden diese Werte als user_metadata bei signUp.
  • pgTAP-Fixtures, die auth.users direkt füllen, brauchen daher age_confirmed, terms_accepted, terms_version und display_name in raw_user_meta_data.
  • Ergebnisse der GoTrue-Prüfung: docs/specs/1-auth-spike-ergebnisse.md.
  • Auth-Einstellungen (AUTH-CFG-nn in config.toml), Env-Block für Staging/Produktion, Release-Checkliste und bekannte Grenzen: docs/auth-konfiguration.md.
  • Mailvorlagen (Bestätigung, Passwort-Reset; de/en nach user_metadata.locale): templates/. Lokal landen Mails in Mailpit (http://127.0.0.1:54324).

E2E-Tests (Playwright)

  • e2e/ testet GoTrue über Kong (api), die gebaute Web-App (web), die IP-Drosselung (throttle) und den SMTP-Ausfall (spike). Voraussetzung: supabase start mit Mailpit und Postgres (Ports 54321, 54322, 54324).
  • e2e/support/db.ts verbindet sich direkt mit dem lokalen Postgres (Rolle postgres) und setzt recovery_sent_at/confirmation_sent_at für die Ablauftests; es bricht bei nicht-lokalem Host ab.
  • Der Extra-Container für throttle/spike startet mit e2e/support/start-throttle-gotrue.sh. Details: e2e/README.md.
  • CI: Job e2e in .forgejo/workflows/ci.yml (Runner docker-host, dind); Ablauf in docs/auth-konfiguration.md Abschnitt 7.

Katalog (KAT-05)

  • Pflege in R1 nur über Studio bzw. psql (Rolle postgres), Ablauf und Regeln: docs/katalog-pflege.md. Spec: docs/specs/2-katalog-daten.md.
  • Suche und Entdecken lesen nur die View catalog_games (ohne ausgeblendete und zusammengeführte Spiele). Geänderte Fakten trägt ein Trigger in games.manual_fields ein.
  • Zusammenführen von Duplikaten nur über die Funktion public.admin_merge_games(quelle, ziel) (nur Datenbankrolle postgres/supabase_admin, nicht über die API aufrufbar); Ablauf in docs/katalog-pflege.md, Abschnitt 5. Jede neue Tabelle mit Verweis auf games muss dort behandelt werden (Wächter in tests/database/07_catalog_merge.test.sql und 08_game_reports.test.sql).
  • Meldungen fehlender Spiele (game_reports) bearbeitet der Admin nur über public.admin_resolve_report(meldung, status, ziel) (nur Datenbankrolle postgres/supabase_admin); Ablauf in docs/katalog-pflege.md, Abschnitt 6. visibility und owner_id eines Spiels sind unveränderlich (Trigger games_visibility_immutable).
  • db reset spielt seed.sql, catalog/vocabulary.sql und catalog/startbestand.sql ein ([db.seed] sql_paths in config.toml). Die SQL-Dateien in catalog/ sind erzeugt; Quellen sind die CSV-Dateien. Neu erzeugen und testen (Deno, brew install deno):
    deno run --allow-read=supabase --allow-write=supabase supabase/catalog/build_startbestand.ts
    deno test --allow-read=supabase supabase/catalog/
    
  • Ein Pfad in sql_paths, der nicht existiert, wird von der CLI nur mit Warnung übersprungen (kein Fehler). Genauere CLI-Ergebnisse: docs/katalog-pflege.md, Abschnitt 2.7.
  • pgTAP-Tests, die Include-Dateien brauchen, nutzen \ir ../support/…; die Dateien in tests/support/ sind erzeugt (gleiches Werkzeug) und keine Tests.

Regeln

  • Jede Tabelle hat id (uuid, PK), created_at, updated_at und Row Level Security.
  • updated_at setzt ein Trigger; id und created_at sind nach dem Anlegen unveränderlich.
  • Fremdschlüssel nur dort, wo Tabellen in Beziehung stehen, benannt <Zieltabelle>_id.
  • Rechte werden explizit vergeben (erst alles entziehen, dann gezielt gewähren).
  • Admin-Rolle kommt aus app_metadata.role = 'admin' im JWT, nie aus user_metadata; in R1 niemandem vergeben, Pflege über Studio (KAT-05 E10).

Noch nicht enthalten

  • Storage-Buckets und -Policies für Avatare und Spielbilder.
  • Edge Functions (BGG-Import, Konto löschen).
  • Selbst-Hosting-Setup auf Hetzner (ADR-0002, Aufgabe für devops).