From d93f8a12bbd35f9069e19d08b64ba87cd4bb623d Mon Sep 17 00:00:00 2001 From: Mani Chandra <84711804+ThisIsMani@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:27:54 +0530 Subject: [PATCH] feat(payouts): Add profile level payout filter API (#5808) --- crates/router/src/core/payouts.rs | 7 +++-- crates/router/src/routes/app.rs | 7 ++++- crates/router/src/routes/payouts.rs | 40 ++++++++++++++++++++++++++--- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/crates/router/src/core/payouts.rs b/crates/router/src/core/payouts.rs index e7acdd1800..0e9df5284d 100644 --- a/crates/router/src/core/payouts.rs +++ b/crates/router/src/core/payouts.rs @@ -947,10 +947,11 @@ pub async fn payouts_filtered_list_core( pub async fn payouts_list_available_filters_core( state: SessionState, merchant_account: domain::MerchantAccount, + profile_id_list: Option>, time_range: api::TimeRange, ) -> RouterResponse { let db = state.store.as_ref(); - let payout = db + let payouts = db .filter_payouts_by_time_range_constraints( merchant_account.get_id(), &time_range, @@ -959,9 +960,11 @@ pub async fn payouts_list_available_filters_core( .await .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; + let payouts = core_utils::filter_objects_based_on_profile_id_list(profile_id_list, payouts); + let filters = db .get_filters_for_payouts( - payout.as_slice(), + payouts.as_slice(), merchant_account.get_id(), storage_enums::MerchantStorageScheme::PostgresOnly, ) diff --git a/crates/router/src/routes/app.rs b/crates/router/src/routes/app.rs index 1e97c7e3f6..e2651e2929 100644 --- a/crates/router/src/routes/app.rs +++ b/crates/router/src/routes/app.rs @@ -1034,7 +1034,12 @@ impl Payouts { .route(web::post().to(payouts_list_by_filter_profile)), ) .service( - web::resource("/filter").route(web::post().to(payouts_list_available_filters)), + web::resource("/filter") + .route(web::post().to(payouts_list_available_filters_for_merchant)), + ) + .service( + web::resource("/profile/filter") + .route(web::post().to(payouts_list_available_filters_for_profile)), ); } route = route diff --git a/crates/router/src/routes/payouts.rs b/crates/router/src/routes/payouts.rs index bc14a61974..8c45f9fdfd 100644 --- a/crates/router/src/routes/payouts.rs +++ b/crates/router/src/routes/payouts.rs @@ -320,10 +320,10 @@ pub async fn payouts_list_by_filter_profile( .await } -/// Payouts - Available filters +/// Payouts - Available filters for Merchant #[cfg(feature = "olap")] #[instrument(skip_all, fields(flow = ?Flow::PayoutsFilter))] -pub async fn payouts_list_available_filters( +pub async fn payouts_list_available_filters_for_merchant( state: web::Data, req: HttpRequest, json_payload: web::Json, @@ -337,7 +337,41 @@ pub async fn payouts_list_available_filters( &req, payload, |state, auth, req, _| { - payouts_list_available_filters_core(state, auth.merchant_account, req) + payouts_list_available_filters_core(state, auth.merchant_account, None, req) + }, + auth::auth_type( + &auth::HeaderAuth(auth::ApiKeyAuth), + &auth::JWTAuth(Permission::PayoutRead), + req.headers(), + ), + api_locking::LockAction::NotApplicable, + )) + .await +} + +/// Payouts - Available filters for Profile +#[cfg(feature = "olap")] +#[instrument(skip_all, fields(flow = ?Flow::PayoutsFilter))] +pub async fn payouts_list_available_filters_for_profile( + state: web::Data, + req: HttpRequest, + json_payload: web::Json, +) -> HttpResponse { + let flow = Flow::PayoutsFilter; + let payload = json_payload.into_inner(); + + Box::pin(api::server_wrap( + flow, + state, + &req, + payload, + |state, auth, req, _| { + payouts_list_available_filters_core( + state, + auth.merchant_account, + auth.profile_id.map(|profile_id| vec![profile_id]), + req, + ) }, auth::auth_type( &auth::HeaderAuth(auth::ApiKeyAuth),