5959 MessageNotFoundError ,
6060 MultipleMessagesError ,
6161)
62- from .models import MessagesResponse
62+ from .models import MessagesResponse , PostsResponse
6363from .utils import check_unix_socket_valid , get_message_type_value
6464
6565logger = logging .getLogger (__name__ )
@@ -215,7 +215,7 @@ def get_posts(
215215 chains : Optional [Iterable [str ]] = None ,
216216 start_date : Optional [Union [datetime , float ]] = None ,
217217 end_date : Optional [Union [datetime , float ]] = None ,
218- ) -> Dict [ str , Dict ] :
218+ ) -> PostsResponse :
219219 return self ._wrap (
220220 self .async_session .get_posts ,
221221 pagination = pagination ,
@@ -575,7 +575,18 @@ async def get_posts(
575575 chains : Optional [Iterable [str ]] = None ,
576576 start_date : Optional [Union [datetime , float ]] = None ,
577577 end_date : Optional [Union [datetime , float ]] = None ,
578- ) -> Dict [str , Dict ]:
578+ ignore_invalid_messages : bool = True ,
579+ invalid_messages_log_level : int = logging .NOTSET ,
580+ ) -> PostsResponse :
581+ ignore_invalid_messages = (
582+ True if ignore_invalid_messages is None else ignore_invalid_messages
583+ )
584+ invalid_messages_log_level = (
585+ logging .NOTSET
586+ if invalid_messages_log_level is None
587+ else invalid_messages_log_level
588+ )
589+
579590 params : Dict [str , Any ] = dict (pagination = pagination , page = page )
580591
581592 if types is not None :
@@ -604,7 +615,36 @@ async def get_posts(
604615
605616 async with self .http_session .get ("/api/v0/posts.json" , params = params ) as resp :
606617 resp .raise_for_status ()
607- return await resp .json ()
618+ response_json = await resp .json ()
619+ posts_raw = response_json ["posts" ]
620+
621+ # All posts may not be valid according to the latest specification in
622+ # aleph-message. This allows the user to specify how errors should be handled.
623+ posts : List [AlephMessage ] = []
624+ for post_raw in posts_raw :
625+ try :
626+ message = parse_message (post_raw )
627+ posts .append (message )
628+ except KeyError as e :
629+ if not ignore_invalid_messages :
630+ raise e
631+ logger .log (
632+ level = invalid_messages_log_level ,
633+ msg = f"KeyError: Field '{ e .args [0 ]} ' not found" ,
634+ )
635+ except ValidationError as e :
636+ if not ignore_invalid_messages :
637+ raise e
638+ if invalid_messages_log_level :
639+ logger .log (level = invalid_messages_log_level , msg = e )
640+
641+ return PostsResponse (
642+ posts = posts ,
643+ pagination_page = response_json ["pagination_page" ],
644+ pagination_total = response_json ["pagination_total" ],
645+ pagination_per_page = response_json ["pagination_per_page" ],
646+ pagination_item = response_json ["pagination_item" ],
647+ )
608648
609649 async def download_file_to_buffer (
610650 self ,
@@ -807,6 +847,7 @@ async def watch_messages(
807847 self ,
808848 message_type : Optional [MessageType ] = None ,
809849 content_types : Optional [Iterable [str ]] = None ,
850+ content_keys : Optional [Iterable [str ]] = None ,
810851 refs : Optional [Iterable [str ]] = None ,
811852 addresses : Optional [Iterable [str ]] = None ,
812853 tags : Optional [Iterable [str ]] = None ,
@@ -822,6 +863,8 @@ async def watch_messages(
822863 params ["msgType" ] = message_type .value
823864 if content_types is not None :
824865 params ["contentTypes" ] = "," .join (content_types )
866+ if content_keys is not None :
867+ params ["contentKeys" ] = "," .join (content_keys )
825868 if refs is not None :
826869 params ["refs" ] = "," .join (refs )
827870 if addresses is not None :
0 commit comments