Model danych — co gdzie leży#
Ta strona zbiera obiekty, z których składa się Fyndi, i mówi, czego można się po każdym z nich spodziewać: co liczy serwer, co leży w bazie, a co jest tylko plikiem na dysku.
Co gdzie leży#
| Obiekt | Co zawiera |
|---|---|
| Konto | E-mail, odcisk hasła, rola (gracz / moderator / administrator), tokeny odświeżania sesji |
| Postać | Wygląd (fryzura, czapka, góra, dół, buty, dodatki, kolory), nazwa w postaci nazwa#tag, zgoda na pokazywanie pozycji innym graczom |
| Trasa | Nazwa, opis, uporządkowana lista punktów, dystans, szacowany czas, profil ruchu (pieszo / rower / hulajnoga) |
| Punkt (stop) | Pozycja, promień zaliczenia (domyślnie 45 m), reguła zaliczenia (GPS / zagadka / AR), opis i media |
| Znajdźka | Pozycja, opis, model (zwykły lub AR), przypisanie do sponsora |
| Przejście trasy | Jedno zwiedzanie: stan (aktywne → zakończone albo porzucone), czasy, zaliczone punkty |
| Zdarzenie | Niezmienny fakt: zaliczony punkt, zebrana znajdźka, start lub meta trasy |
| Paczka offline | Wersjonowany zestaw treści miasta do pobrania na telefon |
| Media i modele 3D | Pliki na dysku serwera: zdjęcia, audio, modele do mapy i AR, adresowane jak zwykłe pliki |
| Bot NPC | Nazwa, rodzaj, ikona, pętla trasy (geometria po chodnikach plus tempo), dar, włącznik i kalendarz służby |
| Dar od bota | Kto, od kogo i którego dnia odebrał dar — jeden na gracza, na bota, na dobę |
| Reguła nagród | Zdarzenie (znajdźka, punkt, trasa) → ile tokenów i jaki dzienny limit; do tego portfel i katalog nagród z wymianami |
| Lobby (wspólny spacer) | Kod, gospodarz, członkowie, status, czas życia 2 godziny i pozycje członków |
| Zadanie planera | Karta z planowania: tytuł, notatka, kolumna i termin (Proces pracy) |
| Pozycja gracza | Ostatnia pozycja do widoczności innych graczy — tylko za zgodą obu stron |
Dwie rzeczy są tu warte podkreślenia, bo tłumaczą zachowanie aplikacji:
- Pozycji bota nie trzyma baza. Serwer liczy ją deterministycznie z czasu i geometrii pętli, więc bot nie „zapada się” w bazie i nie wymaga osobnego procesu, który go przesuwa. Więcej: boty w mieście.
- Saldo tokenów nie jest polem do zapisu. Portfel liczy się z zapisów księgi minus wymiany, więc nie da się go „poprawić” po cichu — każda zmiana zostawia ślad w historii.
Odpowiedzi bez jawnych haseł#
Punkt-zagadka ma pytanie i odpowiedź, ale odpowiedź nie leży nigdzie jawnie. W bazie zapisany jest wyłącznie skrót (SHA-256) z odpowiedzi po normalizacji — z małymi literami i przyciętymi spacjami. Nawet osoba z dostępem do bazy nie podejrzy rozwiązania.
Co z tego wynika dla gracza i dla redaktora:
| Sprawa | Jak jest rozwiązane |
|---|---|
| Wielkość liter | Gracz może wpisać odpowiedź dowolną wielkością liter |
| Polskie znaki i interpunkcja | Nowe punkty porównuje „luźna” normalizacja: Krzyż, krzyz i K R Z Y Ż trafiają w ten sam skrót |
| Punkty sprzed zmiany normalizacji | Porównywane starą, ścisłą metodą (przycięcie, małe litery, zbite spacje), więc nadal działają |
| Odpowiedź + warianty | Dla jednej zagadki można zapisać listę dopuszczalnych wariantów |
| Samo hashowanie | Odpowiedź nie opuszcza przeglądarki redaktora: kreator wysyła ją tylko po to, by otrzymać skrót |
Pliki i modele#
| Rodzaj danych | Gdzie żyje | Uwagi |
|---|---|---|
| Konta, postęp, zdarzenia, boty, nagrody, lobby | baza danych | Relacyjnie, z historią zdarzeń jako źródłem prawdy statystyk |
| Zdjęcia, audio, modele 3D, paczki offline | pliki na dysku serwera | Aplikacja pobiera je pod adresem w ramach domeny fyndi.app |
| Geometria trasy | w rekordzie trasy | Linia trasy i punkty pośrednie między stopami; trasa „ręczna” nie jest przeliczana routerem |
| Wygląd postaci | na koncie gracza | Ten sam zestaw pól czyta aplikacja, strona i podgląd w panelu |
| Odpowiedzi do zagadek | w rekordzie punktu | Tylko skrót, nigdy tekst (patrz wyżej) |
| Opisy funkcji i stron dokumentacji | pliki markdown w repozytorium | Generowane w stronę docs.fyndi.app |
| Zadania i notatki planowania | baza danych panelu | Karty widzi tylko staff (Panel staff) |
Punkt i znajdźka to dwa różne rodzaje tego samego obiektu: punkt trasy jest stopem, a znajdźka jest zbierana. API pilnuje tego twardo — próba dodania znajdźki jako stopu trasy kończy się odmową, a próba zamiany stopu w znajdźkę zgłasza konflikt. Dlatego trasa przechodząca przez miejsce znajdźki dostaje własny punkt w tych samych współrzędnych. Opis dla gracza: punkty na trasie i znajdźki.
Paczka offline to wersjonowany zestaw treści: manifest z listą plików, sumami kontrolnymi i mapowaniem tras na lokalne ścieżki. Telefon pobiera go, gdy ma sieć, i od tego momentu czyta treść z pamięci urządzenia.
Opis zgodny z aplikacją 0.120.1 (zaktualizowano 2026-09-26).