# spotlight.cam πŸŽ₯ Web application (PWA) for the dance community enabling matchmaking, chat, and video file exchange directly via WebRTC (peer-to-peer). ## πŸš€ Features ### βœ… Implemented **Authentication & Security:** - βœ… **JWT Authentication** - real authentication with bcrypt password hashing - βœ… **Email Verification** - email verification via AWS SES (link + PIN code) - βœ… **Password Reset** - complete password reset workflow - βœ… **WSDC Integration** - auto-fill data from worldsdc.com during registration - βœ… **Event Slugs** - unique alphanumeric identifiers preventing ID enumeration attacks **User Profiles:** - βœ… **User Profiles** - profile editing (first name, last name, WSDC ID) - βœ… **Social Media Links** - YouTube, Instagram, Facebook, TikTok - βœ… **Location** - country (dropdown with 195 countries) and city - βœ… **Public Profiles** - visible to other logged-in users at /{username} - βœ… **Profile Statistics** - number of matches, average rating, number of reviews **Events & Chat:** - βœ… **Event List** - browse dance events from worldsdc.com - βœ… **Event Participation Tracking** - automatic saving of joined events - βœ… **Real-time Event Chat** - Socket.IO chat for event participants - βœ… **Active Users Sidebar** - list of online users in the event - βœ… **Message History** - message persistence in database - βœ… **Infinite Scroll** - loading older messages **Matchmaking & Private Chat:** - βœ… **Match Requests** - send and accept match requests with real-time notifications - βœ… **Match Management** - view pending/active matches, accept/reject requests - βœ… **Private 1:1 Chat** - private chat for matched users with Socket.IO and message history - βœ… **Match Slugs** - secure random slugs (CUID) preventing ID enumeration **Ratings & Reviews:** - βœ… **Partner Ratings** - rate collaboration partners (1-5 stars, comments) - βœ… **Collaboration Preferences** - "would collaborate again" indicator - βœ… **Public Rating Display** - ratings visible on public user profiles - βœ… **Duplicate Prevention** - users can only rate each match once - βœ… **Auto-completion** - matches auto-complete when both partners have rated **WebRTC P2P File Transfer:** - βœ… **WebRTC Signaling** - SDP/ICE exchange via Socket.IO - βœ… **P2P File Transfer** - RTCDataChannel with 16KB chunking (tested up to 700MB) - βœ… **WebRTC Detection** - automatic detection of browser capabilities - βœ… **Fallback UX** - user-friendly warnings when WebRTC blocked - βœ… **Real-time Progress** - transfer progress monitoring for sender/receiver - βœ… **E2E Encryption** - DTLS encryption (native WebRTC) - βœ… **Auto Download** - automatic file download on receiver side **Landing Page:** - βœ… **Homepage** - professional landing page with hero section, features showcase, and CTAs - βœ… **Public Access** - accessible to non-logged users with links to register/login - βœ… **Responsive Design** - mobile-friendly with gradient backgrounds **Backend & Infrastructure:** - βœ… **PostgreSQL Database** - 7 tables with relations (Prisma ORM) - βœ… **RESTful API** - Express.js backend with validation - βœ… **WebSocket** - Socket.IO for real-time communication - βœ… **Docker Compose** - full orchestration (nginx, frontend, backend, PostgreSQL) - βœ… **Test Coverage** - comprehensive test suite for WebRTC, Auth, Events, Matches - βœ… **WebRTC Tests** - full Socket.IO signaling and detection tests (7 tests passing) ### πŸ”œ Next Up - ⏳ **Competition Heats** - complete UI integration and real-time updates - ⏳ **PWA Features** - manifest, service worker, offline support - ⏳ **Security Hardening** - CORS, CSRF, Helmet.js, CSP ## πŸ› οΈ Tech Stack ### Frontend - **React 18** - UI framework - **Vite** - build tool and dev server - **Tailwind CSS v3.4.0** - styling - **React Router** - routing - **Lucide React** - icons - **Context API** - state management (auth) - **Socket.IO Client** - real-time WebSocket communication - **WebRTC** - P2P file transfer (RTCPeerConnection, RTCDataChannel) ### Backend - **Node.js 20** - runtime - **Express 4.18** - web framework - **PostgreSQL 15** - relational database - **Prisma ORM 5.22** - type-safe database client - **Socket.IO 4.8** - WebSocket server - **bcrypt** - password hashing - **JWT** - token-based authentication - **AWS SES** - email service - **Jest + Supertest** - testing (81%+ coverage) ### Infrastructure - **Docker Compose** - container orchestration (dev + prod profiles) - **Nginx** - reverse proxy & static file serving - **Alpine Linux** - lightweight container base images ## πŸ“ Project Structure ``` spotlightcam/ β”œβ”€β”€ docker-compose.yml # Container orchestration (dev + prod profiles) β”œβ”€β”€ nginx/ # Nginx reverse proxy config β”‚ β”œβ”€β”€ nginx.conf β”‚ └── conf.d/default.conf # Proxy /api & /socket.io to backend β”œβ”€β”€ frontend/ # React PWA β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ components/ # React components β”‚ β”‚ β”‚ β”œβ”€β”€ common/ # Shared components, PasswordStrength, VerificationBanner β”‚ β”‚ β”‚ β”œβ”€β”€ chat/ # Chat components β”‚ β”‚ β”‚ β”œβ”€β”€ video/ # WebRTC components (WebRTCWarning) β”‚ β”‚ β”‚ β”œβ”€β”€ layout/ # Navbar, Layout β”‚ β”‚ β”‚ └── __tests__/ # Component tests (WebRTCWarning) β”‚ β”‚ β”œβ”€β”€ pages/ # Application pages β”‚ β”‚ β”‚ β”œβ”€β”€ HomePage.jsx # Landing page with hero & features β”‚ β”‚ β”‚ β”œβ”€β”€ LoginPage.jsx β”‚ β”‚ β”‚ β”œβ”€β”€ RegisterPage.jsx # Two-step registration with WSDC lookup β”‚ β”‚ β”‚ β”œβ”€β”€ VerifyEmailPage.jsx # Email verification (link + PIN) β”‚ β”‚ β”‚ β”œβ”€β”€ ForgotPasswordPage.jsx # Request password reset β”‚ β”‚ β”‚ β”œβ”€β”€ ResetPasswordPage.jsx # Reset password with token β”‚ β”‚ β”‚ β”œβ”€β”€ ProfilePage.jsx # Edit profile (social media, location) β”‚ β”‚ β”‚ β”œβ”€β”€ PublicProfilePage.jsx # View other user's profile β”‚ β”‚ β”‚ β”œβ”€β”€ EventsPage.jsx # Event list with real API β”‚ β”‚ β”‚ β”œβ”€β”€ EventChatPage.jsx # Real-time event chat β”‚ β”‚ β”‚ β”œβ”€β”€ MatchChatPage.jsx # Private chat + WebRTC P2P transfer β”‚ β”‚ β”‚ β”œβ”€β”€ RatePartnerPage.jsx # Rate partner after collaboration β”‚ β”‚ β”‚ └── HistoryPage.jsx # Match history β”‚ β”‚ β”œβ”€β”€ hooks/ # Custom hooks (useWebRTC) β”‚ β”‚ β”œβ”€β”€ utils/ # Utilities (webrtcDetection) β”‚ β”‚ β”‚ └── __tests__/ # Utility tests (webrtcDetection) β”‚ β”‚ β”œβ”€β”€ contexts/ # AuthContext (JWT integration) β”‚ β”‚ β”œβ”€β”€ services/ # API client, Socket.IO client β”‚ β”‚ β”œβ”€β”€ data/ # Static data (countries list) β”‚ β”‚ └── mocks/ # Mock data (for UI development) β”‚ β”œβ”€β”€ Dockerfile # Development container β”‚ β”œβ”€β”€ Dockerfile.prod # Production build β”‚ └── package.json β”œβ”€β”€ backend/ # Node.js + Express API β”‚ β”œβ”€β”€ src/ β”‚ β”‚ β”œβ”€β”€ controllers/ # Auth, users, events, WSDC β”‚ β”‚ β”œβ”€β”€ middleware/ # Auth, validation, error handling β”‚ β”‚ β”œβ”€β”€ routes/ # API routes β”‚ β”‚ β”œβ”€β”€ socket/ # Socket.IO server (event/match rooms, WebRTC signaling) β”‚ β”‚ β”œβ”€β”€ utils/ # Auth utils, DB, email service (AWS SES) β”‚ β”‚ └── __tests__/ # Jest unit tests β”‚ β”‚ β”‚ β”œβ”€β”€ socket-webrtc.test.js # WebRTC signaling tests (7 tests) β”‚ β”‚ β”‚ β”œβ”€β”€ auth.test.js # Authentication tests β”‚ β”‚ β”‚ β”œβ”€β”€ events.test.js # Events API tests β”‚ β”‚ β”‚ β”œβ”€β”€ matches.test.js # Matches API tests β”‚ β”‚ β”‚ └── ... # Other test suites β”‚ β”œβ”€β”€ prisma/ β”‚ β”‚ β”œβ”€β”€ schema.prisma # Database schema (7 tables) β”‚ β”‚ β”œβ”€β”€ migrations/ # Database migrations β”‚ β”‚ └── seed.js # Seed data β”‚ β”œβ”€β”€ Dockerfile # Development container β”‚ β”œβ”€β”€ Dockerfile.prod # Production build β”‚ └── package.json └── docs/ # Documentation β”œβ”€β”€ SESSION_CONTEXT.md # Quick session context (minimal tokens) β”œβ”€β”€ CONTEXT.md # Full project description β”œβ”€β”€ TODO.md # Task list & roadmap β”œβ”€β”€ ARCHITECTURE.md # Technical details β”œβ”€β”€ COMPLETED.md # Completed tasks archive β”œβ”€β”€ PHASE_1.5.md # Phase 1.5 documentation β”œβ”€β”€ SECURITY_AUDIT.md # Security audit & fixes β”œβ”€β”€ DEPLOYMENT.md # Deployment guide └── RESOURCES.md # Learning resources ``` ## πŸš€ Getting Started ### Requirements - Docker and Docker Compose - (Optional) Node.js 20+ for development without Docker ### Development Mode 1. Clone the repository: ```bash git clone cd spotlightcam ``` 2. Copy example .env file: ```bash cp backend/.env.example backend/.env ``` 3. Start Docker Compose with dev profile: ```bash docker compose --profile dev up ``` 4. Open browser: ``` http://localhost:8080 ``` ### Production Mode ```bash docker compose --profile prod up -d ``` ### Service Access **Development:** - Frontend: http://localhost:8080 - Backend API: http://localhost:8080/api - WebSocket: ws://localhost:8080/socket.io - Health check: http://localhost:8080/api/health - PostgreSQL: localhost:5432 (exposed for dev tools) **Production:** - Application: http://localhost (port 80) - HTTPS: https://localhost (port 443, requires SSL certificates) - PostgreSQL: internal only (not exposed) ### Stopping Services ```bash # Development docker compose --profile dev down # Production docker compose --profile prod down ``` ### Rebuild After Changes ```bash docker compose --profile dev down docker compose --profile dev up --build ``` ## πŸ—„οΈ Database Schema 7 tables with relations (Prisma ORM): 1. **users** - users - Base: id, username, email, password_hash, avatar, created_at, updated_at - WSDC: first_name, last_name, wsdc_id - Email: email_verified, verification_token, verification_code, verification_token_expiry - Password Reset: reset_token, reset_token_expiry - Social: youtube_url, instagram_url, facebook_url, tiktok_url - Location: country, city 2. **events** - dance events - id, slug (unique), name, location, start_date, end_date, description, worldsdc_id, participants_count 3. **event_participants** - event participants (many-to-many) - id, user_id, event_id, joined_at 4. **chat_rooms** - chat rooms - id, event_id, type (event/private), created_at 5. **messages** - messages - id, room_id, user_id, content, type (text/link/video), created_at 6. **matches** - user pairs - id, slug (unique cuid), user1_id, user2_id, event_id, room_id, status (pending/accepted/completed), created_at 7. **ratings** - ratings - id, match_id, rater_id, rated_id, score (1-5), comment, would_collaborate_again, created_at - Unique constraint: (match_id, rater_id, rated_id) - prevents duplicate ratings ### Migrations ```bash # Development (inside backend container) docker compose exec backend npx prisma migrate dev # Production docker compose exec backend-prod npx prisma migrate deploy # Generate Prisma Client docker compose exec backend npx prisma generate ``` ### Seed Data ```bash docker compose exec backend npx prisma db seed ``` Adds: - 3 events (Warsaw, Barcelona, HerrΓ€ng) - 2 users (john_doe, jane_smith) - Event chat rooms ## πŸ§ͺ Testing the Application ### Test Flow: 1. **Landing Page** (http://localhost:8080/) - View professional landing page with hero section - Explore features showcase and how-it-works section - Click "Get Started" to register or "Sign in" to login 2. **Registration with WSDC** (http://localhost:8080/register) - Optional: provide WSDC ID (e.g., 12345) for auto-fill - Complete registration form - You'll receive verification email (check AWS SES sandbox) 3. **Email Verification** (http://localhost:8080/verify-email) - Click link from email OR enter 6-digit PIN code - Email will be verified 4. **Login** (http://localhost:8080/login) - Email: john@example.com - Password: password123 5. **Profile Editing** (http://localhost:8080/profile) - Add social media links (Instagram, YouTube, etc.) - Select country from list of 195 countries - Enter city - Edit WSDC ID, first name, last name 6. **Event Selection** (http://localhost:8080/events) - View event list (joined events appear at top) - Select event (e.g., "Warsaw Dance Festival 2025") - Click "Join chat" or "Open chat" (if already joined) 7. **Event Chat** - Real-time chat with Socket.IO - Active users list on the right side - Click "+" icon next to user to connect - You'll be redirected to private 1:1 chat 8. **1:1 Chat - WebRTC P2P File Transfer** πŸ”₯ - See partner's profile at top (click username to view public profile) - WebRTC connection status (disconnected/connecting/connected) - **Sending video via WebRTC:** - Click "Send video (WebRTC)" - Select video file from disk - Real P2P transfer via RTCDataChannel with STUN servers for NAT traversal - Supports files up to 700MB+ tested successfully - See real-time progress bar (16KB chunking) - Receiver automatically downloads the file - End-to-end encryption via DTLS (native WebRTC) - **WebRTC Detection:** - Automatic detection if WebRTC is blocked - User-friendly warning with fix suggestions - Button disabled when WebRTC unavailable - **Fallback - link sharing:** - Click "Link" - Paste video URL (Google Drive, Dropbox, etc.) - Alternative when WebRTC blocked (Opera, VPNs, privacy settings) 9. **Rate Partner** - Click "Finish and rate" - Select rating (1-5 stars) - Add comment - Mark if you want to collaborate again 10. **Collaboration History** (http://localhost:8080/history) - See list of matches - See received ratings - See statistics 11. **Public Profiles** - Click on another user's username - View profile: avatar, location, social media, statistics ## 🧰 Admin CLI Use an in-container admin console for quick maintenance. - Start REPL (default): `docker compose exec backend npm run cli` - Explicit REPL: `docker compose exec backend npm run cli -- repl` - List users: `docker compose exec backend npm run cli -- users:list --limit 20` - Create user: `docker compose exec backend npm run cli -- users:create --email admin@example.com --username admin --password 'Secret123!'` - Verify email: `docker compose exec backend npm run cli -- users:verify --email admin@example.com` - List events: `docker compose exec backend npm run cli -- events:list --limit 10` - Event details by slug: `docker compose exec backend npm run cli -- events:details --slug warsaw-dance-2025 [--participants 25]` - Event participants: `docker compose exec backend npm run cli -- events:participants --slug warsaw-dance-2025 --limit 100` - Event participants CSV: `docker compose exec backend npm run cli -- events:participants --slug warsaw-dance-2025 --limit 200 --csv > participants.csv` - List matches: `docker compose exec backend npm run cli -- matches:list --limit 20 [--status accepted|pending|completed]` - Check-in user to event (simulate QR): `docker compose exec backend npm run cli -- events:checkin --username john_doe --slug warsaw-dance-2025` - App logs (if LOG_FILE configured): `docker compose exec backend npm run cli -- logs:app --lines 200` - Recent chat messages: `docker compose exec backend npm run cli -- logs:messages --limit 50` Production equivalents use `backend-prod` instead of `backend`. REPL specifics: - Inside REPL use `run('users:list --limit 20')` or `.cli users:list --limit 20`. - Top-level await works for Prisma: `await prisma.user.findMany({ take: 5 })`. ## πŸ” Security ### Implemented Security Features: βœ… **Authentication:** - bcrypt password hashing (10 salt rounds) - JWT tokens (httpOnly cookies in production) - Protected routes with auth middleware - Email verification required βœ… **Input Validation:** - express-validator for all inputs - Custom validators for URLs (domain checking) - SQL injection prevention (Prisma parameterized queries) - XSS protection (input sanitization) βœ… **Rate Limiting:** - Login attempts: 5 per 15 minutes - Registration: 3 per hour - Email sending: 3 per hour βœ… **Database:** - Unique constraints on emails, usernames - Indexed fields for performance - Cascading deletes for data integrity βœ… **Event Security:** - Unique alphanumeric slugs (12 chars, MD5-based) - Prevents ID enumeration attacks - URLs: /events/{slug}/chat instead of /events/{id}/chat βœ… **Socket.IO:** - JWT authentication for WebSocket connections - Room-based access control - User verification before joining rooms ### Planned Security Features (Phase 3): ⏳ CORS configuration ⏳ CSRF protection (cookies) ⏳ Helmet.js security headers ⏳ Content Security Policy ⏳ HTTPS enforcement (production) ## πŸ“Š Test Coverage **Backend: ~43% overall coverage** (116 tests passing) - **WebRTC Signaling**: 7/7 tests passing (offer/answer/ICE relay, authorization) - **Auth Controllers**: 82.9% coverage - **Events API**: Comprehensive tests - **Matches API**: Full CRUD tests - **Socket.IO**: 42.4% coverage (WebRTC + chat) **Frontend: Test files ready** (requires test runner setup) - WebRTC detection utility tests - WebRTC warning component tests **Coverage gaps** (priority areas): - Routes: events.js (8.98%), matches.js (8.22%), users.js (43%) - Controllers: user.js (8.19%) - Utils: sanitize.js (31.81%) ```bash # Run all backend tests docker compose exec backend npm test # Run specific test suite docker compose exec backend npm test -- socket-webrtc.test.js # Coverage report docker compose exec backend npm run test:coverage ``` ## 🎯 Roadmap ### βœ… Phase 0: Frontend Mockup (COMPLETED) - All views with mock data - WebRTC UI mockup - Routing & navigation ### βœ… Phase 1: Backend Foundation (COMPLETED) - Node.js + Express + PostgreSQL - JWT authentication - Socket.IO real-time chat - Test coverage 81%+ ### βœ… Phase 1.5: Email & WSDC Integration (COMPLETED) - Email verification (AWS SES) - Password reset workflow - WSDC API integration - User profiles with social media & location - Public profiles - Event participation tracking - Event security (slugs) ### βœ… Phase 2: Matches & Ratings API (COMPLETED) - Matches API (create/accept match requests with slugs) - Real-time match notifications via Socket.IO - Ratings API (1-5 stars, comments, collaboration preferences) - Public profile ratings display - Profile links from chat and matches pages - Message history for matches - Duplicate rating prevention ### βœ… Phase 2.5: WebRTC P2P File Transfer (COMPLETED) - WebRTC signaling (SDP/ICE exchange via Socket.IO) - P2P file transfer via RTCDataChannel (16KB chunking) - STUN servers for NAT traversal (production-ready) - WebRTC capability detection (browser/network compatibility) - User-friendly fallback UX when WebRTC blocked - Tested up to 700MB file transfers - E2E encryption (DTLS) - Comprehensive test suite (7 backend tests passing) - Professional landing page with hero section ### ⏳ Phase 3: MVP Finalization (IN PROGRESS) - βœ… Landing page (completed) - βœ… WebRTC tests (completed) - ⏳ Security hardening (CORS, CSRF, Helmet.js, CSP) - ⏳ Integration & E2E tests - ⏳ PWA features (manifest, service worker) - ⏳ Production deployment - ⏳ Monitoring & logging ### ⏳ Phase 4: Extensions (FUTURE) - User badges & trust system - Block users - Push notifications - Video compression - Multi-file transfer ## πŸ“– Documentation **Quick Start:** - `docs/SESSION_CONTEXT.md` - Quick context for resuming sessions (minimal tokens) **Main Documentation:** - `docs/CONTEXT.md` - Main project description and assumptions - `docs/TODO.md` - Active tasks and roadmap **Detailed Documentation:** - `docs/ARCHITECTURE.md` - Technical details and implementation - `docs/PHASE_1.5.md` - Phase 1.5 documentation (Email & WSDC) - `docs/SECURITY_AUDIT.md` - Security audit & fixes - `docs/DEPLOYMENT.md` - Deployment guide - `docs/ADMIN_CLI.md` - Admin CLI & REPL usage - `docs/COMPLETED.md` - Completed tasks archive - `docs/RESOURCES.md` - Links to documentation and learning resources ## 🀝 Contributing Project is in development phase. Currently implementing Phase 2 (Matches & Ratings API, WebRTC P2P transfer). ### Git workflow: ```bash git status git add . git commit -m "feat: description" ``` **Note:** Commit messages without mentions of AI/automatic generation. ## πŸ“„ License TBD --- **Current Status:** Phase 2.5 (WebRTC) βœ… Completed | Phase 3 (MVP) ⏳ In Progress | Progress: ~80% overall **Last Updated:** 2025-11-15