11from datetime import datetime
2+ from enum import Enum
23from typing import Dict , Iterable , Optional , Union
34
45from aleph_message .models import MessageType
56
6- from ..utils import _date_field_to_timestamp , serialize_list
7+ from ..utils import _date_field_to_timestamp , enum_as_str , serialize_list
8+
9+
10+ class SortBy (str , Enum ):
11+ """Supported SortBy types"""
12+
13+ TIME = "time"
14+ TX_TIME = "tx-time"
15+
16+
17+ class SortOrder (str , Enum ):
18+ """Supported SortOrder types"""
19+
20+ ASCENDING = "1"
21+ DESCENDING = "-1"
722
823
924class MessageFilter :
@@ -20,6 +35,8 @@ class MessageFilter:
2035 :param chains: Filter by sender address chain
2136 :param start_date: Earliest date to fetch messages from
2237 :param end_date: Latest date to fetch messages from
38+ :param sort_by: Sort by time or tx-time
39+ :param sort_order: Sort by ascending or descending order
2340 """
2441
2542 message_types : Optional [Iterable [MessageType ]]
@@ -33,6 +50,8 @@ class MessageFilter:
3350 chains : Optional [Iterable [str ]]
3451 start_date : Optional [Union [datetime , float ]]
3552 end_date : Optional [Union [datetime , float ]]
53+ sort_by : Optional [SortBy ]
54+ sort_order : Optional [SortOrder ]
3655
3756 def __init__ (
3857 self ,
@@ -47,6 +66,8 @@ def __init__(
4766 chains : Optional [Iterable [str ]] = None ,
4867 start_date : Optional [Union [datetime , float ]] = None ,
4968 end_date : Optional [Union [datetime , float ]] = None ,
69+ sort_by : Optional [SortBy ] = None ,
70+ sort_order : Optional [SortOrder ] = None ,
5071 ):
5172 self .message_types = message_types
5273 self .content_types = content_types
@@ -59,14 +80,16 @@ def __init__(
5980 self .chains = chains
6081 self .start_date = start_date
6182 self .end_date = end_date
83+ self .sort_by = sort_by
84+ self .sort_order = sort_order
6285
6386 def as_http_params (self ) -> Dict [str , str ]:
6487 """Convert the filters into a dict that can be used by an `aiohttp` client
6588 as `params` to build the HTTP query string.
6689 """
6790
6891 partial_result = {
69- "msgType " : serialize_list (
92+ "msgTypes " : serialize_list (
7093 [type .value for type in self .message_types ]
7194 if self .message_types
7295 else None
@@ -81,6 +104,8 @@ def as_http_params(self) -> Dict[str, str]:
81104 "chains" : serialize_list (self .chains ),
82105 "startDate" : _date_field_to_timestamp (self .start_date ),
83106 "endDate" : _date_field_to_timestamp (self .end_date ),
107+ "sortBy" : enum_as_str (self .sort_by ),
108+ "sortOrder" : enum_as_str (self .sort_order ),
84109 }
85110
86111 # Ensure all values are strings.
@@ -110,6 +135,8 @@ class PostFilter:
110135 chains : Optional [Iterable [str ]]
111136 start_date : Optional [Union [datetime , float ]]
112137 end_date : Optional [Union [datetime , float ]]
138+ sort_by : Optional [SortBy ]
139+ sort_order : Optional [SortOrder ]
113140
114141 def __init__ (
115142 self ,
@@ -122,6 +149,8 @@ def __init__(
122149 chains : Optional [Iterable [str ]] = None ,
123150 start_date : Optional [Union [datetime , float ]] = None ,
124151 end_date : Optional [Union [datetime , float ]] = None ,
152+ sort_by : Optional [SortBy ] = None ,
153+ sort_order : Optional [SortOrder ] = None ,
125154 ):
126155 self .types = types
127156 self .refs = refs
@@ -132,6 +161,8 @@ def __init__(
132161 self .chains = chains
133162 self .start_date = start_date
134163 self .end_date = end_date
164+ self .sort_by = sort_by
165+ self .sort_order = sort_order
135166
136167 def as_http_params (self ) -> Dict [str , str ]:
137168 """Convert the filters into a dict that can be used by an `aiohttp` client
@@ -148,6 +179,8 @@ def as_http_params(self) -> Dict[str, str]:
148179 "chains" : serialize_list (self .chains ),
149180 "startDate" : _date_field_to_timestamp (self .start_date ),
150181 "endDate" : _date_field_to_timestamp (self .end_date ),
182+ "sortBy" : enum_as_str (self .sort_by ),
183+ "sortOrder" : enum_as_str (self .sort_order ),
151184 }
152185
153186 # Ensure all values are strings.
0 commit comments