@@ -6,7 +6,7 @@ use crate::{
66} ;
77use anyhow:: { Context , bail} ;
88use retrack_types:: trackers:: {
9- Tracker , TrackerCreateParams , TrackerDataRevision , TrackerDataRevisionImportParams ,
9+ Page , Tracker , TrackerCreateParams , TrackerDataRevision , TrackerDataRevisionImportParams ,
1010 TrackerDataRevisionImportResult , TrackerDebugParams , TrackerExecutionLog ,
1111 TrackerListRevisionsParams , TrackerUpdateParams ,
1212} ;
@@ -21,6 +21,8 @@ pub struct RetrackApi<'a, DR: DnsResolver, ET: EmailTransport> {
2121}
2222
2323impl < ' a , DR : DnsResolver , ET : EmailTransport > RetrackApi < ' a , DR , ET > {
24+ const LIST_TRACKERS_PAGE_SIZE : usize = 100 ;
25+
2426 /// Creates Retrack API.
2527 pub fn new ( api : & ' a Api < DR , ET > ) -> Self {
2628 Self { api }
@@ -31,26 +33,46 @@ impl<'a, DR: DnsResolver, ET: EmailTransport> RetrackApi<'a, DR, ET> {
3133 & self ,
3234 tags : & [ Tag ] ,
3335 ) -> anyhow:: Result < Vec < Tracker > > {
34- // Construct tags query string.
35- let tags_query = prepare_tags ( tags )
36+ let prepared_tags = prepare_tags ( tags ) ;
37+ let tags_query = prepared_tags
3638 . iter ( )
3739 . map ( |tag| format ! ( "tag={}" , urlencoding:: encode( tag) ) )
3840 . collect :: < Vec < _ > > ( )
3941 . join ( "&" ) ;
40- let endpoint = format ! ( "{}api/trackers?{tags_query}" , self . api. config. retrack. host) ;
42+ let mut trackers = vec ! [ ] ;
43+ let mut page_index = 0 ;
44+
45+ loop {
46+ let page_query = format ! (
47+ "page={page_index}&pageSize={}{}{}" ,
48+ Self :: LIST_TRACKERS_PAGE_SIZE ,
49+ if tags_query. is_empty( ) { "" } else { "&" } ,
50+ tags_query
51+ ) ;
52+ let endpoint = format ! ( "{}api/trackers?{page_query}" , self . api. config. retrack. host) ;
53+ let response = self
54+ . api
55+ . network
56+ . http_client
57+ . get ( & endpoint)
58+ . send ( )
59+ . await
60+ . with_context ( || format ! ( "Cannot query trackers ({page_query})." ) ) ?;
61+ let mut page = response
62+ . json :: < Page < Tracker > > ( )
63+ . await
64+ . context ( format ! ( "Cannot deserialize trackers ({page_query})." ) ) ?;
4165
42- let response = self
43- . api
44- . network
45- . http_client
46- . get ( & endpoint)
47- . send ( )
48- . await
49- . with_context ( || format ! ( "Cannot query trackers ({tags_query})." ) ) ?;
50- response
51- . json ( )
52- . await
53- . context ( format ! ( "Cannot deserialize trackers ({tags_query})." ) )
66+ let total = page. total . max ( 0 ) as usize ;
67+ let is_last_page = page. items . is_empty ( ) || trackers. len ( ) + page. items . len ( ) >= total;
68+ trackers. append ( & mut page. items ) ;
69+ if is_last_page {
70+ break ;
71+ }
72+ page_index += 1 ;
73+ }
74+
75+ Ok ( trackers)
5476 }
5577
5678 /// Retrieves Retrack trackers with the specified IDs.
0 commit comments