# ThrillWiki Django Backend Migration Plan ## 🎯 Project Overview **Objective**: Migrate ThrillWiki from Supabase backend to Django REST backend while preserving 100% of functionality. **Timeline**: 12-16 weeks with 2 developers **Status**: Foundation Phase - In Progress **Branch**: `django-backend` --- ## 📊 Architecture Overview ### Current Stack (Supabase) - **Frontend**: React 18.3 + TypeScript + Vite + React Query - **Backend**: Supabase (PostgreSQL + Edge Functions) - **Database**: PostgreSQL with 80+ tables - **Auth**: Supabase Auth (OAuth + MFA) - **Storage**: CloudFlare Images - **Notifications**: Novu Cloud - **Real-time**: Supabase Realtime ### Target Stack (Django) - **Frontend**: React 18.3 + TypeScript + Vite (unchanged) - **Backend**: Django 4.2 + django-ninja - **Database**: PostgreSQL (migrated schema) - **Auth**: Django + django-allauth + django-otp - **Storage**: CloudFlare Images (unchanged) - **Notifications**: Novu Cloud (unchanged) - **Real-time**: Django Channels + WebSockets - **Tasks**: Celery + Redis - **Caching**: Redis + django-cacheops --- ## 🏗️ Project Structure ``` django/ ├── manage.py ├── config/ # Project settings │ ├── settings/ │ │ ├── __init__.py │ │ ├── base.py # Shared settings │ │ ├── local.py # Development │ │ └── production.py # Production │ ├── urls.py │ ├── wsgi.py │ └── asgi.py # For Channels │ ├── apps/ │ ├── core/ # Base models, utilities │ │ ├── models.py # Abstract base models │ │ ├── permissions.py # Reusable permissions │ │ ├── mixins.py # Model mixins │ │ └── utils.py │ │ │ ├── entities/ # Parks, Rides, Companies │ │ ├── models/ │ │ │ ├── park.py │ │ │ ├── ride.py │ │ │ ├── company.py │ │ │ └── ride_model.py │ │ ├── api/ │ │ │ ├── views.py │ │ │ ├── serializers.py │ │ │ └── filters.py │ │ ├── services.py │ │ └── tasks.py │ │ │ ├── moderation/ # Content moderation │ │ ├── models.py │ │ ├── state_machine.py # django-fsm workflow │ │ ├── services.py │ │ └── api/ │ │ │ ├── versioning/ # Entity versioning │ │ ├── models.py │ │ ├── signals.py │ │ └── services.py │ │ │ ├── users/ # User management │ │ ├── models.py │ │ ├── managers.py │ │ └── api/ │ │ │ ├── media/ # Photo management │ │ ├── models.py │ │ ├── storage.py │ │ └── tasks.py │ │ │ └── notifications/ # Notification system │ ├── models.py │ ├── providers/ │ │ └── novu.py │ └── tasks.py │ ├── api/ │ └── v1/ │ ├── router.py # Main API router │ └── schemas.py # Pydantic schemas │ └── scripts/ ├── migrate_from_supabase.py └── validate_data.py ``` --- ## 📋 Implementation Phases ### ✅ Phase 0: Foundation (CURRENT - Week 1) - [x] Create git branch `django-backend` - [x] Set up Python virtual environment - [x] Install all dependencies (Django 4.2, django-ninja, celery, etc.) - [x] Create Django project structure - [x] Create app directories - [x] Create .env.example - [ ] Configure Django settings (base, local, production) - [ ] Create base models and utilities - [ ] Set up database connection - [ ] Create initial migrations ### Phase 1: Core Models (Week 2-3) - [ ] Create abstract base models (TimeStamped, Versioned, etc.) - [ ] Implement entity models (Park, Ride, Company, RideModel) - [ ] Implement location models - [ ] Implement user models with custom User - [ ] Implement photo/media models - [ ] Create Django migrations - [ ] Test model relationships ### Phase 2: Authentication System (Week 3-4) - [ ] Set up django-allauth for OAuth (Google, Discord) - [ ] Implement JWT authentication with djangorestframework-simplejwt - [ ] Set up django-otp for MFA (TOTP) - [ ] Create user registration/login endpoints - [ ] Implement permission system (django-guardian) - [ ] Create role-based access control - [ ] Test authentication flow ### Phase 3: Moderation System (Week 5-7) - [ ] Create ContentSubmission and SubmissionItem models - [ ] Implement django-fsm state machine - [ ] Create ModerationService with atomic transactions - [ ] Implement submission creation endpoints - [ ] Implement approval/rejection endpoints - [ ] Implement selective approval logic - [ ] Create moderation queue API - [ ] Add rate limiting with django-ratelimit - [ ] Test moderation workflow end-to-end ### Phase 4: Versioning System (Week 7-8) - [ ] Create version models for all entities - [ ] Implement django-lifecycle hooks for auto-versioning - [ ] Create VersioningService - [ ] Implement version history endpoints - [ ] Add version diff functionality - [ ] Test versioning with submissions ### Phase 5: API Layer with django-ninja (Week 8-10) - [ ] Set up django-ninja router - [ ] Create Pydantic schemas for all entities - [ ] Implement CRUD endpoints for parks - [ ] Implement CRUD endpoints for rides - [ ] Implement CRUD endpoints for companies - [ ] Add filtering with django-filter - [ ] Add search functionality - [ ] Implement pagination - [ ] Add API documentation (auto-generated) - [ ] Test all endpoints ### Phase 6: Celery Tasks (Week 10-11) - [ ] Set up Celery with Redis - [ ] Set up django-celery-beat for periodic tasks - [ ] Migrate edge functions to Celery tasks: - [ ] cleanup_old_page_views - [ ] update_entity_view_counts - [ ] process_submission_notifications - [ ] generate_daily_stats - [ ] Create notification tasks for Novu - [ ] Set up Flower for monitoring - [ ] Test async task execution ### Phase 7: Real-time Features (Week 11-12) - [ ] Set up Django Channels with Redis - [ ] Create WebSocket consumers - [ ] Implement moderation queue real-time updates - [ ] Implement notification real-time delivery - [ ] Test WebSocket connections - [ ] OR: Implement Server-Sent Events as alternative ### Phase 8: Caching & Performance (Week 12-13) - [ ] Set up django-redis for caching - [ ] Configure django-cacheops for automatic ORM caching - [ ] Add cache invalidation logic - [ ] Optimize database queries (select_related, prefetch_related) - [ ] Add database indexes - [ ] Profile with django-silk - [ ] Load testing ### Phase 9: Data Migration (Week 13-14) - [ ] Export all data from Supabase - [ ] Create migration script for entities - [ ] Migrate user data (preserve UUIDs) - [ ] Migrate submissions (pending only) - [ ] Migrate version history - [ ] Migrate photos/media references - [ ] Validate data integrity - [ ] Test with migrated data ### Phase 10: Frontend Integration (Week 14-15) - [ ] Create new API client (replace Supabase client) - [ ] Update authentication logic - [ ] Update all API calls to point to Django - [ ] Update real-time subscriptions to WebSockets - [ ] Test all user flows - [ ] Fix any integration issues ### Phase 11: Testing & QA (Week 15-16) - [ ] Write unit tests for all models - [ ] Write unit tests for all services - [ ] Write API integration tests - [ ] Write end-to-end tests - [ ] Security audit - [ ] Performance testing - [ ] Load testing - [ ] Bug fixes ### Phase 12: Deployment (Week 16-17) - [ ] Set up production environment - [ ] Configure PostgreSQL - [ ] Configure Redis - [ ] Set up Celery workers - [ ] Configure Gunicorn/Daphne - [ ] Set up Docker containers - [ ] Configure CI/CD - [ ] Deploy to staging - [ ] Final testing - [ ] Deploy to production - [ ] Monitor for issues --- ## 🔑 Key Technical Decisions ### 1. **django-ninja vs Django REST Framework** **Choice**: django-ninja - FastAPI-style syntax (modern, intuitive) - Better performance - Automatic OpenAPI documentation - Pydantic integration for validation ### 2. **State Machine for Moderation** **Choice**: django-fsm - Declarative state transitions - Built-in guards and conditions - Prevents invalid state changes - Easy to visualize workflow ### 3. **Auto-versioning Strategy** **Choice**: django-lifecycle hooks - Automatic version creation on model changes - No manual intervention needed - Tracks what changed - Preserves full history ### 4. **Real-time Communication** **Primary**: Django Channels (WebSockets) **Fallback**: Server-Sent Events (SSE) - WebSockets for bidirectional communication - SSE as simpler alternative - Redis channel layer for scaling ### 5. **Caching Strategy** **Tool**: django-cacheops - Automatic ORM query caching - Transparent invalidation - Minimal code changes - Redis backend for consistency --- ## 🚀 Critical Features to Preserve ### 1. **Moderation System** - ✅ Atomic transactions for approvals - ✅ Selective approval (approve individual items) - ✅ State machine workflow (pending → reviewing → approved/rejected) - ✅ Lock mechanism (15-minute lock on review) - ✅ Automatic unlock on timeout - ✅ Batch operations ### 2. **Versioning System** - ✅ Full version history for all entities - ✅ Track who made changes - ✅ Track what changed - ✅ Link versions to submissions - ✅ Version diffs - ✅ Rollback capability ### 3. **Authentication** - ✅ Password-based login - ✅ Google OAuth - ✅ Discord OAuth - ✅ Two-factor authentication (TOTP) - ✅ Session management - ✅ JWT tokens for API ### 4. **Permissions & Security** - ✅ Role-based access control (user, moderator, admin, superuser) - ✅ Object-level permissions - ✅ Rate limiting - ✅ CORS configuration - ✅ Brute force protection ### 5. **Image Management** - ✅ CloudFlare direct upload - ✅ Image validation - ✅ Image metadata storage - ✅ Multiple image variants (thumbnails, etc.) ### 6. **Notifications** - ✅ Email notifications via Novu - ✅ In-app notifications - ✅ Notification templates - ✅ User preferences ### 7. **Search & Filtering** - ✅ Full-text search - ✅ Advanced filtering - ✅ Sorting options - ✅ Pagination --- ## 📊 Database Schema Preservation ### Core Entity Tables (Must Migrate) ``` ✅ parks (80+ fields including dates, locations, operators) ✅ rides (100+ fields including ride_models, parks, manufacturers) ✅ companies (manufacturers, operators, designers) ✅ ride_models (coaster models, flat ride models) ✅ locations (countries, subdivisions, localities) ✅ profiles (user profiles linked to auth.users) ✅ user_roles (role assignments) ✅ content_submissions (moderation queue) ✅ submission_items (individual changes in submissions) ✅ park_versions, ride_versions, etc. (version history) ✅ photos (image metadata) ✅ photo_submissions (photo approval queue) ✅ reviews (user reviews) ✅ reports (user reports) ✅ entity_timeline_events (history timeline) ✅ notification_logs ✅ notification_templates ``` ### Computed Fields Strategy Some Supabase tables have computed fields. Options: 1. **Cache in model** (recommended for frequently accessed) 2. **Property method** (for rarely accessed) 3. **Cached query** (using django-cacheops) Example: ```python class Park(models.Model): # Cached computed fields ride_count = models.IntegerField(default=0) coaster_count = models.IntegerField(default=0) def update_counts(self): """Update cached counts""" self.ride_count = self.rides.count() self.coaster_count = self.rides.filter( is_coaster=True ).count() self.save() ``` --- ## 🔧 Development Setup ### Prerequisites ```bash # System requirements Python 3.11+ PostgreSQL 15+ Redis 7+ Node.js 18+ (for frontend) ``` ### Initial Setup ```bash # 1. Clone and checkout branch git checkout django-backend # 2. Set up Python environment cd django python3 -m venv venv source venv/bin/activate # 3. Install dependencies pip install -r requirements/local.txt # 4. Set up environment cp .env.example .env # Edit .env with your credentials # 5. Run migrations python manage.py migrate # 6. Create superuser python manage.py createsuperuser # 7. Run development server python manage.py runserver # 8. Run Celery worker (separate terminal) celery -A config worker -l info # 9. Run Celery beat (separate terminal) celery -A config beat -l info ``` ### Running Tests ```bash # Run all tests pytest # Run with coverage pytest --cov=apps --cov-report=html # Run specific test file pytest apps/moderation/tests/test_services.py ``` --- ## 📝 Edge Functions to Migrate ### Supabase Edge Functions → Django/Celery | Edge Function | Django Implementation | Priority | |---------------|----------------------|----------| | `process-submission` | `ModerationService.submit()` | P0 | | `process-selective-approval` | `ModerationService.approve()` | P0 | | `reject-submission` | `ModerationService.reject()` | P0 | | `unlock-submission` | Celery periodic task | P0 | | `cleanup_old_page_views` | Celery periodic task | P1 | | `update_entity_view_counts` | Celery periodic task | P1 | | `send-notification` | `NotificationService.send()` | P0 | | `process-photo-submission` | `MediaService.submit_photo()` | P1 | | `generate-daily-stats` | Celery periodic task | P2 | --- ## 🎯 Success Criteria ### Must Have (P0) - ✅ All 80+ database tables migrated - ✅ All user data preserved (with UUIDs) - ✅ Authentication working (password + OAuth + MFA) - ✅ Moderation workflow functional - ✅ Versioning system working - ✅ All API endpoints functional - ✅ Frontend fully integrated - ✅ No data loss during migration - ✅ Performance equivalent or better ### Should Have (P1) - ✅ Real-time updates working - ✅ All Celery tasks running - ✅ Caching operational - ✅ Image uploads working - ✅ Notifications working - ✅ Search functional - ✅ Comprehensive test coverage (>80%) ### Nice to Have (P2) - Admin dashboard improvements - Enhanced monitoring/observability - API rate limiting per user - Advanced analytics - GraphQL endpoint (optional) --- ## 🚨 Risk Mitigation ### Risk 1: Data Loss During Migration **Mitigation**: - Comprehensive backup before migration - Dry-run migration multiple times - Validation scripts to check data integrity - Rollback plan ### Risk 2: Downtime During Cutover **Mitigation**: - Blue-green deployment strategy - Run both systems in parallel briefly - Feature flags to toggle between backends - Quick rollback capability ### Risk 3: Performance Degradation **Mitigation**: - Load testing before production - Database query optimization - Aggressive caching strategy - Monitoring and alerting ### Risk 4: Missing Edge Cases **Mitigation**: - Comprehensive test suite - Manual QA testing - Beta testing period - Staged rollout --- ## 📞 Support & Resources ### Documentation - Django: https://docs.djangoproject.com/ - django-ninja: https://django-ninja.rest-framework.com/ - Celery: https://docs.celeryq.dev/ - Django Channels: https://channels.readthedocs.io/ ### Key Files to Reference - Original database schema: `supabase/migrations/` - Current API endpoints: `src/lib/supabaseClient.ts` - Moderation logic: `src/components/moderation/` - Existing docs: `docs/moderation/`, `docs/versioning/` --- ## 🎉 Next Steps 1. **Immediate** (This Week): - Configure Django settings - Create base models - Set up database connection 2. **Short-term** (Next 2 Weeks): - Implement entity models - Set up authentication - Create basic API endpoints 3. **Medium-term** (Next 4-8 Weeks): - Build moderation system - Implement versioning - Migrate edge functions 4. **Long-term** (8-16 Weeks): - Complete API layer - Frontend integration - Testing and deployment --- **Last Updated**: November 8, 2025 **Status**: Foundation Phase - Dependencies Installed, Structure Created **Next**: Configure Django settings and create base models