diff --git a/contracts/protocols.py b/contracts/protocols.py index 4e57c36..5f6e507 100644 --- a/contracts/protocols.py +++ b/contracts/protocols.py @@ -155,6 +155,12 @@ class MarketService(Protocol): name: str, slug: str, ) -> MarketPlaceDTO: ... + async def list_marketplaces( + self, session: AsyncSession, + container_type: str | None = None, container_id: int | None = None, + *, page: int = 1, per_page: int = 20, + ) -> tuple[list[MarketPlaceDTO], bool]: ... + async def soft_delete_marketplace( self, session: AsyncSession, container_type: str, container_id: int, slug: str, diff --git a/services/market_impl.py b/services/market_impl.py index 5f991ec..71f8771 100644 --- a/services/market_impl.py +++ b/services/market_impl.py @@ -52,6 +52,23 @@ class SqlMarketService: ) return [_mp_to_dto(mp) for mp in result.scalars().all()] + async def list_marketplaces( + self, session: AsyncSession, + container_type: str | None = None, container_id: int | None = None, + *, page: int = 1, per_page: int = 20, + ) -> tuple[list[MarketPlaceDTO], bool]: + stmt = select(MarketPlace).where(MarketPlace.deleted_at.is_(None)) + if container_type is not None and container_id is not None: + stmt = stmt.where( + MarketPlace.container_type == container_type, + MarketPlace.container_id == container_id, + ) + stmt = stmt.order_by(MarketPlace.name.asc()) + stmt = stmt.offset((page - 1) * per_page).limit(per_page + 1) + rows = (await session.execute(stmt)).scalars().all() + has_more = len(rows) > per_page + return [_mp_to_dto(mp) for mp in rows[:per_page]], has_more + async def product_by_id(self, session: AsyncSession, product_id: int) -> ProductDTO | None: product = ( await session.execute(select(Product).where(Product.id == product_id)) diff --git a/services/stubs.py b/services/stubs.py index 5dd36ba..3150041 100644 --- a/services/stubs.py +++ b/services/stubs.py @@ -156,6 +156,13 @@ class StubMarketService: ) -> list[MarketPlaceDTO]: return [] + async def list_marketplaces( + self, session: AsyncSession, + container_type: str | None = None, container_id: int | None = None, + *, page: int = 1, per_page: int = 20, + ) -> tuple[list[MarketPlaceDTO], bool]: + return [], False + async def product_by_id(self, session: AsyncSession, product_id: int) -> ProductDTO | None: return None