Letschat / docs /ARCHITECTURE.md
HonzaH's picture
Upload 171 files
9853b20 verified
|
Raw
History Blame Contribute Delete
4.28 kB

Architektura a flow

Aktualizováno: 2025-12-07

Přehled

  • Next.js 14 (App Router) + TypeScript.
  • Datová vrstva: lib/persistence je jediný vstup do databáze (lokální Postgres přes LOCAL_DATABASE_URL nebo Supabase; dev fallback in-memory). Supabase je používán jen pro auth a synchronizaci.
  • Synchronizace: npm run sync:push čte lokální DB (Pool) a upsertuje do Supabase pomocí service role.
  • Pull sync: npm run sync:pull stáhne rooms/codes/room_messages ze Supabase (service role) a upsertne je do lokální DB – použij pro dorovnání nových zpráv z cloudu do lokální instance.
  • Ad-hoc pull zpráv: při načtení zpráv (getMessagesByRoom) se při dostupné service role pokusíme stáhnout nové zprávy dané místnosti ze Supabase a upsertnout je do lokální DB, aby se příchozí cloudové zprávy propsaly i do lokálního úložiště.
  • Offline klient: lib/offlineStore (IndexedDB) ukládá zprávy a pending frontu; lib/messages při výpadku sítě ukládá zprávy lokálně a po návratu online volá /api/sync/push k jejich uložení do persistence/Supabase.
  • Session: anonymní session v HTTP-only cookie (setAnonymousSession); Supabase auth pro registrované uživatele.
  • Logging: lib/logger zapisuje do lokální DB (logs), při nedostupnosti do Supabase service-role nebo konzole. Úroveň LOG_LEVEL=all|light|mini|off.
  • Rate limiting: lib/rateLimiter (paměťový bucket) blokuje brute-force pro kódy/PIN (IP+device). Rozšiřitelné i na další endpoints.

Datový model (shrnutí)

  • Viz docs/DATAMODEL.md a SQL v src/db/localSQLcreate.sql / src/db/supabaseSQLcreate.sql.
  • Tabulky: users, rooms, codes, room_messages, logs.

Hlavní flow

Zadání/ověření kódu

  • /api/codes/validate: ověřuje kód (persistence), větví na setup/pin/room; rate-limit IP+device; ukládá/čte anonymní session hash; loguje validate_*.
  • /api/codes/setup: pro nepoužitý kód vytvoří pár, místnost, označí used; ukládá PIN hash nebo session hash; loguje setup.
  • /api/codes/enter: pro použitý kód zajistí linked code, případně založí room; označí used; loguje enter.
  • /api/codes/verify-pin: ověří PIN, nastaví session, loguje verify_pin_success; rate-limit.
  • /api/users/transfer-code: převede kód k přihlášenému uživateli, loguje transfer_to_user.

Místnosti a chat

  • /api/rooms/[roomId]: CRUD nad místností přes persistence (vč. vlastnictví přes kód.user_id); loguje get/update/delete.
  • /api/messages/[roomId]: čte a ukládá zprávy přes persistence, aktualizuje rooms.date_last_message, loguje insert. Chat klient (components/chat/ChatRoom) používá tuto API a polling, bez přímého Supabase klienta.

Kódy a páry

  • lib/codes.createCodePair generuje dvojici a kontroluje unikátnost přes persistence (ne Supabase přímo).
  • persistence.getCodeWithLinked vrací primární + spárovaný kód; updateCodesRoomId zapisuje room_id pro obě strany.

Synchronizace a prostředí

  • Lokální DB: LOCAL_DATABASE_URL; init npm run db:local:init (vytvoří i logs).
  • Supabase: NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY (auth), SUPABASE_SERVICE_ROLE_KEY pro sync/log fallback.
  • Sync: src/lib/syncLocalToSupabase.ts upsertuje rooms, codes, room_messages.
  • Pull: src/lib/syncSupabaseToLocal.ts upsertuje rooms, codes, room_messages z cloudu do lokální DB; ad-hoc sync zpráv se volá z getMessagesByRoom.

Logging a observabilita

  • Úrovně: all (včetně UA+data), light (bez UA), mini (bez UA+data), off.
  • Záznam: module, operation, data (JSON), error, ip, user_agent, lang, level.
  • Tabulka logs v obou SQL skriptech; RLS v Supabase dovoluje pouze service role.

Bezpečnost a limity

  • Rate limiter pro kódy/PIN (3 pokusy/5 min/IP+device, 5min blok; po 3 blocích 24h). Doporučeno přidat i na login/register až budou implementované.
  • Session hash: anonymní uživatelé dostávají dlouhou/krátkou expiraci dle PIN, uloženou v DB i cookie.

Frontend

  • App Router stránky v src/app; sdílené komponenty src/components.
  • Chat běží přes API messages; UI layouty dle doc/design (viz docs/GITHUB_INSTRUCTIONS.md).