55from pydantic import ValidationError
66
77from postmark .exceptions import InvalidEmailException
8+ from postmark .models .page import Page
89from postmark .models .templates .schemas import TemplateEmail
910from postmark .utils .types import HTTPClient
1011
@@ -197,7 +198,7 @@ async def list(
197198 offset : int = 0 ,
198199 metadata : Optional [Dict [str , str ]] = None ,
199200 ** filters ,
200- ) -> tuple [ List [ Message ], int ]:
201+ ) -> Page [ Message ]:
201202 """List sent messages."""
202203 if count > 500 :
203204 raise ValueError ("Count cannot exceed 500 messages per request" )
@@ -222,8 +223,9 @@ async def list(
222223 response .raise_for_status ()
223224 data = response .json ()
224225
225- return [Message (** msg ) for msg in data .get ("Messages" , [])], data .get (
226- "TotalCount" , 0
226+ return Page (
227+ items = [Message (** msg ) for msg in data .get ("Messages" , [])],
228+ total = data .get ("TotalCount" , 0 ),
227229 )
228230
229231 async def stream (
@@ -246,20 +248,18 @@ async def stream(
246248 if current_limit <= 0 :
247249 break
248250
249- messages , total = await self .list (
250- count = current_limit , offset = offset , ** filters
251- )
252- if not messages :
251+ page = await self .list (count = current_limit , offset = offset , ** filters )
252+ if not page .items :
253253 break
254254
255- for msg in messages :
255+ for msg in page . items :
256256 yield msg
257257 yielded += 1
258258 if yielded >= max_messages :
259259 return
260260
261- offset += len (messages )
262- if offset >= total :
261+ offset += len (page . items )
262+ if offset >= page . total :
263263 break
264264
265265 async def get (self , message_id : str ) -> MessageDetails :
@@ -278,7 +278,7 @@ async def get_dump(self, message_id: str) -> OutboundMessageDump:
278278
279279 async def list_opens (
280280 self , count : int = 100 , offset : int = 0 , ** filters
281- ) -> tuple [ List [ OpenEvent ], int ]:
281+ ) -> Page [ OpenEvent ]:
282282 """
283283 List open tracking events across all messages.
284284
@@ -304,13 +304,14 @@ async def list_opens(
304304
305305 response = await self .client .get ("/messages/outbound/opens" , params = params )
306306 data = response .json ()
307- return [OpenEvent (** o ) for o in data .get ("Opens" , [])], data .get (
308- "TotalCount" , 0
307+ return Page (
308+ items = [OpenEvent (** o ) for o in data .get ("Opens" , [])],
309+ total = data .get ("TotalCount" , 0 ),
309310 )
310311
311312 async def list_message_opens (
312313 self , message_id : str , count : int = 100 , offset : int = 0
313- ) -> tuple [ List [ OpenEvent ], int ]:
314+ ) -> Page [ OpenEvent ]:
314315 """
315316 List open tracking events for a specific message.
316317
@@ -327,8 +328,9 @@ async def list_message_opens(
327328 f"/messages/outbound/opens/{ message_id } " , params = params
328329 )
329330 data = response .json ()
330- return [OpenEvent (** o ) for o in data .get ("Opens" , [])], data .get (
331- "TotalCount" , 0
331+ return Page (
332+ items = [OpenEvent (** o ) for o in data .get ("Opens" , [])],
333+ total = data .get ("TotalCount" , 0 ),
332334 )
333335
334336 # -------------------------------------------------------------------------
@@ -337,7 +339,7 @@ async def list_message_opens(
337339
338340 async def list_clicks (
339341 self , count : int = 100 , offset : int = 0 , ** filters
340- ) -> tuple [ List [ ClickEvent ], int ]:
342+ ) -> Page [ ClickEvent ]:
341343 """
342344 List click tracking events across all messages.
343345
@@ -363,13 +365,14 @@ async def list_clicks(
363365
364366 response = await self .client .get ("/messages/outbound/clicks" , params = params )
365367 data = response .json ()
366- return [ClickEvent (** c ) for c in data .get ("Clicks" , [])], data .get (
367- "TotalCount" , 0
368+ return Page (
369+ items = [ClickEvent (** c ) for c in data .get ("Clicks" , [])],
370+ total = data .get ("TotalCount" , 0 ),
368371 )
369372
370373 async def list_message_clicks (
371374 self , message_id : str , count : int = 100 , offset : int = 0
372- ) -> tuple [ List [ ClickEvent ], int ]:
375+ ) -> Page [ ClickEvent ]:
373376 """
374377 List click tracking events for a specific message.
375378
@@ -386,6 +389,7 @@ async def list_message_clicks(
386389 f"/messages/outbound/clicks/{ message_id } " , params = params
387390 )
388391 data = response .json ()
389- return [ClickEvent (** c ) for c in data .get ("Clicks" , [])], data .get (
390- "TotalCount" , 0
392+ return Page (
393+ items = [ClickEvent (** c ) for c in data .get ("Clicks" , [])],
394+ total = data .get ("TotalCount" , 0 ),
391395 )
0 commit comments