import asyncio from contextlib import asynccontextmanager from fastapi import FastAPI from sqlalchemy import select from app.config import settings from app.database import Base, async_session, engine from app.models import GameServer, Mode, ServerStatus from app.queue_manager import queue_manager from app.routers import matchmaking, ranks, servers, stats async def _seed_dev_server() -> None: async with async_session() as db: for mode in (Mode.casual, Mode.ranked): existing = ( await db.execute( select(GameServer).where( GameServer.ip == settings.dev_seed_server_ip, GameServer.port == settings.dev_seed_server_port, GameServer.mode == mode, ) ) ).scalars().first() if existing is None: db.add( GameServer( ip=settings.dev_seed_server_ip, port=settings.dev_seed_server_port, mode=mode, status=ServerStatus.available, ) ) await db.commit() @asynccontextmanager async def lifespan(app: FastAPI): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) await _seed_dev_server() matching_task = asyncio.create_task(queue_manager.run_matching_loop()) yield matching_task.cancel() app = FastAPI(title="Spacewar Matchmaking API", lifespan=lifespan) app.include_router(matchmaking.router) app.include_router(stats.router) app.include_router(ranks.router) app.include_router(servers.router) @app.get("/health") async def health() -> dict: return {"status": "ok"}