Skip to content

Commit 693f08d

Browse files
authored
feat(core): [Payouts] Add retrieve flow for payouts (#4936)
1 parent d8d222a commit 693f08d

File tree

19 files changed

+511
-7
lines changed

19 files changed

+511
-7
lines changed

crates/hyperswitch_domain_models/src/router_flow_types/payouts.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ pub struct PoRecipient;
1818

1919
#[derive(Debug, Clone)]
2020
pub struct PoRecipientAccount;
21+
22+
#[derive(Debug, Clone)]
23+
pub struct PoSync;

crates/hyperswitch_domain_models/src/router_response_types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ pub struct PayoutsResponseData {
188188
pub connector_payout_id: Option<String>,
189189
pub payout_eligible: Option<bool>,
190190
pub should_add_next_step_to_process_tracker: bool,
191+
pub error_code: Option<String>,
192+
pub error_message: Option<String>,
191193
}
192194

193195
#[derive(Debug, Clone)]

crates/router/src/connector/adyen/transformers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4849,6 +4849,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, AdyenPayoutResponse>>
48494849
connector_payout_id: Some(response.psp_reference),
48504850
payout_eligible,
48514851
should_add_next_step_to_process_tracker: false,
4852+
error_code: None,
4853+
error_message: None,
48524854
}),
48534855
..item.data
48544856
})

crates/router/src/connector/adyenplatform/transformers/payouts.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, AdyenTransferResponse>>
266266
connector_payout_id: Some(response.id),
267267
payout_eligible: None,
268268
should_add_next_step_to_process_tracker: false,
269+
error_code: None,
270+
error_message: None,
269271
}),
270272
..item.data
271273
})

crates/router/src/connector/cybersource/transformers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3254,6 +3254,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, CybersourceFulfillResponse>>
32543254
connector_payout_id: Some(item.response.id),
32553255
payout_eligible: None,
32563256
should_add_next_step_to_process_tracker: false,
3257+
error_code: None,
3258+
error_message: None,
32573259
}),
32583260
..item.data
32593261
})

crates/router/src/connector/ebanx/transformers.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, EbanxPayoutResponse>>
221221
connector_payout_id: Some(item.response.payout.uid),
222222
payout_eligible: None,
223223
should_add_next_step_to_process_tracker: false,
224+
error_code: None,
225+
error_message: None,
224226
}),
225227
..item.data
226228
})
@@ -305,6 +307,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, EbanxFulfillResponse>>
305307
connector_payout_id: Some(item.data.request.get_transfer_id()?),
306308
payout_eligible: None,
307309
should_add_next_step_to_process_tracker: false,
310+
error_code: None,
311+
error_message: None,
308312
}),
309313
..item.data
310314
})
@@ -396,6 +400,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, EbanxCancelResponse>>
396400
connector_payout_id: item.data.request.connector_payout_id.clone(),
397401
payout_eligible: None,
398402
should_add_next_step_to_process_tracker: false,
403+
error_code: None,
404+
error_message: None,
399405
}),
400406
..item.data
401407
})

crates/router/src/connector/payone/transformers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, PayonePayoutFulfillResponse>
276276
connector_payout_id: Some(response.id),
277277
payout_eligible: None,
278278
should_add_next_step_to_process_tracker: false,
279+
error_code: None,
280+
error_message: None,
279281
}),
280282
..item.data
281283
})

crates/router/src/connector/paypal.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ impl api::Payouts for Paypal {}
7777
impl api::PayoutCreate for Paypal {}
7878
#[cfg(feature = "payouts")]
7979
impl api::PayoutFulfill for Paypal {}
80+
#[cfg(feature = "payouts")]
81+
impl api::PayoutSync for Paypal {}
8082

8183
impl Paypal {
8284
pub fn get_order_error_response(
@@ -533,6 +535,79 @@ impl ConnectorIntegration<api::PoFulfill, types::PayoutsData, types::PayoutsResp
533535
}
534536
}
535537

538+
#[cfg(feature = "payouts")]
539+
impl ConnectorIntegration<api::PoSync, types::PayoutsData, types::PayoutsResponseData> for Paypal {
540+
fn get_url(
541+
&self,
542+
req: &types::PayoutsRouterData<api::PoSync>,
543+
connectors: &settings::Connectors,
544+
) -> CustomResult<String, errors::ConnectorError> {
545+
let batch_id = req.request.connector_payout_id.clone().ok_or(
546+
errors::ConnectorError::MissingRequiredField {
547+
field_name: "connector_payout_id",
548+
},
549+
)?;
550+
Ok(format!(
551+
"{}v1/payments/payouts/{}",
552+
self.base_url(connectors),
553+
batch_id
554+
))
555+
}
556+
557+
fn get_headers(
558+
&self,
559+
req: &types::PayoutsRouterData<api::PoSync>,
560+
connectors: &settings::Connectors,
561+
) -> CustomResult<Vec<(String, request::Maskable<String>)>, errors::ConnectorError> {
562+
self.build_headers(req, connectors)
563+
}
564+
565+
fn build_request(
566+
&self,
567+
req: &types::PayoutsRouterData<api::PoSync>,
568+
connectors: &settings::Connectors,
569+
) -> CustomResult<Option<services::Request>, errors::ConnectorError> {
570+
let request = services::RequestBuilder::new()
571+
.method(services::Method::Get)
572+
.url(&types::PayoutSyncType::get_url(self, req, connectors)?)
573+
.attach_default_headers()
574+
.headers(types::PayoutSyncType::get_headers(self, req, connectors)?)
575+
.build();
576+
577+
Ok(Some(request))
578+
}
579+
580+
#[instrument(skip_all)]
581+
fn handle_response(
582+
&self,
583+
data: &types::PayoutsRouterData<api::PoSync>,
584+
event_builder: Option<&mut ConnectorEvent>,
585+
res: Response,
586+
) -> CustomResult<types::PayoutsRouterData<api::PoSync>, errors::ConnectorError> {
587+
let response: paypal::PaypalFulfillResponse = res
588+
.response
589+
.parse_struct("PaypalFulfillResponse")
590+
.change_context(errors::ConnectorError::ResponseDeserializationFailed)?;
591+
592+
event_builder.map(|i| i.set_response_body(&response));
593+
router_env::logger::info!(connector_response=?response);
594+
595+
types::RouterData::try_from(types::ResponseRouterData {
596+
response,
597+
data: data.clone(),
598+
http_code: res.status_code,
599+
})
600+
}
601+
602+
fn get_error_response(
603+
&self,
604+
res: Response,
605+
event_builder: Option<&mut ConnectorEvent>,
606+
) -> CustomResult<ErrorResponse, errors::ConnectorError> {
607+
self.build_error_response(res, event_builder)
608+
}
609+
}
610+
536611
#[async_trait::async_trait]
537612
#[cfg(feature = "payouts")]
538613
impl ConnectorIntegration<api::PoCreate, types::PayoutsData, types::PayoutsResponseData>

crates/router/src/connector/paypal/transformers.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,6 +1695,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, PaypalFulfillResponse>>
16951695
connector_payout_id: Some(item.response.batch_header.payout_batch_id),
16961696
payout_eligible: None,
16971697
should_add_next_step_to_process_tracker: false,
1698+
error_code: None,
1699+
error_message: None,
16981700
}),
16991701
..item.data
17001702
})

crates/router/src/connector/stripe/transformers/connect.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, StripeConnectPayoutCreateRes
237237
connector_payout_id: Some(response.id),
238238
payout_eligible: None,
239239
should_add_next_step_to_process_tracker: false,
240+
error_code: None,
241+
error_message: None,
240242
}),
241243
..item.data
242244
})
@@ -271,6 +273,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, StripeConnectPayoutFulfillRe
271273
connector_payout_id: Some(response.id),
272274
payout_eligible: None,
273275
should_add_next_step_to_process_tracker: false,
276+
error_code: None,
277+
error_message: None,
274278
}),
275279
..item.data
276280
})
@@ -301,6 +305,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, StripeConnectReversalRespons
301305
connector_payout_id: item.data.request.connector_payout_id.clone(),
302306
payout_eligible: None,
303307
should_add_next_step_to_process_tracker: false,
308+
error_code: None,
309+
error_message: None,
304310
}),
305311
..item.data
306312
})
@@ -374,6 +380,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, StripeConnectRecipientCreate
374380
connector_payout_id: Some(response.id),
375381
payout_eligible: None,
376382
should_add_next_step_to_process_tracker: true,
383+
error_code: None,
384+
error_message: None,
377385
}),
378386
..item.data
379387
})
@@ -455,6 +463,8 @@ impl<F> TryFrom<types::PayoutsResponseRouterData<F, StripeConnectRecipientAccoun
455463
connector_payout_id: item.data.request.connector_payout_id.clone(),
456464
payout_eligible: None,
457465
should_add_next_step_to_process_tracker: false,
466+
error_code: None,
467+
error_message: None,
458468
}),
459469
..item.data
460470
})

0 commit comments

Comments
 (0)