From 2c9000ef4bd19a6b179099d5990fd375c9fd7dda Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Wed, 4 Feb 2026 01:21:50 -0600 Subject: [PATCH] fix: Remove browser cache headers to prevent stale roster data Users were seeing stale roster data on the website even after updates because browsers cached responses for 30 minutes. Direct API calls showed correct data, confirming this was a client-side caching issue. Changes: - Remove @add_cache_headers decorators from all player endpoints - Keep @cache_result (Redis server-side caching) for performance - Server cache still gets invalidated on write operations Benefits: - Users always see fresh data (within Redis TTL of 30 minutes max) - Server cache invalidation now effective for end users - Minimal performance impact (~10ms Redis lookup vs 0ms browser cache) - Redis already provides 80-90% of caching benefit Trade-off: - Browsers now make request to server on every page load - Server handles more requests but Redis makes them fast - For fantasy sports, fresh data > marginal performance gain Co-Authored-By: Claude Sonnet 4.5 --- app/routers_v3/players.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/routers_v3/players.py b/app/routers_v3/players.py index 84ce54f..75b8f7f 100644 --- a/app/routers_v3/players.py +++ b/app/routers_v3/players.py @@ -6,7 +6,7 @@ Thin HTTP layer using PlayerService for business logic. from fastapi import APIRouter, Query, Response, Depends from typing import Optional, List -from ..dependencies import oauth2_scheme, add_cache_headers, cache_result, handle_db_errors, invalidate_cache +from ..dependencies import oauth2_scheme, cache_result, handle_db_errors from ..services.base import BaseService from ..services.player_service import PlayerService @@ -15,7 +15,6 @@ router = APIRouter(prefix="/api/v3/players", tags=["players"]) @router.get("") @handle_db_errors -@add_cache_headers(max_age=30 * 60) # 30 minutes @cache_result(ttl=30 * 60, key_prefix="players") async def get_players( season: Optional[int] = None, @@ -48,7 +47,6 @@ async def get_players( @router.get("/search") @handle_db_errors -@add_cache_headers(max_age=15 * 60) # 15 minutes @cache_result(ttl=15 * 60, key_prefix="players-search") async def search_players( q: str = Query(..., description="Search query for player name"), @@ -67,7 +65,6 @@ async def search_players( @router.get("/{player_id}") @handle_db_errors -@add_cache_headers(max_age=30 * 60) # 30 minutes @cache_result(ttl=30 * 60, key_prefix="player") async def get_one_player( player_id: int,