- Complete rewrite for single Court Manager user - Feature 1: Player Management (CRUD, ELO, skill level) - Feature 2: Court Reservation (timeline, override) - Feature 3: Match Event Builder (3-step wizard) - Step 1: Event setup with player selection + stage calculator - Step 2: Stage configurator (Open/Skill/RR/Tournament) - Step 3: Auto bracket generation - Feature 4: Live Court View (main dashboard, 2x2 grid) - Event Control: score entry, bracket advancement, court assignment - Screen view: TV display per court (/screen/:id) - Seed: 8 players, 4 courts, 1 completed + 1 active event - Routes: / players courts events events/new events/:id screen/:id
56 lines
1.6 KiB
Python
56 lines
1.6 KiB
Python
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)
|