from fastapi import APIRouter, Depends, HTTPException, Query from typing import List, Optional, Literal import logging import pydantic from ..db_engine import db, PitchingStat, Team, Player, Current, model_to_dict, chunked, fn, per_season_weeks from ..dependencies import oauth2_scheme, valid_token router = APIRouter( prefix='/api/v3/pitchingstats', tags=['pitchingstats'] ) class PitStatModel(pydantic.BaseModel): player_id: int team_id: int ip: Optional[float] = 0.0 hit: Optional[int] = 0 run: Optional[int] = 0 erun: Optional[int] = 0 so: Optional[int] = 0 bb: Optional[int] = 0 hbp: Optional[int] = 0 wp: Optional[int] = 0 balk: Optional[int] = 0 hr: Optional[int] = 0 gs: Optional[int] = 0 win: Optional[int] = 0 loss: Optional[int] = 0 hold: Optional[int] = 0 sv: Optional[int] = 0 bsv: Optional[int] = 0 ir: Optional[int] = 0 irs: Optional[int] = 0 week: int game: int season: int class PitStatList(pydantic.BaseModel): count: int stats: List[PitStatModel] @router.get('') async def get_pitstats( season: int, s_type: Optional[str] = 'regular', team_abbrev: list = Query(default=None), player_name: list = Query(default=None), player_id: list = Query(default=None), week_start: Optional[int] = None, week_end: Optional[int] = None, game_num: list = Query(default=None), limit: Optional[int] = None, sort: Optional[str] = None, short_output: Optional[bool] = True): if 'post' in s_type.lower(): all_stats = PitchingStat.post_season(season) if all_stats.count() == 0: db.close() return {'count': 0, 'stats': []} elif s_type.lower() in ['combined', 'total', 'all']: all_stats = PitchingStat.combined_season(season) if all_stats.count() == 0: db.close() return {'count': 0, 'stats': []} else: all_stats = PitchingStat.regular_season(season) if all_stats.count() == 0: db.close() return {'count': 0, 'stats': []} if team_abbrev is not None: t_query = Team.select().where(Team.abbrev << [x.upper() for x in team_abbrev]) all_stats = all_stats.where(PitchingStat.team << t_query) if player_name is not None or player_id is not None: if player_id: all_stats = all_stats.where(PitchingStat.player_id << player_id) else: p_query = Player.select_season(season).where(fn.Lower(Player.name) << [x.lower() for x in player_name]) all_stats = all_stats.where(PitchingStat.player << p_query) if game_num: all_stats = all_stats.where(PitchingStat.game == game_num) start = 1 end = Current.get(Current.season == season).week if week_start is not None: start = week_start if week_end is not None: end = min(week_end, end) if start > end: db.close() raise HTTPException( status_code=404, detail=f'Start week {start} is after end week {end} - cannot pull stats' ) all_stats = all_stats.where( (PitchingStat.week >= start) & (PitchingStat.week <= end) ) if limit: all_stats = all_stats.limit(limit) if sort: if sort == 'newest': all_stats = all_stats.order_by(-PitchingStat.week, -PitchingStat.game) return_stats = { 'count': all_stats.count(), 'stats': [model_to_dict(x, recurse=not short_output) for x in all_stats] } db.close() return return_stats