botWebWars/backend/app/api/routes.py

123 lines
3.0 KiB
Python
Raw Normal View History

from typing import List
from fastapi import APIRouter, HTTPException, status
from app.api.websocket import manager
from app.game import game_engine
from app.models import ApiResponse, BoardState, Player, PlayerCreate
router = APIRouter()
@router.get("/health", response_model=ApiResponse, tags=["System"])
async def health_check():
return ApiResponse(
success=True,
message="botWebWars backend service is healthy",
data={"service": "FastAPI", "status": "running"},
)
@router.post(
"/players",
response_model=Player,
status_code=status.HTTP_201_CREATED,
summary="Register a new player on the board",
tags=["Players"],
)
@router.post(
"/register",
response_model=Player,
status_code=status.HTTP_201_CREATED,
include_in_schema=False,
)
async def register_player(player_in: PlayerCreate):
player = await game_engine.register_player(player_in)
# Broadcast to all connected WebSocket clients
await manager.broadcast({
"event": "player_joined",
"player": player.model_dump(),
"player_count": len(await game_engine.get_all_players()),
})
return player
@router.get(
"/players",
response_model=List[Player],
summary="List all registered players",
tags=["Players"],
)
async def list_players():
return await game_engine.get_all_players()
@router.get(
"/players/{player_id}",
response_model=Player,
summary="Get details of a specific player",
tags=["Players"],
)
async def get_player(player_id: str):
player = await game_engine.get_player(player_id)
if not player:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Player '{player_id}' not found",
)
return player
@router.delete(
"/players/{player_id}",
response_model=ApiResponse,
summary="Remove a player from the board",
tags=["Players"],
)
async def remove_player(player_id: str):
removed = await game_engine.remove_player(player_id)
if not removed:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Player '{player_id}' not found",
)
await manager.broadcast({
"event": "player_left",
"player_id": player_id,
"player_count": len(await game_engine.get_all_players()),
})
return ApiResponse(
success=True,
message=f"Player '{player_id}' successfully removed",
)
@router.get(
"/board",
response_model=BoardState,
summary="Get full board configuration and player positions",
tags=["Board"],
)
async def get_board():
return await game_engine.get_board_state()
@router.post(
"/board/reset",
response_model=ApiResponse,
summary="Reset the board and clear all players",
tags=["Board"],
)
async def reset_board():
await game_engine.reset()
await manager.broadcast({
"event": "board_reset",
"player_count": 0,
})
return ApiResponse(
success=True,
message="Board reset successfully. All players cleared.",
)