Fix stats player profile weekly monthly 500
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# TASK-255 - Fix stats player profile weekly/monthly 500
|
||||
|
||||
## Summary
|
||||
|
||||
This task fixes the public player-profile weekly/monthly endpoints after a production audit reported:
|
||||
|
||||
- `stats-player-profile-weekly` -> `500`
|
||||
- `stats-player-profile-monthly` -> `500`
|
||||
|
||||
The fix prioritizes endpoint availability and fast response over optional KPM enrichment.
|
||||
|
||||
## Affected Endpoint
|
||||
|
||||
Route:
|
||||
|
||||
- `/api/stats/players/{player_id}?timeframe=weekly`
|
||||
- `/api/stats/players/{player_id}?timeframe=monthly`
|
||||
|
||||
Handler chain:
|
||||
|
||||
- `backend/app/routes.py`
|
||||
- `build_stats_player_profile_payload(...)`
|
||||
- `get_rcon_materialized_player_stats(...)`
|
||||
- `_get_player_period_stats_read_model(...)`
|
||||
|
||||
## Root Cause
|
||||
|
||||
The player-period read model path already handled missing read-model rows defensively.
|
||||
|
||||
However, after the base read-model rows were loaded, the code opened a second read scope to compute optional active-time/KPM data:
|
||||
|
||||
- `player_active_seconds`
|
||||
- `player_active_minutes`
|
||||
- `kpm`
|
||||
- `kpm_status`
|
||||
- `active_time_source`
|
||||
- `active_time_coverage`
|
||||
|
||||
That second lookup lived outside the original `try/except`.
|
||||
|
||||
If production schema or compatibility differences caused the active-time query to fail, the exception propagated and the whole profile endpoint returned `500` even though the base weekly/monthly profile data was already available.
|
||||
|
||||
## Fix
|
||||
|
||||
- keep weekly/monthly profile reads read-model-first
|
||||
- keep runtime-heavy fallback disabled
|
||||
- wrap the optional active-time read-model enrichment in a defensive fallback
|
||||
- if active-time enrichment fails:
|
||||
- return `kpm = null`
|
||||
- return `kpm_status = missing_active_time`
|
||||
- return `player_active_seconds = null`
|
||||
- return `player_active_minutes = null`
|
||||
- keep external links and platform identity
|
||||
- still return `200`
|
||||
|
||||
This preserves public endpoint speed and avoids breaking the UI when KPM coverage is unavailable.
|
||||
|
||||
## Validation
|
||||
|
||||
Executed:
|
||||
|
||||
- `python -m compileall backend/app`
|
||||
- `cd backend; python -m unittest tests.test_current_match_payload`
|
||||
- `cd backend; python -m unittest tests.test_historical_snapshot_refresh`
|
||||
- `cd backend; python -m unittest tests.test_stats_player_profile_payload`
|
||||
|
||||
Expected post-fix audit command:
|
||||
|
||||
```powershell
|
||||
python .\scripts\audit_public_requests.py --base-url https://comunidadhll.devzamode.es --timeout 30 --output tmp\task255_full_audit_after.json
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- No TeamKills change.
|
||||
- No scheduler change.
|
||||
- No RCON/server configuration change.
|
||||
- No asset change.
|
||||
Reference in New Issue
Block a user