REHAGYM

czwartek, 27 sierpnia 2026

U
RG

REHAGYM

Dokumentacja Techniczna Systemu

Wersja

1.0.0

Data dokumentacji

2026-05-20

Platforma

Base44

Framework

React 18

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łRolaOpis
AdminDashboardadminKPI systemu, wykresy przychodów i rezerwacji, ostatnie aktywności
AdminCalendaradminWidok tygodniowy/dzienny dostępności trenerów i rezerwacji
AdminTrainersadminCRUD trenerów, przegląd klientów i wyników finansowych
AdminClientsadminCRUD klientów, przypisanie do trenera, historia treningów
AdminBookingsadminZarządzanie rezerwacjami, filtry, zmiana statusów, oznaczanie płatności
AdminServicesadminCRUD usług, statystyki popularności i przychodów
AdminAnalyticsadminWykresy: trendy, rozkład usług, wydajność trenerów
AdminSettingsadminKonfiguracja statusów rezerwacji z kolorami i ikonami
TrainerDashboardtrainerDzienny rozkład, aktywni klienci, przychody
TrainerCalendartrainerZarządzanie slotami dostępności (CRUD)
TrainerClientstrainerLista przypisanych klientów, historia, statystyki
TrainerNotestrainerNotatki po treningu: opis, zalecenia, plan ćwiczeń
BookingWizarduser4-krokowy kreator rezerwacji (usługa → trener → termin → potwierdzenie)
MyBookingsuserHistoria rezerwacji, anulowanie, podgląd notatek trenera
UserDashboarduserStatystyki osobiste, nadchodzące treningi, ostatnie notatki

Frontend

BibliotekaWersjaZastosowanie
React18.2Framework UI, hooks, context, SPA
React Router DOM6.26Klient-side routing, nested routes
Tailwind CSS3.xUtility-first CSS, design tokens przez zmienne CSS
Framer Motion11.xAnimacje wejścia, przejścia między krokami wizarda, AnimatePresence
Recharts2.xWykresy (AreaChart, BarChart, PieChart) w dashboardach
date-fns3.xFormatowanie dat, obliczenia tygodniowe/miesięczne, locale PL
Lucide React0.475Ikony SVG
shadcn/uilatestKomponenty UI: Dialog, Select, Button, Input, Tabs, Badge itd.
@tanstack/react-query5.xZarządzanie stanem asynchronicznym, cache, invalidation
@radix-ui/*latestDostępne prymitywy (pod shadcn/ui)
framer-motion11.xAnimacje

Backend (BaaS)

KomponentOpis
Base44 PlatformBackend-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 APIREST-like ORM z metodami list/filter/create/update/delete/subscribe
Base44 AuthJWT-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.

EncjaKluczowe polaRelacje
User (wbudowana)id, email, full_name, rolereferenced by: Booking, Trainer, TrainerClient, TrainingNote
Trainerbio, specializations[], hourly_rate, avatar_url, phone, status→ User (id = trainer.id), → TrainerClient, → TrainerAvailability
TrainerClienttrainer_id, user_id, status, assigned_date, notesJOIN: Trainer ↔ User (klient)
TrainerAvailabilitytrainer_id, service_id, date, start_time, end_time, max_clients, booked_clients, is_available→ Trainer, → Service
Servicename, description, duration_minutes, price, max_clients, color← Booking, ← TrainerAvailability
Bookinguser_id, trainer_id, service_id, availability_id, status_id, date, start_time, end_time, price, is_paid, notes→ User, → Trainer, → Service, → TrainerAvailability, → BookingStatus
BookingStatusname, color, icon, is_editable, description← Booking.status_id
TrainingNotebooking_id, trainer_id, user_id, content, recommendations, exercise_plan, attachments[], is_archived→ Booking, → Trainer, → User

Diagram zależności (uproszczony)

User ──── TrainerClient ──── User (trainer)
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.

KrokOpis
1. InicjalizacjaApp.jsx inicjalizuje AuthProvider, który wywołuje checkAppState()
2. Weryfikacja aplikacjiGET /api/apps/public/.../public-settings — sprawdza czy aplikacja istnieje i czy auth jest wymagane
3. Weryfikacja użytkownikabase44.auth.me() — weryfikuje token, zwraca obiekt user z rolą
4. Obsługa błędówauth_required → redirect do logowania; user_not_registered → ekran błędu
5. Wylogowaniebase44.auth.logout(redirectUrl) — usuwa token, przekierowuje

Przepływ autoryzacji

App startcheckAppState()token present?
├─ TAK: base44.auth.me() → ustaw user + role
└─ NIE: navigateToLogin() → platforma Base44 login

Po 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 / Akcjaadmintraineruser
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
Ważne

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

KrokDziałanieWalidacja
1. UsługaLista usług z bazy, wybór zapisywany w stanie lokalnymWymaga przynajmniej 1 aktywnej usługi
2. TrenerFilter: trainer.status === "active", dołącza User.full_name przez cross-referenceWymaga aktywnych trenerów
3. Terminfilter(trainer_id, is_available=true) → filtr: booked_clients < max_clients AND date >= todaySloty tylko przyszłe, z wolnymi miejscami
4. PotwierdzenieBooking.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 funkcjaEncja / endpointModel AI
Analiza notatek treningowych — wykrywanie wzorcówTrainingNote.contentInvokeLLM (GPT-4o / Claude)
Automatyczne rekomendacje planu ćwiczeńTrainingNote.exercise_planInvokeLLM + baza historii
Predykcja rezygnacji klienta (churn)Booking[], TrainerClient.statusKlasyfikator na historii rezerwacji
Asystent trenera (chatbot)Agents SDK (Base44)GPT-4 z dostępem do encji
Automatyczne powiadomienia przypominająceBooking.date, Automations (scheduled)Base44 Automations + SendEmail
Transkrypcja notatek głosowychTrainingNote.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

WarstwaMechanizmZakres
SiećHTTPS/TLS (Base44 infrastructure)Wszystkie połączenia frontend ↔ backend
SesjaJWT token, short-lived, refresh by platformKażde żądanie API
AplikacjaAuthContext — weryfikacja tokenu przy starcieBlokada dostępu bez ważnej sesji
RoutingRole-based redirect w App.jsx + Sidebar RBACUkrycie niedostępnych sekcji
APIBase44 RLS (Row Level Security) na encji UserAdmin może czytać wszystkich użytkowników, user tylko siebie
Funkcje backendowecreateClientFromRequest(req) — user.role === "admin" checkOchrona endpointów adminowych
Dane w spoczynkuBase44 managed database encryptionWszystkie dane encji

Potencjalne ryzyka i mitygacje

RyzykoPoziomMitygacja
IDOR (Insecure Direct Object Reference)ŚredniFiltrowanie danych po trainer_id/user_id na poziomie API
Wstrzyknięcie danych (injection)NiskiBase44 SDK parametryzuje wszystkie zapytania
XSSNiskiReact DOM sanitizuje JSX; brak dangerouslySetInnerHTML
CSRFNiskiToken w nagłówkach (nie w cookies); SameSite enforcement przez Base44
Wyciek danych zdrowotnychWysokiTrainingNote dostępne tylko dla właściciela i przypisanego trenera
Nieautoryzowane usuwanie danychŚredniConfirm 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 danychPodstawa prawna (RODO)Cel
Dane identyfikacyjne (imię, email)Art. 6 ust. 1 lit. b — wykonanie umowyObsługa konta, rezerwacji
Dane kontaktowe trenera (telefon)Art. 6 ust. 1 lit. b — wykonanie umowyKoordynacja treningów
Notatki treningowe (dane zdrowotne)Art. 9 ust. 2 lit. a — wyraźna zgodaŚwiadczenie usług rehabilitacyjnych
Historia rezerwacjiArt. 6 ust. 1 lit. b + lit. c — obowiązek prawnyFakturowanie, rozliczenia
Dane płatnicze (is_paid, price)Art. 6 ust. 1 lit. c — obowiązek prawnyDokumentacja finansowa

Prawa podmiotów danych

PrawoStatus implementacjiLokalizacja
Prawo dostępu (Art. 15)✅ CzęściowoUserProfile, MyBookings — klient widzi swoje dane
Prawo do sprostowania (Art. 16)✅ CzęściowoUserProfile — edycja danych osobowych
Prawo do usunięcia (Art. 17)⚠️ Wymaga implementacjiBrak "usuń konto" — wymagane przed produkcją
Prawo do przenoszenia (Art. 20)⚠️ Wymaga implementacjiBrak eksportu danych do JSON/CSV
Prawo sprzeciwu (Art. 21)⚠️ Wymaga implementacjiBrak mechanizmu opt-out
Prawo ograniczenia (Art. 18)⚠️ Wymaga implementacjiBrak 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 danychZalecany okres retencjiStatus
Dane konta użytkownikaDo usunięcia konta + 30 dni⚠️ Brak automatu usunięcia
Historia rezerwacji5 lat (obowiązek podatkowy)⚠️ Brak automatycznej archiwizacji
Notatki treningowe5 lat lub do cofnięcia zgody⚠️ is_archived = true, brak hard-delete
Logi systemowe90 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

App.jsx (Router + QueryClientProvider + AuthProvider)
└─ 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

WzorzecImplementacja
Provider PatternAuthContext, QueryClientProvider — stan globalny
Custom HookuseAuth() — dostęp do kontekstu auth z dowolnego komponentu
Container/PresentationalStrony = container (data fetch), shadcn/ui = presentational
Optimistic UIStatus rezerwacji zmienia się natychmiast, potem load()
Co-locationLogika i widok danej funkcji w jednym pliku strony
BaaS PatternBrak 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

base44
Edit with Base44