123 lines
3.0 KiB
Python
123 lines
3.0 KiB
Python
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.",
|
|
)
|