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 <noreply@anthropic.com>
This commit is contained in:
Cal Corum 2026-02-04 01:21:50 -06:00
parent be7b1b5d91
commit 2c9000ef4b

View File

@ -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,