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