from typing import Any, Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from app import crud, models, schemas from app.api import deps from app.models.event import EventStatus router = APIRouter() @router.get("/", response_model=list[schemas.Event]) def read_events( db: Session = Depends(deps.get_db), skip: int = 0, limit: int = 100, status: Optional[EventStatus] = None, ) -> Any: """ Retrieve events. """ events = crud.get_events(db, skip=skip, limit=limit, status=status) return events @router.post("/", response_model=schemas.Event) def create_event( *, db: Session = Depends(deps.get_db), event_in: schemas.EventCreate, _: models.User = Depends(deps.get_current_admin_user), # Admin check only ) -> Any: """ Create new event. Admin only. """ event = crud.create_event(db, event_in=event_in) return event @router.get("/{event_id}", response_model=schemas.Event) def read_event( *, db: Session = Depends(deps.get_db), event_id: int, ) -> Any: """ Get specific event by ID. """ event = crud.get_event(db, event_id=event_id) if not event: raise HTTPException(status_code=404, detail="Event not found") return event @router.put("/{event_id}", response_model=schemas.Event) def update_event( *, db: Session = Depends(deps.get_db), event_id: int, event_in: schemas.EventUpdate, _: models.User = Depends(deps.get_current_admin_user), # Admin check only ) -> Any: """ Update an event. Admin only. """ event = crud.get_event(db, event_id=event_id) if not event: raise HTTPException(status_code=404, detail="Event not found") event = crud.update_event(db, db_event=event, event_in=event_in) return event @router.delete("/{event_id}", status_code=204, response_model=None) def delete_event( *, db: Session = Depends(deps.get_db), event_id: int, _: models.User = Depends(deps.get_current_admin_user), # Admin check only ) -> None: """ Delete an event. Admin only. """ event = crud.get_event(db, event_id=event_id) if not event: raise HTTPException(status_code=404, detail="Event not found") # Check if there are any bets placed if event.markets: for market in event.markets: if market.outcomes: for outcome in market.outcomes: if outcome.bets: raise HTTPException( status_code=400, detail="Cannot delete event with existing bets" ) crud.delete_event(db, event_id=event_id) @router.post("/outcomes/{outcome_id}/settle", response_model=schemas.Outcome) def settle_outcome( *, db: Session = Depends(deps.get_db), outcome_id: int, is_winner: bool, _: models.User = Depends(deps.get_current_admin_user), # Admin check only ) -> Any: """ Settle an outcome as win or lose. Admin only. This will also settle all related bets. """ outcome = crud.get_outcome(db, outcome_id=outcome_id) if not outcome: raise HTTPException(status_code=404, detail="Outcome not found") # Set the outcome as winner or loser outcome = crud.settle_outcome(db, outcome_id=outcome_id, is_winner=is_winner) # Settle all bets for this outcome crud.settle_bets_for_outcome(db, outcome_id=outcome_id, is_winner=is_winner) return outcome