| # 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`). |
|
|