Automated Action 4cfc9775ae Create betting application API with FastAPI and SQLite
- 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
2025-06-02 15:02:41 +00:00

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