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

Wyświetl plik

@ -1257,7 +1257,7 @@ def create_leaderboard(
description: Optional[str], description: Optional[str],
token: Optional[Union[uuid.UUID, str]] = None, token: Optional[Union[uuid.UUID, str]] = None,
public: bool = False, public: bool = False,
show_connect: bool = False, wallet_connect: bool = False,
blockchain_ids: Optional[List[int]] = None, blockchain_ids: Optional[List[int]] = None,
columns_names: Optional[Dict[str, str]] = None, columns_names: Optional[Dict[str, str]] = None,
) -> Leaderboard: ) -> Leaderboard:
@ -1272,7 +1272,7 @@ def create_leaderboard(
title=title, title=title,
description=description, description=description,
public=public, public=public,
show_connect=show_connect, wallet_connect=wallet_connect,
blockchain_ids=blockchain_ids, blockchain_ids=blockchain_ids,
columns_names=columns_names, columns_names=columns_names,
) )
@ -1335,7 +1335,7 @@ def update_leaderboard(
title: Optional[str], title: Optional[str],
description: Optional[str], description: Optional[str],
public: Optional[bool], public: Optional[bool],
show_connect: Optional[bool], wallet_connect: Optional[bool],
blockchain_ids: Optional[List[int]], blockchain_ids: Optional[List[int]],
columns_names: Optional[Dict[str, str]], columns_names: Optional[Dict[str, str]],
) -> Leaderboard: ) -> Leaderboard:
@ -1353,8 +1353,8 @@ def update_leaderboard(
leaderboard.description = description leaderboard.description = description
if public is not None: if public is not None:
leaderboard.public = public leaderboard.public = public
if show_connect is not None: if wallet_connect is not None:
leaderboard.show_connect = show_connect leaderboard.wallet_connect = wallet_connect
if blockchain_ids is not None: if blockchain_ids is not None:
leaderboard.blockchain_ids = blockchain_ids leaderboard.blockchain_ids = blockchain_ids
if columns_names is not None: 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 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: 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] 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): class LeaderboardPosition(BaseModel):
address: str address: str
rank: int rank: int
@ -371,7 +381,7 @@ class Leaderboard(BaseModel):
description: Optional[str] = None description: Optional[str] = None
resource_id: Optional[UUID] = None resource_id: Optional[UUID] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
created_at: datetime created_at: datetime
@ -390,7 +400,7 @@ class LeaderboardCreateRequest(BaseModel):
title: str title: str
description: Optional[str] = None description: Optional[str] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
@ -401,7 +411,7 @@ class LeaderboardCreatedResponse(BaseModel):
description: Optional[str] = None description: Optional[str] = None
resource_id: Optional[UUID] = None resource_id: Optional[UUID] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
created_at: datetime created_at: datetime
@ -417,7 +427,7 @@ class LeaderboardUpdatedResponse(BaseModel):
description: Optional[str] = None description: Optional[str] = None
resource_id: Optional[UUID] = None resource_id: Optional[UUID] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
created_at: datetime created_at: datetime
@ -431,7 +441,7 @@ class LeaderboardUpdateRequest(BaseModel):
title: Optional[str] = None title: Optional[str] = None
description: Optional[str] = None description: Optional[str] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
@ -442,7 +452,7 @@ class LeaderboardDeletedResponse(BaseModel):
description: Optional[str] = None description: Optional[str] = None
resource_id: Optional[UUID] = None resource_id: Optional[UUID] = None
public: Optional[bool] = False public: Optional[bool] = False
show_connect: Optional[bool] = False wallet_connect: Optional[bool] = False
blockchain_ids: Optional[List[int]] = None blockchain_ids: Optional[List[int]] = None
columns_names: Optional[Dict[str, str]] = None columns_names: Optional[Dict[str, str]] = None
created_at: datetime created_at: datetime

Wyświetl plik

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

Wyświetl plik

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