136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
"""Game management router endpoints."""
|
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select, insert, update, delete
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
|
|
from app.core.database import get_db
|
|
from app.core.security import get_current_user
|
|
from app.models.models import User
|
|
from app.schemas.schemas import GameCreate, GameResponse
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/", response_model=List[GameResponse])
|
|
async def list_games(
|
|
room_id: Optional[int] = None,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""List active games."""
|
|
# This would query a games table - simplified for now
|
|
# In production, you'd have a MTG OnlineGames model
|
|
return []
|
|
|
|
|
|
@router.post("/", response_model=GameResponse)
|
|
async def create_game(
|
|
request: GameCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Create a new game."""
|
|
user_id = int(current_user["user_id"])
|
|
|
|
# Verify user exists
|
|
stmt = select(User).where(User.id == user_id)
|
|
result = await db.execute(stmt)
|
|
user = result.scalar_one_or_none()
|
|
|
|
if not user:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail="User not found",
|
|
)
|
|
|
|
# In production, you'd create a game in the game database
|
|
# For now, return a mock response
|
|
game_data = {
|
|
"id": 1, # Mock ID
|
|
"room_id": request.room_id,
|
|
"game_type": request.game_type,
|
|
"description": request.description,
|
|
"with_password": bool(request.password),
|
|
"max_players": 4,
|
|
"player_count": 1,
|
|
"started": False,
|
|
"creation_date": datetime.now(),
|
|
}
|
|
|
|
return GameResponse(**game_data)
|
|
|
|
|
|
@router.get("/{game_id}", response_model=GameResponse)
|
|
async def get_game(
|
|
game_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Get game by ID."""
|
|
# In production, query the games table
|
|
return GameResponse(
|
|
id=game_id,
|
|
room_id=1,
|
|
game_type="Casual",
|
|
description="Test game",
|
|
with_password=False,
|
|
max_players=4,
|
|
player_count=0,
|
|
started=False,
|
|
creation_date=datetime.now(),
|
|
)
|
|
|
|
|
|
@router.post("/{game_id}/join")
|
|
async def join_game(
|
|
game_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Join a game."""
|
|
user_id = int(current_user["user_id"])
|
|
|
|
# In production, add user to game players table
|
|
return {"message": f"User {user_id} joined game {game_id}"}
|
|
|
|
|
|
@router.post("/{game_id}/leave")
|
|
async def leave_game(
|
|
game_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Leave a game."""
|
|
user_id = int(current_user["user_id"])
|
|
|
|
# In production, remove user from game players table
|
|
return {"message": f"User {user_id} left game {game_id}"}
|
|
|
|
|
|
@router.post("/{game_id}/start")
|
|
async def start_game(
|
|
game_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""Start a game (host only)."""
|
|
user_id = int(current_user["user_id"])
|
|
|
|
# In production, update game started status
|
|
return {"message": f"Game {game_id} started"}
|
|
|
|
|
|
@router.post("/{game_id}/end")
|
|
async def end_game(
|
|
game_id: int,
|
|
db: AsyncSession = Depends(get_db),
|
|
current_user: dict = Depends(get_current_user),
|
|
):
|
|
"""End a game."""
|
|
user_id = int(current_user["user_id"])
|
|
|
|
# In production, update game closed status
|
|
return {"message": f"Game {game_id} ended"}
|