From 3f1efe0ac7d172d1433ada82fc16dc68bc0f911b Mon Sep 17 00:00:00 2001 From: norohind <60548839+norohind@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:10:21 +0300 Subject: [PATCH] WIP: leaderboard state by action_id --- model/abstract_model.py | 4 ++++ model/postgres_model.py | 24 ++++++++++++++++++++++++ model/postgres_sql_requests.py | 9 ++++++++- web.py | 14 +++++++++++--- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/model/abstract_model.py b/model/abstract_model.py index fc15254..90cf1c9 100644 --- a/model/abstract_model.py +++ b/model/abstract_model.py @@ -27,3 +27,7 @@ class AbstractModel(abc.ABC): @abc.abstractmethod def get_leaderboard_sum_history(self, platform: str, leaderboard_type: str) -> list[dict]: raise NotImplemented + + @abc.abstractmethod + def get_leaderboard_by_action_id(self, action_id: int) -> list[dict]: + raise NotImplemented diff --git a/model/postgres_model.py b/model/postgres_model.py index cee9eda..ea9eedc 100644 --- a/model/postgres_model.py +++ b/model/postgres_model.py @@ -166,3 +166,27 @@ class PostgresModel(AbstractModel): cache.set(cache_key, json.dumps(result)) return result + + def get_leaderboard_by_action_id(self, action_id: int) -> list[dict]: + cache_key = f'leaderboard_by_action_id_{action_id}' + + cached_result: typing.Union[str, None] = cache.get(cache_key) + + if cached_result is not None: + logger.debug(f'Cached result for {cache_key}') + return json.loads(cached_result) + + with self.db.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as cursor: + cursor.execute( + postgres_sql_requests.select_last_action_id, + { + 'action_id': action_id + } + ) + + result: list[dict] = cursor.fetchall() + + if not cache.disabled: + cache.set(cache_key, json.dumps(result)) + + return result diff --git a/model/postgres_sql_requests.py b/model/postgres_sql_requests.py index c129bca..dd8f54b 100644 --- a/model/postgres_sql_requests.py +++ b/model/postgres_sql_requests.py @@ -94,4 +94,11 @@ where leaderboard_type = %(LB_type)s and platform = %(platform)s group by action_id order by "Timestamp UTC" desc limit 1000; -""" \ No newline at end of file +""" + +select_leaderboard_by_action_id = """select + * +from squads_stats_states +where action_id = %(action_id)s +order by score desc; +""" diff --git a/web.py b/web.py index df5c1d7..ff3ef60 100644 --- a/web.py +++ b/web.py @@ -119,7 +119,14 @@ class SumLeaderboardHistoryHtml: 'graph_template.html', { 'dataset_title': f'{leaderboard} {platform} points sum' - }) + } + ) + + +class LeaderboardByActionID: + def on_get(self, req: falcon.request.Request, resp: falcon.response.Response, action_id: int) -> None: + resp.content_type = falcon.MEDIA_JSON + resp.text = json.dumps(model.get_diff_action_id(action_id)) class MainPage: @@ -140,11 +147,12 @@ class Cache: app = falcon.App() app.add_route('/api/leaderboard/{leaderboard}/platform/{platform}', Activity()) app.add_route('/api/diff/{action_id}', ActivityDiff()) -app.add_route('/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistoryHtml()) +app.add_route('/api/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistory()) +app.add_route('/api/leaderboard-state/by-action-id/{action_id}', LeaderboardByActionID()) app.add_route('/leaderboard/{leaderboard}/platform/{platform}', ActivityHtml()) app.add_route('/diff/{action_id}', ActivityDiffHtml()) -app.add_route('/api/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistory()) +app.add_route('/leaderboard-history/leaderboard/{leaderboard}/platform/{platform}', SumLeaderboardHistoryHtml()) app.add_route('/api/cache/{action}', Cache())