Add fixes for get leaderboard.

pull/968/head
Andrey 2023-11-15 17:28:15 +02:00
rodzic 949f6c4905
commit 5878e66aaf
5 zmienionych plików z 76 dodań i 39 usunięć

Wyświetl plik

@ -1,8 +1,8 @@
"""leaderboard metadata
Revision ID: e86bb1230bca
Revision ID: 71e888082a6d
Revises: 040f2dfde5a5
Create Date: 2023-11-09 16:43:21.553490
Create Date: 2023-11-15 13:21:16.108399
"""
from alembic import op
@ -10,7 +10,7 @@ import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = "e86bb1230bca"
revision = "71e888082a6d"
down_revision = "040f2dfde5a5"
branch_labels = None
depends_on = None
@ -29,11 +29,13 @@ def upgrade():
)
op.add_column(
"leaderboards",
sa.Column("show_connect", sa.Boolean(), nullable=False, server_default="false"),
sa.Column(
"wallet_connect", sa.Boolean(), nullable=False, server_default="false"
),
)
op.add_column(
"leaderboards",
sa.Column("public", sa.Boolean(), nullable=False, server_default="false"),
sa.Column("public", sa.Boolean(), nullable=False, server_default="true"),
)
op.add_column(
"leaderboards",
@ -51,6 +53,6 @@ def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column("leaderboards", "columns_names")
op.drop_column("leaderboards", "public")
op.drop_column("leaderboards", "show_connect")
op.drop_column("leaderboards", "wallet_connect")
op.drop_column("leaderboards", "blockchain_ids")
# ### end Alembic commands ###

Wyświetl plik

@ -1257,7 +1257,7 @@ def create_leaderboard(
description: Optional[str],
token: Optional[Union[uuid.UUID, str]] = None,
public: bool = False,
show_connect: bool = False,
wallet_connect: bool = False,
blockchain_ids: Optional[List[int]] = None,
columns_names: Optional[Dict[str, str]] = None,
) -> Leaderboard:
@ -1272,7 +1272,7 @@ def create_leaderboard(
title=title,
description=description,
public=public,
show_connect=show_connect,
wallet_connect=wallet_connect,
blockchain_ids=blockchain_ids,
columns_names=columns_names,
)
@ -1335,7 +1335,7 @@ def update_leaderboard(
title: Optional[str],
description: Optional[str],
public: Optional[bool],
show_connect: Optional[bool],
wallet_connect: Optional[bool],
blockchain_ids: Optional[List[int]],
columns_names: Optional[Dict[str, str]],
) -> Leaderboard:
@ -1353,8 +1353,8 @@ def update_leaderboard(
leaderboard.description = description
if public is not None:
leaderboard.public = public
if show_connect is not None:
leaderboard.show_connect = show_connect
if wallet_connect is not None:
leaderboard.wallet_connect = wallet_connect
if blockchain_ids is not None:
leaderboard.blockchain_ids = blockchain_ids
if columns_names is not None:
@ -1369,7 +1369,7 @@ def get_leaderboard_by_id(db_session: Session, leaderboard_id) -> Leaderboard:
"""
Get the leaderboard by id
"""
return db_session.query(Leaderboard).filter(Leaderboard.id == leaderboard_id).filter(leaderboard.public == True).one() # type: ignore
return db_session.query(Leaderboard).filter(Leaderboard.id == leaderboard_id).filter(Leaderboard.public == True).one() # type: ignore
def get_leaderboard_by_title(db_session: Session, title) -> Leaderboard:

Wyświetl plik

@ -342,6 +342,16 @@ class Score(BaseModel):
points_data: Dict[str, Any]
class LeaderboardUnformattedPosition(BaseModel):
column_1: str = Field(serialization_alias="address")
column_2: int = Field(serialization_alias="rank")
column_3: int = Field(serialization_alias="score")
column_4: Dict[str, Any] = Field(serialization_alias="points_data")
class Config:
orm_mode = True
class LeaderboardPosition(BaseModel):
address: str
rank: int
@ -371,7 +381,7 @@ class Leaderboard(BaseModel):
description: Optional[str] = None
resource_id: Optional[UUID] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
created_at: datetime
@ -390,7 +400,7 @@ class LeaderboardCreateRequest(BaseModel):
title: str
description: Optional[str] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
@ -401,7 +411,7 @@ class LeaderboardCreatedResponse(BaseModel):
description: Optional[str] = None
resource_id: Optional[UUID] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
created_at: datetime
@ -417,7 +427,7 @@ class LeaderboardUpdatedResponse(BaseModel):
description: Optional[str] = None
resource_id: Optional[UUID] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
created_at: datetime
@ -431,7 +441,7 @@ class LeaderboardUpdateRequest(BaseModel):
title: Optional[str] = None
description: Optional[str] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
@ -442,7 +452,7 @@ class LeaderboardDeletedResponse(BaseModel):
description: Optional[str] = None
resource_id: Optional[UUID] = None
public: Optional[bool] = False
show_connect: Optional[bool] = False
wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None
created_at: datetime

Wyświetl plik

@ -348,7 +348,8 @@ class Leaderboard(Base): # type: ignore
description = Column(String, nullable=True)
resource_id = Column(UUID(as_uuid=True), nullable=True, index=True)
blockchain_ids = Column(ARRAY(Integer), nullable=False, default=[])
show_connect = Column(Boolean, default=False, nullable=False)
wallet_connect = Column(Boolean, default=False, nullable=False)
public = Column(Boolean, default=False, nullable=False)
columns_names = Column(JSONB, nullable=False, default={})
created_at = Column(

Wyświetl plik

@ -2,7 +2,7 @@
Leaderboard API.
"""
import logging
from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Any, Union
from uuid import UUID
from bugout.exceptions import BugoutResponseException
@ -87,21 +87,33 @@ app.add_middleware(
)
@app.get("", response_model=List[data.LeaderboardPosition], tags=["Public Endpoints"])
@app.get("/", response_model=List[data.LeaderboardPosition], tags=["Public Endpoints"])
@app.get(
"",
response_model=Union[
List[data.LeaderboardPosition], List[data.LeaderboardUnformattedPosition]
],
tags=["Public Endpoints"],
)
@app.get(
"/",
response_model=Union[
List[data.LeaderboardPosition], List[data.LeaderboardUnformattedPosition]
],
tags=["Public Endpoints"],
)
async def leaderboard(
leaderboard_id: UUID = Query(..., description="Leaderboard ID"),
limit: int = Query(10),
offset: int = Query(0),
db_session: Session = Depends(db.yield_db_session),
) -> List[data.LeaderboardPosition]:
) -> Any:
"""
Returns the leaderboard positions.
"""
### Check if leaderboard exists
try:
actions.get_leaderboard_by_id(db_session, leaderboard_id)
leaderboard = actions.get_leaderboard_by_id(db_session, leaderboard_id)
except NoResultFound as e:
raise EngineHTTPException(
status_code=404,
@ -114,16 +126,28 @@ async def leaderboard(
leaderboard_positions = actions.get_leaderboard_positions(
db_session, leaderboard_id, limit, offset
)
if len(leaderboard.columns_names) > 0:
# breakpoint()
result = [
data.LeaderboardUnformattedPosition(
column_1=position[1],
column_2=position[2],
column_3=position[4],
column_4=position[3],
)
for position in leaderboard_positions
]
result = [
data.LeaderboardPosition(
address=position.address,
score=position.score,
rank=position.rank,
points_data=position.points_data,
)
for position in leaderboard_positions
]
else:
result = [
data.LeaderboardPosition(
address=position.address,
score=position.score,
rank=position.rank,
points_data=position.points_data,
)
for position in leaderboard_positions
]
return result
@ -153,7 +177,7 @@ async def create_leaderboard(
description=leaderboard.description,
token=token,
public=leaderboard.public,
show_connect=leaderboard.show_connect,
wallet_connect=leaderboard.wallet_connect,
blockchain_ids=leaderboard.blockchain_ids,
columns_names=leaderboard.columns_names,
)
@ -176,7 +200,7 @@ async def create_leaderboard(
description=created_leaderboard.description, # type: ignore
resource_id=created_leaderboard.resource_id, # type: ignore
public=created_leaderboard.public, # type: ignore
show_connect=created_leaderboard.show_connect, # type: ignore
wallet_connect=created_leaderboard.wallet_connect, # type: ignore
blockchain_ids=created_leaderboard.blockchain_ids, # type: ignore
columns_names=created_leaderboard.columns_names, # type: ignore
created_at=created_leaderboard.created_at, # type: ignore
@ -225,7 +249,7 @@ async def update_leaderboard(
title=leaderboard.title,
description=leaderboard.description,
public=leaderboard.public,
show_connect=leaderboard.show_connect,
wallet_connect=leaderboard.wallet_connect,
blockchain_ids=leaderboard.blockchain_ids,
columns_names=leaderboard.columns_names,
)
@ -246,7 +270,7 @@ async def update_leaderboard(
description=updated_leaderboard.description, # type: ignore
resource_id=updated_leaderboard.resource_id, # type: ignore
public=updated_leaderboard.public, # type: ignore
show_connect=updated_leaderboard.show_connect, # type: ignore
wallet_connect=updated_leaderboard.wallet_connect, # type: ignore
blockchain_ids=updated_leaderboard.blockchain_ids, # type: ignore
columns_names=updated_leaderboard.columns_names, # type: ignore
created_at=updated_leaderboard.created_at, # type: ignore
@ -310,7 +334,7 @@ async def delete_leaderboard(
description=deleted_leaderboard.description, # type: ignore
resource_id=deleted_leaderboard.resource_id, # type: ignore
public=deleted_leaderboard.public, # type: ignore
show_connect=deleted_leaderboard.show_connect, # type: ignore
wallet_connect=deleted_leaderboard.wallet_connect, # type: ignore
blockchain_ids=deleted_leaderboard.blockchain_ids, # type: ignore
columns_names=deleted_leaderboard.columns_names, # type: ignore
created_at=deleted_leaderboard.created_at, # type: ignore
@ -352,7 +376,7 @@ async def get_leaderboards(
description=leaderboard.description, # type: ignore
resource_id=leaderboard.resource_id, # type: ignore
public=leaderboard.public, # type: ignore
show_connect=leaderboard.show_connect, # type: ignore
wallet_connect=leaderboard.wallet_connect, # type: ignore
blockchain_ids=leaderboard.blockchain_ids, # type: ignore
columns_names=leaderboard.columns_names, # type: ignore
created_at=leaderboard.created_at, # type: ignore