major-domo-database/app/routers_v3/divisions.py
Cal Corum ab90dfc437
All checks were successful
Build Docker Image / build (pull_request) Successful in 2m28s
fix: replace manual db.close() calls with middleware-based connection management (#71)
Closes #71

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 06:04:56 -05:00

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"
)