diff --git a/engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py b/engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py new file mode 100644 index 00000000..3198bc75 --- /dev/null +++ b/engineapi/alembic/versions/e86bb1230bca_leaderboard_metadata.py @@ -0,0 +1,56 @@ +"""leaderboard metadata + +Revision ID: e86bb1230bca +Revises: 040f2dfde5a5 +Create Date: 2023-11-09 16:43:21.553490 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = "e86bb1230bca" +down_revision = "040f2dfde5a5" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "leaderboards", + sa.Column( + "blockchain_ids", + sa.ARRAY(sa.Integer()), + nullable=False, + server_default="{}", + ), + ) + op.add_column( + "leaderboards", + sa.Column("show_connect", sa.Boolean(), nullable=False, server_default="false"), + ) + op.add_column( + "leaderboards", + sa.Column("public", sa.Boolean(), nullable=False, server_default="false"), + ) + op.add_column( + "leaderboards", + sa.Column( + "columns_names", + postgresql.JSONB(astext_type=sa.Text()), + nullable=False, + server_default="{}", + ), + ) + # ### end Alembic commands ### + + +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", "blockchain_ids") + # ### end Alembic commands ### diff --git a/engineapi/engineapi/actions.py b/engineapi/engineapi/actions.py index 23c3e20f..feb5fe8d 100644 --- a/engineapi/engineapi/actions.py +++ b/engineapi/engineapi/actions.py @@ -1256,6 +1256,10 @@ def create_leaderboard( title: str, description: Optional[str], token: Optional[Union[uuid.UUID, str]] = None, + public: bool = False, + show_connect: bool = False, + blockchain_ids: Optional[List[int]] = None, + columns_names: Optional[Dict[str, str]] = None, ) -> Leaderboard: """ Create a leaderboard @@ -1264,7 +1268,14 @@ def create_leaderboard( if not token: token = uuid.UUID(MOONSTREAM_ADMIN_ACCESS_TOKEN) try: - leaderboard = Leaderboard(title=title, description=description) + leaderboard = Leaderboard( + title=title, + description=description, + public=public, + show_connect=show_connect, + blockchain_ids=blockchain_ids, + columns_names=columns_names, + ) db_session.add(leaderboard) db_session.commit() @@ -1323,6 +1334,10 @@ def update_leaderboard( leaderboard_id: uuid.UUID, title: Optional[str], description: Optional[str], + public: Optional[bool], + show_connect: Optional[bool], + blockchain_ids: Optional[List[int]], + columns_names: Optional[Dict[str, str]], ) -> Leaderboard: """ Update a leaderboard @@ -1336,6 +1351,14 @@ def update_leaderboard( leaderboard.title = title if description is not None: leaderboard.description = description + if public is not None: + leaderboard.public = public + if show_connect is not None: + leaderboard.show_connect = show_connect + if blockchain_ids is not None: + leaderboard.blockchain_ids = blockchain_ids + if columns_names is not None: + leaderboard.columns_names = columns_names db_session.commit() @@ -1346,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).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 8a33d619..49fa92be 100644 --- a/engineapi/engineapi/data.py +++ b/engineapi/engineapi/data.py @@ -370,6 +370,10 @@ class Leaderboard(BaseModel): title: str description: Optional[str] = None resource_id: Optional[UUID] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None created_at: datetime updated_at: datetime @@ -385,6 +389,10 @@ class LeaderboardInfoResponse(BaseModel): class LeaderboardCreateRequest(BaseModel): title: str description: Optional[str] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None class LeaderboardCreatedResponse(BaseModel): @@ -392,6 +400,10 @@ class LeaderboardCreatedResponse(BaseModel): title: str description: Optional[str] = None resource_id: Optional[UUID] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None created_at: datetime updated_at: datetime @@ -404,6 +416,10 @@ class LeaderboardUpdatedResponse(BaseModel): title: str description: Optional[str] = None resource_id: Optional[UUID] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None created_at: datetime updated_at: datetime @@ -414,6 +430,10 @@ class LeaderboardUpdatedResponse(BaseModel): class LeaderboardUpdateRequest(BaseModel): title: Optional[str] = None description: Optional[str] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None class LeaderboardDeletedResponse(BaseModel): @@ -421,6 +441,10 @@ class LeaderboardDeletedResponse(BaseModel): title: str description: Optional[str] = None resource_id: Optional[UUID] = None + public: Optional[bool] = False + show_connect: Optional[bool] = False + blockchain_ids: Optional[List[int]] = None + columns_names: Optional[Dict[str, str]] = None created_at: datetime updated_at: datetime diff --git a/engineapi/engineapi/models.py b/engineapi/engineapi/models.py index 36cc975d..a937fe07 100644 --- a/engineapi/engineapi/models.py +++ b/engineapi/engineapi/models.py @@ -1,6 +1,7 @@ import uuid from sqlalchemy import ( + ARRAY, DECIMAL, VARCHAR, BigInteger, @@ -346,6 +347,10 @@ class Leaderboard(Base): # type: ignore title = Column(VARCHAR(128), nullable=False) 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) + public = Column(Boolean, default=False, nullable=False) + columns_names = Column(JSONB, nullable=False, default={}) created_at = Column( DateTime(timezone=True), server_default=utcnow(), nullable=False ) diff --git a/engineapi/engineapi/routes/leaderboard.py b/engineapi/engineapi/routes/leaderboard.py index 15050f31..fbbbbb08 100644 --- a/engineapi/engineapi/routes/leaderboard.py +++ b/engineapi/engineapi/routes/leaderboard.py @@ -114,6 +114,7 @@ async def leaderboard( leaderboard_positions = actions.get_leaderboard_positions( db_session, leaderboard_id, limit, offset ) + result = [ data.LeaderboardPosition( address=position.address, @@ -140,7 +141,6 @@ async def create_leaderboard( Authorization: str = AuthHeader, ) -> data.LeaderboardCreatedResponse: """ - Create leaderboard. """ @@ -152,6 +152,10 @@ async def create_leaderboard( title=leaderboard.title, description=leaderboard.description, token=token, + public=leaderboard.public, + show_connect=leaderboard.show_connect, + blockchain_ids=leaderboard.blockchain_ids, + columns_names=leaderboard.columns_names, ) except actions.LeaderboardCreateError as e: logger.error(f"Error while creating leaderboard: {e}") @@ -171,6 +175,10 @@ async def create_leaderboard( title=created_leaderboard.title, # type: ignore 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 + blockchain_ids=created_leaderboard.blockchain_ids, # type: ignore + columns_names=created_leaderboard.columns_names, # type: ignore created_at=created_leaderboard.created_at, # type: ignore updated_at=created_leaderboard.updated_at, # type: ignore ) @@ -216,6 +224,10 @@ async def update_leaderboard( leaderboard_id=leaderboard_id, title=leaderboard.title, description=leaderboard.description, + public=leaderboard.public, + show_connect=leaderboard.show_connect, + blockchain_ids=leaderboard.blockchain_ids, + columns_names=leaderboard.columns_names, ) except actions.LeaderboardUpdateError as e: logger.error(f"Error while updating leaderboard: {e}") @@ -233,6 +245,10 @@ async def update_leaderboard( title=updated_leaderboard.title, # type: ignore 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 + blockchain_ids=updated_leaderboard.blockchain_ids, # type: ignore + columns_names=updated_leaderboard.columns_names, # type: ignore created_at=updated_leaderboard.created_at, # type: ignore updated_at=updated_leaderboard.updated_at, # type: ignore ) @@ -292,6 +308,11 @@ async def delete_leaderboard( id=deleted_leaderboard.id, # type: ignore title=deleted_leaderboard.title, # type: ignore 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 + blockchain_ids=deleted_leaderboard.blockchain_ids, # type: ignore + columns_names=deleted_leaderboard.columns_names, # type: ignore created_at=deleted_leaderboard.created_at, # type: ignore updated_at=deleted_leaderboard.updated_at, # type: ignore ) @@ -330,6 +351,10 @@ async def get_leaderboards( title=leaderboard.title, # type: ignore description=leaderboard.description, # type: ignore resource_id=leaderboard.resource_id, # type: ignore + public=leaderboard.public, # type: ignore + show_connect=leaderboard.show_connect, # type: ignore + blockchain_ids=leaderboard.blockchain_ids, # type: ignore + columns_names=leaderboard.columns_names, # type: ignore created_at=leaderboard.created_at, # type: ignore updated_at=leaderboard.updated_at, # type: ignore )