Add leaderboard key value filter.

pull/1023/head
Andrey 2024-02-24 03:11:45 +02:00
rodzic 3a0ccb889f
commit 62857b08d9
2 zmienionych plików z 29 dodań i 1 usunięć

Wyświetl plik

@ -1289,6 +1289,7 @@ def get_leaderboard_positions(
limit: int,
offset: int,
version_number: Optional[int] = None,
poitns_data: Optional[Dict[str, str]] = None,
) -> List[Row[Tuple[uuid.UUID, str, int, str, int]]]:
"""
Get the leaderboard positions
@ -1324,6 +1325,18 @@ def get_leaderboard_positions(
.filter(LeaderboardVersion.version_number == latest_version)
)
if poitns_data:
query = query.filter(
or_(
*[
LeaderboardScores.points_data[point_key].astext == point_value
for point_key, point_value in poitns_data.items()
]
)
)
if limit:
query = query.limit(limit)

Wyświetl plik

@ -1,6 +1,7 @@
"""
Leaderboard API.
"""
import logging
from typing import Any, Dict, List, Optional, Any, Union
from uuid import UUID
@ -88,6 +89,19 @@ app.add_middleware(
)
def points_data_dependency(request: Request):
# Extract all query parameters as a dictionary
query_params = dict(request.query_params)
# Filter parameters that start with 'points_data.'
points_data_params = {
key[len("points_data.") :]: value
for key, value in query_params.items()
if key.startswith("points_data.")
}
# Optionally, transform the keys or structure as needed
return points_data_params
@app.get(
"",
response_model=List[data.LeaderboardPosition],
@ -104,6 +118,7 @@ async def leaderboard(
offset: int = Query(0),
db_session: Session = Depends(db.yield_db_session),
version: Optional[str] = Query(None, description="Version of the leaderboard."),
points_data: Dict[str, str] = Depends(points_data_dependency),
) -> List[data.LeaderboardPosition]:
"""
Returns the leaderboard positions.
@ -122,7 +137,7 @@ async def leaderboard(
raise EngineHTTPException(status_code=500, detail="Internal server error")
leaderboard_positions = actions.get_leaderboard_positions(
db_session, leaderboard.id, limit, offset, version
db_session, leaderboard.id, limit, offset, version, points_data
)
result = [