mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 06:51:12 -05:00
- Created Django 4.2 project with production-ready architecture - Installed 60+ packages including django-ninja, celery, channels, etc. - Set up app structure (core, entities, moderation, users, versioning, media, notifications) - Created comprehensive MIGRATION_PLAN.md with 12-phase roadmap - Created README.md with setup instructions - Created .env.example with all required configuration - Configured for Python 3.13 compatibility - All dependencies successfully installed and tested Next steps: Configure Django settings and create base models
16 KiB
16 KiB
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)
- Create git branch
django-backend - Set up Python virtual environment
- Install all dependencies (Django 4.2, django-ninja, celery, etc.)
- Create Django project structure
- Create app directories
- 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:
- Cache in model (recommended for frequently accessed)
- Property method (for rarely accessed)
- Cached query (using django-cacheops)
Example:
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
# System requirements
Python 3.11+
PostgreSQL 15+
Redis 7+
Node.js 18+ (for frontend)
Initial Setup
# 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
# 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
-
Immediate (This Week):
- Configure Django settings
- Create base models
- Set up database connection
-
Short-term (Next 2 Weeks):
- Implement entity models
- Set up authentication
- Create basic API endpoints
-
Medium-term (Next 4-8 Weeks):
- Build moderation system
- Implement versioning
- Migrate edge functions
-
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