From e0db2c9bfbf37c5e1fb4ab50098d5f995b84695a Mon Sep 17 00:00:00 2001 From: devRaGonSa Date: Mon, 23 Mar 2026 15:47:18 +0100 Subject: [PATCH] Fix monthly leaderboard routes --- backend/app/payloads.py | 30 ++++++++++++++++++++++++++++++ backend/app/routes.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/backend/app/payloads.py b/backend/app/payloads.py index 1279829..226a1c9 100644 --- a/backend/app/payloads.py +++ b/backend/app/payloads.py @@ -291,6 +291,21 @@ def build_weekly_leaderboard_payload( ) +def build_monthly_leaderboard_payload( + *, + limit: int = 10, + server_id: str | None = None, + metric: str = "kills", +) -> dict[str, object]: + """Return one monthly historical leaderboard for the requested metric.""" + return build_historical_leaderboard_payload( + limit=limit, + server_id=server_id, + metric=metric, + timeframe="monthly", + ) + + def build_recent_historical_matches_payload( *, limit: int = 20, @@ -426,6 +441,21 @@ def build_weekly_leaderboard_snapshot_payload( ) +def build_monthly_leaderboard_snapshot_payload( + *, + limit: int = 10, + server_id: str | None = None, + metric: str = "kills", +) -> dict[str, object]: + """Return one precomputed monthly leaderboard snapshot.""" + return build_leaderboard_snapshot_payload( + limit=limit, + server_id=server_id, + metric=metric, + timeframe="monthly", + ) + + def build_recent_historical_matches_snapshot_payload( *, limit: int = 20, diff --git a/backend/app/routes.py b/backend/app/routes.py index 2a09508..47dd152 100644 --- a/backend/app/routes.py +++ b/backend/app/routes.py @@ -11,6 +11,8 @@ from .payloads import ( build_error_payload, build_health_payload, build_historical_leaderboard_payload, + build_monthly_leaderboard_payload, + build_monthly_leaderboard_snapshot_payload, build_historical_server_summary_snapshot_payload, build_historical_player_profile_payload, build_historical_server_summary_payload, @@ -90,6 +92,21 @@ def resolve_get_payload(path: str) -> tuple[HTTPStatus | None, dict[str, object] metric=metric, ) + if parsed.path == "/api/historical/monthly-leaderboard": + limit = _parse_limit(parsed.query) + if limit is None: + return HTTPStatus.BAD_REQUEST, build_error_payload("Invalid limit parameter") + params = parse_qs(parsed.query) + server_id = params.get("server", [None])[0] + metric = params.get("metric", ["kills"])[0] + if metric not in {"kills", "deaths", "support", "matches_over_100_kills"}: + return HTTPStatus.BAD_REQUEST, build_error_payload("Invalid metric parameter") + return HTTPStatus.OK, build_monthly_leaderboard_payload( + limit=limit, + server_id=server_id, + metric=metric, + ) + if parsed.path == "/api/historical/snapshots/leaderboard": limit = _parse_limit(parsed.query) if limit is None: @@ -109,6 +126,21 @@ def resolve_get_payload(path: str) -> tuple[HTTPStatus | None, dict[str, object] timeframe=timeframe, ) + if parsed.path == "/api/historical/snapshots/monthly-leaderboard": + limit = _parse_limit(parsed.query) + if limit is None: + return HTTPStatus.BAD_REQUEST, build_error_payload("Invalid limit parameter") + params = parse_qs(parsed.query) + server_id = params.get("server", [None])[0] + metric = params.get("metric", ["kills"])[0] + if metric not in {"kills", "deaths", "support", "matches_over_100_kills"}: + return HTTPStatus.BAD_REQUEST, build_error_payload("Invalid metric parameter") + return HTTPStatus.OK, build_monthly_leaderboard_snapshot_payload( + limit=limit, + server_id=server_id, + metric=metric, + ) + if parsed.path == "/api/historical/snapshots/weekly-leaderboard": limit = _parse_limit(parsed.query) if limit is None: