From 7ce64a14ea0804f967b5173ac9364a3aecbdc051 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Sat, 25 Oct 2025 20:15:56 -0500 Subject: [PATCH] Update caching rules & Add DELETE /draftlist --- app/routers_v3/draftlist.py | 12 ++++++++++++ app/routers_v3/players.py | 39 ++++++++++++++++++++----------------- app/routers_v3/teams.py | 22 ++++++++++++++++++--- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/app/routers_v3/draftlist.py b/app/routers_v3/draftlist.py index 2667bfa..2e25f6b 100644 --- a/app/routers_v3/draftlist.py +++ b/app/routers_v3/draftlist.py @@ -94,3 +94,15 @@ async def post_draftlist(draft_list: DraftListList, token: str = Depends(oauth2_ db.close() return f'Inserted {len(new_list)} list values' + + +@router.delete('/team/{team_id}', include_in_schema=PRIVATE_IN_SCHEMA) +@handle_db_errors +async def delete_draftlist(team_id: int, token: str = Depends(oauth2_scheme)): + if not valid_token(token): + logger.warning(f'delete_draftlist - Bad Token: {token}') + raise HTTPException(status_code=401, detail='Unauthorized') + + count = DraftList.delete().where(DraftList.team_id == team_id).execute() + db.close() + return f'Deleted {count} list values' diff --git a/app/routers_v3/players.py b/app/routers_v3/players.py index 9af9f82..2035519 100644 --- a/app/routers_v3/players.py +++ b/app/routers_v3/players.py @@ -50,6 +50,7 @@ class PlayerList(pydantic.BaseModel): @router.get('') @handle_db_errors @add_cache_headers(max_age=30*60) # 30 minutes - safe with cache invalidation on writes +@cache_result(ttl=30*60, key_prefix='players') async def get_players( season: Optional[int], name: Optional[str] = None, team_id: list = Query(default=None), pos: list = Query(default=None), strat_code: list = Query(default=None), is_injured: Optional[bool] = None, @@ -127,6 +128,7 @@ async def get_players( @router.get('/search') @handle_db_errors @add_cache_headers(max_age=15*60) # 15 minutes - safe with cache invalidation on writes +@cache_result(ttl=15*60, key_prefix='players-search') async def search_players( q: str = Query(..., description="Search query for player name"), season: Optional[int] = Query(default=None, description="Season to search in (defaults to current)"), @@ -178,6 +180,7 @@ async def search_players( @router.get('/{player_id}') @handle_db_errors @add_cache_headers(max_age=30*60) # 30 minutes - safe with cache invalidation on writes +@cache_result(ttl=30*60, key_prefix='player') async def get_one_player(player_id: int, short_output: Optional[bool] = False): this_player = Player.get_or_none(Player.id == player_id) if this_player: @@ -205,11 +208,11 @@ async def put_player( db.close() # Invalidate player-related cache entries - invalidate_cache("api:get_players*") - invalidate_cache("api:search_players*") - invalidate_cache(f"api:get_one_player*{player_id}*") - # Invalidate team roster cache (use wildcard since team may have changed) - invalidate_cache("api:get_team_roster*") + invalidate_cache("players*") + invalidate_cache("players-search*") + invalidate_cache(f"player*{player_id}*") + # Invalidate team roster cache (player data affects team rosters) + invalidate_cache("team-roster*") return r_player @@ -293,11 +296,11 @@ async def patch_player( db.close() # Invalidate player-related cache entries - invalidate_cache("api:get_players*") - invalidate_cache("api:search_players*") - invalidate_cache(f"api:get_one_player*{player_id}*") - # Invalidate team roster cache (use wildcard since team may have changed) - invalidate_cache("api:get_team_roster*") + invalidate_cache("players*") + invalidate_cache("players-search*") + invalidate_cache(f"player*{player_id}*") + # Invalidate team roster cache (player data affects team rosters) + invalidate_cache("team-roster*") return r_player else: @@ -330,11 +333,11 @@ async def post_players(p_list: PlayerList, token: str = Depends(oauth2_scheme)): db.close() # Invalidate player-related cache entries - invalidate_cache("api:get_players*") - invalidate_cache("api:search_players*") - invalidate_cache("api:get_one_player*") + invalidate_cache("players*") + invalidate_cache("players-search*") + invalidate_cache("player*") # Invalidate team roster cache (new players added to teams) - invalidate_cache("api:get_team_roster*") + invalidate_cache("team-roster*") return f'Inserted {len(new_players)} players' @@ -356,11 +359,11 @@ async def delete_player(player_id: int, token: str = Depends(oauth2_scheme)): if count == 1: # Invalidate player-related cache entries - invalidate_cache("api:get_players*") - invalidate_cache("api:search_players*") - invalidate_cache(f"api:get_one_player*{player_id}*") + invalidate_cache("players*") + invalidate_cache("players-search*") + invalidate_cache(f"player*{player_id}*") # Invalidate team roster cache (player removed from team) - invalidate_cache("api:get_team_roster*") + invalidate_cache("team-roster*") return f'Player {player_id} has been deleted' else: diff --git a/app/routers_v3/teams.py b/app/routers_v3/teams.py index f373099..b976b8a 100644 --- a/app/routers_v3/teams.py +++ b/app/routers_v3/teams.py @@ -5,7 +5,7 @@ import logging import pydantic from ..db_engine import db, Team, Manager, Division, model_to_dict, chunked, fn, query_to_csv, Player -from ..dependencies import add_cache_headers, cache_result, oauth2_scheme, valid_token, PRIVATE_IN_SCHEMA, handle_db_errors +from ..dependencies import add_cache_headers, cache_result, oauth2_scheme, valid_token, PRIVATE_IN_SCHEMA, handle_db_errors, invalidate_cache logger = logging.getLogger('discord_app') @@ -77,7 +77,7 @@ async def get_teams( @router.get('/{team_id}') @handle_db_errors -@add_cache_headers(max_age=60*60) +# @add_cache_headers(max_age=60*60) @cache_result(ttl=30*60, key_prefix='team') async def get_one_team(team_id: int): this_team = Team.get_or_none(Team.id == team_id) @@ -91,7 +91,7 @@ async def get_one_team(team_id: int): @router.get('/{team_id}/roster/{which}', include_in_schema=PRIVATE_IN_SCHEMA) @handle_db_errors -@add_cache_headers(max_age=60*60) +# @add_cache_headers(max_age=60*60) @cache_result(ttl=30*60, key_prefix='team-roster') async def get_team_roster(team_id: int, which: Literal['current', 'next'], sort: Optional[str] = None): try: @@ -201,6 +201,12 @@ async def patch_team( if this_team.save(): r_team = model_to_dict(this_team) db.close() + + # Invalidate team-related cache entries + invalidate_cache("teams*") + invalidate_cache(f"team*{team_id}*") + invalidate_cache("team-roster*") + return r_team else: db.close() @@ -242,6 +248,11 @@ async def post_team(team_list: TeamList, token: str = Depends(oauth2_scheme)): Team.insert_many(batch).on_conflict_ignore().execute() db.close() + # Invalidate team-related cache entries + invalidate_cache("teams*") + invalidate_cache("team*") + invalidate_cache("team-roster*") + return f'Inserted {len(new_teams)} teams' @@ -261,6 +272,11 @@ async def delete_team(team_id: int, token: str = Depends(oauth2_scheme)): db.close() if count == 1: + # Invalidate team-related cache entries + invalidate_cache("teams*") + invalidate_cache(f"team*{team_id}*") + invalidate_cache("team-roster*") + return f'Team {team_id} has been deleted' else: raise HTTPException(status_code=500, detail=f'Team {team_id} could not be deleted')