@@ -14,7 +14,7 @@ use crate::{
1414} ;
1515use adapter:: { prelude:: * , Adapter , Error as AdaptorError } ;
1616use deadpool_postgres:: PoolError ;
17- use futures:: future:: try_join_all;
17+ use futures:: { future:: try_join_all, TryFutureExt } ;
1818use hyper:: { Body , Request , Response } ;
1919use primitives:: {
2020 campaign_validator:: Validator ,
@@ -115,17 +115,24 @@ pub async fn fetch_campaign_ids_for_channel(
115115 if total_pages < 2 {
116116 Ok ( campaign_ids)
117117 } else {
118- let other_pages: Vec < Vec < CampaignId > > = try_join_all ( ( 1 ..total_pages) . map ( |i| {
119- get_campaign_ids_by_channel (
120- pool,
121- & channel_id,
122- limit. into ( ) ,
123- i. checked_mul ( limit. into ( ) ) . expect ( "TODO" ) ,
124- )
118+ let pages_skip: Vec < u64 > = ( 1 ..total_pages)
119+ . map ( |i| {
120+ i. checked_mul ( limit. into ( ) ) . ok_or_else ( || {
121+ ResponseError :: FailedValidation (
122+ "Calculating skip while fetching campaign ids results in an overflow"
123+ . to_string ( ) ,
124+ )
125+ } )
126+ } )
127+ . collect :: < Result < _ , _ > > ( ) ?;
128+
129+ let other_pages = try_join_all ( pages_skip. into_iter ( ) . map ( |skip| {
130+ get_campaign_ids_by_channel ( pool, & channel_id, limit. into ( ) , skip)
131+ . map_err ( |e| ResponseError :: BadRequest ( e. to_string ( ) ) )
125132 } ) )
126133 . await ?;
127134
128- let all_campaigns: Vec < CampaignId > = std:: iter:: once ( campaign_ids)
135+ let all_campaigns = std:: iter:: once ( campaign_ids)
129136 . chain ( other_pages. into_iter ( ) )
130137 . flat_map ( |campaign_ids| campaign_ids. into_iter ( ) )
131138 . collect ( ) ;
@@ -1279,13 +1286,19 @@ mod test {
12791286 let new_budget = UnifiedNum :: from_u64 ( 300 * multiplier) ;
12801287 let delta_budget = get_delta_budget ( & campaign_remaining, & campaign, new_budget) . await ;
12811288
1282- assert ! ( matches!( & delta_budget, Err ( Error :: NewBudget ( _) ) ) , "Got result: {delta_budget:?}" ) ;
1289+ assert ! (
1290+ matches!( & delta_budget, Err ( Error :: NewBudget ( _) ) ) ,
1291+ "Got result: {delta_budget:?}"
1292+ ) ;
12831293
12841294 // campaign_spent == new_budget
12851295 let new_budget = UnifiedNum :: from_u64 ( 400 * multiplier) ;
12861296 let delta_budget = get_delta_budget ( & campaign_remaining, & campaign, new_budget) . await ;
12871297
1288- assert ! ( matches!( & delta_budget, Err ( Error :: NewBudget ( _) ) ) , "Got result: {delta_budget:?}" ) ;
1298+ assert ! (
1299+ matches!( & delta_budget, Err ( Error :: NewBudget ( _) ) ) ,
1300+ "Got result: {delta_budget:?}"
1301+ ) ;
12891302 }
12901303 // Increasing budget
12911304 {
0 commit comments