major-domo-database/app/routers_v3/divisions.py
Cal Corum c05d00d60e DB Error Handling
Added error handling wrapper and fixed SQLite -> Postgres issues
2025-08-20 19:33:40 -05:00

133 lines
4.4 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]
}
db.close()
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:
db.close()
raise HTTPException(status_code=404, detail=f'Division ID {division_id} not found')
r_div = model_to_dict(this_div)
db.close()
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:
db.close()
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)
db.close()
return r_division
else:
db.close()
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)
db.close()
return r_division
else:
db.close()
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:
db.close()
raise HTTPException(status_code=404, detail=f'Division ID {division_id} not found')
count = this_div.delete_instance()
db.close()
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')