- state.json: Phase 5 status changed to pending, next steps updated - DEVELOPMENT_PLAN.md v1.1: Added actual progress, verified current state, renumbered phases 5-9, marked all remaining work as PENDING - Deleted outdated plans (BACKEND_TEST_PLAN, DATA_LOADING_VERIFICATION, DOCKER_MIGRATION_PLAN, ENDPOINT_AUDIT, ROADMAP, SIMPLIFICATION_PLAN, STATEMENT_OF_INTENT, backend/TEST_PLAN) - Added new files: DEVELOPMENT_PLAN.md, backend/ARCHITECTURAL_REPORT.md, backend/SIMPLIFICATION_SUMMARY.md, backend/run.py, backend/.dockerignore
20 KiB
MTG Online Backend - Development Plan
Last Updated: 2025-08-27
Status: Active Development
Version: 2.0
Executive Summary
This document outlines the development roadmap for the MTG Online backend API. The system is designed to support Magic: The Gathering Online gameplay with a focus on Commander format, while supporting Standard, Modern, and Pauper formats. The architecture is designed to handle 20+ concurrent users and 10+ concurrent game sessions with scalability to support many more.
Current Status
Overall Progress: 10-15% complete
Last Verified: 2025-08-27
✅ Completed (Phases 1-4)
- Architecture simplification (unified database config, security, settings)
- Model consolidation (10+ files → 2: models.py, mtg_models.py)
- Router consolidation (54+ files → 37 files)
- Docker packaging (Dockerfile, docker-compose.yml)
- Authentication system (JWT-based login/register)
- Room management (CRUD operations)
- MTGJSON data management (download, refresh, verify)
- Basic WebSocket server (game_server.py - not integrated with DB)
⚠️ Partially Implemented
- Card search (basic structure exists, needs optimization)
- Deck management (stubs only, no real implementation)
- User data (profile endpoints exist, statistics not implemented)
❌ Not Started
- Game engine (all endpoints are mocks/stubs)
- Game models (no MTG OnlineGames, GamePlayer, or GameHistory models)
- Commander deck validation
- User statistics and history
- Real-time game state persistence
Project Scope
Core Requirements
- Primary Format: Commander (EDH)
- Secondary Formats: Standard, Modern, Pauper
- Concurrent Users: 20+ (scalable to 100+)
- Concurrent Games: 10+ (scalable to 50+)
- Card Data Source: MTGJSON exclusively
- Technology Stack: Python 3.12, FastAPI, SQLAlchemy, PostgreSQL, Redis
Non-Goals (Out of Scope)
- Frontend development (handled separately)
- Cockatrice client integration
- Third-party tournament management
- Card image hosting (use MTGJSON links)
Architecture Overview
Target Architecture
┌─────────────────────────────────────────────────────────────┐
│ API Gateway (FastAPI) │
├─────────────────────────────────────────────────────────────┤
│ Auth │ Users │ Decks │ Cards │ Games │ Rooms │ MTGJSON │
├─────────────────────────────────────────────────────────────┤
│ Service Layer │
│ GameServer │ CardSearch │ DeckParser │ ImportProcessor │
├─────────────────────────────────────────────────────────────┤
│ Data Layer │
│ PostgreSQL (mtgonline + mtg_data) │ Redis (cache/sessions) │
└─────────────────────────────────────────────────────────────┘
Current Implementation:
├── ✅ Authentication (JWT)
├── ✅ Room Management (CRUD)
├── ✅ MTGJSON Data (download/refresh/verify)
├── ⚠️ Card Search (basic)
├── ❌ Game Engine (stubs only)
├── ❌ Deck Management (stubs only)
└── ❌ User Statistics (not implemented)
Development Phases
Phase 1: Core Game Engine (Weeks 1-3) ⭐ PRIORITY
Status: Not Started
Current State: All game endpoints are mocks/stubs returning hardcoded data
Objective: Implement functional game management with real-time capabilities
1.1 Game Models & Database
- Create
MTG OnlineGamesmodel inapp/models/mtg_models.py- Game ID, room ID, host ID
- Game type (Commander, Standard, Modern, Pauper)
- Game state (waiting, in_progress, finished, aborted)
- Player slots (max 4 for Commander, configurable)
- Password protection
- Timestamps (created, started, finished)
- Create
GamePlayerassociation table- Player ID, game ID
- Seat number, color identity
- Life total, status (ready, left)
- Create
GameHistorytable- Game ID, participants, winner
- Game length, result type
- Replay data reference
1.2 Game Management Endpoints
- Replace mock
POST /games/with real implementation- Validate game type and format rules
- Check room availability
- Set host as player 1
- Save to database
- Return game ID and join link
- Replace mock
GET /games/with real implementation- Query database for active games
- Filter by room, game type
- Include player count
- Pagination support
- Replace mock
GET /games/{game_id}with real implementation- Query database for game details
- Include player list (without passwords)
- Game state and settings
- Implement
POST /games/{game_id}/join- Validate player availability
- Check if game is full
- Add player to game in database
- Implement
POST /games/{game_id}/leave- Remove player from game in database
- Handle host transfer if needed
- Implement
POST /games/{game_id}/start(host only)- Validate all players ready
- Transition to in_progress state
- Broadcast to all players
- Implement
POST /games/{game_id}/end- Record results to GameHistory
- Update player statistics
- Clean up game state
1.3 WebSocket Game Server Integration
- Integrate existing
game_server.pywith database- Load game state from database on connection
- Persist game state changes to database
- Handle reconnection scenarios
- Enhance WebSocket endpoints
WS /ws/game/{game_id}- Game connection- Real-time player join/leave notifications
- Game state updates (life totals, turns)
- Chat/messaging within games
- Game state management
- Turn tracking
- Life total updates
- Game log/events
- Victory/defeat conditions
1.4 Commander-Specific Logic
- Commander deck validation
- 100-card minimum (excluding basic lands)
- Color identity rules
- Commander uniqueness
- Ban list enforcement
- Commander game rules
- Commander damage tracking
- Command zone management
- Popularity tracker (optional)
Phase 2: Card System (Weeks 4-5)
Status: Not Started
Objective: Complete card search, filtering, and collection tracking
2.1 Card Search Service
- Implement
app/services/card_search_service.py- Full-text search on card names
- Filter by: set, type, color, mana cost, rarity
- Card name autocomplete (debounced)
- Card detail views with images
- Search optimization
- PostgreSQL full-text search configuration
- Redis caching for popular searches
- Pagination and sorting
2.2 Card Database Integration
- Optimize
app/services/card_database.py- Production-ready query patterns
- Connection pooling
- Batch operations for card imports
- Card collection tracking
- User card collection per format
- Card count by set/type
- Collection statistics
2.3 Card Import System
- Complete
app/services/import_batch_processor.py- Excel/CSV import support
- Fuzzy matching with
fuzzy_card_matcher.py - Validation and error reporting
- Bulk import with progress tracking
- MTGJSON integration
- Automatic card data sync
- Set and card version tracking
- Image URL management
Phase 3: Deck Management (Weeks 6-7)
Status: Not Started
Objective: Full deck CRUD with validation and sharing
3.1 Deck Models
- Create
UserDeckmodel- Deck ID, user ID, name
- Format (Commander, Standard, Modern, Pauper)
- Deck list (JSON or separate table)
- Commander/legendary creature reference
- Privacy settings (public, private, friends-only)
- Create
DeckCardmodel- Deck ID, card ID
- Quantity, sideboard flag
- Card list ordering
3.2 Deck Endpoints
POST /decks/- Create deck- Validate format rules
- Check card legality
- Save deck with card list
GET /decks/- List user decks- Filter by format
- Pagination
GET /decks/{deck_id}- Get deck details- Include card list with quantities
- Format validation status
PUT /decks/{deck_id}- Update deck- Modify card list
- Update metadata
DELETE /decks/{deck_id}- Delete deckPOST /decks/{deck_id}/share- Generate share linkGET /decks/shared/{token}- View shared deck
3.3 Deck Parser
- Implement
app/services/deck_parser.py- Parse MTGO deck list format
- Extract card names and quantities
- Validate against format rules
- Error reporting for invalid decks
3.4 Deck Suggestions
- Implement
app/services/deck_suggestion_service.py- Meta analysis (most popular decks)
- Card recommendations based on commander
- Deck archetypes and templates
- Counter-pick suggestions
Phase 4: User Data & Profiles (Weeks 8-9)
Status: Not Started
Objective: Enhanced user profiles with statistics and history
4.1 User Profile Enhancement
- User statistics
- Games played (by format)
- Win/loss record
- Win rate by format
- Average game length
- Commander damage dealt/taken
- Card collection
- Total cards owned
- Cards by set/type/color
- Collection completion percentage
- Deck collection
- Total decks created
- Decks by format
- Most played decks
4.2 User Data Endpoints
- Complete
app/routers/user_data_router.pyGET /api/v1/user-data/profile- Get profilePUT /api/v1/user-data/profile- Update profileGET /api/v1/user-data/statistics- Get statisticsGET /api/v1/user-data/games- Game historyGET /api/v1/user-data/collection- Card collectionGET /api/v1/user-data/decks- Deck collection
- Data export
- JSON export of user data
- CSV export for statistics
- Privacy controls
4.3 Game History & Replay
- Game history tracking
- Store game results
- Track participant performance
- Format-specific statistics
- Replay data storage
- Game event log
- Turn-by-turn actions
- Save/load replay functionality
Phase 5: Infrastructure & Quality (Weeks 10-11)
Status: Not Started
Objective: Testing, documentation, and performance optimization
5.1 Testing
- Unit tests
- Service layer tests (card search, deck parser, game logic)
- Model validation tests
- Utility function tests
- Integration tests
- API endpoint tests (all routers)
- Database transaction tests
- WebSocket connection tests
- Load testing
- Concurrent user simulation
- Concurrent game session testing
- Performance benchmarking
- Test coverage target: 80%+
5.2 Documentation
- API documentation
- OpenAPI/Swagger auto-generation (already enabled)
- Endpoint examples
- Authentication guide
- Architecture documentation
- System design diagrams
- Data flow diagrams
- Service interaction docs
- Deployment guide
- Docker setup instructions
- Environment configuration
- Database migration steps
- Contributing guide
- Code style guidelines
- PR process
- Issue reporting
5.3 Performance Optimization
- Database optimization
- Query plan analysis
- Index optimization
- Connection pooling configuration
- Redis caching strategy
- Cache invalidation policies
- Session management
- Popular data caching
- Rate limiting
- API request limits
- WebSocket connection limits
- Brute force protection
Technical Specifications
Game Format Rules
Commander (EDH)
- Players: 2-4 (configurable)
- Deck Size: Minimum 100 cards (excluding basic lands)
- Commander: 1 legendary creature or planeswalker with "Commander" ability
- Color Identity: All cards in deck must match commander's color identity
- Ban List: Enforce official Commander ban list
- Special Rules: Commander damage (21 points = loss)
Standard
- Players: 2-4
- Deck Size: Minimum 60 cards
- Set Rotation: Current Standard-legal sets
- Ban List: Standard ban list
Modern
- Players: 2-4
- Deck Size: Minimum 60 cards
- Card Pool: All cards printed prior to 8th Edition forward
- Ban List: Modern ban list
Pauper
- Players: 2-4
- Deck Size: Minimum 60 cards
- Card Pool: Only common rarity cards
- Ban List: Pauper ban list
Database Schema
Primary Database (mtgonline)
users- User accountsrooms- Game roomsmtg_online_games- Game sessionsgame_players- Game participant mappinggame_history- Game resultsuser_decks- User deck collectionsdeck_cards- Deck card listsuser_collections- Card collection trackinggame_events- In-game event logs
Card Data Database (mtg_data)
cards- Card definitionssets- Set informationcard_sets- Card-set relationshipsrulings- Card rulingsprices- Card price history
API Endpoints
Authentication (/auth)
POST /login- User loginPOST /refresh- Token refreshPOST /register- User registrationGET /me- Get current user
Users (/users)
GET /- List users (admin)GET /{user_id}- Get user profilePUT /{user_id}- Update user (admin)DELETE /{user_id}- Delete user (admin)
Decks (/decks)
POST /- Create deckGET /- List user decksGET /{deck_id}- Get deck detailsPUT /{deck_id}- Update deckDELETE /{deck_id}- Delete deckPOST /{deck_id}/share- Generate share link
Cards (/api/cards)
GET /search- Search cardsGET /{card_id}- Get card detailsGET /autocomplete- Card name autocomplete
Games (/games)
POST /- Create gameGET /- List active gamesGET /{game_id}- Get game detailsPOST /{game_id}/join- Join gamePOST /{game_id}/leave- Leave gamePOST /{game_id}/start- Start game (host)POST /{game_id}/end- End game
Rooms (/rooms)
GET /- List roomsGET /{room_id}- Get room detailsPOST /- Create room (admin)PUT /{room_id}- Update room (admin)DELETE /{room_id}- Delete room (admin)
User Data (/api/v1/user-data)
GET /profile- Get profilePUT /profile- Update profileGET /statistics- Get statisticsGET /games- Game historyGET /collection- Card collectionGET /decks- Deck collection
MTGJSON (/mtgjson)
POST /refresh- Trigger data refresh (admin)GET /status- Get refresh status (admin)POST /verify- Verify files (admin)
WebSocket (/ws)
WS /game/{game_id}- Game connection
Scalability Considerations
Current Capacity
- Concurrent Users: 20
- Concurrent Games: 10
- Expected Growth: 5x within 6 months
Scaling Strategy
Horizontal Scaling
- Stateless API servers (multiple instances behind load balancer)
- Redis cluster for session management and caching
- PostgreSQL read replicas for card data queries
Database Optimization
- Partition game_history by date
- Index frequently queried columns
- Archive old game data (6+ months)
WebSocket Scaling
- Redis pub/sub for cross-instance messaging
- Sticky sessions for WebSocket connections
- Connection pooling and limits
Caching Strategy
- L1: Application memory (hot data, 5min TTL)
- L2: Redis (session data, popular cards, 1hr TTL)
- L3: PostgreSQL (primary data)
Security Requirements
Authentication & Authorization
- JWT tokens with 15min access, 7day refresh
- Password hashing with bcrypt (cost factor 12)
- Rate limiting on auth endpoints
- Account lockout after 5 failed attempts
API Security
- HTTPS enforcement in production
- CORS configuration (whitelist allowed origins)
- Request validation on all endpoints
- SQL injection prevention (parameterized queries)
- XSS prevention (output encoding)
Data Protection
- Passwords never stored in plaintext
- Personal data encrypted at rest
- API keys rotated quarterly
- Audit logging for admin actions
Monitoring & Observability
Metrics
- API request rate and latency
- WebSocket connection count
- Database query performance
- Redis hit/miss ratio
- Error rates by endpoint
Logging
- Structured JSON logs
- Request ID tracking
- User action logging
- Error context inclusion
Alerts
- High error rate (>5% over 5min)
- Database connection pool exhaustion
- Redis memory usage >80%
- WebSocket connection failures
Development Guidelines
Code Style
- Python 3.12+ with type hints
- PEP 8 compliance
- Docstrings for all public functions
- Maximum line length: 88 characters (Black formatter)
Git Workflow
- Feature branches for all work
- Descriptive commit messages
- Squash merges for feature branches
- Semantic versioning for releases
Testing Requirements
- Unit tests for all service logic
- Integration tests for API endpoints
- Minimum 80% code coverage
- Tests run on every PR
Documentation
- Update README for new features
- API docs auto-generated from code
- Architecture decisions documented in ADRs
- Changelog maintained
Risk Mitigation
Technical Risks
| Risk | Impact | Probability | Mitigation |
|---|---|---|---|
| WebSocket performance issues | High | Medium | Load test early, optimize connections |
| Card data sync failures | Medium | Low | Retry logic, manual override endpoint |
| Database lock contention | High | Medium | Connection pooling, query optimization |
| Third-party API downtime | Medium | Low | Caching, fallback data |
Business Risks
| Risk | Impact | Probability | Mitigation |
|---|---|---|---|
| Low user adoption | High | Medium | Marketing, UX improvements |
| Format rule changes | Medium | Low | Configurable ban lists, easy updates |
| Security breach | Critical | Low | Regular audits, penetration testing |
Success Metrics
Technical Metrics
- API response time: <200ms (p95)
- WebSocket latency: <100ms
- Database query time: <50ms (p95)
- Uptime: 99.9%
- Test coverage: 80%+
Business Metrics
- Concurrent users: 20+ (Month 1), 50+ (Month 3)
- Active games: 10+ (Month 1), 30+ (Month 3)
- User retention: 60% (30-day)
- Deck creation: 100+ decks/week
- Card searches: 1000+ searches/day
Next Steps
Immediate (This Week)
- ✅ Review and approve this development plan
- ⏳ Create
MTG OnlineGamesmodel inapp/models/mtg_models.py - ⏳ Create
GamePlayerassociation model - ⏳ Create
GameHistorymodel - ⏳ Replace mock game endpoints with real database operations
Short-term (Next 2 Weeks)
- Integrate WebSocket server with database
- Implement Commander deck validation
- Write unit tests for game services
- Test concurrent game sessions
Medium-term (Month 2)
- Complete card search system
- Implement deck management
- Add user statistics
- Performance optimization
Appendix
A. References
B. Tools & Dependencies
- Python: 3.12+
- Framework: FastAPI 0.115.0
- Database: PostgreSQL 16, SQLAlchemy 2.0
- Cache: Redis 7
- Auth: python-jose, bcrypt
- Testing: pytest, pytest-asyncio
- Deployment: Docker, docker-compose
C. Environment Variables
# Database
DATABASE_URL=postgresql://user:pass@localhost:5432/mtgonline
MTG_DATA_URL=postgresql://user:pass@localhost:5432/mtg_data
# Redis
REDIS_URL=redis://localhost:6379/0
# Authentication
SECRET_KEY=your-secret-key-here
ACCESS_TOKEN_EXPIRE_MINUTES=15
REFRESH_TOKEN_EXPIRE_DAYS=7
# Application
DEBUG=false
APP_NAME=MTG Online Backend
CORS_ORIGINS=http://localhost:3000,http://localhost:8000
Document Version: 2.0
Last Updated: 2025-08-27
Author: Development Team
Status: Active