# AGENTS.md — notatki o projekcie ## Build / test / run - **Serwer rezerwacji Forno:** `npm run start:forno` → `node forno-server.js` (port `PORT` lub 3100) - **Serwer gry biletowej:** `npm start` → `node server.js` - **Testy:** `npm test` → `node --test "test/**/*.test.js"` (testy Forno w `test/forno-server.test.js`) - **Build (zdjęcia):** `npm run build` → `node exif-reader.js` (jednorazowy) ## Zmienne środowiskowe (Render / `.env`) - `ADMIN_PASSWORD` — hasło do panelu `/panel` (Forno) i panelu gry biletowej - `SESSION_SECRET` — sekret sesji. Na Render `generateValue: true` (stabilny, nie zmienia się przy redeploju). **Wymagany**, by sesja przetrwała restart serwera. - `TASKS_TOKEN` — token dla zewnętrznego crona `POST /tasks/run` - `GITHUB_TOKEN`, `GITHUB_OWNER`, `GITHUB_REPO`, `GITHUB_BRANCH` — persystencja danych przez `github-sync.js` - `FORNO_SMS_*` — konfiguracja SMS (patrz `FORNO_SMS_SETUP.md`) ## Sesje w forno-server.js `forno-server.js` używa **`cookie-session`** (sesja trzymana w ciastku przeglądarki, podpisana `SESSION_SECRET`), a **nie** `express-session` (MemoryStore). **Dlaczego:** Render Free ma efemeryczny dysk i restartuje serwer przy każdym pushu do `main` (auto-redeploy), a `github-sync.js` commituje dane (`reservations.json`, `forno-settings.json`) do `main` przy każdej zmianie. `express-session` trzyma sesje w pamięci procesu — po restarcie znikały, więc `requireAdmin` odrzucał POST `/panel/settings` i przekierowywał na formularz logowania (stąd objaw: „klikam zapisz → prosi o hasło → wraca panel ze starymi danymi”). `cookie-session` trzyma stan w ciastku, więc sesja przetrwa restart / redeploy / spin-down, o ile `SESSION_SECRET` jest stabilny. **Konsekwencje dla kodu:** - `req.session = null` do wylogowania (nie `req.session.destroy(cb)` — `cookie-session` tego nie ma). - `cookie-session` z `keys: [SESSION_SECRET]` ustawia dwa ciastka: `forno.sid` (dane) i `forno.sig` (podpis). W testach trzeba czytać oba przez `res.headers.getSetCookie()`. ## Persystencja danych (github-sync.js) Dane (`reservations.json`, `forno-settings.json`) są commitowane do gałęzi `GITHUB_BRANCH` (domyślnie `main`) przez `github-sync.js`. **Uwaga:** każdy commit triggeruje auto-redeploy na Render (serwer niedostępny ~1-2 min). Planowane rozwiązanie: osobna gałąż `data` + pull-on-startup (jeszcze niezaimplementowane). ## Struktura - `forno-server.js` — aplikacja rezerwacji stolików (Express + EJS) - `forno-data.js` — model danych (ustawienia, rezerwacje, walidacja, formatowanie) - `forno-notify.js` — wysyłka SMS przez SMS Gateway for Android - `github-sync.js` — commitowanie JSON-ów do GitHub (persystencja na Render Free) - `server.js` — gra biletowa (osobny serwis, używa `express-session`) - `views/forno-*.ejs` — widoki rezerwacji / panelu / paragonu - `reservations.json`, `forno-settings.json` — płaska baza danych (commitowana do GitHub)