From 5878e66aaf57d02b942f8dbb3ec841e8c995a7b8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 15 Nov 2023 17:28:15 +0200 Subject: [PATCH] Add fixes for get leaderboard. --- ...y => 71e888082a6d_leaderboard_metadata.py} | 14 ++-- engineapi/engineapi/actions.py | 12 ++-- engineapi/engineapi/data.py | 22 +++++-- engineapi/engineapi/models.py | 3 +- engineapi/engineapi/routes/leaderboard.py | 64 +++++++++++++------ 5 files changed, 76 insertions(+), 39 deletions(-) rename engineapi/alembic/versions/{e86bb1230bca_leaderboard_metadata.py => 71e888082a6d_leaderboard_metadata.py} (81%) diff --git a/engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py b/engineapi/alembic/versions/71e888082a6d_leaderboard_metadata.py similarity index 81% rename from engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py rename to engineapi/alembic/versions/71e888082a6d_leaderboard_metadata.py index 3198bc75..da9fa9d1 100644 --- a/engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py +++ b/engineapi/alembic/versions/71e888082a6d_leaderboard_metadata.py @@ -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 ### diff --git a/engineapi/engineapi/actions.py b/engineapi/engineapi/actions.py index feb5fe8d..05310ed7 100644 --- a/engineapi/engineapi/actions.py +++ b/engineapi/engineapi/actions.py @@ -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: diff --git a/engineapi/engineapi/data.py b/engineapi/engineapi/data.py index 49fa92be..9fffad0b 100644 --- a/engineapi/engineapi/data.py +++ b/engineapi/engineapi/data.py @@ -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 diff --git a/engineapi/engineapi/models.py b/engineapi/engineapi/models.py index a937fe07..c786ea5c 100644 --- a/engineapi/engineapi/models.py +++ b/engineapi/engineapi/models.py @@ -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( diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index fbbbbb08..6f79e3ce 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -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