- Created BaseService with common patterns (cache, db, auth)
- Created PlayerService with CRUD, search, filtering
- Created TeamService with CRUD, roster management
- Refactored players.py router to use PlayerService (~60% shorter)
- Refactored teams.py router to use TeamService (~75% shorter)
Benefits:
- Business logic isolated in services
- Easy to unit test
- Consistent error handling
- Reusable across endpoints
- /api/v3/players/search now supports season=0 or omitting season to search ALL seasons
- Results ordered by most recent season first
- Added all_seasons field in response to indicate search mode
- Added numpy<2.0.0 constraint for server compatibility
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Fix unsafe dict access in PUT endpoint roster cache invalidation
- Add roster cache invalidation to PATCH, POST, and DELETE endpoints
- Use wildcard pattern to invalidate all roster caches since:
* Team IDs may change in PUT/PATCH operations
* Multiple teams affected in bulk POST operations
* Ensures stale roster data is never served
This ensures team rosters are immediately updated when players are
added, removed, or transferred between teams.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add cache invalidation to PUT, PATCH, POST, and DELETE endpoints
- Invalidate all player list, search, and detail caches on data changes
- Increase cache TTLs now that invalidation ensures accuracy:
- GET /players: 10min → 30min
- GET /players/search: 5min → 15min
- GET /players/{player_id}: 10min → 30min
This ensures users see updated player data immediately after changes
while benefiting from longer cache lifetimes for read operations.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>