11from datetime import datetime
22from typing import Dict , Iterable , Optional , Union
3-
43from aleph_message .models import MessageType
4+ from ..utils import _date_field_to_timestamp , serialize_list , enum_as_str
5+ from enum import Enum , IntEnum
6+
7+
8+ class SortBy (str , Enum ):
9+ """Supported SortBy types"""
10+
11+ TIME = "time"
12+ TX_TIME = "tx-time"
13+
14+
15+ class SortOrder (str , Enum ):
16+ """Supported SortOrder types"""
517
6- from ..utils import _date_field_to_timestamp , serialize_list
18+ ASCENDING = "1"
19+ DESCENDING = "-1"
720
821
922class MessageFilter :
@@ -20,6 +33,8 @@ class MessageFilter:
2033 :param chains: Filter by sender address chain
2134 :param start_date: Earliest date to fetch messages from
2235 :param end_date: Latest date to fetch messages from
36+ :param sort_by: Sort by time or tx-time
37+ :param sort_order: Sort by ascending or descending order
2338 """
2439
2540 message_types : Optional [Iterable [MessageType ]]
@@ -33,6 +48,8 @@ class MessageFilter:
3348 chains : Optional [Iterable [str ]]
3449 start_date : Optional [Union [datetime , float ]]
3550 end_date : Optional [Union [datetime , float ]]
51+ sort_by : Optional [SortBy ]
52+ sort_order : Optional [SortOrder ]
3653
3754 def __init__ (
3855 self ,
@@ -47,6 +64,8 @@ def __init__(
4764 chains : Optional [Iterable [str ]] = None ,
4865 start_date : Optional [Union [datetime , float ]] = None ,
4966 end_date : Optional [Union [datetime , float ]] = None ,
67+ sort_by : Optional [SortBy ] = None ,
68+ sort_order : Optional [SortOrder ] = None ,
5069 ):
5170 self .message_types = message_types
5271 self .content_types = content_types
@@ -59,14 +78,16 @@ def __init__(
5978 self .chains = chains
6079 self .start_date = start_date
6180 self .end_date = end_date
81+ self .sort_by = sort_by
82+ self .sort_order = sort_order
6283
6384 def as_http_params (self ) -> Dict [str , str ]:
6485 """Convert the filters into a dict that can be used by an `aiohttp` client
6586 as `params` to build the HTTP query string.
6687 """
6788
6889 partial_result = {
69- "msgType " : serialize_list (
90+ "msgTypes " : serialize_list (
7091 [type .value for type in self .message_types ]
7192 if self .message_types
7293 else None
@@ -81,6 +102,8 @@ def as_http_params(self) -> Dict[str, str]:
81102 "chains" : serialize_list (self .chains ),
82103 "startDate" : _date_field_to_timestamp (self .start_date ),
83104 "endDate" : _date_field_to_timestamp (self .end_date ),
105+ "sortBy" : enum_as_str (self .sort_by ),
106+ "sortOrder" : enum_as_str (self .sort_order ),
84107 }
85108
86109 # Ensure all values are strings.
@@ -110,6 +133,8 @@ class PostFilter:
110133 chains : Optional [Iterable [str ]]
111134 start_date : Optional [Union [datetime , float ]]
112135 end_date : Optional [Union [datetime , float ]]
136+ sort_by : Optional [SortBy ]
137+ sort_order : Optional [SortOrder ]
113138
114139 def __init__ (
115140 self ,
@@ -122,6 +147,8 @@ def __init__(
122147 chains : Optional [Iterable [str ]] = None ,
123148 start_date : Optional [Union [datetime , float ]] = None ,
124149 end_date : Optional [Union [datetime , float ]] = None ,
150+ sort_by : Optional [SortBy ] = None ,
151+ sort_order : Optional [SortOrder ] = None ,
125152 ):
126153 self .types = types
127154 self .refs = refs
@@ -132,6 +159,8 @@ def __init__(
132159 self .chains = chains
133160 self .start_date = start_date
134161 self .end_date = end_date
162+ self .sort_by = sort_by
163+ self .sort_order = sort_order
135164
136165 def as_http_params (self ) -> Dict [str , str ]:
137166 """Convert the filters into a dict that can be used by an `aiohttp` client
@@ -148,6 +177,8 @@ def as_http_params(self) -> Dict[str, str]:
148177 "chains" : serialize_list (self .chains ),
149178 "startDate" : _date_field_to_timestamp (self .start_date ),
150179 "endDate" : _date_field_to_timestamp (self .end_date ),
180+ "sortBy" : enum_as_str (self .sort_by ),
181+ "sortOrder" : enum_as_str (self .sort_order ),
151182 }
152183
153184 # Ensure all values are strings.
0 commit comments