diff --git a/requirments.txt b/requirments.txt index 224f248..f7ef04d 100644 --- a/requirments.txt +++ b/requirments.txt @@ -3,3 +3,5 @@ click psycopg2-binary ratelimit backoff +fastapi +python-multipart diff --git a/src/api.py b/src/api.py new file mode 100644 index 0000000..17d7044 --- /dev/null +++ b/src/api.py @@ -0,0 +1,55 @@ +from fastapi import FastAPI, status +from transform import get_db_cols +from datetime import datetime +import db + + +app = FastAPI() + + +@app.get("/players") +async def get_players(): + cols = get_db_cols("profile_meta") + profiles = db.get_all_profiles() + profiles = map( + lambda profile: {cols[i]: profile[i] for i, _ in enumerate(profile)}, + profiles, + ) + + return list(profiles) + + +@app.get("/players/{player_id}/games") +async def get_player_games( + player_id, + begin: datetime | None = None, + end: datetime | None = None, +): + print(begin) + print(end) + + game_ids = db.get_profile_game_ids(player_id, begin=begin, end=end) + print(len(game_ids)) + if len(game_ids) == 0: + return status.HTTP_404_NOT_FOUND + + return {"game_ids": game_ids} + + +@app.get("/players/{player_id}/player_stats/") +async def get_player_stats(player_id: str, game_ids_param: str | None = None): + if not game_ids_param or len(game_ids_param) == 0: + game_ids = db.get_profile_game_ids(player_id) + else: + game_ids = [id.strip('" ') for id in game_ids_param.split(",")] + + print(len(game_ids)) + cols = get_db_cols("player_stats") + stats = db.get_player_stats(game_ids) + print(len(stats)) + stats = map( + lambda stat: {cols[i]: stat[i] for i, _ in enumerate(stat)}, + stats, + ) + + return {"player_id": player_id, "player_stats": list(stats)} diff --git a/src/db.py b/src/db.py index c03e55e..9453ac9 100644 --- a/src/db.py +++ b/src/db.py @@ -32,6 +32,15 @@ def get_all_profile_names(conn=None): return data +@connect_by_default +def get_all_profiles(conn=None): + with conn.cursor() as curs: + curs.execute("SELECT * from data.profile_meta;") + data = curs.fetchall() + + return data + + @connect_by_default def get_profile_game_count(user_id, conn=None): with conn.cursor() as curs: @@ -48,18 +57,42 @@ def get_profile_game_count(user_id, conn=None): @connect_by_default -def get_profile_game_ids(user_id, conn=None): +def get_profile_game_ids(user_id, begin=None, end=None, conn=None): + sql = """ + SELECT game_id FROM data.profile_game + WHERE leetify_user_id = %s""" + vals = [user_id] + if begin: + sql += """ + AND game_finished_at >= (%s) + """ + vals.append(begin) + if end: + sql += """ + AND game_finished_at < (%s) + """ + vals.append(end) + sql += ";" with conn.cursor() as curs: - curs.execute( - """SELECT game_id FROM data.profile_game - WHERE leetify_user_id = %s;""", - (user_id,), - ) + curs.execute(sql, (*vals,)) data = curs.fetchall() return [row[0] for row in data] +@connect_by_default +def get_player_stats(game_ids, conn=None): + sql = """ + SELECT * FROM data.player_stats + WHERE game_id = ANY(%s); + """ + with conn.cursor() as curs: + curs.execute(sql, (game_ids,)) + data = curs.fetchall() + + return data + + @connect_by_default def insert_player_stats(stats, conn=None): cols_api, cols_db = get_cols("player_stats")