REHAGYM
Dokumentacja Techniczna Systemu
Wersja
1.0.0
Data dokumentacji
2026-05-20
Platforma
Base44
Framework
React 18
Spis treści
REHAGYM to platforma SaaS do zarządzania centrum rehabilitacyjno-treningowym. System obsługuje trzy role użytkowników (administrator, trener, klient), zapewniając pełny cykl życia rezerwacji — od wyboru usługi i trenera, przez zarządzanie dostępnością, po śledzenie historii treningów i notatek klinicznych.
Główne moduły funkcjonalne
| Moduł | Rola | Opis |
|---|---|---|
| AdminDashboard | admin | KPI systemu, wykresy przychodów i rezerwacji, ostatnie aktywności |
| AdminCalendar | admin | Widok tygodniowy/dzienny dostępności trenerów i rezerwacji |
| AdminTrainers | admin | CRUD trenerów, przegląd klientów i wyników finansowych |
| AdminClients | admin | CRUD klientów, przypisanie do trenera, historia treningów |
| AdminBookings | admin | Zarządzanie rezerwacjami, filtry, zmiana statusów, oznaczanie płatności |
| AdminServices | admin | CRUD usług, statystyki popularności i przychodów |
| AdminAnalytics | admin | Wykresy: trendy, rozkład usług, wydajność trenerów |
| AdminSettings | admin | Konfiguracja statusów rezerwacji z kolorami i ikonami |
| TrainerDashboard | trainer | Dzienny rozkład, aktywni klienci, przychody |
| TrainerCalendar | trainer | Zarządzanie slotami dostępności (CRUD) |
| TrainerClients | trainer | Lista przypisanych klientów, historia, statystyki |
| TrainerNotes | trainer | Notatki po treningu: opis, zalecenia, plan ćwiczeń |
| BookingWizard | user | 4-krokowy kreator rezerwacji (usługa → trener → termin → potwierdzenie) |
| MyBookings | user | Historia rezerwacji, anulowanie, podgląd notatek trenera |
| UserDashboard | user | Statystyki osobiste, nadchodzące treningi, ostatnie notatki |
Frontend
| Biblioteka | Wersja | Zastosowanie |
|---|---|---|
| React | 18.2 | Framework UI, hooks, context, SPA |
| React Router DOM | 6.26 | Klient-side routing, nested routes |
| Tailwind CSS | 3.x | Utility-first CSS, design tokens przez zmienne CSS |
| Framer Motion | 11.x | Animacje wejścia, przejścia między krokami wizarda, AnimatePresence |
| Recharts | 2.x | Wykresy (AreaChart, BarChart, PieChart) w dashboardach |
| date-fns | 3.x | Formatowanie dat, obliczenia tygodniowe/miesięczne, locale PL |
| Lucide React | 0.475 | Ikony SVG |
| shadcn/ui | latest | Komponenty UI: Dialog, Select, Button, Input, Tabs, Badge itd. |
| @tanstack/react-query | 5.x | Zarządzanie stanem asynchronicznym, cache, invalidation |
| @radix-ui/* | latest | Dostępne prymitywy (pod shadcn/ui) |
| framer-motion | 11.x | Animacje |
Backend (BaaS)
| Komponent | Opis |
|---|---|
| Base44 Platform | Backend-as-a-Service — baza danych, auth, storage, funkcje, integracje |
| Base44 SDK (@base44/sdk) | Klient TypeScript do komunikacji z platformą z przeglądarki |
| Deno Deploy | Środowisko uruchomieniowe dla funkcji backendowych (serverless edge) |
| Base44 Entities API | REST-like ORM z metodami list/filter/create/update/delete/subscribe |
| Base44 Auth | JWT-based session management, token w parametrach URL aplikacji |
Środowisko budowania
- Vite — bundler, HMR, szybki build
- Tailwind CSS PostCSS plugin z tailwindcss-animate
- Aliasy ścieżek: @/ → src/
- class-variance-authority (cva) — warianty komponentów
- clsx + tailwind-merge — bezpieczne łączenie klas
Wszystkie dane przechowywane są w bazie Base44. Każda encja ma wbudowane pola systemowe:id, created_date, updated_date, created_by.
| Encja | Kluczowe pola | Relacje |
|---|---|---|
| User (wbudowana) | id, email, full_name, role | referenced by: Booking, Trainer, TrainerClient, TrainingNote |
| Trainer | bio, specializations[], hourly_rate, avatar_url, phone, status | → User (id = trainer.id), → TrainerClient, → TrainerAvailability |
| TrainerClient | trainer_id, user_id, status, assigned_date, notes | JOIN: Trainer ↔ User (klient) |
| TrainerAvailability | trainer_id, service_id, date, start_time, end_time, max_clients, booked_clients, is_available | → Trainer, → Service |
| Service | name, description, duration_minutes, price, max_clients, color | ← Booking, ← TrainerAvailability |
| Booking | user_id, trainer_id, service_id, availability_id, status_id, date, start_time, end_time, price, is_paid, notes | → User, → Trainer, → Service, → TrainerAvailability, → BookingStatus |
| BookingStatus | name, color, icon, is_editable, description | ← Booking.status_id |
| TrainingNote | booking_id, trainer_id, user_id, content, recommendations, exercise_plan, attachments[], is_archived | → Booking, → Trainer, → User |
Diagram zależności (uproszczony)
User ──── Booking ──── User (trainer)
Booking ──── Service
Booking ──── TrainerAvailability
Booking ──── BookingStatus
Booking ──── TrainingNote
Atomy danych wrażliwych
- User.email — adres e-mail (PII)
- User.full_name — imię i nazwisko (PII)
- Trainer.phone — telefon kontaktowy trenera (PII)
- TrainingNote.content / recommendations / exercise_plan — dane zdrowotne / rehabilitacyjne (dane szczególne kategorii RODO Art. 9)
- Booking.notes — notatki klienta (mogą zawierać informacje zdrowotne)
Mechanizm sesji
System używa JWT-based session management zarządzanego przez platformę Base44. Token sesji jest wstrzykiwany przez platformę do parametrów aplikacji (appParams.token) i przekazywany do klienta SDK przy każdym żądaniu.
| Krok | Opis |
|---|---|
| 1. Inicjalizacja | App.jsx inicjalizuje AuthProvider, który wywołuje checkAppState() |
| 2. Weryfikacja aplikacji | GET /api/apps/public/.../public-settings — sprawdza czy aplikacja istnieje i czy auth jest wymagane |
| 3. Weryfikacja użytkownika | base44.auth.me() — weryfikuje token, zwraca obiekt user z rolą |
| 4. Obsługa błędów | auth_required → redirect do logowania; user_not_registered → ekran błędu |
| 5. Wylogowanie | base44.auth.logout(redirectUrl) — usuwa token, przekierowuje |
Przepływ autoryzacji
├─ TAK:
base44.auth.me() → ustaw user + role└─ NIE:
navigateToLogin() → platforma Base44 loginPo zalogowaniu: token w URL → AuthContext → user.role → routing
Ochrona routów
Każdy URL jest dostępny tylko po uwierzytelnieniu. Role są egzekwowane przez Sidebar (renderuje tylko menu przypisane do roli) oraz przez warunki w App.jsx (root route /przekierowuje do odpowiedniego dashboardu na podstawie user.role).
System implementuje trójpoziomowy RBAC (Role-Based Access Control) z rolami: admin trainer user
| Zasób / Akcja | admin | trainer | user |
|---|---|---|---|
| Widok wszystkich rezerwacji | ✅ | ❌ | ❌ |
| Widok własnych rezerwacji | ✅ | ✅ (jako trener) | ✅ |
| Tworzenie rezerwacji | ✅ | ❌ | ✅ |
| Anulowanie rezerwacji | ✅ | ❌ | ✅ (własne) |
| Zarządzanie trenerami | ✅ | ❌ | ❌ |
| Zarządzanie klientami | ✅ | ✅ (przypisani) | ❌ |
| Dodawanie slotów dostępności | ❌ | ✅ | ❌ |
| Tworzenie notatek treningowych | ❌ | ✅ | ❌ |
| Odczyt notatek treningowych | ✅ | ✅ (własne) | ✅ (swoje) |
| Zarządzanie usługami | ✅ | ❌ | ❌ |
| Konfiguracja statusów | ✅ | ❌ | ❌ |
| Widok analityki | ✅ | ❌ | ❌ |
Egzekwowanie ról odbywa się zarówno po stronie UI (renderowanie warunkowe) jak i po stronie platformy Base44 (wbudowane RLS — Row Level Security na encji User). Dane wrażliwe trenerów i klientów nie są dostępne przez API dla nieupoważnionych ról.
Kreator rezerwacji (BookingWizard) — 4-krokowy wizard
| Krok | Działanie | Walidacja |
|---|---|---|
| 1. Usługa | Lista usług z bazy, wybór zapisywany w stanie lokalnym | Wymaga przynajmniej 1 aktywnej usługi |
| 2. Trener | Filter: trainer.status === "active", dołącza User.full_name przez cross-reference | Wymaga aktywnych trenerów |
| 3. Termin | filter(trainer_id, is_available=true) → filtr: booked_clients < max_clients AND date >= today | Sloty tylko przyszłe, z wolnymi miejscami |
| 4. Potwierdzenie | Booking.create() + TrainerAvailability.update(booked_clients +1) | Atomowe — oba zapisy muszą się udać |
Algorytm kalkulacji przychodów (AdminAnalytics / AdminDashboard)
- Pobierz wszystkie Booking[] z bazy
- Grupuj po miesiącu: booking.date.slice(0, 7) → klucz YYYY-MM
- Sumuj booking.price dla każdej grupy miesięcznej
- Oblicz wzrost MoM: (currentMonth - prevMonth) / prevMonth * 100
- Filtruj: tylko opłacone (is_paid = true) dla "real revenue", wszystkie dla prognoz
Algorytm wydajności trenerów
- Dla każdego trenera zlicz bookings.filter(b => b.trainer_id === trainer.id)
- Sumuj przychody: bookings.reduce((sum, b) => sum + (b.price || 0), 0)
- Zlicz aktywnych klientów: unikalne b.user_id z ostatnich 30 dni
- Sortuj trendin: po liczbie sesji malejąco
Zarządzanie dostępnością trenera
- Trener tworzy TrainerAvailability (slot) z: date, start_time, end_time, max_clients
- Przy rezerwacji: booked_clients++ na slocie (optymistyczne, bez locka)
- Slot widoczny dla klientów tylko gdy: is_available=true AND booked_clients < max_clients AND date >= dziś
- Usunięcie slotu przez trenera: DELETE z ostrzeżeniem (slot może mieć istniejące rezerwacje)
Przypisanie trener–klient (TrainerClient)
- Admin tworzy rekord TrainerClient { trainer_id, user_id, status: "active" }
- Przy zmianie trenera: poprzedni rekord status → "inactive", nowy rekord CREATE
- Trener widzi klientów przez: TrainerClient.filter({ trainer_id: user.id, status: "active" })
- Historia: zachowane nieaktywne rekordy dla audytu
Anulowanie rezerwacji
- Booking.update({ status_id: cancelledStatusId })
- TrainerAvailability.update({ booked_clients: max(0, booked_clients - 1) })
- Dostępne tylko dla rezerwacji przyszłych (date >= dziś)
W obecnej wersji (v1.0) REHAGYM nie używa aktywnie AI w runtime aplikacji. AI zostało zastosowane na etapie tworzenia systemu oraz zostało przygotowane architektonicznie do przyszłej integracji.
AI na etapie developmentu
- Cały kod aplikacji wygenerowany przez AI (Base44 Agent) na podstawie specyfikacji funkcjonalnej
- Architektura encji, relacje i walidacje zaprojektowane przez AI zgodnie z wymaganiami domeny rehabilitacyjnej
- Automatyczne generowanie komponentów UI, logiki biznesowej i algorytmów analitycznych
- Iteracyjne poprawki i refactoring przez AI w odpowiedzi na feedback użytkownika
Przygotowanie infrastruktury dla AI (przyszłe wdrożenia)
| Planowana funkcja | Encja / endpoint | Model AI |
|---|---|---|
| Analiza notatek treningowych — wykrywanie wzorców | TrainingNote.content | InvokeLLM (GPT-4o / Claude) |
| Automatyczne rekomendacje planu ćwiczeń | TrainingNote.exercise_plan | InvokeLLM + baza historii |
| Predykcja rezygnacji klienta (churn) | Booking[], TrainerClient.status | Klasyfikator na historii rezerwacji |
| Asystent trenera (chatbot) | Agents SDK (Base44) | GPT-4 z dostępem do encji |
| Automatyczne powiadomienia przypominające | Booking.date, Automations (scheduled) | Base44 Automations + SendEmail |
| Transkrypcja notatek głosowych | TrainingNote.attachments[] | TranscribeAudio (Whisper) |
Platforma integracji AI (Base44 Core)
- InvokeLLM — dostęp do GPT-4o-mini, Claude Sonnet, Gemini Pro przez jednolite API
- GenerateImage — generowanie obrazów (dokumentacja, materiały marketingowe)
- GenerateSpeech — synteza mowy (TTS) dla powiadomień głosowych
- TranscribeAudio — transkrypcja sesji audio/wideo (przyszłe notatki głosowe)
- ExtractDataFromUploadedFile — ekstrakcja danych z PDF/Excel (import historii klientów)
Nota: Każde przyszłe użycie AI przetwarzającego dane zdrowotne klientów (TrainingNote) wymaga oceny skutków dla ochrony danych (DPIA) zgodnie z RODO Art. 35 oraz uzyskania wyraźnej zgody użytkownika.
Warstwy ochrony
| Warstwa | Mechanizm | Zakres |
|---|---|---|
| Sieć | HTTPS/TLS (Base44 infrastructure) | Wszystkie połączenia frontend ↔ backend |
| Sesja | JWT token, short-lived, refresh by platform | Każde żądanie API |
| Aplikacja | AuthContext — weryfikacja tokenu przy starcie | Blokada dostępu bez ważnej sesji |
| Routing | Role-based redirect w App.jsx + Sidebar RBAC | Ukrycie niedostępnych sekcji |
| API | Base44 RLS (Row Level Security) na encji User | Admin może czytać wszystkich użytkowników, user tylko siebie |
| Funkcje backendowe | createClientFromRequest(req) — user.role === "admin" check | Ochrona endpointów adminowych |
| Dane w spoczynku | Base44 managed database encryption | Wszystkie dane encji |
Potencjalne ryzyka i mitygacje
| Ryzyko | Poziom | Mitygacja |
|---|---|---|
| IDOR (Insecure Direct Object Reference) | Średni | Filtrowanie danych po trainer_id/user_id na poziomie API |
| Wstrzyknięcie danych (injection) | Niski | Base44 SDK parametryzuje wszystkie zapytania |
| XSS | Niski | React DOM sanitizuje JSX; brak dangerouslySetInnerHTML |
| CSRF | Niski | Token w nagłówkach (nie w cookies); SameSite enforcement przez Base44 |
| Wyciek danych zdrowotnych | Wysoki | TrainingNote dostępne tylko dla właściciela i przypisanego trenera |
| Nieautoryzowane usuwanie danych | Średni | Confirm dialog przed DELETE; brak bulk-delete dla klientów |
Brak implementacji (wymagane przed produkcją)
- Rate limiting na BookingWizard — ochrona przed spam-rezerwacjami
- Audit log dla operacji adminowych (kto i kiedy zmienił status/płatność)
- Two-Factor Authentication (2FA) — szczególnie dla konta admin
- Automatyczne wygasanie sesji po czasie bezczynności
- Content Security Policy (CSP) headers
Podstawa prawna przetwarzania
| Kategoria danych | Podstawa prawna (RODO) | Cel |
|---|---|---|
| Dane identyfikacyjne (imię, email) | Art. 6 ust. 1 lit. b — wykonanie umowy | Obsługa konta, rezerwacji |
| Dane kontaktowe trenera (telefon) | Art. 6 ust. 1 lit. b — wykonanie umowy | Koordynacja treningów |
| Notatki treningowe (dane zdrowotne) | Art. 9 ust. 2 lit. a — wyraźna zgoda | Świadczenie usług rehabilitacyjnych |
| Historia rezerwacji | Art. 6 ust. 1 lit. b + lit. c — obowiązek prawny | Fakturowanie, rozliczenia |
| Dane płatnicze (is_paid, price) | Art. 6 ust. 1 lit. c — obowiązek prawny | Dokumentacja finansowa |
Prawa podmiotów danych
| Prawo | Status implementacji | Lokalizacja |
|---|---|---|
| Prawo dostępu (Art. 15) | ✅ Częściowo | UserProfile, MyBookings — klient widzi swoje dane |
| Prawo do sprostowania (Art. 16) | ✅ Częściowo | UserProfile — edycja danych osobowych |
| Prawo do usunięcia (Art. 17) | ⚠️ Wymaga implementacji | Brak "usuń konto" — wymagane przed produkcją |
| Prawo do przenoszenia (Art. 20) | ⚠️ Wymaga implementacji | Brak eksportu danych do JSON/CSV |
| Prawo sprzeciwu (Art. 21) | ⚠️ Wymaga implementacji | Brak mechanizmu opt-out |
| Prawo ograniczenia (Art. 18) | ⚠️ Wymaga implementacji | Brak mechanizmu zamrożenia przetwarzania |
Dane szczególnych kategorii (Art. 9)
Encja TrainingNote może zawierać dane o stanie zdrowia(diagnozy, urazy, rehabilitacja) — dane szczególnej kategorii wg RODO Art. 9.
Wymagania przed przetwarzaniem:
- • Wyraźna zgoda klienta w formie checkboxa przy rejestracji
- • Polityka prywatności dostępna przed rejestracją
- • Rejestr czynności przetwarzania (RCP) prowadzony przez ADO
- • DPIA jeśli planowane jest przetwarzanie AI na tych danych
Retencja danych
| Typ danych | Zalecany okres retencji | Status |
|---|---|---|
| Dane konta użytkownika | Do usunięcia konta + 30 dni | ⚠️ Brak automatu usunięcia |
| Historia rezerwacji | 5 lat (obowiązek podatkowy) | ⚠️ Brak automatycznej archiwizacji |
| Notatki treningowe | 5 lat lub do cofnięcia zgody | ⚠️ is_archived = true, brak hard-delete |
| Logi systemowe | 90 dni (Base44 managed) | ✅ Zarządzane przez platformę |
Lokalizacja danych
- Wszystkie dane przechowywane na infrastrukturze Base44 (EU datacenter)
- Brak transferu danych do krajów trzecich poza EOG
- Backup i replikacja zarządzane przez Base44 (SLA 99.9%)
Hierarchia komponentów
└─ AppLayout.jsx (Sidebar + Header + Outlet)
├─ Sidebar.jsx (role-based nav, logout)
├─ Header.jsx (breadcrumb, notifications)
└─ Pages (Admin* / Trainer* / User*)
└─ shadcn/ui components (Dialog, Select, Button...)
└─ base44.entities.* (data layer)
Wzorce projektowe
| Wzorzec | Implementacja |
|---|---|
| Provider Pattern | AuthContext, QueryClientProvider — stan globalny |
| Custom Hook | useAuth() — dostęp do kontekstu auth z dowolnego komponentu |
| Container/Presentational | Strony = container (data fetch), shadcn/ui = presentational |
| Optimistic UI | Status rezerwacji zmienia się natychmiast, potem load() |
| Co-location | Logika i widok danej funkcji w jednym pliku strony |
| BaaS Pattern | Brak własnego backendu — wszystko przez Base44 SDK |
Przepływ danych
- Dane pobierane przez useEffect + Promise.all() przy montowaniu komponentu
- Stan lokalny (useState) dla UI state (filtry, otwarte dialogi, edytowany rekord)
- Mutacje: bezpośrednie wywołanie base44.entities.*.create/update/delete + reload
- Real-time: base44.entities.*.subscribe() dostępne (nie używane w v1.0)
- @tanstack/react-query skonfigurowany (queryClientInstance) ale używany selektywnie
REHAGYM Technical Documentation v1.0 · Wygenerowane: 2026-05-20 · Base44 Platform
Dokument wewnętrzny — zawiera informacje poufne