Implemented full FastAPI backend with WebSocket support, database models, and comprehensive documentation for the Paper Dynasty game engine. Backend Implementation: - FastAPI application with Socket.io WebSocket server - SQLAlchemy async database models (Game, Play, Lineup, GameSession) - PostgreSQL connection to dev server (10.10.0.42:5432) - Connection manager for WebSocket lifecycle - JWT authentication utilities - Health check and stub API endpoints - Rotating file logger with Pendulum datetime handling - Redis via Docker Compose for caching Technical Details: - Python 3.13 with updated package versions - Pendulum 3.0 for all datetime operations - Greenlet for SQLAlchemy async support - Fixed SQLAlchemy reserved column names (metadata -> *_metadata) - Pydantic Settings with JSON array format for lists - Docker Compose V2 commands Documentation: - Updated backend/CLAUDE.md with environment-specific details - Created .claude/ENVIRONMENT.md for gotchas and quirks - Created QUICKSTART.md for developer onboarding - Documented all critical learnings and troubleshooting steps Database: - Tables created: games, plays, lineups, game_sessions - All indexes and foreign keys configured - Successfully tested connection and health checks Verified: - Server starts at http://localhost:8000 - Health endpoints responding - Database connection working - WebSocket infrastructure functional - Hot-reload working 🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
51 lines
1.0 KiB
Python
51 lines
1.0 KiB
Python
import logging
|
|
from fastapi import APIRouter
|
|
from typing import List
|
|
from pydantic import BaseModel
|
|
|
|
logger = logging.getLogger(f'{__name__}.games')
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class GameListItem(BaseModel):
|
|
"""Game list item model"""
|
|
game_id: str
|
|
league_id: str
|
|
status: str
|
|
home_team_id: int
|
|
away_team_id: int
|
|
|
|
|
|
@router.get("/", response_model=List[GameListItem])
|
|
async def list_games():
|
|
"""
|
|
List all games
|
|
|
|
TODO Phase 2: Implement game listing with database query
|
|
"""
|
|
logger.info("List games endpoint called (stub)")
|
|
return []
|
|
|
|
|
|
@router.get("/{game_id}")
|
|
async def get_game(game_id: str):
|
|
"""
|
|
Get game details
|
|
|
|
TODO Phase 2: Implement game retrieval
|
|
"""
|
|
logger.info(f"Get game {game_id} endpoint called (stub)")
|
|
return {"game_id": game_id, "message": "Game retrieval stub"}
|
|
|
|
|
|
@router.post("/")
|
|
async def create_game():
|
|
"""
|
|
Create new game
|
|
|
|
TODO Phase 2: Implement game creation
|
|
"""
|
|
logger.info("Create game endpoint called (stub)")
|
|
return {"message": "Game creation stub"}
|