docs: update documentation for QR code check-in system
This commit is contained in:
@@ -99,6 +99,58 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## ✅ Phase 1.5 Continuation: QR Code Check-in System (COMPLETED)
|
||||||
|
|
||||||
|
**Completed:** 2025-11-14
|
||||||
|
**Time Spent:** ~4 hours
|
||||||
|
**Status:** Production-ready with security fixes
|
||||||
|
|
||||||
|
### QR Code Event Check-in Implementation
|
||||||
|
- [x] Database schema extension:
|
||||||
|
- EventCheckinToken model (id, event_id unique, token cuid unique, created_at)
|
||||||
|
- Migration: `20251114125544_add_event_checkin_tokens`
|
||||||
|
- One token per event (on-demand generation)
|
||||||
|
- [x] Backend endpoints:
|
||||||
|
- `GET /api/events/:slug/details` - Get event details with QR code token and participants
|
||||||
|
- `POST /api/events/checkin/:token` - Check-in to event via QR code scan
|
||||||
|
- `DELETE /api/events/:slug/leave` - Leave event (remove participation)
|
||||||
|
- Date validation (startDate - 1 day to endDate + 1 day, disabled in dev mode)
|
||||||
|
- Participant count updates (increment/decrement)
|
||||||
|
- [x] Frontend pages:
|
||||||
|
- EventDetailsPage.jsx - QR code display (qrcode.react), participant list, stats
|
||||||
|
- EventCheckinPage.jsx - Check-in confirmation screen with event info
|
||||||
|
- EventChatPage.jsx - Access control (verify participation before showing chat)
|
||||||
|
- EventsPage.jsx - Check-in requirement notice, dev-only details link
|
||||||
|
- [x] Security implementation:
|
||||||
|
- Frontend access control (check participation status)
|
||||||
|
- Socket.IO handler verification (prevent auto-participation)
|
||||||
|
- Dev-only QR code access (import.meta.env.DEV)
|
||||||
|
- Leave Event button with confirmation modal
|
||||||
|
- [x] UX improvements:
|
||||||
|
- Real participant counts using `_count.participants`
|
||||||
|
- Joined events shown first in events list
|
||||||
|
- Check-in required screen for non-participants
|
||||||
|
- Dev mode shortcuts for testing
|
||||||
|
- [x] Security fixes:
|
||||||
|
- Fixed bypass vulnerability (page refresh granting unauthorized access)
|
||||||
|
- Removed auto-participation from Socket.IO handler
|
||||||
|
- Added participant verification before room join
|
||||||
|
|
||||||
|
### Git Commits (QR Code Check-in)
|
||||||
|
1. `feat: add QR code event check-in system`
|
||||||
|
2. `fix: improve event check-in UX and participant counting`
|
||||||
|
3. `fix: prevent bypassing event check-in via page refresh`
|
||||||
|
|
||||||
|
### Key Features
|
||||||
|
- Physical presence requirement (QR code must be scanned at venue)
|
||||||
|
- On-demand token generation (created when admin views /details)
|
||||||
|
- Development mode bypass for date validation
|
||||||
|
- Secure token generation (CUID)
|
||||||
|
- Complete access control (frontend + backend + socket)
|
||||||
|
- Leave event functionality with confirmation
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🐳 1. Setup projektu i infrastruktura
|
## 🐳 1. Setup projektu i infrastruktura
|
||||||
|
|
||||||
### Docker Compose
|
### Docker Compose
|
||||||
@@ -309,5 +361,5 @@ docs: update TODO.md with completed tasks and next steps
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated:** 2025-11-12
|
**Last Updated:** 2025-11-14
|
||||||
**Note:** This file is an archive. For current tasks, see TODO.md
|
**Note:** This file is an archive. For current tasks, see TODO.md
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
- ✅ Docker Compose (nginx:8080 + frontend + backend + PostgreSQL)
|
- ✅ Docker Compose (nginx:8080 + frontend + backend + PostgreSQL)
|
||||||
- ✅ All frontend views with real API integration
|
- ✅ All frontend views with real API integration
|
||||||
- ✅ Backend API (Node.js + Express)
|
- ✅ Backend API (Node.js + Express)
|
||||||
- ✅ PostgreSQL database with 7 tables (Prisma ORM)
|
- ✅ PostgreSQL database with 8 tables (Prisma ORM)
|
||||||
- ✅ Real authentication (JWT + bcrypt)
|
- ✅ Real authentication (JWT + bcrypt)
|
||||||
- ✅ **Email verification (AWS SES with link + PIN code) - Phase 1.5**
|
- ✅ **Email verification (AWS SES with link + PIN code) - Phase 1.5**
|
||||||
- ✅ **Password reset workflow - Phase 1.5**
|
- ✅ **Password reset workflow - Phase 1.5**
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
- ✅ **Public profiles (/{username}) - Phase 1.5**
|
- ✅ **Public profiles (/{username}) - Phase 1.5**
|
||||||
- ✅ **Event participation tracking - Phase 1.5**
|
- ✅ **Event participation tracking - Phase 1.5**
|
||||||
- ✅ **Event security (unique slugs, no ID enumeration) - Phase 1.5**
|
- ✅ **Event security (unique slugs, no ID enumeration) - Phase 1.5**
|
||||||
|
- ✅ **QR code event check-in system - Phase 1.5** (requires physical presence at venue)
|
||||||
- ✅ Real-time chat (Socket.IO for event & match rooms)
|
- ✅ Real-time chat (Socket.IO for event & match rooms)
|
||||||
- ✅ WebRTC P2P transfer UI mockup
|
- ✅ WebRTC P2P transfer UI mockup
|
||||||
|
|
||||||
@@ -113,13 +114,15 @@
|
|||||||
- `frontend/src/pages/ResetPasswordPage.jsx` - Reset password with token
|
- `frontend/src/pages/ResetPasswordPage.jsx` - Reset password with token
|
||||||
- `frontend/src/pages/ProfilePage.jsx` - **UPDATED: Edit profile (social media, location) - Phase 1.5**
|
- `frontend/src/pages/ProfilePage.jsx` - **UPDATED: Edit profile (social media, location) - Phase 1.5**
|
||||||
- `frontend/src/pages/PublicProfilePage.jsx` - **NEW: View other user profiles - Phase 1.5**
|
- `frontend/src/pages/PublicProfilePage.jsx` - **NEW: View other user profiles - Phase 1.5**
|
||||||
- `frontend/src/pages/EventsPage.jsx` - **UPDATED: Real API, joined events first - Phase 1.5**
|
- `frontend/src/pages/EventsPage.jsx` - **UPDATED: Shows check-in requirement, dev-only QR access - Phase 1.5**
|
||||||
- `frontend/src/pages/EventChatPage.jsx` - **UPDATED: Uses slugs instead of IDs - Phase 1.5**
|
- `frontend/src/pages/EventChatPage.jsx` - **UPDATED: Access control with check-in verification, Leave Event - Phase 1.5**
|
||||||
|
- `frontend/src/pages/EventDetailsPage.jsx` - **NEW: QR code display, participant list - Phase 1.5**
|
||||||
|
- `frontend/src/pages/EventCheckinPage.jsx` - **NEW: Check-in confirmation page - Phase 1.5**
|
||||||
- `frontend/src/pages/MatchChatPage.jsx` - Private chat + WebRTC mockup
|
- `frontend/src/pages/MatchChatPage.jsx` - Private chat + WebRTC mockup
|
||||||
- `frontend/src/components/common/PasswordStrengthIndicator.jsx` - Password strength indicator
|
- `frontend/src/components/common/PasswordStrengthIndicator.jsx` - Password strength indicator
|
||||||
- `frontend/src/components/common/VerificationBanner.jsx` - Email verification banner
|
- `frontend/src/components/common/VerificationBanner.jsx` - Email verification banner
|
||||||
- `frontend/src/contexts/AuthContext.jsx` - JWT authentication integration
|
- `frontend/src/contexts/AuthContext.jsx` - JWT authentication integration
|
||||||
- `frontend/src/services/api.js` - **UPDATED: eventsAPI uses slugs - Phase 1.5**
|
- `frontend/src/services/api.js` - **UPDATED: QR check-in methods (checkin, getDetails, leave) - Phase 1.5**
|
||||||
- `frontend/src/services/socket.js` - Socket.IO client connection manager
|
- `frontend/src/services/socket.js` - Socket.IO client connection manager
|
||||||
- `frontend/src/data/countries.js` - **NEW: List of 195 countries - Phase 1.5**
|
- `frontend/src/data/countries.js` - **NEW: List of 195 countries - Phase 1.5**
|
||||||
|
|
||||||
@@ -127,17 +130,18 @@
|
|||||||
- `backend/src/controllers/auth.js` - Register, login, email verification, password reset
|
- `backend/src/controllers/auth.js` - Register, login, email verification, password reset
|
||||||
- `backend/src/controllers/user.js` - **UPDATED: Profile updates (social, location) - Phase 1.5**
|
- `backend/src/controllers/user.js` - **UPDATED: Profile updates (social, location) - Phase 1.5**
|
||||||
- `backend/src/controllers/wsdc.js` - WSDC API proxy for dancer lookup
|
- `backend/src/controllers/wsdc.js` - WSDC API proxy for dancer lookup
|
||||||
- `backend/src/routes/events.js` - **UPDATED: Uses slugs instead of IDs - Phase 1.5**
|
- `backend/src/routes/events.js` - **UPDATED: QR check-in endpoints (checkin, details, leave), participant verification - Phase 1.5**
|
||||||
- `backend/src/routes/users.js` - **UPDATED: Public profile endpoint - Phase 1.5**
|
- `backend/src/routes/users.js` - **UPDATED: Public profile endpoint - Phase 1.5**
|
||||||
- `backend/src/socket/index.js` - **UPDATED: Slug-based event rooms, participation tracking - Phase 1.5**
|
- `backend/src/socket/index.js` - **UPDATED: Participant verification before room join, security fix - Phase 1.5**
|
||||||
- `backend/src/utils/email.js` - AWS SES email service with HTML templates
|
- `backend/src/utils/email.js` - AWS SES email service with HTML templates
|
||||||
- `backend/src/utils/auth.js` - Token generation utilities
|
- `backend/src/utils/auth.js` - Token generation utilities
|
||||||
- `backend/src/middleware/auth.js` - Email verification middleware
|
- `backend/src/middleware/auth.js` - Email verification middleware
|
||||||
- `backend/src/middleware/validators.js` - **UPDATED: Social media URL validation - Phase 1.5**
|
- `backend/src/middleware/validators.js` - **UPDATED: Social media URL validation - Phase 1.5**
|
||||||
- `backend/src/server.js` - Express server with Socket.IO integration
|
- `backend/src/server.js` - Express server with Socket.IO integration
|
||||||
- `backend/prisma/schema.prisma` - **UPDATED: 7 tables (social, location, event_participants, slugs) - Phase 1.5**
|
- `backend/prisma/schema.prisma` - **UPDATED: 8 tables (EventCheckinToken added) - Phase 1.5**
|
||||||
- `backend/prisma/migrations/20251113151534_add_wsdc_and_email_verification/` - Phase 1.5 migration
|
- `backend/prisma/migrations/20251113151534_add_wsdc_and_email_verification/` - Phase 1.5 migration
|
||||||
- `backend/prisma/migrations/20251113202500_add_event_slug/` - **NEW: Event slugs migration - Phase 1.5**
|
- `backend/prisma/migrations/20251113202500_add_event_slug/` - **NEW: Event slugs migration - Phase 1.5**
|
||||||
|
- `backend/prisma/migrations/20251114125544_add_event_checkin_tokens/` - **NEW: QR check-in tokens - Phase 1.5**
|
||||||
|
|
||||||
**Config:**
|
**Config:**
|
||||||
- `docker-compose.yml` - nginx, frontend, backend, PostgreSQL
|
- `docker-compose.yml` - nginx, frontend, backend, PostgreSQL
|
||||||
@@ -148,7 +152,7 @@
|
|||||||
|
|
||||||
## Database Schema (Implemented - Prisma)
|
## Database Schema (Implemented - Prisma)
|
||||||
|
|
||||||
7 tables with relations:
|
8 tables with relations:
|
||||||
- `users` - **EXTENDED in Phase 1.5:**
|
- `users` - **EXTENDED in Phase 1.5:**
|
||||||
- Base: id, username, email, password_hash, avatar, created_at, updated_at
|
- Base: id, username, email, password_hash, avatar, created_at, updated_at
|
||||||
- **WSDC:** first_name, last_name, wsdc_id
|
- **WSDC:** first_name, last_name, wsdc_id
|
||||||
@@ -158,6 +162,7 @@
|
|||||||
- **Location:** country, city
|
- **Location:** country, city
|
||||||
- `events` - id, **slug (unique)**, name, location, start_date, end_date, description, worldsdc_id, participants_count
|
- `events` - id, **slug (unique)**, name, location, start_date, end_date, description, worldsdc_id, participants_count
|
||||||
- `event_participants` - **NEW in Phase 1.5:** id, user_id, event_id, joined_at (many-to-many)
|
- `event_participants` - **NEW in Phase 1.5:** id, user_id, event_id, joined_at (many-to-many)
|
||||||
|
- `event_checkin_tokens` - **NEW in Phase 1.5:** id, event_id (unique), token (cuid, unique), created_at
|
||||||
- `chat_rooms` - id, event_id, match_id, type (event/private), created_at
|
- `chat_rooms` - id, event_id, match_id, type (event/private), created_at
|
||||||
- `messages` - id, room_id, user_id, content, type, created_at
|
- `messages` - id, room_id, user_id, content, type, created_at
|
||||||
- `matches` - id, user1_id, user2_id, event_id, room_id, status, created_at
|
- `matches` - id, user1_id, user2_id, event_id, room_id, status, created_at
|
||||||
@@ -167,6 +172,7 @@
|
|||||||
- `20251112205214_init` - Initial schema
|
- `20251112205214_init` - Initial schema
|
||||||
- `20251113151534_add_wsdc_and_email_verification` - Phase 1.5 (email, WSDC, social, location)
|
- `20251113151534_add_wsdc_and_email_verification` - Phase 1.5 (email, WSDC, social, location)
|
||||||
- `20251113202500_add_event_slug` - **Phase 1.5 (event security - unique slugs)**
|
- `20251113202500_add_event_slug` - **Phase 1.5 (event security - unique slugs)**
|
||||||
|
- `20251114125544_add_event_checkin_tokens` - **Phase 1.5 (QR code check-in system)**
|
||||||
|
|
||||||
**Seed data:** 3 events, 2 users, event chat rooms
|
**Seed data:** 3 events, 2 users, event chat rooms
|
||||||
|
|
||||||
@@ -314,8 +320,10 @@ RUN apk add --no-cache openssl
|
|||||||
- `/reset-password/:token` - Reset password with token
|
- `/reset-password/:token` - Reset password with token
|
||||||
- `/profile` - Edit user profile (social media, location)
|
- `/profile` - Edit user profile (social media, location)
|
||||||
- `/:username` - Public profile view
|
- `/:username` - Public profile view
|
||||||
- `/events` - Event list (joined events first)
|
- `/events` - Event list (joined events first, check-in requirement notice)
|
||||||
- `/events/:slug/chat` - Event chat (public, real-time Socket.IO)
|
- `/events/:slug/chat` - Event chat (requires check-in, real-time Socket.IO)
|
||||||
|
- `/events/:slug/details` - **NEW:** Event details with QR code, participant list
|
||||||
|
- `/events/checkin/:token` - **NEW:** QR code check-in confirmation page
|
||||||
- `/matches/:id/chat` - Private 1:1 chat + WebRTC mockup
|
- `/matches/:id/chat` - Private 1:1 chat + WebRTC mockup
|
||||||
- `/matches/:id/rate` - Rate partner
|
- `/matches/:id/rate` - Rate partner
|
||||||
- `/history` - Match history
|
- `/history` - Match history
|
||||||
@@ -354,7 +362,7 @@ RUN apk add --no-cache openssl
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated:** 2025-11-13
|
**Last Updated:** 2025-11-14
|
||||||
**Phase 1 Status:** ✅ COMPLETED - Backend Foundation (Express + PostgreSQL + JWT + Socket.IO)
|
**Phase 1 Status:** ✅ COMPLETED - Backend Foundation (Express + PostgreSQL + JWT + Socket.IO)
|
||||||
**Phase 1.5 Status:** ✅ COMPLETED - Email Verification & WSDC Integration & User Profiles & Security
|
**Phase 1.5 Status:** ✅ COMPLETED - Email Verification & WSDC Integration & User Profiles & Security
|
||||||
- AWS SES email verification (link + PIN)
|
- AWS SES email verification (link + PIN)
|
||||||
@@ -364,4 +372,5 @@ RUN apk add --no-cache openssl
|
|||||||
- Public profiles (/{username})
|
- Public profiles (/{username})
|
||||||
- Event participation tracking
|
- Event participation tracking
|
||||||
- Event security (unique slugs, no ID enumeration)
|
- Event security (unique slugs, no ID enumeration)
|
||||||
|
- **QR code event check-in system** (physical presence required, dev mode bypass)
|
||||||
**Next Phase:** Phase 2 - Core Features (Matches API + Ratings + WebRTC)
|
**Next Phase:** Phase 2 - Core Features (Matches API + Ratings + WebRTC)
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
- Public profiles (/{username})
|
- Public profiles (/{username})
|
||||||
- Event participation tracking (auto-save joined events)
|
- Event participation tracking (auto-save joined events)
|
||||||
- Event security (unique slugs, prevent ID enumeration)
|
- Event security (unique slugs, prevent ID enumeration)
|
||||||
|
- **QR code event check-in system** (physical presence required at venue)
|
||||||
|
|
||||||
### ⏳ Next Priority
|
### ⏳ Next Priority
|
||||||
**Core Features** - Matches API + Ratings + WebRTC Signaling
|
**Core Features** - Matches API + Ratings + WebRTC Signaling
|
||||||
@@ -256,4 +257,4 @@ git commit -m "feat: description"
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated:** 2025-11-13
|
**Last Updated:** 2025-11-14
|
||||||
|
|||||||
Reference in New Issue
Block a user