from fastapi import FastAPI, WebSocket, WebSocketDisconnect from fastapi.middleware.cors import CORSMiddleware from .database import engine from .models import Base from .routers import players, courts, events, matches, dashboard, admin from .websocket_manager import manager import asyncio import json Base.metadata.create_all(bind=engine) app = FastAPI(title="ServeSync API", version="2.0.0") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(players.router) app.include_router(courts.router) app.include_router(events.router) app.include_router(matches.router) app.include_router(dashboard.router) app.include_router(admin.router) @app.get("/api/health") def health(): return {"status": "ok", "version": "2.0.0"} @app.websocket("/ws/dashboard") async def ws_dashboard(websocket: WebSocket): await manager.connect(websocket, "dashboard") try: while True: await asyncio.sleep(3) await manager.broadcast("dashboard", {"type": "ping"}) except WebSocketDisconnect: manager.disconnect(websocket, "dashboard") @app.websocket("/ws/screen/{court_id}") async def ws_screen(websocket: WebSocket, court_id: int): channel = f"screen_{court_id}" await manager.connect(websocket, channel) try: while True: await asyncio.sleep(5) await manager.broadcast(channel, {"type": "ping", "court_id": court_id}) except WebSocketDisconnect: manager.disconnect(websocket, channel)