From a8294b65a6465ae8612c4f11902e45b9e21ea403 Mon Sep 17 00:00:00 2001 From: "marek.galvanek" Date: Fri, 21 Feb 2025 15:03:03 +0100 Subject: [PATCH 1/2] feat: add order_by arg to offers and listings endpoints --- blockapi/v2/api/nft/simple_hash.py | 53 +++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/blockapi/v2/api/nft/simple_hash.py b/blockapi/v2/api/nft/simple_hash.py index bd17cfe4..adbcee62 100644 --- a/blockapi/v2/api/nft/simple_hash.py +++ b/blockapi/v2/api/nft/simple_hash.py @@ -1,6 +1,6 @@ import logging from functools import cached_property -from typing import Iterable, Optional +from typing import Iterable, Literal, Optional from blockapi.v2.base import BlockchainApi, INftParser, INftProvider, ISleepProvider from blockapi.v2.coins import COIN_BTC, COIN_ETH, COIN_SOL @@ -28,6 +28,13 @@ 'ethereum.native': COIN_ETH, } +BidOrderBy = Literal[ + 'bid_timestamp__asc', 'bid_timestamp__desc', 'bid_price__asc', 'bid_price__desc' +] +ListingOrderBy = Literal[ + 'listing_timestamp_asc', 'listing_timestamp_desc', 'price_asc', 'price_desc' +] + class SimpleHashApi(BlockchainApi, INftProvider, INftParser): """ @@ -358,22 +365,36 @@ def _get_coin(token: Optional[dict], chain) -> Optional[Coin]: ) def fetch_offers( - self, collection: str, cursor: Optional[str] = None + self, + collection: str, + cursor: Optional[str] = None, + order_by: BidOrderBy = 'bid_price__desc', ) -> FetchResult: + params = {'order_by': order_by} + if cursor: + params['cursor'] = cursor + return self.get_data( 'get_bids', headers=self.headers, - params=dict(cursor=cursor) if cursor else None, + params=params, slug=collection, ) def fetch_wallet_offers( - self, address: str, cursor: Optional[str] = None + self, + address: str, + cursor: Optional[str] = None, + order_by: BidOrderBy = 'bid_price__desc', ) -> FetchResult: + params = {'order_by': order_by} + if cursor: + params['cursor'] = cursor + return self.get_data( 'get_wallet_bids', headers=self.headers, - params=dict(cursor=cursor) if cursor else None, + params=params, chain=self.simplehash_blockchains, address=address, ) @@ -421,22 +442,36 @@ def _yield_parsed_offers(self, items: list[dict]) -> Iterable[NftOffer]: ) def fetch_listings( - self, collection: str, cursor: Optional[str] = None + self, + collection: str, + cursor: Optional[str] = None, + order_by: ListingOrderBy = 'price_desc', ) -> FetchResult: + params = {'order_by': order_by} + if cursor: + params['cursor'] = cursor + return self.get_data( 'get_listings', headers=self.headers, - params=dict(cursor=cursor) if cursor else None, + params=params, slug=collection, ) def fetch_wallet_listings( - self, address: str, cursor: Optional[str] = None + self, + address: str, + cursor: Optional[str] = None, + order_by: ListingOrderBy = 'price_desc', ) -> FetchResult: + params = {'order_by': order_by} + if cursor: + params['cursor'] = cursor + return self.get_data( 'get_wallet_listings', headers=self.headers, - params=dict(cursor=cursor) if cursor else None, + params=params, chain=self.simplehash_blockchains, include_nft_details=0, address=address, From 417f5b9365727aa6fe839f3103fcc37f1c1ecf87 Mon Sep 17 00:00:00 2001 From: "marek.galvanek" Date: Fri, 21 Feb 2025 17:27:13 +0100 Subject: [PATCH 2/2] fix: fix Enum to (str, Enum) --- blockapi/v2/api/nft/simple_hash.py | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/blockapi/v2/api/nft/simple_hash.py b/blockapi/v2/api/nft/simple_hash.py index adbcee62..30c3d470 100644 --- a/blockapi/v2/api/nft/simple_hash.py +++ b/blockapi/v2/api/nft/simple_hash.py @@ -1,6 +1,7 @@ import logging +from enum import Enum from functools import cached_property -from typing import Iterable, Literal, Optional +from typing import Iterable, Optional from blockapi.v2.base import BlockchainApi, INftParser, INftProvider, ISleepProvider from blockapi.v2.coins import COIN_BTC, COIN_ETH, COIN_SOL @@ -28,12 +29,19 @@ 'ethereum.native': COIN_ETH, } -BidOrderBy = Literal[ - 'bid_timestamp__asc', 'bid_timestamp__desc', 'bid_price__asc', 'bid_price__desc' -] -ListingOrderBy = Literal[ - 'listing_timestamp_asc', 'listing_timestamp_desc', 'price_asc', 'price_desc' -] + +class BidOrderBy(str, Enum): + BID_TIMESTAMP_ASC = 'bid_timestamp__asc' + BID_TIMESTAMP_DESC = 'bid_timestamp__desc' + BID_PRICE_ASC = 'bid_price__asc' + BID_PRICE_DESC = 'bid_price__desc' + + +class ListingOrderBy(str, Enum): + LISTING_TIMESTAMP_ASC = 'listing_timestamp_asc' + LISTING_TIMESTAMP_DESC = 'listing_timestamp_desc' + PRICE_ASC = 'price_asc' + PRICE_DESC = 'price_desc' class SimpleHashApi(BlockchainApi, INftProvider, INftParser): @@ -368,7 +376,7 @@ def fetch_offers( self, collection: str, cursor: Optional[str] = None, - order_by: BidOrderBy = 'bid_price__desc', + order_by: BidOrderBy = BidOrderBy.BID_PRICE_DESC, ) -> FetchResult: params = {'order_by': order_by} if cursor: @@ -385,7 +393,7 @@ def fetch_wallet_offers( self, address: str, cursor: Optional[str] = None, - order_by: BidOrderBy = 'bid_price__desc', + order_by: BidOrderBy = BidOrderBy.BID_PRICE_DESC, ) -> FetchResult: params = {'order_by': order_by} if cursor: @@ -445,7 +453,7 @@ def fetch_listings( self, collection: str, cursor: Optional[str] = None, - order_by: ListingOrderBy = 'price_desc', + order_by: ListingOrderBy = ListingOrderBy.PRICE_DESC, ) -> FetchResult: params = {'order_by': order_by} if cursor: @@ -462,7 +470,7 @@ def fetch_wallet_listings( self, address: str, cursor: Optional[str] = None, - order_by: ListingOrderBy = 'price_desc', + order_by: ListingOrderBy = ListingOrderBy.PRICE_DESC, ) -> FetchResult: params = {'order_by': order_by} if cursor: