All checks were successful
Build Docker Image / build (pull_request) Successful in 2m28s
Closes #71 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
144 lines
4.3 KiB
Python
144 lines
4.3 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Query, Response
|
|
from typing import List, Optional
|
|
import logging
|
|
import pydantic
|
|
|
|
from ..db_engine import db, Division, Team, model_to_dict, chunked, fn
|
|
from ..dependencies import (
|
|
oauth2_scheme,
|
|
valid_token,
|
|
PRIVATE_IN_SCHEMA,
|
|
handle_db_errors,
|
|
)
|
|
|
|
logger = logging.getLogger("discord_app")
|
|
|
|
router = APIRouter(prefix="/api/v3/divisions", tags=["divisions"])
|
|
|
|
|
|
class DivisionModel(pydantic.BaseModel):
|
|
division_name: str
|
|
division_abbrev: str
|
|
league_name: Optional[str]
|
|
league_abbrev: Optional[str]
|
|
season: int = 0
|
|
|
|
|
|
@router.get("")
|
|
@handle_db_errors
|
|
async def get_divisions(
|
|
season: int,
|
|
div_name: Optional[str] = None,
|
|
div_abbrev: Optional[str] = None,
|
|
lg_name: Optional[str] = None,
|
|
lg_abbrev: Optional[str] = None,
|
|
):
|
|
all_divisions = Division.select().where(Division.season == season)
|
|
|
|
if div_name is not None:
|
|
all_divisions = all_divisions.where(Division.division_name == div_name)
|
|
if div_abbrev is not None:
|
|
all_divisions = all_divisions.where(Division.division_abbrev == div_abbrev)
|
|
if lg_name is not None:
|
|
all_divisions = all_divisions.where(Division.league_name == lg_name)
|
|
if lg_abbrev is not None:
|
|
all_divisions = all_divisions.where(Division.league_abbrev == lg_abbrev)
|
|
|
|
return_div = {
|
|
"count": all_divisions.count(),
|
|
"divisions": [model_to_dict(x) for x in all_divisions],
|
|
}
|
|
return return_div
|
|
|
|
|
|
@router.get("/{division_id}")
|
|
@handle_db_errors
|
|
async def get_one_division(division_id: int):
|
|
this_div = Division.get_or_none(Division.id == division_id)
|
|
if this_div is None:
|
|
raise HTTPException(
|
|
status_code=404, detail=f"Division ID {division_id} not found"
|
|
)
|
|
|
|
r_div = model_to_dict(this_div)
|
|
return r_div
|
|
|
|
|
|
@router.patch("/{division_id}", include_in_schema=PRIVATE_IN_SCHEMA)
|
|
@handle_db_errors
|
|
async def patch_division(
|
|
division_id: int,
|
|
div_name: Optional[str] = None,
|
|
div_abbrev: Optional[str] = None,
|
|
lg_name: Optional[str] = None,
|
|
lg_abbrev: Optional[str] = None,
|
|
token: str = Depends(oauth2_scheme),
|
|
):
|
|
if not valid_token(token):
|
|
logger.warning(f"patch_division - Bad Token: {token}")
|
|
raise HTTPException(status_code=401, detail="Unauthorized")
|
|
|
|
this_div = Division.get_or_none(Division.id == division_id)
|
|
if this_div is None:
|
|
raise HTTPException(
|
|
status_code=404, detail=f"Division ID {division_id} not found"
|
|
)
|
|
|
|
if div_name is not None:
|
|
this_div.division_name = div_name
|
|
if div_abbrev is not None:
|
|
this_div.division_abbrev = div_abbrev
|
|
if lg_name is not None:
|
|
this_div.league_name = lg_name
|
|
if lg_abbrev is not None:
|
|
this_div.league_abbrev = lg_abbrev
|
|
|
|
if this_div.save() == 1:
|
|
r_division = model_to_dict(this_div)
|
|
return r_division
|
|
else:
|
|
raise HTTPException(
|
|
status_code=500, detail=f"Unable to patch division {division_id}"
|
|
)
|
|
|
|
|
|
@router.post("/", include_in_schema=PRIVATE_IN_SCHEMA)
|
|
@handle_db_errors
|
|
async def post_division(
|
|
new_division: DivisionModel, token: str = Depends(oauth2_scheme)
|
|
):
|
|
if not valid_token(token):
|
|
logger.warning(f"post_division - Bad Token: {token}")
|
|
raise HTTPException(status_code=401, detail="Unauthorized")
|
|
|
|
this_division = Division(**new_division.dict())
|
|
|
|
if this_division.save() == 1:
|
|
r_division = model_to_dict(this_division)
|
|
return r_division
|
|
else:
|
|
raise HTTPException(status_code=500, detail=f"Unable to post division")
|
|
|
|
|
|
@router.delete("/{division_id}", include_in_schema=PRIVATE_IN_SCHEMA)
|
|
@handle_db_errors
|
|
async def delete_division(division_id: int, token: str = Depends(oauth2_scheme)):
|
|
if not valid_token(token):
|
|
logger.warning(f"delete_division - Bad Token: {token}")
|
|
raise HTTPException(status_code=401, detail="Unauthorized")
|
|
|
|
this_div = Division.get_or_none(Division.id == division_id)
|
|
if this_div is None:
|
|
raise HTTPException(
|
|
status_code=404, detail=f"Division ID {division_id} not found"
|
|
)
|
|
|
|
count = this_div.delete_instance()
|
|
|
|
if count == 1:
|
|
return f"Division {division_id} has been deleted"
|
|
else:
|
|
raise HTTPException(
|
|
status_code=500, detail=f"Division {division_id} could not be deleted"
|
|
)
|