Replace sequential event IDs in URLs with unique alphanumeric slugs to prevent enumeration attacks. Event URLs now use format /events/{slug}/chat instead of /events/{id}/chat.
Backend changes:
- Add slug field (VARCHAR 50, unique) to Event model
- Create migration with auto-generated 12-char MD5-based slugs for existing events
- Update GET /api/events/:slug endpoint (changed from :id)
- Update GET /api/events/:slug/messages endpoint (changed from :eventId)
- Modify Socket.IO join_event_room to accept slug parameter
- Update send_event_message to use stored event context instead of passing eventId
Frontend changes:
- Update eventsAPI.getBySlug() method (changed from getById)
- Update eventsAPI.getMessages() to use slug parameter
- Change route from /events/:eventId/chat to /events/:slug/chat
- Update EventsPage to navigate using event.slug
- Update EventChatPage to fetch event data via slug and use slug in socket events
Security impact: Prevents attackers from discovering all events by iterating sequential IDs.
spotlight.cam 🎥
Aplikacja webowa (PWA) dla społeczności tanecznej umożliwiająca matchmaking, czatowanie i wymianę nagrań wideo bezpośrednio przez WebRTC (peer-to-peer).
🚀 Funkcjonalności (Mockup)
✅ Zaimplementowane (Frontend Mockup)
- Autoryzacja - logowanie i rejestracja (mock)
- Wybór eventu - przeglądanie i dołączanie do eventów tanecznych
- Czat eventowy - publiczny czat dla uczestników eventu z listą aktywnych użytkowników
- Matchmaking - łączenie się w pary bezpośrednio z czatu
- Czat 1:1 - prywatny czat dla sparowanych użytkowników
- 📹 Transfer wideo (mockup WebRTC) - symulacja przesyłania filmów P2P
- Wybór pliku z galerii urządzenia
- Symulacja połączenia WebRTC (connecting → connected)
- Progress bar transferu pliku
- Status połączenia (disconnected/connecting/connected/failed)
- Fallback: wysyłanie linków do filmów (Google Drive, Dropbox)
- System ocen - ocenianie partnera po współpracy (1-5 gwiazdek, komentarz)
- Historia współprac - lista poprzednich matchów i otrzymanych ocen
🔜 Do implementacji w kolejnych etapach
- Backend API (Node.js + Express + PostgreSQL)
- WebSocket (Socket.IO) - real-time chat i signaling
- WebRTC P2P - prawdziwy transfer plików przez RTCDataChannel
- Autentykacja JWT - prawdziwa autoryzacja
- Baza danych - PostgreSQL z pełnym schematem
🛠️ Stack Technologiczny
Frontend (Current)
- React 18 - framework UI
- Vite - build tool i dev server
- Tailwind CSS - stylowanie
- React Router - routing
- Lucide React - ikony
- Context API - zarządzanie stanem (auth)
Infrastructure
- Docker Compose - orkiestracja kontenerów
- Nginx - reverse proxy i serving statycznych plików
- Node.js 20 Alpine - kontener dla frontendu
📁 Struktura projektu
spotlightcam/
├── docker-compose.yml # Konfiguracja Docker Compose
├── nginx/ # Konfiguracja Nginx
│ ├── nginx.conf # Główna konfiguracja
│ └── conf.d/
│ └── default.conf # Proxy do frontendu (i backendu w przyszłości)
├── frontend/ # React PWA
│ ├── src/
│ │ ├── components/ # Komponenty React
│ │ │ ├── common/
│ │ │ ├── chat/
│ │ │ ├── video/
│ │ │ └── layout/ # Navbar, Layout
│ │ ├── pages/ # Strony aplikacji
│ │ │ ├── LoginPage.jsx
│ │ │ ├── RegisterPage.jsx
│ │ │ ├── EventsPage.jsx
│ │ │ ├── EventChatPage.jsx
│ │ │ ├── MatchChatPage.jsx # 🔥 Główna funkcjonalność - mockup WebRTC
│ │ │ ├── RatePartnerPage.jsx
│ │ │ └── HistoryPage.jsx
│ │ ├── contexts/ # Context API (AuthContext)
│ │ ├── hooks/ # Custom hooks
│ │ ├── utils/ # Utility functions
│ │ ├── services/ # API services (przyszłość)
│ │ └── mocks/ # Mock data
│ │ ├── events.js
│ │ ├── users.js
│ │ ├── messages.js
│ │ └── matches.js
│ ├── Dockerfile
│ └── package.json
└── docs/ # Dokumentacja
├── CONTEXT.md # Opis projektu
└── TODO.md # Lista zadań
🚀 Uruchomienie projektu
Wymagania
- Docker i Docker Compose
- (Opcjonalnie) Node.js 20+ dla developmentu bez Dockera
Uruchomienie z Docker Compose
- Sklonuj repozytorium:
git clone <repo-url>
cd spotlightcam
- Uruchom Docker Compose:
docker-compose up --build
- Otwórz przeglądarkę:
http://localhost:8080
Frontend Vite dev server działa na porcie 5173 (wewnątrz kontenera), ale jest dostępny przez Nginx na porcie 8080.
Zatrzymanie
docker-compose down
Rebuild po zmianach
docker-compose up --build
🧪 Testowanie aplikacji
Flow testowy:
-
Logowanie (http://localhost:8080/login)
- Wpisz dowolny email i hasło (mock auth)
- Zostaniesz zalogowany jako użytkownik "john_dancer"
-
Wybór eventu (http://localhost:8080/events)
- Wybierz jeden z eventów (np. "Warsaw Dance Festival 2025")
- Kliknij "Dołącz do czatu"
-
Czat eventowy
- Zobacz mockowane wiadomości w czacie publicznym
- Po prawej stronie lista aktywnych użytkowników
- Kliknij ikonę "+" przy użytkowniku aby się z nim połączyć
- Po 1 sekundzie zostaniesz przekierowany do prywatnego czatu 1:1
-
Czat 1:1 - Główna funkcjonalność! 🔥
- Zobacz profil partnera na górze
- Status WebRTC połączenia (disconnected/connecting/connected)
- Wysyłanie filmu przez WebRTC (mockup):
- Kliknij "Wyślij film (WebRTC)"
- Wybierz plik wideo z dysku
- Kliknij "Wyślij film (P2P)"
- Zobacz symulację:
- Status WebRTC: connecting → connected
- Progress bar transferu (0% → 100%)
- Informacja o przesłanym pliku w czacie
- Fallback - wysyłanie linku:
- Kliknij "Link"
- Wklej URL do filmu (np. Google Drive)
- Link pojawi się w czacie
-
Ocena partnera
- Kliknij "Zakończ i oceń"
- Wybierz ocenę (1-5 gwiazdek)
- Dodaj komentarz (opcjonalnie)
- Zaznacz czy chcesz współpracować ponownie
- Kliknij "Zapisz ocenę"
-
Historia współprac (http://localhost:8080/history)
- Zobacz listę twoich poprzednich matchów
- Zobacz otrzymane oceny
- Zobacz statystyki
🎨 Główne widoki
LoginPage & RegisterPage
- Formularz logowania/rejestracji
- Mock autoryzacja (dowolny email/hasło)
- Info box o demo mode
EventsPage
- Karty eventów z worldsdc.com
- Informacje: lokalizacja, daty, liczba uczestników
- Przycisk "Dołącz do czatu"
EventChatPage
- Czat publiczny dla eventu
- Lista aktywnych użytkowników (sidebar)
- Wysyłanie wiadomości
- Matchmaking przez ikonę "+"
MatchChatPage ⭐ (Główna funkcjonalność)
- Profil partnera
- Status WebRTC połączenia (disconnected/connecting/connected/failed)
- Czat 1:1
- Mockup transferu wideo WebRTC:
- Wybór pliku z galerii
- Symulacja nawiązywania połączenia WebRTC
- Progress bar (chunking simulation)
- Info o szyfrrowaniu E2E (DTLS/SRTP)
- Fallback: wysyłanie linków do filmów
- Przycisk "Zakończ i oceń"
RatePartnerPage
- Ocena partnera (1-5 gwiazdek)
- Pole komentarza
- Checkbox "Chcę współpracować ponownie"
HistoryPage
- Lista matchów
- Otrzymane oceny
- Statystyki użytkownika
📝 Mock Data
Aplikacja używa mock data dla wszystkich funkcjonalności:
- Users: 5 użytkowników testowych
- Events: 4 eventy (Warsaw, Berlin, Prague, Krakow)
- Messages: Przykładowe wiadomości w czatach
- Matches: 3 przykładowe matche
- Ratings: 3 przykładowe oceny
Mock data znajduje się w frontend/src/mocks/.
🔐 Bezpieczeństwo (Mockup)
W obecnej wersji (mockup):
- ✅ Autoryzacja jest symulowana (localStorage)
- ✅ WebRTC status jest symulowany
- ⏳ Backend API będzie dodany w kolejnym etapie
- ⏳ Prawdziwe WebRTC P2P będzie zaimplementowane później
- ⏳ JWT autoryzacja będzie dodana później
🎯 Kolejne kroki
Zobacz docs/TODO.md dla pełnej listy zadań. Najważniejsze:
- Backend setup - Node.js + Express + PostgreSQL
- WebSocket - Socket.IO dla real-time communication
- WebRTC Signaling - Serwer sygnalizacyjny (SDP/ICE exchange)
- WebRTC P2P Transfer - Prawdziwy transfer plików przez RTCDataChannel
- Autentykacja - JWT + bcrypt
- Testy - Unit, integration, E2E
- Deployment - Production setup
📖 Dokumentacja
Quick Start:
docs/SESSION_CONTEXT.md- Ultra-zwięzły kontekst dla wznowienia sesji (minimal tokens)
Main Documentation:
docs/CONTEXT.md- Główny opis projektu i założeńdocs/TODO.md- Aktywne zadania i roadmap
Detailed Documentation:
docs/ARCHITECTURE.md- Szczegóły techniczne i implementacyjnedocs/COMPLETED.md- Archiwum ukończonych zadańdocs/RESOURCES.md- Linki do dokumentacji i zasobów edukacyjnych
🤝 Contributing
Projekt jest w fazie MVP. Backend i prawdziwy WebRTC będą dodane w kolejnych etapach.
📄 License
TBD
Uwaga: To jest wersja mockup frontendu. WebRTC transfer jest symulowany. Pełna funkcjonalność (backend + prawdziwy WebRTC) będzie dostępna w kolejnych wersjach.