from datetime import datetime from fastapi import APIRouter, Depends from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import GameServer, ServerStatus from app.schemas import ServerRegisterRequest router = APIRouter(prefix="/servers", tags=["servers"]) # Real game servers should call this on boot and periodically (heartbeat) once # NetworkManager grows that integration. Until then, a dev server is seeded # on API startup (see main.py) from DEV_SEED_SERVER_IP/PORT so matchmaking is # testable end-to-end without it. @router.post("/register") async def register_server(req: ServerRegisterRequest, db: AsyncSession = Depends(get_db)) -> dict: existing = ( await db.execute(select(GameServer).where(GameServer.ip == req.ip, GameServer.port == req.port, GameServer.mode == req.mode)) ).scalars().first() if existing: existing.status = ServerStatus.available existing.last_heartbeat = datetime.utcnow() else: db.add(GameServer(ip=req.ip, port=req.port, mode=req.mode, status=ServerStatus.available)) await db.commit() return {"status": "registered"} @router.get("") async def list_servers(db: AsyncSession = Depends(get_db)) -> list[dict]: servers = (await db.execute(select(GameServer))).scalars().all() return [ { "ip": s.ip, "port": s.port, "mode": s.mode, "status": s.status, "last_heartbeat": s.last_heartbeat, } for s in servers ]