3.7 KiB
3.7 KiB
id, title, status, type, team, supporting_teams, roadmap_item, priority
| id | title | status | type | team | supporting_teams | roadmap_item | priority | ||
|---|---|---|---|---|---|---|---|---|---|
| TASK-169-add-annual-ranking-snapshot-api | Add annual ranking snapshot API | done | backend | Backend Senior |
|
foundation | medium |
TASK-169-add-annual-ranking-snapshot-api
Goal
Exponer una API de lectura publica para el ranking anual top 20 precomputado desde snapshots almacenadas.
Context
La API debe consumir rcon_annual_ranking_snapshots y rcon_annual_ranking_snapshot_items generados por el modulo de generacion (TASK-168) y las tablas añadidas por TASK-167.
Mantiene compatibilidad entre SQLite y Postgres usando el patron de conexion compartido.
Steps
- Leer los archivos indicados en "Files to Read First".
- Implementar el endpoint GET
/api/stats/rankings/annualen backend sin recalcular ranking. - Anadir payload y registro de ruta siguiendo patrones existentes.
- Validar comportamientos esperados (snapshot existente, faltante, metrica no soportada).
Files to Read First
AGENTS.mdai/repo-context.mdai/architecture-index.mddocs/annual-ranking-snapshot-schema-plan.mddocs/stats-section-functional-plan.mdbackend/app/rcon_annual_rankings.pybackend/app/rcon_historical_leaderboards.pybackend/app/rcon_historical_player_stats.pybackend/app/routes.pybackend/app/payloads.pybackend/app/rcon_admin_log_materialization.pybackend/app/postgres_rcon_storage.py
Expected Files to Modify
backend/app/rcon_annual_rankings.pybackend/app/payloads.pybackend/app/routes.py
Constraints
- Endpoint:
GET /api/stats/rankings/annual?year=<year>&server_id=<server-or-all>&metric=kills&limit=<n> server_idopcional,allpor defecto.metricpor ahora solokills.limitopcional, por defecto 20, validado razonablemente.- Si no existe snapshot debe responder
snapshot_status="missing"conitems=[]y estado HTTP 200. - No generar snapshot en el endpoint.
- Mantener compatibilidad SQLite/Postgres.
- No tocar frontend.
- No tocar
frontend/assets/js/partida-actual.jsnifrontend/assets/img/clans/bxb.png. - No reactivar Elo/MMR.
- No incluir Comunidad Hispana #03.
- No modificar workers historicos salvo justificacion imprescindible.
Validation
python -m compileall backend/apppowershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1- Validacion manual del contrato con backend local o metodo equivalente.
Outcome
Files modified
backend/app/rcon_annual_rankings.pybackend/app/payloads.pybackend/app/routes.py
Endpoint created
GET /api/stats/rankings/annual?year=<year>&server_id=<server-or-all>&metric=kills&limit=<n>- Respuestas:
snapshot_status=readycuando existe snapshot.snapshot_status=missingcuando no existe snapshot, y devuelveitems=[].
- Soporta
metric=killsy devuelve 400 para metricas no soportadas.
Validations performed
python -m compileall backend/app✅powershell -ExecutionPolicy Bypass -File scripts/run-integration-tests.ps1✅- Validacion manual usando
app.routes.resolve_get_payload:/api/stats/rankings/annual(HTTP 200, respuesta OK)/api/stats/rankings/annual?year=1990(HTTP 200)/api/stats/rankings/annual?year=1990&metric=kills&limit=3(HTTP 200)/api/stats/rankings/annual?metric=deaths(HTTP 400, metrica invalida)/api/stats/rankings/annual?year=1900(HTTP 200, snapshot_statusmissing,items=[])
Limitations
- Soporta solo
metric=killsen esta fase. - Endpoint no genera snapshots (no recalculo); requiere que TASK-168 haya generado datos.
- No se toco frontend en este alcance.
Next task recommendation
Conectar ranking anual top 20 desde frontend Stats.