/
leaderboard.py
125 lines (94 loc) · 2.65 KB
/
leaderboard.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
"""
Leaderboard API.
"""
import logging
from uuid import UUID
from web3 import Web3
from fastapi import FastAPI, Request, Depends
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
from .. import actions
from .. import data
from .. import db
from ..settings import DOCS_TARGET_PATH
from ..version import VERSION
logger = logging.getLogger(__name__)
tags_metadata = [
{"name": "leaderboard", "description": "Moonstream Engine leaderboard API"}
]
app = FastAPI(
title=f"Moonstream Engine leaderboard API",
description="Moonstream Engine leaderboard API endpoints.",
version=VERSION,
openapi_tags=tags_metadata,
openapi_url="/openapi.json",
docs_url=None,
redoc_url=f"/{DOCS_TARGET_PATH}",
)
app.add_middleware(
CORSMiddleware,
allow_origins="*",
allow_credentials=False,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/count/addresses")
async def count_addresses(
request: Request,
leaderboard_id: UUID,
db_session: Session = Depends(db.yield_db_session),
):
"""
Returns the number of addresses in the leaderboard.
"""
count = actions.get_leaderboard_total_count(db_session, leaderboard_id)
return data.CountAddressesResponse(count=count)
@app.get("/quartiles")
async def quartiles(
request: Request,
leaderboard_id: UUID,
db_session: Session = Depends(db.yield_db_session),
):
"""
Returns the quartiles of the leaderboard.
"""
q1, q2, q3 = actions.get_qurtiles(db_session, leaderboard_id)
return data.QuartilesResponse(
percentile_25={"address": q1[0], "score": q1[1], "rank": q1[2]},
percentile_50={"address": q2[0], "score": q2[1], "rank": q2[2]},
percentile_75={"address": q3[0], "score": q3[1], "rank": q3[2]},
)
@app.get("/position")
async def position(
request: Request,
leaderboard_id: UUID,
address: str,
window_size: int = 1,
limit: int = 10,
offset: int = 0,
db_session: Session = Depends(db.yield_db_session),
):
"""
Returns the leaderboard posotion for the given address.
With given window size.
"""
address = Web3.toChecksumAddress(address)
positions = actions.get_position(
db_session, leaderboard_id, address, window_size, limit, offset
)
return positions
@app.get("/")
async def leaderboard(
request: Request,
leaderboard_id: UUID,
limit: int = 10,
offset: int = 0,
db_session: Session = Depends(db.yield_db_session),
):
"""
Returns the leaderboard.
"""
leaderboard = actions.get_leaderboard_positions(
db_session, leaderboard_id, limit, offset
)
return leaderboard