Files
Nemo 4421f61c24 feat: Rebuild as Court Manager Dashboard v2
- 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
2026-03-19 07:35:51 +08:00

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)