Přeskočit obsah

Phase A.1 — UI port (v1 → v2)

Stav: ✅ Dokončeno 28.4.2026 Trvání: 1 den (27.4 → 28.4)

Cíl

Portovat klíčové v1 frontend komponenty na v2 schema (JWT auth, nové DB shape).

Kroky

1. /reports list page

Client component, search by title/filename, sort newest first, source badge (v1-import / user-upload / Nette), empty state s CTA na /migrate. Karty linkují na /chat/{id}.

2. /chat/[reportId] standalone rewrite

Server component s auth gate (getClaims) + UUID validace + render client wrapper. ChatPageClient s ChatWindow + ZoomBar + ThreadTabs + MultiReportPicker.

Lib refactor: conversations.ts, feedback.ts, reports.ts všechno přes apiFetch (JWT). user_id field/prop dropped napříč (RLS + JWT pokrývá).

End-to-end ověřeno chat call → Gemini 3 Flash Preview odpověděl s daty z reportu.

3. /admin dashboard port

Refaktor lib/admin.ts + admin/page.tsx na v2 shapes:

  • rating int 1/-1 (v1 měl boolean)
  • FeedbackStats {total, up, down}
  • LLMProvider.display_name na top level
  • config.models[] = objekty s vlastním reasoning_capable + reasoning_levels

Sloupce "Tester" a "Odpověď AI" odstraněné (v2 shape nemá). ProviderCard přepracovaný pro nový model shape.

4. /demo cleanup

Smazán (page.tsx + report-fixture.json). Page byla v1 mock-handle Nette parent simulator s broken iframe. Phase E má vlastní detailní plán; recreate při potřebě je trivka.

5. Frontend tests (Vitest scaffold)

  • vitest + jsdom + path alias @/* matching tsconfig
  • tests/setup.ts injektuje NEXT_PUBLIC_* env
  • tests/lib/api.test.ts (5 testů) + tests/lib/feedback.test.ts (2 testy) = 7/7 ✓
  • npm scripts test + test:watch
  • Playwright e2e odložen (minimum-viable scope)

6. typescript.ignoreBuildErrors: false

Sundán flag, build pass strict TS check za 7.5s.

Fix: explicit CookieSetEntry type v supabase/server.ts.

Deploy size dropped 8.5 → 6.3 MB / 2.0 → 1.3 MB gzip (po /demo delete + chat duplicate state cleanup).

Bonus bugs nalezené během e2e testu

Bug A.1.1 — Migrace 0012 (messages_id_seq USAGE)

authenticated neměl USAGE na messages_id_seq. Při INSERTu do messages backend hodil 500 db_error (permission denied for sequence messages_id_seq).

Fix: migrace 0012 — GRANT USAGE, SELECT ON SEQUENCE messages_id_seq TO authenticated. Admin sequences zůstávají service_role-only.

Lesson learned: pgTAP grants suite rozšířen o sequence USAGE checks aby budoucí migrace nezapomenula.

Bug A.1.2 — Wrong Gemini model name

CLAUDE.md plán říkal gemini-3.1-flash, ale ten ještě neexistuje na v1beta API. Aktuální dostupný model = gemini-3-flash-preview.

Fix: opraveno v Sliplane env + app/config.py default.

Co Phase A.1 zanechala pro Phase B

  • Stable v2 chat flow (přes parsed_markdown / clean_text fallback)
  • Admin dashboard funkční na v2 shape
  • TS strict build pipeline
  • Vitest scaffold pro budoucí FE testy
  • 6.3 MB / 1.3 MB gzip deploy size baseline