128 lines
4.3 KiB
Python
128 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
|
|
|
|
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('')
|
|
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}')
|
|
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)
|
|
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)
|
|
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)
|
|
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')
|
|
|
|
|