Skip to content

Commit 4ee3380

Browse files
philogicaehoh
authored andcommittedFeb 22, 2024
Fix msgTypes + Add sort_by/sort_order args to MessageFilter/PostFilter
1 parent 9074d98 commit 4ee3380

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed
 

‎src/aleph/sdk/chains/common.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def get_verification_buffer(message: Dict) -> bytes:
2727
# Convert Enum values to strings
2828
return "\n".join(
2929
(
30-
enum_as_str(message["chain"]),
30+
enum_as_str(message["chain"]) or "",
3131
message["sender"],
32-
enum_as_str(message["type"]),
32+
enum_as_str(message["type"]) or "",
3333
message["item_hash"],
3434
)
3535
).encode()

‎src/aleph/sdk/query/filters.py

+35-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,24 @@
11
from datetime import datetime
2+
from enum import Enum
23
from typing import Dict, Iterable, Optional, Union
34

45
from 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

924
class 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.

‎src/aleph/sdk/utils.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,14 @@ async def copy_async_readable_to_buffer(
115115
buffer.write(chunk)
116116

117117

118-
def enum_as_str(obj: Union[str, Enum]) -> str:
118+
def enum_as_str(obj: Optional[Union[str, Enum]]) -> Optional[str]:
119119
"""Returns the value of an Enum, or the string itself when passing a string.
120120
121121
Python 3.11 adds a new formatting of string enums.
122122
`str(MyEnum.value)` becomes `MyEnum.value` instead of `value`.
123123
"""
124+
if not obj:
125+
return None
124126
if not isinstance(obj, str):
125127
raise TypeError(f"Unsupported enum type: {type(obj)}")
126128

0 commit comments

Comments
 (0)