
- Set up project structure with FastAPI and SQLite - Implement user authentication with JWT - Create database models for users, events, bets, and transactions - Add API endpoints for user management - Add API endpoints for events and betting functionality - Add wallet management for deposits and withdrawals - Configure Alembic for database migrations - Add linting with Ruff - Add documentation in README
124 lines
3.5 KiB
Python
124 lines
3.5 KiB
Python
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 |