WAGERBABE DOCS
All Stories
2-1-3-optimize-sidebar-dataReviewEpic 2.1

Story 2.1.3: Optimize Sidebar Data

Status: review

Tasks

  • Task 1: Remove Optic Odds API calls from SidebarCacheService (AC: #2)
    • 1.1: Delete `_get_league_fixture_count()` method that calls OpticOddsAPIClient
    • 1.2: Refactor `_get_basic_sports_list()` to query materialized view only
    • 1.3: Remove OpticOddsAPIClient import from sidebar_cache_service.py
    • 1.4: Add unit test verifying no external API calls during sidebar fetch
  • Task 2: Consolidate sidebar endpoints (AC: #1, #2)
    • 2.1: Audit sidebar.py vs sidebar_cache_service.py - identify duplicate logic
    • 2.2: Ensure `/api/v1/shared/sidebar` uses ONLY materialized view + Redis cache path
    • 2.3: Remove or deprecate any alternative sidebar endpoints calling Optic Odds
  • Task 3: Verify background refresh job (AC: #4)
    • 3.1: Confirm `sidebar_refresh_scheduler.py` refreshes MV every 5 minutes
    • 3.2: Add health check metric for background job status (last run, success/fail)
    • 3.3: Ensure MV refresh updates game_count and live_game_count columns
  • Task 4: Response size optimization (AC: #3)
    • 4.1: Measure current response size for `/api/v1/shared/sidebar`
    • 4.2: Remove unnecessary fields from response (only keep: sport, league, game_count, icon)
    • 4.3: Verify <5KB response for typical sidebar (10-15 sports, 30 leagues)
  • Task 5: Performance validation (AC: #1)
    • 5.1: Add p95 response time logging/metrics for sidebar endpoint
    • 5.2: Load test: 100 concurrent requests, verify p95 <100ms
    • 5.3: Document cache hit ratio (target >95%)
  • Task 6: Integration tests (AC: #1, #2, #3, #4)
    • 6.1: Test cache hit path returns <100ms
    • 6.2: Test cache miss path uses MV (no Optic Odds API)
    • 6.3: Test response size is <5KB
    • 6.4: Test force_refresh parameter works correctly

Progress

Tasks6/6
Acceptance Criteria0
Total Tasks6