From 7dfe400401daf7081f9240ed52064281b302ba57 Mon Sep 17 00:00:00 2001 From: spritianeja03 <146620839+spritianeja03@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:18:24 +0530 Subject: [PATCH] refactor(connector): Move connectors Aci, Braintree, Globalpay, Iatapay, Itaubank, Klarna, Mifinity and Nuvei from router to hyperswitch_connectors crate (#7167) Co-authored-by: Spriti Aneja Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com> --- Cargo.lock | 1 + crates/hyperswitch_connectors/Cargo.toml | 1 + .../hyperswitch_connectors/src/connectors.rs | 37 +- .../src/connectors}/aci.rs | 361 ++++----- .../src/connectors/aci/aci_result_codes.rs} | 0 .../src/connectors}/aci/transformers.rs | 309 ++++---- .../src/connectors}/braintree.rs | 605 +++++++-------- .../src/connectors}/braintree/transformers.rs | 364 +++++---- .../src/connectors}/globalpay.rs | 566 +++++++------- .../src/connectors}/globalpay/requests.rs | 0 .../src/connectors}/globalpay/response.rs | 0 .../src/connectors}/globalpay/transformers.rs | 235 +++--- .../src/connectors}/iatapay.rs | 314 ++++---- .../src/connectors}/iatapay/transformers.rs | 289 ++++--- .../src/connectors}/itaubank.rs | 328 ++++---- .../src/connectors}/itaubank/transformers.rs | 163 ++-- .../src/connectors}/klarna.rs | 438 +++++------ .../src/connectors}/klarna/transformers.rs | 184 +++-- .../src/connectors}/mifinity.rs | 232 +++--- .../src/connectors}/mifinity/transformers.rs | 158 ++-- .../src/connectors}/nuvei.rs | 446 ++++++----- .../src/connectors}/nuvei/transformers.rs | 705 +++++++++--------- .../hyperswitch_connectors/src/constants.rs | 2 + .../src/default_implementations.rs | 274 ++++++- .../src/default_implementations_v2.rs | 175 +++++ crates/hyperswitch_connectors/src/types.rs | 9 +- crates/hyperswitch_connectors/src/utils.rs | 94 ++- crates/router/src/connector.rs | 55 +- crates/router/src/consts.rs | 1 - .../connector_integration_v2_impls.rs | 186 ----- crates/router/src/core/payments/flows.rs | 272 ------- 31 files changed, 3339 insertions(+), 3465 deletions(-) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/aci.rs (59%) rename crates/{router/src/connector/aci/result_codes.rs => hyperswitch_connectors/src/connectors/aci/aci_result_codes.rs} (100%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/aci/transformers.rs (72%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/braintree.rs (66%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/braintree/transformers.rs (84%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/globalpay.rs (61%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/globalpay/requests.rs (100%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/globalpay/response.rs (100%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/globalpay/transformers.rs (65%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/iatapay.rs (71%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/iatapay/transformers.rs (68%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/itaubank.rs (71%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/itaubank/transformers.rs (71%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/klarna.rs (78%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/klarna/transformers.rs (81%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/mifinity.rs (68%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/mifinity/transformers.rs (72%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/nuvei.rs (67%) rename crates/{router/src/connector => hyperswitch_connectors/src/connectors}/nuvei/transformers.rs (72%) diff --git a/Cargo.lock b/Cargo.lock index 9e39e50ff52..5b4d9767029 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4031,6 +4031,7 @@ dependencies = [ "serde_qs", "serde_urlencoded", "serde_with", + "sha1", "strum 0.26.3", "time", "url", diff --git a/crates/hyperswitch_connectors/Cargo.toml b/crates/hyperswitch_connectors/Cargo.toml index 68ea60af8c6..6b76e6ac195 100644 --- a/crates/hyperswitch_connectors/Cargo.toml +++ b/crates/hyperswitch_connectors/Cargo.toml @@ -36,6 +36,7 @@ serde_json = "1.0.115" serde_qs = "0.12.0" serde_urlencoded = "0.7.1" serde_with = "3.7.0" +sha1 = { version = "0.10.6" } strum = { version = "0.26", features = ["derive"] } time = "0.3.35" url = "2.5.0" diff --git a/crates/hyperswitch_connectors/src/connectors.rs b/crates/hyperswitch_connectors/src/connectors.rs index e9738a4907a..58e6d9c7e5d 100644 --- a/crates/hyperswitch_connectors/src/connectors.rs +++ b/crates/hyperswitch_connectors/src/connectors.rs @@ -1,3 +1,4 @@ +pub mod aci; pub mod airwallex; pub mod amazonpay; pub mod bambora; @@ -7,6 +8,7 @@ pub mod billwerk; pub mod bitpay; pub mod bluesnap; pub mod boku; +pub mod braintree; pub mod cashtocode; pub mod chargebee; pub mod coinbase; @@ -23,17 +25,23 @@ pub mod fiserv; pub mod fiservemea; pub mod fiuu; pub mod forte; +pub mod globalpay; pub mod globepay; pub mod gocardless; pub mod helcim; +pub mod iatapay; pub mod inespay; +pub mod itaubank; pub mod jpmorgan; +pub mod klarna; +pub mod mifinity; pub mod mollie; pub mod multisafepay; pub mod nexinets; pub mod nexixpay; pub mod nomupay; pub mod novalnet; +pub mod nuvei; pub mod paybox; pub mod payeezy; pub mod payu; @@ -59,19 +67,20 @@ pub mod zen; pub mod zsl; pub use self::{ - airwallex::Airwallex, amazonpay::Amazonpay, bambora::Bambora, bamboraapac::Bamboraapac, - bankofamerica::Bankofamerica, billwerk::Billwerk, bitpay::Bitpay, bluesnap::Bluesnap, - boku::Boku, cashtocode::Cashtocode, chargebee::Chargebee, coinbase::Coinbase, - coingate::Coingate, cryptopay::Cryptopay, ctp_mastercard::CtpMastercard, - cybersource::Cybersource, datatrans::Datatrans, deutschebank::Deutschebank, - digitalvirgo::Digitalvirgo, dlocal::Dlocal, elavon::Elavon, fiserv::Fiserv, - fiservemea::Fiservemea, fiuu::Fiuu, forte::Forte, globepay::Globepay, gocardless::Gocardless, - helcim::Helcim, inespay::Inespay, jpmorgan::Jpmorgan, mollie::Mollie, + aci::Aci, airwallex::Airwallex, amazonpay::Amazonpay, bambora::Bambora, + bamboraapac::Bamboraapac, bankofamerica::Bankofamerica, billwerk::Billwerk, bitpay::Bitpay, + bluesnap::Bluesnap, boku::Boku, braintree::Braintree, cashtocode::Cashtocode, + chargebee::Chargebee, coinbase::Coinbase, coingate::Coingate, cryptopay::Cryptopay, + ctp_mastercard::CtpMastercard, cybersource::Cybersource, datatrans::Datatrans, + deutschebank::Deutschebank, digitalvirgo::Digitalvirgo, dlocal::Dlocal, elavon::Elavon, + fiserv::Fiserv, fiservemea::Fiservemea, fiuu::Fiuu, forte::Forte, globalpay::Globalpay, + globepay::Globepay, gocardless::Gocardless, helcim::Helcim, iatapay::Iatapay, inespay::Inespay, + itaubank::Itaubank, jpmorgan::Jpmorgan, klarna::Klarna, mifinity::Mifinity, mollie::Mollie, multisafepay::Multisafepay, nexinets::Nexinets, nexixpay::Nexixpay, nomupay::Nomupay, - novalnet::Novalnet, paybox::Paybox, payeezy::Payeezy, payu::Payu, placetopay::Placetopay, - powertranz::Powertranz, prophetpay::Prophetpay, rapyd::Rapyd, razorpay::Razorpay, - redsys::Redsys, shift4::Shift4, square::Square, stax::Stax, taxjar::Taxjar, thunes::Thunes, - tsys::Tsys, unified_authentication_service::UnifiedAuthenticationService, volt::Volt, - wellsfargo::Wellsfargo, worldline::Worldline, worldpay::Worldpay, xendit::Xendit, zen::Zen, - zsl::Zsl, + novalnet::Novalnet, nuvei::Nuvei, paybox::Paybox, payeezy::Payeezy, payu::Payu, + placetopay::Placetopay, powertranz::Powertranz, prophetpay::Prophetpay, rapyd::Rapyd, + razorpay::Razorpay, redsys::Redsys, shift4::Shift4, square::Square, stax::Stax, taxjar::Taxjar, + thunes::Thunes, tsys::Tsys, unified_authentication_service::UnifiedAuthenticationService, + volt::Volt, wellsfargo::Wellsfargo, worldline::Worldline, worldpay::Worldpay, xendit::Xendit, + zen::Zen, zsl::Zsl, }; diff --git a/crates/router/src/connector/aci.rs b/crates/hyperswitch_connectors/src/connectors/aci.rs similarity index 59% rename from crates/router/src/connector/aci.rs rename to crates/hyperswitch_connectors/src/connectors/aci.rs index c59c0ce0755..f4fce668ee0 100644 --- a/crates/router/src/connector/aci.rs +++ b/crates/hyperswitch_connectors/src/connectors/aci.rs @@ -1,32 +1,55 @@ -mod result_codes; +mod aci_result_codes; pub mod transformers; +use api_models::webhooks::IncomingWebhookEvent; +use common_enums::enums; use common_utils::{ - request::RequestContent, + errors::CustomResult, + ext_traits::BytesExt, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, StringMajorUnit, StringMajorUnitForConnector}, }; use error_stack::{report, ResultExt}; -use hyperswitch_interfaces::api::ConnectorSpecifications; -use masking::PeekInterface; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsSyncRouterData, + RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, + }, + configs::Connectors, + errors, + events::connector_api_logs::ConnectorEvent, + types::{ + PaymentsAuthorizeType, PaymentsSyncType, PaymentsVoidType, RefundExecuteType, Response, + }, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{Mask, PeekInterface}; use transformers as aci; -use super::utils::{convert_amount, is_mandate_supported, PaymentsAuthorizeRequestData}; use crate::{ - configs::settings, - connector::utils::PaymentMethodDataType, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorValidation, + constants::headers, + types::ResponseRouterData, + utils::{ + convert_amount, is_mandate_supported, PaymentMethodDataType, PaymentsAuthorizeRequestData, }, - types::{ - self, - api::{self, ConnectorCommon}, - }, - utils::BytesExt, }; #[derive(Clone)] @@ -53,14 +76,14 @@ impl ConnectorCommon for Aci { "application/x-www-form-urlencoded" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.aci.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = aci::AciAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -71,16 +94,16 @@ impl ConnectorCommon for Aci { fn build_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { let response: aci::AciErrorResponse = res .response .parse_struct("AciErrorResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_error_response_body(&response)); router_env::logger::info!(connector_response=?response); - Ok(types::ErrorResponse { + Ok(ErrorResponse { status_code: res.status_code, code: response.result.code, message: response.result.description, @@ -105,8 +128,8 @@ impl ConnectorCommon for Aci { impl ConnectorValidation for Aci { fn validate_mandate_payment( &self, - pm_type: Option, - pm_data: types::domain::payments::PaymentMethodData, + pm_type: Option, + pm_data: PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([PaymentMethodDataType::Card]); is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) @@ -123,83 +146,46 @@ impl api::PaymentSession for Aci {} impl api::ConnectorAccessToken for Aci {} impl api::PaymentToken for Aci {} -impl - services::ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Aci +impl ConnectorIntegration + for Aci { // Not Implemented (R) } -impl - services::ConnectorIntegration< - api::Session, - types::PaymentsSessionData, - types::PaymentsResponseData, - > for Aci -{ +impl ConnectorIntegration for Aci { // Not Implemented (R) } -impl - services::ConnectorIntegration< - api::AccessTokenAuth, - types::AccessTokenRequestData, - types::AccessToken, - > for Aci -{ +impl ConnectorIntegration for Aci { // Not Implemented (R) } impl api::MandateSetup for Aci {} -impl - services::ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Aci -{ +impl ConnectorIntegration for Aci { // Issue: #173 fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err(errors::ConnectorError::NotImplemented("Setup Mandate flow for Aci".to_string()).into()) } } -impl - services::ConnectorIntegration< - api::Capture, - types::PaymentsCaptureData, - types::PaymentsResponseData, - > for Aci -{ +impl ConnectorIntegration for Aci { // Not Implemented (R) } -impl - services::ConnectorIntegration - for Aci -{ +impl ConnectorIntegration for Aci { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PaymentsSyncType::get_content_type(self) - .to_string() - .into(), + PaymentsSyncType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -212,8 +198,8 @@ impl fn get_url( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, + req: &PaymentsSyncRouterData, + connectors: &Connectors, ) -> CustomResult { let auth = aci::AciAuthType::try_from(&req.connector_auth_type)?; Ok(format!( @@ -231,28 +217,28 @@ impl fn build_request( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) - .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Get) + .url(&PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) + .headers(PaymentsSyncType::get_headers(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::PaymentsSyncRouterData, + data: &PaymentsSyncRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult + res: Response, + ) -> CustomResult where - types::PaymentsSyncData: Clone, - types::PaymentsResponseData: Clone, + PaymentsSyncData: Clone, + PaymentsResponseData: Clone, { let response: aci::AciPaymentsResponse = res.response @@ -260,7 +246,7 @@ impl .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -270,28 +256,22 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl - services::ConnectorIntegration< - api::Authorize, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - > for Aci -{ +impl ConnectorIntegration for Aci { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PaymentsAuthorizeType::get_content_type(self) + PaymentsAuthorizeType::get_content_type(self) .to_string() .into(), )]; @@ -306,8 +286,8 @@ impl fn get_url( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { match req.request.connector_mandate_id() { Some(mandate_id) => Ok(format!( @@ -321,8 +301,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { // encode only for for urlencoded things. @@ -340,24 +320,16 @@ impl fn build_request( &self, - req: &types::RouterData< - api::Authorize, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - >, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &RouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsAuthorizeType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsAuthorizeType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsAuthorizeType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsAuthorizeType::get_request_body( + .headers(PaymentsAuthorizeType::get_headers(self, req, connectors)?) + .set_body(PaymentsAuthorizeType::get_request_body( self, req, connectors, )?) .build(), @@ -366,17 +338,17 @@ impl fn handle_response( &self, - data: &types::PaymentsAuthorizeRouterData, + data: &PaymentsAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: aci::AciPaymentsResponse = res.response .parse_struct("AciPaymentsResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -386,28 +358,22 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl - services::ConnectorIntegration< - api::Void, - types::PaymentsCancelData, - types::PaymentsResponseData, - > for Aci -{ +impl ConnectorIntegration for Aci { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PaymentsAuthorizeType::get_content_type(self) + PaymentsAuthorizeType::get_content_type(self) .to_string() .into(), )]; @@ -422,8 +388,8 @@ impl fn get_url( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + connectors: &Connectors, ) -> CustomResult { let id = &req.request.connector_transaction_id; Ok(format!("{}v1/payments/{}", self.base_url(connectors), id)) @@ -431,43 +397,41 @@ impl fn get_request_body( &self, - req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = aci::AciCancelRequest::try_from(req)?; Ok(RequestContent::FormUrlEncoded(Box::new(connector_req))) } fn build_request( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) - .set_body(types::PaymentsVoidType::get_request_body( - self, req, connectors, - )?) + .headers(PaymentsVoidType::get_headers(self, req, connectors)?) + .set_body(PaymentsVoidType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::PaymentsCancelRouterData, + data: &PaymentsCancelRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: aci::AciPaymentsResponse = res.response .parse_struct("AciPaymentsResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -477,9 +441,9 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -488,19 +452,15 @@ impl api::Refund for Aci {} impl api::RefundExecute for Aci {} impl api::RefundSync for Aci {} -impl services::ConnectorIntegration - for Aci -{ +impl ConnectorIntegration for Aci { fn get_headers( &self, - req: &types::RefundsRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::RefundExecuteType::get_content_type(self) - .to_string() - .into(), + RefundExecuteType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -513,8 +473,8 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { let connector_payment_id = req.request.connector_transaction_id.clone(); Ok(format!( @@ -526,8 +486,8 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { let amount = convert_amount( self.amount_converter, @@ -542,30 +502,26 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::RefundExecuteType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefundExecuteType::get_headers( - self, req, connectors, - )?) - .set_body(types::RefundExecuteType::get_request_body( - self, req, connectors, - )?) + .headers(RefundExecuteType::get_headers(self, req, connectors)?) + .set_body(RefundExecuteType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::RefundsRouterData, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: aci::AciRefundResponse = res .response .parse_struct("AciRefundResponse") @@ -573,7 +529,7 @@ impl services::ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl services::ConnectorIntegration - for Aci -{ -} +impl ConnectorIntegration for Aci {} #[async_trait::async_trait] -impl api::IncomingWebhook for Aci { +impl IncomingWebhook for Aci { fn get_webhook_object_reference_id( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_event_type( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { - Ok(api::IncomingWebhookEvent::EventNotSupported) + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { + Ok(IncomingWebhookEvent::EventNotSupported) } fn get_webhook_resource_object( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } diff --git a/crates/router/src/connector/aci/result_codes.rs b/crates/hyperswitch_connectors/src/connectors/aci/aci_result_codes.rs similarity index 100% rename from crates/router/src/connector/aci/result_codes.rs rename to crates/hyperswitch_connectors/src/connectors/aci/aci_result_codes.rs diff --git a/crates/router/src/connector/aci/transformers.rs b/crates/hyperswitch_connectors/src/connectors/aci/transformers.rs similarity index 72% rename from crates/router/src/connector/aci/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/aci/transformers.rs index 11d34e55b7b..3246f7d01d5 100644 --- a/crates/router/src/connector/aci/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/aci/transformers.rs @@ -1,17 +1,26 @@ use std::str::FromStr; -use common_utils::{id_type, pii::Email, types::StringMajorUnit}; +use common_enums::enums; +use common_utils::{id_type, pii::Email, request::Method, types::StringMajorUnit}; use error_stack::report; +use hyperswitch_domain_models::{ + payment_method_data::{BankRedirectData, Card, PayLaterData, PaymentMethodData, WalletData}, + router_data::{ConnectorAuthType, RouterData}, + router_request_types::ResponseId, + router_response_types::{ + MandateReference, PaymentsResponseData, RedirectForm, RefundsResponseData, + }, + types::{PaymentsAuthorizeRouterData, PaymentsCancelRouterData, RefundsRouterData}, +}; +use hyperswitch_interfaces::errors; use masking::{ExposeInterface, Secret}; -use reqwest::Url; use serde::{Deserialize, Serialize}; +use url::Url; -use super::result_codes::{FAILURE_CODES, PENDING_CODES, SUCCESSFUL_CODES}; +use super::aci_result_codes::{FAILURE_CODES, PENDING_CODES, SUCCESSFUL_CODES}; use crate::{ - connector::utils::{self, PhoneDetailsData, RouterData}, - core::errors, - services, - types::{self, domain, storage::enums}, + types::{RefundsResponseRouterData, ResponseRouterData}, + utils::{self, PhoneDetailsData, RouterData as _}, }; type Error = error_stack::Report; @@ -36,10 +45,10 @@ pub struct AciAuthType { pub entity_id: Secret, } -impl TryFrom<&types::ConnectorAuthType> for AciAuthType { +impl TryFrom<&ConnectorAuthType> for AciAuthType { type Error = error_stack::Report; - fn try_from(item: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::BodyKey { api_key, key1 } = item { + fn try_from(item: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::BodyKey { api_key, key1 } = item { Ok(Self { api_key: api_key.to_owned(), entity_id: key1.to_owned(), @@ -89,51 +98,49 @@ pub enum PaymentDetails { Mandate, } -impl TryFrom<(&domain::WalletData, &types::PaymentsAuthorizeRouterData)> for PaymentDetails { +impl TryFrom<(&WalletData, &PaymentsAuthorizeRouterData)> for PaymentDetails { type Error = Error; - fn try_from( - value: (&domain::WalletData, &types::PaymentsAuthorizeRouterData), - ) -> Result { + fn try_from(value: (&WalletData, &PaymentsAuthorizeRouterData)) -> Result { let (wallet_data, item) = value; let payment_data = match wallet_data { - domain::WalletData::MbWayRedirect(_) => { + WalletData::MbWayRedirect(_) => { let phone_details = item.get_billing_phone()?; Self::Wallet(Box::new(WalletPMData { payment_brand: PaymentBrand::Mbway, account_id: Some(phone_details.get_number_with_hash_country_code()?), })) } - domain::WalletData::AliPayRedirect { .. } => Self::Wallet(Box::new(WalletPMData { + WalletData::AliPayRedirect { .. } => Self::Wallet(Box::new(WalletPMData { payment_brand: PaymentBrand::AliPay, account_id: None, })), - domain::WalletData::AliPayHkRedirect(_) - | domain::WalletData::AmazonPayRedirect(_) - | domain::WalletData::MomoRedirect(_) - | domain::WalletData::KakaoPayRedirect(_) - | domain::WalletData::GoPayRedirect(_) - | domain::WalletData::GcashRedirect(_) - | domain::WalletData::ApplePay(_) - | domain::WalletData::ApplePayThirdPartySdk(_) - | domain::WalletData::DanaRedirect { .. } - | domain::WalletData::GooglePay(_) - | domain::WalletData::GooglePayThirdPartySdk(_) - | domain::WalletData::MobilePayRedirect(_) - | domain::WalletData::PaypalRedirect(_) - | domain::WalletData::PaypalSdk(_) - | domain::WalletData::Paze(_) - | domain::WalletData::SamsungPay(_) - | domain::WalletData::TwintRedirect { .. } - | domain::WalletData::VippsRedirect { .. } - | domain::WalletData::TouchNGoRedirect(_) - | domain::WalletData::WeChatPayRedirect(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::SwishQr(_) - | domain::WalletData::AliPayQr(_) - | domain::WalletData::ApplePayRedirect(_) - | domain::WalletData::GooglePayRedirect(_) - | domain::WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( + WalletData::AliPayHkRedirect(_) + | WalletData::AmazonPayRedirect(_) + | WalletData::MomoRedirect(_) + | WalletData::KakaoPayRedirect(_) + | WalletData::GoPayRedirect(_) + | WalletData::GcashRedirect(_) + | WalletData::ApplePay(_) + | WalletData::ApplePayThirdPartySdk(_) + | WalletData::DanaRedirect { .. } + | WalletData::GooglePay(_) + | WalletData::GooglePayThirdPartySdk(_) + | WalletData::MobilePayRedirect(_) + | WalletData::PaypalRedirect(_) + | WalletData::PaypalSdk(_) + | WalletData::Paze(_) + | WalletData::SamsungPay(_) + | WalletData::TwintRedirect { .. } + | WalletData::VippsRedirect { .. } + | WalletData::TouchNGoRedirect(_) + | WalletData::WeChatPayRedirect(_) + | WalletData::WeChatPayQr(_) + | WalletData::CashappQr(_) + | WalletData::SwishQr(_) + | WalletData::AliPayQr(_) + | WalletData::ApplePayRedirect(_) + | WalletData::GooglePayRedirect(_) + | WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( "Payment method".to_string(), ))?, }; @@ -143,33 +150,31 @@ impl TryFrom<(&domain::WalletData, &types::PaymentsAuthorizeRouterData)> for Pay impl TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AciRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, )> for PaymentDetails { type Error = Error; fn try_from( value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AciRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, ), ) -> Result { let (item, bank_redirect_data) = value; let payment_data = match bank_redirect_data { - domain::BankRedirectData::Eps { .. } => { - Self::BankRedirect(Box::new(BankRedirectionPMData { - payment_brand: PaymentBrand::Eps, - bank_account_country: Some(item.router_data.get_billing_country()?), - bank_account_bank_name: None, - bank_account_bic: None, - bank_account_iban: None, - billing_country: None, - merchant_customer_id: None, - merchant_transaction_id: None, - customer_email: None, - })) - } - domain::BankRedirectData::Giropay { + BankRedirectData::Eps { .. } => Self::BankRedirect(Box::new(BankRedirectionPMData { + payment_brand: PaymentBrand::Eps, + bank_account_country: Some(item.router_data.get_billing_country()?), + bank_account_bank_name: None, + bank_account_bic: None, + bank_account_iban: None, + billing_country: None, + merchant_customer_id: None, + merchant_transaction_id: None, + customer_email: None, + })), + BankRedirectData::Giropay { bank_account_bic, bank_account_iban, .. @@ -184,7 +189,7 @@ impl merchant_transaction_id: None, customer_email: None, })), - domain::BankRedirectData::Ideal { bank_name, .. } => { + BankRedirectData::Ideal { bank_name, .. } => { Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::Ideal, bank_account_country: Some(item.router_data.get_billing_country()?), @@ -201,7 +206,7 @@ impl customer_email: None, })) } - domain::BankRedirectData::Sofort { .. } => { + BankRedirectData::Sofort { .. } => { Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::Sofortueberweisung, bank_account_country: Some(item.router_data.get_billing_country()?), @@ -214,7 +219,7 @@ impl customer_email: None, })) } - domain::BankRedirectData::Przelewy24 { .. } => { + BankRedirectData::Przelewy24 { .. } => { Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::Przelewy, bank_account_country: None, @@ -227,7 +232,7 @@ impl customer_email: Some(item.router_data.get_billing_email()?), })) } - domain::BankRedirectData::Interac { .. } => { + BankRedirectData::Interac { .. } => { Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::InteracOnline, bank_account_country: Some(item.router_data.get_billing_country()?), @@ -240,7 +245,7 @@ impl customer_email: Some(item.router_data.get_billing_email()?), })) } - domain::BankRedirectData::Trustly { .. } => { + BankRedirectData::Trustly { .. } => { Self::BankRedirect(Box::new(BankRedirectionPMData { payment_brand: PaymentBrand::Trustly, bank_account_country: None, @@ -255,17 +260,17 @@ impl customer_email: None, })) } - domain::BankRedirectData::Bizum { .. } - | domain::BankRedirectData::Blik { .. } - | domain::BankRedirectData::BancontactCard { .. } - | domain::BankRedirectData::OnlineBankingCzechRepublic { .. } - | domain::BankRedirectData::OnlineBankingFinland { .. } - | domain::BankRedirectData::OnlineBankingFpx { .. } - | domain::BankRedirectData::OnlineBankingPoland { .. } - | domain::BankRedirectData::OnlineBankingSlovakia { .. } - | domain::BankRedirectData::OnlineBankingThailand { .. } - | domain::BankRedirectData::LocalBankRedirect {} - | domain::BankRedirectData::OpenBankingUk { .. } => Err( + BankRedirectData::Bizum { .. } + | BankRedirectData::Blik { .. } + | BankRedirectData::BancontactCard { .. } + | BankRedirectData::OnlineBankingCzechRepublic { .. } + | BankRedirectData::OnlineBankingFinland { .. } + | BankRedirectData::OnlineBankingFpx { .. } + | BankRedirectData::OnlineBankingPoland { .. } + | BankRedirectData::OnlineBankingSlovakia { .. } + | BankRedirectData::OnlineBankingThailand { .. } + | BankRedirectData::LocalBankRedirect {} + | BankRedirectData::OpenBankingUk { .. } => Err( errors::ConnectorError::NotImplemented("Payment method".to_string()), )?, }; @@ -273,10 +278,10 @@ impl } } -impl TryFrom<(domain::payments::Card, Option>)> for PaymentDetails { +impl TryFrom<(Card, Option>)> for PaymentDetails { type Error = Error; fn try_from( - (card_data, card_holder_name): (domain::payments::Card, Option>), + (card_data, card_holder_name): (Card, Option>), ) -> Result { Ok(Self::AciCard(Box::new(CardDetails { card_number: card_data.card_number, @@ -406,23 +411,19 @@ pub enum AciPaymentType { Refund, } -impl TryFrom<&AciRouterData<&types::PaymentsAuthorizeRouterData>> for AciPaymentsRequest { +impl TryFrom<&AciRouterData<&PaymentsAuthorizeRouterData>> for AciPaymentsRequest { type Error = error_stack::Report; - fn try_from( - item: &AciRouterData<&types::PaymentsAuthorizeRouterData>, - ) -> Result { + fn try_from(item: &AciRouterData<&PaymentsAuthorizeRouterData>) -> Result { match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::Card(ref card_data) => Self::try_from((item, card_data)), - domain::PaymentMethodData::Wallet(ref wallet_data) => { - Self::try_from((item, wallet_data)) - } - domain::PaymentMethodData::PayLater(ref pay_later_data) => { + PaymentMethodData::Card(ref card_data) => Self::try_from((item, card_data)), + PaymentMethodData::Wallet(ref wallet_data) => Self::try_from((item, wallet_data)), + PaymentMethodData::PayLater(ref pay_later_data) => { Self::try_from((item, pay_later_data)) } - domain::PaymentMethodData::BankRedirect(ref bank_redirect_data) => { + PaymentMethodData::BankRedirect(ref bank_redirect_data) => { Self::try_from((item, bank_redirect_data)) } - domain::PaymentMethodData::MandatePayment => { + PaymentMethodData::MandatePayment => { let mandate_id = item.router_data.request.mandate_id.clone().ok_or( errors::ConnectorError::MissingRequiredField { field_name: "mandate_id", @@ -430,20 +431,20 @@ impl TryFrom<&AciRouterData<&types::PaymentsAuthorizeRouterData>> for AciPayment )?; Self::try_from((item, mandate_id)) } - domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Crypto(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Aci"), ))? @@ -452,18 +453,10 @@ impl TryFrom<&AciRouterData<&types::PaymentsAuthorizeRouterData>> for AciPayment } } -impl - TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::WalletData, - )> for AciPaymentsRequest -{ +impl TryFrom<(&AciRouterData<&PaymentsAuthorizeRouterData>, &WalletData)> for AciPaymentsRequest { type Error = Error; fn try_from( - value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::WalletData, - ), + value: (&AciRouterData<&PaymentsAuthorizeRouterData>, &WalletData), ) -> Result { let (item, wallet_data) = value; let txn_details = get_transaction_details(item)?; @@ -480,15 +473,15 @@ impl impl TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AciRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, )> for AciPaymentsRequest { type Error = Error; fn try_from( value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AciRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, ), ) -> Result { let (item, bank_redirect_data) = value; @@ -504,18 +497,10 @@ impl } } -impl - TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::payments::PayLaterData, - )> for AciPaymentsRequest -{ +impl TryFrom<(&AciRouterData<&PaymentsAuthorizeRouterData>, &PayLaterData)> for AciPaymentsRequest { type Error = Error; fn try_from( - value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::payments::PayLaterData, - ), + value: (&AciRouterData<&PaymentsAuthorizeRouterData>, &PayLaterData), ) -> Result { let (item, _pay_later_data) = value; let txn_details = get_transaction_details(item)?; @@ -530,18 +515,10 @@ impl } } -impl - TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::Card, - )> for AciPaymentsRequest -{ +impl TryFrom<(&AciRouterData<&PaymentsAuthorizeRouterData>, &Card)> for AciPaymentsRequest { type Error = Error; fn try_from( - value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::Card, - ), + value: (&AciRouterData<&PaymentsAuthorizeRouterData>, &Card), ) -> Result { let (item, card_data) = value; let card_holder_name = item.router_data.get_optional_billing_full_name(); @@ -560,14 +537,14 @@ impl impl TryFrom<( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, + &AciRouterData<&PaymentsAuthorizeRouterData>, api_models::payments::MandateIds, )> for AciPaymentsRequest { type Error = Error; fn try_from( value: ( - &AciRouterData<&types::PaymentsAuthorizeRouterData>, + &AciRouterData<&PaymentsAuthorizeRouterData>, api_models::payments::MandateIds, ), ) -> Result { @@ -585,7 +562,7 @@ impl } fn get_transaction_details( - item: &AciRouterData<&types::PaymentsAuthorizeRouterData>, + item: &AciRouterData<&PaymentsAuthorizeRouterData>, ) -> Result> { let auth = AciAuthType::try_from(&item.router_data.connector_auth_type)?; Ok(TransactionDetails { @@ -597,7 +574,7 @@ fn get_transaction_details( } fn get_instruction_details( - item: &AciRouterData<&types::PaymentsAuthorizeRouterData>, + item: &AciRouterData<&PaymentsAuthorizeRouterData>, ) -> Option { if item.router_data.request.setup_mandate_details.is_some() { return Some(Instruction { @@ -617,9 +594,9 @@ fn get_instruction_details( None } -impl TryFrom<&types::PaymentsCancelRouterData> for AciCancelRequest { +impl TryFrom<&PaymentsCancelRouterData> for AciCancelRequest { type Error = error_stack::Report; - fn try_from(item: &types::PaymentsCancelRouterData) -> Result { + fn try_from(item: &PaymentsCancelRouterData) -> Result { let auth = AciAuthType::try_from(&item.connector_auth_type)?; let aci_payment_request = Self { entity_id: auth.entity_id, @@ -692,7 +669,7 @@ pub struct AciErrorResponse { #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(rename_all = "camelCase")] pub struct AciRedirectionData { - method: Option, + method: Option, parameters: Vec, url: Url, } @@ -718,13 +695,12 @@ pub struct ErrorParameters { pub(super) message: String, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let redirection_data = item.response.redirect.map(|data| { let form_fields = std::collections::HashMap::<_, _>::from_iter( @@ -735,24 +711,21 @@ impl // If method is Get, parameters are appended to URL // If method is post, we http Post the method to URL - services::RedirectForm::Form { + RedirectForm::Form { endpoint: data.url.to_string(), // Handles method for Bank redirects currently. // 3DS response have method within preconditions. That would require replacing below line with a function. - method: data.method.unwrap_or(services::Method::Post), + method: data.method.unwrap_or(Method::Post), form_fields, } }); - let mandate_reference = item - .response - .registration_id - .map(|id| types::MandateReference { - connector_mandate_id: Some(id.expose()), - payment_method_id: None, - mandate_metadata: None, - connector_mandate_request_reference_id: None, - }); + let mandate_reference = item.response.registration_id.map(|id| MandateReference { + connector_mandate_id: Some(id.expose()), + payment_method_id: None, + mandate_metadata: None, + connector_mandate_request_reference_id: None, + }); Ok(Self { status: { @@ -764,8 +737,8 @@ impl )?) } }, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.id.clone()), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id.clone()), redirection_data: Box::new(redirection_data), mandate_reference: Box::new(mandate_reference), connector_metadata: None, @@ -788,9 +761,9 @@ pub struct AciRefundRequest { pub entity_id: Secret, } -impl TryFrom<&AciRouterData<&types::RefundsRouterData>> for AciRefundRequest { +impl TryFrom<&AciRouterData<&RefundsRouterData>> for AciRefundRequest { type Error = error_stack::Report; - fn try_from(item: &AciRouterData<&types::RefundsRouterData>) -> Result { + fn try_from(item: &AciRouterData<&RefundsRouterData>) -> Result { let amount = item.amount.to_owned(); let currency = item.router_data.request.currency; let payment_type = AciPaymentType::Refund; @@ -852,15 +825,13 @@ pub struct AciRefundResponse { pub(super) result: ResultCode, } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.id, refund_status: enums::RefundStatus::from(AciRefundStatus::from_str( &item.response.result.code, diff --git a/crates/router/src/connector/braintree.rs b/crates/hyperswitch_connectors/src/connectors/braintree.rs similarity index 66% rename from crates/router/src/connector/braintree.rs rename to crates/hyperswitch_connectors/src/connectors/braintree.rs index 7a88180c64d..705bf0688fa 100644 --- a/crates/router/src/connector/braintree.rs +++ b/crates/hyperswitch_connectors/src/connectors/braintree.rs @@ -2,43 +2,67 @@ pub mod transformers; use api_models::webhooks::IncomingWebhookEvent; use base64::Engine; +use common_enums::{enums, CallConnectorAction, PaymentAction}; use common_utils::{ + consts::BASE64_ENGINE, crypto, - ext_traits::XmlExt, - request::RequestContent, + errors::{CustomResult, ParsingError}, + ext_traits::{BytesExt, XmlExt}, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, StringMajorUnit, StringMajorUnitForConnector}, }; -use diesel_models::enums; use error_stack::{report, Report, ResultExt}; -use hyperswitch_interfaces::webhooks::IncomingWebhookFlowError; -use masking::{ExposeInterface, PeekInterface, Secret}; +use hyperswitch_domain_models::{ + api::ApplicationResponse, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + CompleteAuthorize, + }, + router_request_types::{ + AccessTokenRequestData, CompleteAuthorizeData, PaymentMethodTokenizationData, + PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, + PaymentsSyncData, RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsCompleteAuthorizeRouterData, PaymentsSyncRouterData, RefundSyncRouterData, + RefundsRouterData, TokenizationRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorRedirectResponse, + ConnectorSpecifications, ConnectorValidation, + }, + configs::Connectors, + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + disputes::DisputePayload, + errors, + events::connector_api_logs::ConnectorEvent, + types::{ + PaymentsAuthorizeType, PaymentsCaptureType, PaymentsCompleteAuthorizeType, + PaymentsSyncType, PaymentsVoidType, RefundExecuteType, RefundSyncType, Response, + TokenizationType, + }, + webhooks::{IncomingWebhook, IncomingWebhookFlowError, IncomingWebhookRequestDetails}, +}; +use masking::{ExposeInterface, Mask, PeekInterface, Secret}; use ring::hmac; +use router_env::logger; use sha1::{Digest, Sha1}; +use transformers::{self as braintree, get_status}; -use self::transformers as braintree; -use super::utils::{self as connector_utils, PaymentsAuthorizeRequestData}; use crate::{ - configs::settings, - connector::utils::PaymentMethodDataType, - consts, - core::{ - errors::{self, CustomResult}, - payments, - }, - events::connector_api_logs::ConnectorEvent, - headers, logger, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, - }, - types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - transformers::ForeignFrom, - ErrorResponse, + constants::headers, + types::ResponseRouterData, + utils::{ + self, convert_amount, is_mandate_supported, to_currency_lower_unit, PaymentMethodDataType, + PaymentsAuthorizeRequestData, PaymentsCompleteAuthorizeRequestData, }, - utils::{self, BytesExt}, }; #[derive(Clone)] @@ -63,9 +87,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![ ( headers::CONTENT_TYPE.to_string(), @@ -91,18 +115,18 @@ impl ConnectorCommon for Braintree { api::CurrencyUnit::Base } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.braintree.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = braintree::BraintreeAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; let auth_key = format!("{}:{}", auth.public_key.peek(), auth.private_key.peek()); - let auth_header = format!("Basic {}", consts::BASE64_ENGINE.encode(auth_key)); + let auth_header = format!("Basic {}", BASE64_ENGINE.encode(auth_key)); Ok(vec![( headers::AUTHORIZATION.to_string(), auth_header.into_masked(), @@ -111,13 +135,11 @@ impl ConnectorCommon for Braintree { fn build_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { - let response: Result< - braintree::ErrorResponses, - Report, - > = res.response.parse_struct("Braintree Error Response"); + let response: Result> = + res.response.parse_struct("Braintree Error Response"); match response { Ok(braintree::ErrorResponses::BraintreeApiErrorResponse(response)) => { @@ -135,10 +157,7 @@ impl ConnectorCommon for Braintree { .and_then(|credit_card_error| credit_card_error.errors.first())) })); let (code, message) = error.map_or( - ( - consts::NO_ERROR_CODE.to_string(), - consts::NO_ERROR_MESSAGE.to_string(), - ), + (NO_ERROR_CODE.to_string(), NO_ERROR_MESSAGE.to_string()), |error| (error.code.clone(), error.message.clone()), ); Ok(ErrorResponse { @@ -156,8 +175,8 @@ impl ConnectorCommon for Braintree { Ok(ErrorResponse { status_code: res.status_code, - code: consts::NO_ERROR_CODE.to_string(), - message: consts::NO_ERROR_MESSAGE.to_string(), + code: NO_ERROR_CODE.to_string(), + message: NO_ERROR_MESSAGE.to_string(), reason: Some(response.errors), attempt_status: None, connector_transaction_id: None, @@ -185,18 +204,18 @@ impl ConnectorValidation for Braintree { | enums::CaptureMethod::Manual | enums::CaptureMethod::SequentialAutomatic => Ok(()), enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( - connector_utils::construct_not_implemented_error_report(capture_method, self.id()), + utils::construct_not_implemented_error_report(capture_method, self.id()), ), } } fn validate_mandate_payment( &self, - pm_type: Option, + pm_type: Option, pm_data: hyperswitch_domain_models::payment_method_data::PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([PaymentMethodDataType::Card]); - connector_utils::is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) + is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) } } @@ -210,31 +229,22 @@ impl api::PaymentsCompleteAuthorize for Braintree {} impl api::PaymentSession for Braintree {} impl api::ConnectorAccessToken for Braintree {} -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { // Not Implemented (R) } -impl ConnectorIntegration - for Braintree -{ -} +impl ConnectorIntegration for Braintree {} impl api::PaymentToken for Braintree {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Braintree +impl ConnectorIntegration + for Braintree { fn get_headers( &self, - req: &types::TokenizationRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &TokenizationRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -244,16 +254,16 @@ impl fn get_url( &self, - _req: &types::TokenizationRouterData, - connectors: &settings::Connectors, + _req: &TokenizationRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::TokenizationRouterData, - _connectors: &settings::Connectors, + req: &TokenizationRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = transformers::BraintreeTokenRequest::try_from(req)?; @@ -262,29 +272,27 @@ impl fn build_request( &self, - req: &types::TokenizationRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &TokenizationRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::TokenizationType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&TokenizationType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::TokenizationType::get_headers(self, req, connectors)?) - .set_body(types::TokenizationType::get_request_body( - self, req, connectors, - )?) + .headers(TokenizationType::get_headers(self, req, connectors)?) + .set_body(TokenizationType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::TokenizationRouterData, + data: &TokenizationRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult + res: Response, + ) -> CustomResult where - types::PaymentsResponseData: Clone, + PaymentsResponseData: Clone, { let response: transformers::BraintreeTokenResponse = res .response @@ -293,7 +301,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -301,7 +309,7 @@ impl } fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -311,23 +319,15 @@ impl impl api::MandateSetup for Braintree {} #[allow(dead_code)] -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Braintree +impl ConnectorIntegration + for Braintree { // Not Implemented (R) fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Braintree".to_string()) .into(), @@ -335,14 +335,12 @@ impl } } -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -352,18 +350,18 @@ impl ConnectorIntegration CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount_to_capture, req.request.currency, @@ -377,18 +375,16 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsCaptureType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsCaptureType::get_request_body( + .headers(PaymentsCaptureType::get_headers(self, req, connectors)?) + .set_body(PaymentsCaptureType::get_request_body( self, req, connectors, )?) .build(), @@ -397,17 +393,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: transformers::BraintreeCaptureResponse = res .response .parse_struct("Braintree PaymentsCaptureResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -416,21 +412,19 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -440,16 +434,16 @@ impl ConnectorIntegration CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::PaymentsSyncRouterData, - _connectors: &settings::Connectors, + req: &PaymentsSyncRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = transformers::BraintreePSyncRequest::try_from(req)?; @@ -458,35 +452,33 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) - .set_body(types::PaymentsSyncType::get_request_body( - self, req, connectors, - )?) + .headers(PaymentsSyncType::get_headers(self, req, connectors)?) + .set_body(PaymentsSyncType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::PaymentsSyncRouterData, + data: &PaymentsSyncRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: transformers::BraintreePSyncResponse = res .response .parse_struct("Braintree PaymentSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -495,48 +487,42 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_url( &self, - _req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, + _req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(self.base_url(connectors).to_string()) } fn build_request( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsAuthorizeType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsAuthorizeType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsAuthorizeType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsAuthorizeType::get_request_body( + .headers(PaymentsAuthorizeType::get_headers(self, req, connectors)?) + .set_body(PaymentsAuthorizeType::get_request_body( self, req, connectors, )?) .build(), @@ -545,10 +531,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -561,10 +547,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { match data.request.is_auto_capture()? { true => { let response: transformers::BraintreePaymentsResponse = res @@ -573,7 +559,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -621,34 +605,32 @@ impl ConnectorIntegration CustomResult { Ok(self.base_url(connectors).to_string()) } fn build_request( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) - .set_body(types::PaymentsVoidType::get_request_body( - self, req, connectors, - )?) + .headers(PaymentsVoidType::get_headers(self, req, connectors)?) + .set_body(PaymentsVoidType::get_request_body(self, req, connectors)?) .build(), )) } fn get_request_body( &self, - req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = transformers::BraintreeCancelRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -656,17 +638,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: transformers::BraintreeCancelResponse = res .response .parse_struct("Braintree VoidResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -674,7 +656,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -685,14 +667,12 @@ impl api::Refund for Braintree {} impl api::RefundExecute for Braintree {} impl api::RefundSync for Braintree {} -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -702,18 +682,18 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + _req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::RefundsRouterData, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -724,36 +704,32 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::RefundExecuteType::get_url(self, req, connectors)?) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefundExecuteType::get_headers( - self, req, connectors, - )?) - .set_body(types::RefundExecuteType::get_request_body( - self, req, connectors, - )?) + .headers(RefundExecuteType::get_headers(self, req, connectors)?) + .set_body(RefundExecuteType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) } fn handle_response( &self, - data: &types::RefundsRouterData, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: transformers::BraintreeRefundResponse = res .response .parse_struct("Braintree RefundResponse") .change_context(errors::ConnectorError::RequestEncodingFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -762,21 +738,19 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Braintree -{ +impl ConnectorIntegration for Braintree { fn get_headers( &self, - req: &types::RefundSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -786,16 +760,16 @@ impl ConnectorIntegration CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::RefundSyncRouterData, - _connectors: &settings::Connectors, + req: &RefundSyncRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = transformers::BraintreeRSyncRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -803,38 +777,34 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::RefundSyncType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefundSyncType::get_headers(self, req, connectors)?) - .set_body(types::RefundSyncType::get_request_body( - self, req, connectors, - )?) + .headers(RefundSyncType::get_headers(self, req, connectors)?) + .set_body(RefundSyncType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::RefundSyncRouterData, + data: &RefundSyncRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult< - types::RouterData, - errors::ConnectorError, - > { + res: Response, + ) -> CustomResult, errors::ConnectorError> + { let response: transformers::BraintreeRSyncResponse = res .response .parse_struct("Braintree RefundResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -842,7 +812,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -850,17 +820,17 @@ impl ConnectorIntegration, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Ok(Box::new(crypto::HmacSha1)) } fn get_webhook_source_verification_signature( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { let notif_item = get_webhook_object_from_body(request.body) @@ -886,7 +856,7 @@ impl api::IncomingWebhook for Braintree { fn get_webhook_source_verification_message( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _merchant_id: &common_utils::id_type::MerchantId, _connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { @@ -900,7 +870,7 @@ impl api::IncomingWebhook for Braintree { async fn verify_webhook_source( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, merchant_id: &common_utils::id_type::MerchantId, connector_webhook_details: Option, _connector_account_details: crypto::Encryptable>, @@ -940,7 +910,7 @@ impl api::IncomingWebhook for Braintree { fn get_webhook_object_reference_id( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let notif = get_webhook_object_from_body(_request.body) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; @@ -959,19 +929,19 @@ impl api::IncomingWebhook for Braintree { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let notif = get_webhook_object_from_body(request.body) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; let response = decode_webhook_payload(notif.bt_payload.replace('\n', "").as_bytes())?; - Ok(IncomingWebhookEvent::foreign_from(response.kind.as_str())) + Ok(get_status(response.kind.as_str())) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let notif = get_webhook_object_from_body(request.body) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; @@ -983,27 +953,24 @@ impl api::IncomingWebhook for Braintree { fn get_webhook_api_response( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, _error_kind: Option, - ) -> CustomResult, errors::ConnectorError> - { - Ok(services::api::ApplicationResponse::TextPlain( - "[accepted]".to_string(), - )) + ) -> CustomResult, errors::ConnectorError> { + Ok(ApplicationResponse::TextPlain("[accepted]".to_string())) } fn get_dispute_details( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let notif = get_webhook_object_from_body(request.body) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; let response = decode_webhook_payload(notif.bt_payload.replace('\n', "").as_bytes())?; match response.dispute { - Some(dispute_data) => Ok(api::disputes::DisputePayload { - amount: connector_utils::to_currency_lower_unit( + Some(dispute_data) => Ok(DisputePayload { + amount: to_currency_lower_unit( dispute_data.amount_disputed.to_string(), dispute_data.currency_iso_code, )?, @@ -1036,16 +1003,15 @@ fn get_matching_webhook_signature( fn get_webhook_object_from_body( body: &[u8], -) -> CustomResult { - serde_urlencoded::from_bytes::(body).change_context( - errors::ParsingError::StructParseFailure("BraintreeWebhookResponse"), - ) +) -> CustomResult { + serde_urlencoded::from_bytes::(body) + .change_context(ParsingError::StructParseFailure("BraintreeWebhookResponse")) } fn decode_webhook_payload( payload: &[u8], ) -> CustomResult { - let decoded_response = consts::BASE64_ENGINE + let decoded_response = BASE64_ENGINE .decode(payload) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; @@ -1057,15 +1023,15 @@ fn decode_webhook_payload( .change_context(errors::ConnectorError::WebhookBodyDecodingFailed) } -impl services::ConnectorRedirectResponse for Braintree { +impl ConnectorRedirectResponse for Braintree { fn get_flow_type( &self, _query_params: &str, json_payload: Option, - action: services::PaymentAction, - ) -> CustomResult { + action: PaymentAction, + ) -> CustomResult { match action { - services::PaymentAction::PSync => match json_payload { + PaymentAction::PSync => match json_payload { Some(payload) => { let redirection_response: transformers::BraintreeRedirectionResponse = serde_json::from_value(payload).change_context( @@ -1083,38 +1049,34 @@ impl services::ConnectorRedirectResponse for Braintree { braintree_response_payload.message, ), Err(_) => ( - consts::NO_ERROR_CODE.to_string(), + NO_ERROR_CODE.to_string(), redirection_response.authentication_response, ), }; - Ok(payments::CallConnectorAction::StatusUpdate { + Ok(CallConnectorAction::StatusUpdate { status: enums::AttemptStatus::AuthenticationFailed, error_code: Some(error_code), error_message: Some(error_message), }) } - None => Ok(payments::CallConnectorAction::Avoid), + None => Ok(CallConnectorAction::Avoid), }, - services::PaymentAction::CompleteAuthorize - | services::PaymentAction::PaymentAuthenticateCompleteAuthorize => { - Ok(payments::CallConnectorAction::Trigger) + PaymentAction::CompleteAuthorize + | PaymentAction::PaymentAuthenticateCompleteAuthorize => { + Ok(CallConnectorAction::Trigger) } } } } -impl - ConnectorIntegration< - api::CompleteAuthorize, - types::CompleteAuthorizeData, - types::PaymentsResponseData, - > for Braintree +impl ConnectorIntegration + for Braintree { fn get_headers( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_content_type(&self) -> &'static str { @@ -1122,17 +1084,17 @@ impl } fn get_url( &self, - _req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, + _req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(self.base_url(connectors).to_string()) } fn get_request_body( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCompleteAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -1146,20 +1108,20 @@ impl fn build_request( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsCompleteAuthorizeType::get_url( + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsCompleteAuthorizeType::get_url( self, req, connectors, )?) .attach_default_headers() - .headers(types::PaymentsCompleteAuthorizeType::get_headers( + .headers(PaymentsCompleteAuthorizeType::get_headers( self, req, connectors, )?) - .set_body(types::PaymentsCompleteAuthorizeType::get_request_body( + .set_body(PaymentsCompleteAuthorizeType::get_request_body( self, req, connectors, )?) .build(), @@ -1167,12 +1129,11 @@ impl } fn handle_response( &self, - data: &types::PaymentsCompleteAuthorizeRouterData, + data: &PaymentsCompleteAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { - match connector_utils::PaymentsCompleteAuthorizeRequestData::is_auto_capture(&data.request)? - { + res: Response, + ) -> CustomResult { + match PaymentsCompleteAuthorizeRequestData::is_auto_capture(&data.request)? { true => { let response: transformers::BraintreeCompleteChargeResponse = res .response @@ -1180,7 +1141,7 @@ impl .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -1193,7 +1154,7 @@ impl .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -1204,7 +1165,7 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) diff --git a/crates/router/src/connector/braintree/transformers.rs b/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs similarity index 84% rename from crates/router/src/connector/braintree/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs index 5dd6db5aa24..b8253cc411d 100644 --- a/crates/router/src/connector/braintree/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/braintree/transformers.rs @@ -1,19 +1,32 @@ +use api_models::webhooks::IncomingWebhookEvent; +use common_enums::enums; use common_utils::{pii, types::StringMajorUnit}; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{ConnectorAuthType, PaymentMethodToken, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::{CompleteAuthorizeData, PaymentsAuthorizeData, ResponseId}, + router_response_types::{ + MandateReference, PaymentsResponseData, RedirectForm, RefundsResponseData, + }, + types::{self, RefundsRouterData}, +}; +use hyperswitch_interfaces::{ + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, +}; use masking::{ExposeInterface, Secret}; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use crate::{ - connector::utils::{ + types::{PaymentsCaptureResponseRouterData, RefundsResponseRouterData, ResponseRouterData}, + unimplemented_payment_method, + utils::{ self, PaymentsAuthorizeRequestData, PaymentsCompleteAuthorizeRequestData, - RefundsRequestData, RouterData, + RefundsRequestData, RouterData as _, }, - consts, - core::errors, - services, - types::{self, api, domain, storage::enums, MandateReference}, - unimplemented_payment_method, }; pub const CHANNEL_CODE: &str = "HyperSwitchBT_Ecom"; pub const CLIENT_TOKEN_MUTATION: &str = "mutation createClientToken($input: CreateClientTokenInput!) { createClientToken(input: $input) { clientToken}}"; @@ -135,11 +148,11 @@ pub struct BraintreeAuthType { pub(super) private_key: Secret, } -impl TryFrom<&types::ConnectorAuthType> for BraintreeAuthType { +impl TryFrom<&ConnectorAuthType> for BraintreeAuthType { type Error = error_stack::Report; - fn try_from(item: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::SignatureKey { + fn try_from(item: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::SignatureKey { api_key, api_secret, key1: _merchant_id, @@ -271,7 +284,7 @@ impl TryFrom<&BraintreeRouterData<&types::PaymentsAuthorizeRouterData>> Some(metadata.merchant_config_currency), )?; match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::Card(_) => { + PaymentMethodData::Card(_) => { if item.router_data.is_three_ds() { Ok(Self::CardThreeDs(BraintreeClientTokenRequest::try_from( metadata, @@ -280,7 +293,7 @@ impl TryFrom<&BraintreeRouterData<&types::PaymentsAuthorizeRouterData>> Ok(Self::Card(CardPaymentRequest::try_from((item, metadata))?)) } } - domain::PaymentMethodData::MandatePayment => { + PaymentMethodData::MandatePayment => { let connector_mandate_id = item.router_data.request.connector_mandate_id().ok_or( errors::ConnectorError::MissingRequiredField { field_name: "connector_mandate_id", @@ -292,23 +305,23 @@ impl TryFrom<&BraintreeRouterData<&types::PaymentsAuthorizeRouterData>> metadata, ))?)) } - domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("braintree"), ) @@ -400,21 +413,16 @@ pub struct AuthChargeCreditCard { impl TryFrom< - types::ResponseRouterData< - F, - BraintreeAuthResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - >, - > for types::RouterData + ResponseRouterData, + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, BraintreeAuthResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, ) -> Result { match item.response { @@ -426,7 +434,7 @@ impl let transaction_data = auth_response.data.authorize_credit_card.transaction; let status = enums::AttemptStatus::from(transaction_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: transaction_data.status.to_string().clone(), message: transaction_data.status.to_string().clone(), reason: Some(transaction_data.status.to_string().clone()), @@ -435,8 +443,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(transaction_data.id), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(transaction_data.id), redirection_data: Box::new(None), mandate_reference: Box::new(transaction_data.payment_method.as_ref().map( |pm| MandateReference { @@ -461,8 +469,8 @@ impl } BraintreeAuthResponse::ClientTokenResponse(client_token_data) => Ok(Self { status: enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(Some(get_braintree_redirect_form( *client_token_data, item.data.get_payment_method_token()?, @@ -484,7 +492,7 @@ impl fn build_error_response( response: &[ErrorDetails], http_code: u16, -) -> Result { +) -> Result { let error_messages = response .iter() .map(|error| error.message.to_string()) @@ -513,10 +521,10 @@ fn get_error_response( error_msg: Option, error_reason: Option, http_code: u16, -) -> Result { - Err(types::ErrorResponse { - code: error_code.unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), - message: error_msg.unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), +) -> Result { + Err(hyperswitch_domain_models::router_data::ErrorResponse { + code: error_code.unwrap_or_else(|| NO_ERROR_CODE.to_string()), + message: error_msg.unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: error_reason, status_code: http_code, attempt_status: None, @@ -576,21 +584,21 @@ impl From for enums::AttemptStatus { impl TryFrom< - types::ResponseRouterData< + ResponseRouterData< F, BraintreePaymentsResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, - > for types::RouterData + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, BraintreePaymentsResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, ) -> Result { match item.response { @@ -602,7 +610,7 @@ impl let transaction_data = payment_response.data.charge_credit_card.transaction; let status = enums::AttemptStatus::from(transaction_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: transaction_data.status.to_string().clone(), message: transaction_data.status.to_string().clone(), reason: Some(transaction_data.status.to_string().clone()), @@ -611,8 +619,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(transaction_data.id), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(transaction_data.id), redirection_data: Box::new(None), mandate_reference: Box::new(transaction_data.payment_method.as_ref().map( |pm| MandateReference { @@ -637,8 +645,8 @@ impl } BraintreePaymentsResponse::ClientTokenResponse(client_token_data) => Ok(Self { status: enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(Some(get_braintree_redirect_form( *client_token_data, item.data.get_payment_method_token()?, @@ -659,21 +667,21 @@ impl impl TryFrom< - types::ResponseRouterData< + ResponseRouterData< F, BraintreeCompleteChargeResponse, - types::CompleteAuthorizeData, - types::PaymentsResponseData, + CompleteAuthorizeData, + PaymentsResponseData, >, - > for types::RouterData + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, BraintreeCompleteChargeResponse, - types::CompleteAuthorizeData, - types::PaymentsResponseData, + CompleteAuthorizeData, + PaymentsResponseData, >, ) -> Result { match item.response { @@ -685,7 +693,7 @@ impl let transaction_data = payment_response.data.charge_credit_card.transaction; let status = enums::AttemptStatus::from(transaction_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: transaction_data.status.to_string().clone(), message: transaction_data.status.to_string().clone(), reason: Some(transaction_data.status.to_string().clone()), @@ -694,8 +702,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(transaction_data.id), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(transaction_data.id), redirection_data: Box::new(None), mandate_reference: Box::new(transaction_data.payment_method.as_ref().map( |pm| MandateReference { @@ -724,21 +732,21 @@ impl impl TryFrom< - types::ResponseRouterData< + ResponseRouterData< F, BraintreeCompleteAuthResponse, - types::CompleteAuthorizeData, - types::PaymentsResponseData, + CompleteAuthorizeData, + PaymentsResponseData, >, - > for types::RouterData + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, BraintreeCompleteAuthResponse, - types::CompleteAuthorizeData, - types::PaymentsResponseData, + CompleteAuthorizeData, + PaymentsResponseData, >, ) -> Result { match item.response { @@ -750,7 +758,7 @@ impl let transaction_data = auth_response.data.authorize_credit_card.transaction; let status = enums::AttemptStatus::from(transaction_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: transaction_data.status.to_string().clone(), message: transaction_data.status.to_string().clone(), reason: Some(transaction_data.status.to_string().clone()), @@ -759,8 +767,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(transaction_data.id), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(transaction_data.id), redirection_data: Box::new(None), mandate_reference: Box::new(transaction_data.payment_method.as_ref().map( |pm| MandateReference { @@ -835,11 +843,9 @@ pub struct BraintreeRefundInput { refund: RefundInputData, } -impl TryFrom>> for BraintreeRefundRequest { +impl TryFrom>> for BraintreeRefundRequest { type Error = error_stack::Report; - fn try_from( - item: BraintreeRouterData<&types::RefundsRouterData>, - ) -> Result { + fn try_from(item: BraintreeRouterData<&RefundsRouterData>) -> Result { let metadata: BraintreeMeta = utils::to_connector_meta_from_secret(item.router_data.connector_meta_data.clone()) .change_context(errors::ConnectorError::InvalidConnectorConfig { @@ -907,12 +913,12 @@ pub struct RefundResponse { pub data: BraintreeRefundResponseData, } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { response: match item.response { @@ -923,7 +929,7 @@ impl TryFrom), } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { match item.response { BraintreeRSyncResponse::ErrorResponse(error_response) => Ok(Self { @@ -1030,7 +1036,7 @@ impl TryFrom for BraintreeTokenRequest { type Error = error_stack::Report; fn try_from(item: &types::TokenizationRouterData) -> Result { match item.request.payment_method_data.clone() { - domain::PaymentMethodData::Card(card_data) => Ok(Self { + PaymentMethodData::Card(card_data) => Ok(Self { query: TOKENIZE_CREDIT_CARD.to_string(), variables: VariableInput { input: InputData { @@ -1091,24 +1097,24 @@ impl TryFrom<&types::TokenizationRouterData> for BraintreeTokenRequest { }, }, }), - domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("braintree"), ) @@ -1169,13 +1175,12 @@ pub enum BraintreeTokenResponse { ErrorResponse(Box), } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { response: match item.response { @@ -1184,7 +1189,7 @@ impl } BraintreeTokenResponse::TokenResponse(token_response) => { - Ok(types::PaymentsResponseData::TokenizationResponse { + Ok(PaymentsResponseData::TokenizationResponse { token: token_response .data .tokenize_credit_card @@ -1253,19 +1258,19 @@ pub struct CaptureResponse { data: CaptureResponseData, } -impl TryFrom> +impl TryFrom> for types::PaymentsCaptureRouterData { type Error = error_stack::Report; fn try_from( - item: types::PaymentsCaptureResponseRouterData, + item: PaymentsCaptureResponseRouterData, ) -> Result { match item.response { BraintreeCaptureResponse::SuccessResponse(capture_data) => { let transaction_data = capture_data.data.capture_transaction.transaction; let status = enums::AttemptStatus::from(transaction_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: transaction_data.status.to_string().clone(), message: transaction_data.status.to_string().clone(), reason: Some(transaction_data.status.to_string().clone()), @@ -1274,8 +1279,8 @@ impl TryFrom> status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(transaction_data.id), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(transaction_data.id), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -1358,13 +1363,12 @@ pub enum BraintreeCancelResponse { ErrorResponse(Box), } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { match item.response { BraintreeCancelResponse::ErrorResponse(error_response) => Ok(Self { @@ -1375,7 +1379,7 @@ impl let void_data = void_response.data.reverse_transaction.reversal; let status = enums::AttemptStatus::from(void_data.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: void_data.status.to_string().clone(), message: void_data.status.to_string().clone(), reason: Some(void_data.status.to_string().clone()), @@ -1384,8 +1388,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -1455,13 +1459,12 @@ pub struct PSyncResponse { data: PSyncResponseData, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { match item.response { BraintreePSyncResponse::ErrorResponse(error_response) => Ok(Self { @@ -1478,7 +1481,7 @@ impl .ok_or(errors::ConnectorError::MissingConnectorTransactionID)?; let status = enums::AttemptStatus::from(edge_data.node.status.clone()); let response = if utils::is_payment_failure(status) { - Err(types::ErrorResponse { + Err(hyperswitch_domain_models::router_data::ErrorResponse { code: edge_data.node.status.to_string().clone(), message: edge_data.node.status.to_string().clone(), reason: Some(edge_data.node.status.to_string().clone()), @@ -1487,10 +1490,8 @@ impl status_code: item.http_code, }) } else { - Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - edge_data.node.id.clone(), - ), + Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(edge_data.node.id.clone()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -1591,14 +1592,14 @@ impl variables: VariablePaymentInput { input: PaymentInput { payment_method_id: match item.router_data.get_payment_method_token()? { - types::PaymentMethodToken::Token(token) => token, - types::PaymentMethodToken::ApplePayDecrypt(_) => Err( + PaymentMethodToken::Token(token) => token, + PaymentMethodToken::ApplePayDecrypt(_) => Err( unimplemented_payment_method!("Apple Pay", "Simplified", "Braintree"), )?, - types::PaymentMethodToken::PazeDecrypt(_) => { + PaymentMethodToken::PazeDecrypt(_) => { Err(unimplemented_payment_method!("Paze", "Braintree"))? } - types::PaymentMethodToken::GooglePayDecrypt(_) => { + PaymentMethodToken::GooglePayDecrypt(_) => { Err(unimplemented_payment_method!("Google Pay", "Braintree"))? } }, @@ -1683,51 +1684,49 @@ impl TryFrom<&BraintreeRouterData<&types::PaymentsCompleteAuthorizeRouterData>> fn get_braintree_redirect_form( client_token_data: ClientTokenResponse, - payment_method_token: types::PaymentMethodToken, - card_details: domain::PaymentMethodData, -) -> Result> { - Ok(services::RedirectForm::Braintree { + payment_method_token: PaymentMethodToken, + card_details: PaymentMethodData, +) -> Result> { + Ok(RedirectForm::Braintree { client_token: client_token_data .data .create_client_token .client_token .expose(), card_token: match payment_method_token { - types::PaymentMethodToken::Token(token) => token.expose(), - types::PaymentMethodToken::ApplePayDecrypt(_) => Err(unimplemented_payment_method!( + PaymentMethodToken::Token(token) => token.expose(), + PaymentMethodToken::ApplePayDecrypt(_) => Err(unimplemented_payment_method!( "Apple Pay", "Simplified", "Braintree" ))?, - types::PaymentMethodToken::PazeDecrypt(_) => { + PaymentMethodToken::PazeDecrypt(_) => { Err(unimplemented_payment_method!("Paze", "Braintree"))? } - types::PaymentMethodToken::GooglePayDecrypt(_) => { + PaymentMethodToken::GooglePayDecrypt(_) => { Err(unimplemented_payment_method!("Google Pay", "Braintree"))? } }, bin: match card_details { - domain::PaymentMethodData::Card(card_details) => { - card_details.card_number.get_card_isin() - } - domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => Err( + PaymentMethodData::Card(card_details) => card_details.card_number.get_card_isin(), + PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => Err( errors::ConnectorError::NotImplemented("given payment method".to_owned()), )?, }, @@ -1747,17 +1746,16 @@ pub struct Notification { pub timestamp: String, pub dispute: Option, } -impl types::transformers::ForeignFrom<&str> for api_models::webhooks::IncomingWebhookEvent { - fn foreign_from(status: &str) -> Self { - match status { - "dispute_opened" => Self::DisputeOpened, - "dispute_lost" => Self::DisputeLost, - "dispute_won" => Self::DisputeWon, - "dispute_accepted" | "dispute_auto_accepted" => Self::DisputeAccepted, - "dispute_expired" => Self::DisputeExpired, - "dispute_disputed" => Self::DisputeChallenged, - _ => Self::EventNotSupported, - } + +pub(crate) fn get_status(status: &str) -> IncomingWebhookEvent { + match status { + "dispute_opened" => IncomingWebhookEvent::DisputeOpened, + "dispute_lost" => IncomingWebhookEvent::DisputeLost, + "dispute_won" => IncomingWebhookEvent::DisputeWon, + "dispute_accepted" | "dispute_auto_accepted" => IncomingWebhookEvent::DisputeAccepted, + "dispute_expired" => IncomingWebhookEvent::DisputeExpired, + "dispute_disputed" => IncomingWebhookEvent::DisputeChallenged, + _ => IncomingWebhookEvent::EventNotSupported, } } diff --git a/crates/router/src/connector/globalpay.rs b/crates/hyperswitch_connectors/src/connectors/globalpay.rs similarity index 61% rename from crates/router/src/connector/globalpay.rs rename to crates/hyperswitch_connectors/src/connectors/globalpay.rs index 2e971f8034a..6d233bcfc33 100644 --- a/crates/router/src/connector/globalpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/globalpay.rs @@ -1,42 +1,68 @@ mod requests; -use super::utils as connector_utils; mod response; pub mod transformers; -use ::common_utils::{errors::ReportSwitchExt, ext_traits::ByteSliceExt, request::RequestContent}; -use common_utils::types::{AmountConvertor, StringMinorUnit, StringMinorUnitForConnector}; -use diesel_models::enums; -use error_stack::ResultExt; -use masking::PeekInterface; -use serde_json::Value; -use self::{ - requests::{GlobalpayPaymentsRequest, GlobalpayRefreshTokenRequest}, - response::{ - GlobalpayPaymentsResponse, GlobalpayRefreshTokenErrorResponse, - GlobalpayRefreshTokenResponse, +use api_models::webhooks::IncomingWebhookEvent; +use common_enums::{enums, CallConnectorAction, PaymentAction}; +use common_utils::{ + crypto, + errors::{CustomResult, ReportSwitchExt}, + ext_traits::{ByteSliceExt, BytesExt}, + request::{Method, Request, RequestBuilder, RequestContent}, + types::{AmountConvertor, StringMinorUnit, StringMinorUnitForConnector}, +}; +use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + CompleteAuthorize, + }, + router_request_types::{ + AccessTokenRequestData, CompleteAuthorizeData, PaymentMethodTokenizationData, + PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, + PaymentsSyncData, RefundsData, SetupMandateRequestData, SyncRequestType, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsCompleteAuthorizeRouterData, PaymentsSyncRouterData, RefundSyncRouterData, + RefundsRouterData, }, }; -use super::utils::{PaymentMethodDataType, RefundsRequestData}; -use crate::{ - configs::settings, - core::{ - errors::{self, CustomResult}, - payments, +use hyperswitch_interfaces::{ + api::{ + self, CaptureSyncMethod, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, + ConnectorRedirectResponse, ConnectorSpecifications, ConnectorValidation, + PaymentsCompleteAuthorize, }, + configs::Connectors, + errors, events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, - }, types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt, PaymentsCompleteAuthorize}, - transformers::ForeignTryFrom, - ErrorResponse, + PaymentsAuthorizeType, PaymentsCaptureType, PaymentsCompleteAuthorizeType, + PaymentsSyncType, PaymentsVoidType, RefreshTokenType, RefundExecuteType, RefundSyncType, + Response, + }, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{Mask, PeekInterface}; +use requests::{GlobalpayPaymentsRequest, GlobalpayRefreshTokenRequest}; +use response::{ + GlobalpayPaymentsResponse, GlobalpayRefreshTokenErrorResponse, GlobalpayRefreshTokenResponse, +}; +use serde_json::Value; + +use crate::{ + constants::headers, + types::{RefreshTokenRouterData, ResponseRouterData}, + utils::{ + construct_not_supported_error_report, convert_amount, get_header_key_value, + is_mandate_supported, ForeignTryFrom, PaymentMethodDataType, RefundsRequestData, }, - utils::{crypto, BytesExt}, }; #[derive(Clone)] @@ -58,9 +84,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let access_token = req .access_token .clone() @@ -69,7 +95,7 @@ where Ok(vec![ ( headers::CONTENT_TYPE.to_string(), - types::PaymentsAuthorizeType::get_content_type(self) + PaymentsAuthorizeType::get_content_type(self) .to_string() .into(), ), @@ -91,20 +117,20 @@ impl ConnectorCommon for Globalpay { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.globalpay.base_url.as_ref() } fn get_auth_header( &self, - _auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + _auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { Ok(vec![]) } fn build_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { let response: transformers::GlobalpayErrorResponse = res @@ -137,17 +163,16 @@ impl ConnectorValidation for Globalpay { match capture_method { enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual - | enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::SequentialAutomatic => Ok(()), - enums::CaptureMethod::Scheduled => Err( - connector_utils::construct_not_implemented_error_report(capture_method, self.id()), + enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( + construct_not_supported_error_report(capture_method, self.id()), ), } } fn validate_mandate_payment( &self, - pm_type: Option, - pm_data: types::domain::payments::PaymentMethodData, + pm_type: Option, + pm_data: PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([ PaymentMethodDataType::Card, @@ -158,24 +183,20 @@ impl ConnectorValidation for Globalpay { PaymentMethodDataType::Eps, PaymentMethodDataType::Giropay, ]); - connector_utils::is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) + is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) } } impl PaymentsCompleteAuthorize for Globalpay {} -impl - ConnectorIntegration< - api::CompleteAuthorize, - types::CompleteAuthorizeData, - types::PaymentsResponseData, - > for Globalpay +impl ConnectorIntegration + for Globalpay { fn get_headers( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -185,8 +206,8 @@ impl fn get_url( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}transactions/{}/confirmation", @@ -200,28 +221,28 @@ impl fn get_request_body( &self, - _req: &types::PaymentsCompleteAuthorizeRouterData, - _connectors: &settings::Connectors, + _req: &PaymentsCompleteAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { Ok(RequestContent::Json(Box::new(serde_json::json!({})))) } fn build_request( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsCompleteAuthorizeType::get_url( + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsCompleteAuthorizeType::get_url( self, req, connectors, )?) .attach_default_headers() - .headers(types::PaymentsCompleteAuthorizeType::get_headers( + .headers(PaymentsCompleteAuthorizeType::get_headers( self, req, connectors, )?) - .set_body(types::PaymentsCompleteAuthorizeType::get_request_body( + .set_body(PaymentsCompleteAuthorizeType::get_request_body( self, req, connectors, )?) .build(), @@ -230,10 +251,10 @@ impl fn handle_response( &self, - data: &types::PaymentsCompleteAuthorizeRouterData, + data: &PaymentsCompleteAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("Globalpay PaymentsResponse") @@ -242,7 +263,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -252,7 +273,7 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -261,20 +282,16 @@ impl impl api::ConnectorAccessToken for Globalpay {} -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - _req: &types::RefreshTokenRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + _req: &RefreshTokenRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { Ok(vec![ ( headers::CONTENT_TYPE.to_string(), - types::RefreshTokenType::get_content_type(self) - .to_string() - .into(), + RefreshTokenType::get_content_type(self).to_string().into(), ), ("X-GP-Version".to_string(), "2021-03-22".to_string().into()), ]) @@ -286,34 +303,32 @@ impl ConnectorIntegration CustomResult { Ok(format!("{}{}", self.base_url(connectors), "accesstoken")) } fn build_request( &self, - req: &types::RefreshTokenRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &RefreshTokenRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::RefreshTokenType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&RefreshTokenType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefreshTokenType::get_headers(self, req, connectors)?) - .set_body(types::RefreshTokenType::get_request_body( - self, req, connectors, - )?) + .headers(RefreshTokenType::get_headers(self, req, connectors)?) + .set_body(RefreshTokenType::get_request_body(self, req, connectors)?) .build(), )) } fn get_request_body( &self, - req: &types::RefreshTokenRouterData, - _connectors: &settings::Connectors, + req: &RefreshTokenRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = GlobalpayRefreshTokenRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -321,10 +336,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayRefreshTokenResponse = res .response .parse_struct("Globalpay PaymentsResponse") @@ -333,7 +348,7 @@ impl ConnectorIntegration, ) -> CustomResult { let response: GlobalpayRefreshTokenErrorResponse = res @@ -369,33 +384,21 @@ impl api::Payment for Globalpay {} impl api::PaymentToken for Globalpay {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Globalpay +impl ConnectorIntegration + for Globalpay { // Not Implemented (R) } impl api::MandateSetup for Globalpay {} -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Globalpay +impl ConnectorIntegration + for Globalpay { fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Globalpay".to_string()) .into(), @@ -405,14 +408,12 @@ impl impl api::PaymentVoid for Globalpay {} -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -422,8 +423,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}/transactions/{}/reversal", @@ -434,34 +435,32 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) - .set_body(types::PaymentsVoidType::get_request_body( - self, req, connectors, - )?) + .headers(PaymentsVoidType::get_headers(self, req, connectors)?) + .set_body(PaymentsVoidType::get_request_body(self, req, connectors)?) .build(), )) } fn get_request_body( &self, - req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + _connectors: &Connectors, ) -> CustomResult { let amount = req .request .minor_amount .and_then(|amount| { - req.request.currency.map(|currency| { - connector_utils::convert_amount(self.amount_converter, amount, currency) - }) + req.request + .currency + .map(|currency| convert_amount(self.amount_converter, amount, currency)) }) .transpose()?; let connector_router_data = requests::GlobalpayCancelRouterData::from((amount, req)); @@ -471,17 +470,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("Globalpay PaymentsResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -491,7 +490,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -499,14 +498,12 @@ impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -516,8 +513,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}transactions/{}", @@ -531,22 +528,22 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) - .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Get) + .url(&PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) + .headers(PaymentsSyncType::get_headers(self, req, connectors)?) .build(), )) } fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -554,10 +551,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("globalpay PaymentsResponse") @@ -567,11 +564,11 @@ impl ConnectorIntegration true, - types::SyncRequestType::SinglePaymentSync => false, + SyncRequestType::MultipleCaptureSync(_) => true, + SyncRequestType::SinglePaymentSync => false, }; - types::RouterData::foreign_try_from(( - types::ResponseRouterData { + RouterData::foreign_try_from(( + ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -582,20 +579,18 @@ impl ConnectorIntegration CustomResult { - Ok(services::CaptureSyncMethod::Individual) + ) -> CustomResult { + Ok(CaptureSyncMethod::Individual) } } impl api::PaymentCapture for Globalpay {} -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -605,8 +600,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}/transactions/{}/capture", @@ -617,10 +612,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount_to_capture, req.request.currency, @@ -633,18 +628,16 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsCaptureType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsCaptureType::get_request_body( + .headers(PaymentsCaptureType::get_headers(self, req, connectors)?) + .set_body(PaymentsCaptureType::get_request_body( self, req, connectors, )?) .build(), @@ -653,17 +646,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("Globalpay PaymentsResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -673,7 +666,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -682,21 +675,16 @@ impl ConnectorIntegration - for Globalpay -{ -} +impl ConnectorIntegration for Globalpay {} impl api::PaymentAuthorize for Globalpay {} -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -706,18 +694,18 @@ impl ConnectorIntegration CustomResult { Ok(format!("{}transactions", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -730,20 +718,16 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsAuthorizeType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsAuthorizeType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsAuthorizeType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsAuthorizeType::get_request_body( + .headers(PaymentsAuthorizeType::get_headers(self, req, connectors)?) + .set_body(PaymentsAuthorizeType::get_request_body( self, req, connectors, )?) .build(), @@ -752,17 +736,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("Globalpay PaymentsResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -772,7 +756,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -783,14 +767,12 @@ impl api::Refund for Globalpay {} impl api::RefundExecute for Globalpay {} impl api::RefundSync for Globalpay {} -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -800,8 +782,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}transactions/{}/refund", @@ -812,10 +794,10 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -828,29 +810,25 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::RefundExecuteType::get_url(self, req, connectors)?) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefundExecuteType::get_headers( - self, req, connectors, - )?) - .set_body(types::RefundExecuteType::get_request_body( - self, req, connectors, - )?) + .headers(RefundExecuteType::get_headers(self, req, connectors)?) + .set_body(RefundExecuteType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) } fn handle_response( &self, - data: &types::RefundsRouterData, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: GlobalpayPaymentsResponse = res .response .parse_struct("globalpay RefundResponse") @@ -859,7 +837,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Globalpay -{ +impl ConnectorIntegration for Globalpay { fn get_headers( &self, - req: &types::RefundSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -893,8 +869,8 @@ impl ConnectorIntegration CustomResult { let refund_id = req.request.get_connector_refund_id()?; Ok(format!( @@ -906,32 +882,32 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) - .url(&types::RefundSyncType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Get) + .url(&RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::RefundSyncType::get_headers(self, req, connectors)?) + .headers(RefundSyncType::get_headers(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::RefundSyncRouterData, + data: &RefundSyncRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: GlobalpayPaymentsResponse = res .response .parse_struct("globalpay RefundResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -941,7 +917,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -949,26 +925,26 @@ impl ConnectorIntegration, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Ok(Box::new(crypto::Sha512)) } fn get_webhook_source_verification_signature( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { - let signature = connector_utils::get_header_key_value("x-gp-signature", request.headers)?; + let signature = get_header_key_value("x-gp-signature", request.headers)?; Ok(signature.as_bytes().to_vec()) } fn get_webhook_source_verification_message( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _merchant_id: &common_utils::id_type::MerchantId, connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { @@ -983,7 +959,7 @@ impl api::IncomingWebhook for Globalpay { fn get_webhook_object_reference_id( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let details: response::GlobalpayWebhookObjectId = request .body @@ -996,28 +972,26 @@ impl api::IncomingWebhook for Globalpay { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let details: response::GlobalpayWebhookObjectEventType = request .body .parse_struct("GlobalpayWebhookObjectEventType") .switch()?; Ok(match details.status { response::GlobalpayWebhookStatus::Declined => { - api::IncomingWebhookEvent::PaymentIntentFailure + IncomingWebhookEvent::PaymentIntentFailure } response::GlobalpayWebhookStatus::Captured => { - api::IncomingWebhookEvent::PaymentIntentSuccess - } - response::GlobalpayWebhookStatus::Unknown => { - api::IncomingWebhookEvent::EventNotSupported + IncomingWebhookEvent::PaymentIntentSuccess } + response::GlobalpayWebhookStatus::Unknown => IncomingWebhookEvent::EventNotSupported, }) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Ok(Box::new( request @@ -1028,18 +1002,18 @@ impl api::IncomingWebhook for Globalpay { } } -impl services::ConnectorRedirectResponse for Globalpay { +impl ConnectorRedirectResponse for Globalpay { fn get_flow_type( &self, _query_params: &str, _json_payload: Option, - action: services::PaymentAction, - ) -> CustomResult { + action: PaymentAction, + ) -> CustomResult { match action { - services::PaymentAction::PSync - | services::PaymentAction::CompleteAuthorize - | services::PaymentAction::PaymentAuthenticateCompleteAuthorize => { - Ok(payments::CallConnectorAction::Trigger) + PaymentAction::PSync + | PaymentAction::CompleteAuthorize + | PaymentAction::PaymentAuthenticateCompleteAuthorize => { + Ok(CallConnectorAction::Trigger) } } } diff --git a/crates/router/src/connector/globalpay/requests.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs similarity index 100% rename from crates/router/src/connector/globalpay/requests.rs rename to crates/hyperswitch_connectors/src/connectors/globalpay/requests.rs diff --git a/crates/router/src/connector/globalpay/response.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/response.rs similarity index 100% rename from crates/router/src/connector/globalpay/response.rs rename to crates/hyperswitch_connectors/src/connectors/globalpay/response.rs diff --git a/crates/router/src/connector/globalpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs similarity index 65% rename from crates/router/src/connector/globalpay/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs index 8008cc309c2..2b74b5f8cd4 100644 --- a/crates/router/src/connector/globalpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/globalpay/transformers.rs @@ -1,8 +1,24 @@ use common_utils::{ crypto::{self, GenerateDigest}, + errors::ParsingError, + request::Method, types::{AmountConvertor, MinorUnit, StringMinorUnit, StringMinorUnitForConnector}, }; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{Execute, RSync}, + router_request_types::ResponseId, + router_response_types::{ + MandateReference, PaymentsResponseData, RedirectForm, RefundsResponseData, + }, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsSyncRouterData, RefreshTokenRouterData, RefundExecuteRouterData, RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{consts::NO_ERROR_MESSAGE, errors}; use masking::{ExposeInterface, PeekInterface, Secret}; use rand::distributions::DistString; use serde::{Deserialize, Serialize}; @@ -17,11 +33,12 @@ use super::{ response::{GlobalpayPaymentStatus, GlobalpayPaymentsResponse, GlobalpayRefreshTokenResponse}, }; use crate::{ - connector::utils::{self, CardData, PaymentsAuthorizeRequestData, RouterData, WalletData}, - consts, - core::errors, - services::{self, RedirectForm}, - types::{self, api, domain, storage::enums, transformers::ForeignTryFrom, ErrorResponse}, + types::{PaymentsSyncResponseRouterData, RefundsResponseRouterData, ResponseRouterData}, + utils::{ + construct_captures_response_hashmap, to_connector_meta_from_secret, CardData, + ForeignTryFrom, MultipleCaptureSyncResponse, PaymentsAuthorizeRequestData, RouterData as _, + WalletData, + }, }; impl From<(StringMinorUnit, T)> for GlobalPayRouterData { @@ -49,15 +66,13 @@ pub struct GlobalPayMeta { account_name: Secret, } -impl TryFrom<&GlobalPayRouterData<&types::PaymentsAuthorizeRouterData>> - for GlobalpayPaymentsRequest -{ +impl TryFrom<&GlobalPayRouterData<&PaymentsAuthorizeRouterData>> for GlobalpayPaymentsRequest { type Error = Error; fn try_from( - item: &GlobalPayRouterData<&types::PaymentsAuthorizeRouterData>, + item: &GlobalPayRouterData<&PaymentsAuthorizeRouterData>, ) -> Result { let metadata: GlobalPayMeta = - utils::to_connector_meta_from_secret(item.router_data.connector_meta_data.clone())?; + to_connector_meta_from_secret(item.router_data.connector_meta_data.clone())?; let account_name = metadata.account_name; let (initiator, stored_credential, brand_reference) = get_mandate_details(item.router_data)?; @@ -116,12 +131,12 @@ impl TryFrom<&GlobalPayRouterData<&types::PaymentsAuthorizeRouterData>> } } -impl TryFrom<&GlobalPayRouterData<&types::PaymentsCaptureRouterData>> +impl TryFrom<&GlobalPayRouterData<&PaymentsCaptureRouterData>> for requests::GlobalpayCaptureRequest { type Error = Error; fn try_from( - value: &GlobalPayRouterData<&types::PaymentsCaptureRouterData>, + value: &GlobalPayRouterData<&PaymentsCaptureRouterData>, ) -> Result { Ok(Self { amount: Some(value.amount.to_owned()), @@ -147,12 +162,12 @@ impl TryFrom<&GlobalPayRouterData<&types::PaymentsCaptureRouterData>> } } -impl TryFrom<&GlobalpayCancelRouterData<&types::PaymentsCancelRouterData>> +impl TryFrom<&GlobalpayCancelRouterData<&PaymentsCancelRouterData>> for requests::GlobalpayCancelRequest { type Error = Error; fn try_from( - value: &GlobalpayCancelRouterData<&types::PaymentsCancelRouterData>, + value: &GlobalpayCancelRouterData<&PaymentsCancelRouterData>, ) -> Result { Ok(Self { amount: value.amount.clone(), @@ -165,11 +180,11 @@ pub struct GlobalpayAuthType { pub key: Secret, } -impl TryFrom<&types::ConnectorAuthType> for GlobalpayAuthType { +impl TryFrom<&ConnectorAuthType> for GlobalpayAuthType { type Error = Error; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { + fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { - types::ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { + ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { app_id: key1.to_owned(), key: api_key.to_owned(), }), @@ -178,8 +193,8 @@ impl TryFrom<&types::ConnectorAuthType> for GlobalpayAuthType { } } -impl TryFrom for types::AccessToken { - type Error = error_stack::Report; +impl TryFrom for AccessToken { + type Error = error_stack::Report; fn try_from(item: GlobalpayRefreshTokenResponse) -> Result { Ok(Self { @@ -189,10 +204,10 @@ impl TryFrom for types::AccessToken { } } -impl TryFrom<&types::RefreshTokenRouterData> for GlobalpayRefreshTokenRequest { +impl TryFrom<&RefreshTokenRouterData> for GlobalpayRefreshTokenRequest { type Error = Error; - fn try_from(item: &types::RefreshTokenRouterData) -> Result { + fn try_from(item: &RefreshTokenRouterData) -> Result { let globalpay_auth = GlobalpayAuthType::try_from(&item.connector_auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType) .attach_printable("Could not convert connector_auth to globalpay_auth")?; @@ -215,7 +230,7 @@ impl TryFrom<&types::RefreshTokenRouterData> for GlobalpayRefreshTokenRequest { } } -impl From for enums::AttemptStatus { +impl From for common_enums::AttemptStatus { fn from(item: GlobalpayPaymentStatus) -> Self { match item { GlobalpayPaymentStatus::Captured | GlobalpayPaymentStatus::Funded => Self::Charged, @@ -228,7 +243,7 @@ impl From for enums::AttemptStatus { } } -impl From for enums::RefundStatus { +impl From for common_enums::RefundStatus { fn from(item: GlobalpayPaymentStatus) -> Self { match item { GlobalpayPaymentStatus::Captured | GlobalpayPaymentStatus::Funded => Self::Success, @@ -239,26 +254,26 @@ impl From for enums::RefundStatus { } } -impl From> for requests::CaptureMode { - fn from(capture_method: Option) -> Self { +impl From> for requests::CaptureMode { + fn from(capture_method: Option) -> Self { match capture_method { - Some(enums::CaptureMethod::Manual) => Self::Later, - Some(enums::CaptureMethod::ManualMultiple) => Self::Multiple, + Some(common_enums::CaptureMethod::Manual) => Self::Later, + Some(common_enums::CaptureMethod::ManualMultiple) => Self::Multiple, _ => Self::Auto, } } } fn get_payment_response( - status: enums::AttemptStatus, + status: common_enums::AttemptStatus, response: GlobalpayPaymentsResponse, redirection_data: Option, -) -> Result { +) -> Result { let mandate_reference = response.payment_method.as_ref().and_then(|pm| { pm.card .as_ref() .and_then(|card| card.brand_reference.to_owned()) - .map(|id| types::MandateReference { + .map(|id| MandateReference { connector_mandate_id: Some(id.expose()), payment_method_id: None, mandate_metadata: None, @@ -266,15 +281,15 @@ fn get_payment_response( }) }); match status { - enums::AttemptStatus::Failure => Err(ErrorResponse { + common_enums::AttemptStatus::Failure => Err(ErrorResponse { message: response .payment_method .and_then(|pm| pm.message) - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), ..Default::default() }), - _ => Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(response.id), + _ => Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.id), redirection_data: Box::new(redirection_data), mandate_reference: Box::new(mandate_reference), connector_metadata: None, @@ -286,20 +301,14 @@ fn get_payment_response( } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = Error; fn try_from( - item: types::ResponseRouterData< - F, - GlobalpayPaymentsResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { - let status = enums::AttemptStatus::from(item.response.status); + let status = common_enums::AttemptStatus::from(item.response.status); let redirect_url = item .response .payment_method @@ -315,8 +324,7 @@ impl Url::parse(url).change_context(errors::ConnectorError::FailedToObtainIntegrationUrl) }) .transpose()?; - let redirection_data = - redirect_url.map(|url| RedirectForm::from((url, services::Method::Get))); + let redirection_data = redirect_url.map(|url| RedirectForm::from((url, Method::Get))); Ok(Self { status, response: get_payment_response(status, item.response, redirection_data), @@ -327,23 +335,23 @@ impl impl ForeignTryFrom<( - types::PaymentsSyncResponseRouterData, + PaymentsSyncResponseRouterData, bool, - )> for types::PaymentsSyncRouterData + )> for PaymentsSyncRouterData { type Error = Error; fn foreign_try_from( (value, is_multiple_capture_sync): ( - types::PaymentsSyncResponseRouterData, + PaymentsSyncResponseRouterData, bool, ), ) -> Result { if is_multiple_capture_sync { let capture_sync_response_list = - utils::construct_captures_response_hashmap(vec![value.response])?; + construct_captures_response_hashmap(vec![value.response])?; Ok(Self { - response: Ok(types::PaymentsResponseData::MultipleCaptureResponse { + response: Ok(PaymentsResponseData::MultipleCaptureResponse { capture_sync_response_list, }), ..value.data @@ -354,16 +362,15 @@ impl } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { - type Error = error_stack::Report; + type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::AccessToken { + response: Ok(AccessToken { token: item.response.token, expires: item.response.seconds_to_expire, }), @@ -372,47 +379,43 @@ impl } } -impl TryFrom<&GlobalPayRouterData<&types::RefundsRouterData>> - for requests::GlobalpayRefundRequest -{ +impl TryFrom<&GlobalPayRouterData<&RefundsRouterData>> for requests::GlobalpayRefundRequest { type Error = Error; - fn try_from( - item: &GlobalPayRouterData<&types::RefundsRouterData>, - ) -> Result { + fn try_from(item: &GlobalPayRouterData<&RefundsRouterData>) -> Result { Ok(Self { amount: item.amount.to_owned(), }) } } -impl TryFrom> - for types::RefundExecuteRouterData +impl TryFrom> + for RefundExecuteRouterData { type Error = Error; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.id, - refund_status: enums::RefundStatus::from(item.response.status), + refund_status: common_enums::RefundStatus::from(item.response.status), }), ..item.data }) } } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for RefundsRouterData { type Error = Error; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.id, - refund_status: enums::RefundStatus::from(item.response.status), + refund_status: common_enums::RefundStatus::from(item.response.status), }), ..item.data }) @@ -427,28 +430,30 @@ pub struct GlobalpayErrorResponse { } fn get_payment_method_data( - item: &types::PaymentsAuthorizeRouterData, + item: &PaymentsAuthorizeRouterData, brand_reference: Option, ) -> Result { match &item.request.payment_method_data { - domain::PaymentMethodData::Card(ccard) => Ok(PaymentMethodData::Card(requests::Card { - number: ccard.card_number.clone(), - expiry_month: ccard.card_exp_month.clone(), - expiry_year: ccard.get_card_expiry_year_2_digit()?, - cvv: ccard.card_cvc.clone(), - account_type: None, - authcode: None, - avs_address: None, - avs_postal_code: None, - brand_reference, - chip_condition: None, - funding: None, - pin_block: None, - tag: None, - track: None, - })), - domain::PaymentMethodData::Wallet(wallet_data) => get_wallet_data(wallet_data), - domain::PaymentMethodData::BankRedirect(bank_redirect) => { + payment_method_data::PaymentMethodData::Card(ccard) => { + Ok(PaymentMethodData::Card(requests::Card { + number: ccard.card_number.clone(), + expiry_month: ccard.card_exp_month.clone(), + expiry_year: ccard.get_card_expiry_year_2_digit()?, + cvv: ccard.card_cvc.clone(), + account_type: None, + authcode: None, + avs_address: None, + avs_postal_code: None, + brand_reference, + chip_condition: None, + funding: None, + pin_block: None, + tag: None, + track: None, + })) + } + payment_method_data::PaymentMethodData::Wallet(wallet_data) => get_wallet_data(wallet_data), + payment_method_data::PaymentMethodData::BankRedirect(bank_redirect) => { PaymentMethodData::try_from(bank_redirect) } _ => Err(errors::ConnectorError::NotImplemented( @@ -457,17 +462,17 @@ fn get_payment_method_data( } } -fn get_return_url(item: &types::PaymentsAuthorizeRouterData) -> Option { +fn get_return_url(item: &PaymentsAuthorizeRouterData) -> Option { match item.request.payment_method_data.clone() { - domain::PaymentMethodData::Wallet(domain::WalletData::PaypalRedirect(_)) => { - item.request.complete_authorize_url.clone() - } + payment_method_data::PaymentMethodData::Wallet( + payment_method_data::WalletData::PaypalRedirect(_), + ) => item.request.complete_authorize_url.clone(), _ => item.request.router_return_url.clone(), } } type MandateDetails = (Option, Option, Option); -fn get_mandate_details(item: &types::PaymentsAuthorizeRouterData) -> Result { +fn get_mandate_details(item: &PaymentsAuthorizeRouterData) -> Result { Ok(if item.request.is_mandate_payment() { let connector_mandate_id = item.request.mandate_id.as_ref().and_then(|mandate_ids| { match mandate_ids.mandate_reference_id.clone() { @@ -496,12 +501,16 @@ fn get_mandate_details(item: &types::PaymentsAuthorizeRouterData) -> Result Result { +fn get_wallet_data( + wallet_data: &payment_method_data::WalletData, +) -> Result { match wallet_data { - domain::WalletData::PaypalRedirect(_) => Ok(PaymentMethodData::Apm(requests::Apm { - provider: Some(ApmProvider::Paypal), - })), - domain::WalletData::GooglePay(_) => { + payment_method_data::WalletData::PaypalRedirect(_) => { + Ok(PaymentMethodData::Apm(requests::Apm { + provider: Some(ApmProvider::Paypal), + })) + } + payment_method_data::WalletData::GooglePay(_) => { Ok(PaymentMethodData::DigitalWallet(requests::DigitalWallet { provider: Some(requests::DigitalWalletProvider::PayByGoogle), payment_token: wallet_data.get_wallet_token_as_json("Google Pay".to_string())?, @@ -513,20 +522,20 @@ fn get_wallet_data(wallet_data: &domain::WalletData) -> Result for PaymentMethodData { +impl TryFrom<&payment_method_data::BankRedirectData> for PaymentMethodData { type Error = Error; - fn try_from(value: &domain::BankRedirectData) -> Result { + fn try_from(value: &payment_method_data::BankRedirectData) -> Result { match value { - domain::BankRedirectData::Eps { .. } => Ok(Self::Apm(requests::Apm { + payment_method_data::BankRedirectData::Eps { .. } => Ok(Self::Apm(requests::Apm { provider: Some(ApmProvider::Eps), })), - domain::BankRedirectData::Giropay { .. } => Ok(Self::Apm(requests::Apm { + payment_method_data::BankRedirectData::Giropay { .. } => Ok(Self::Apm(requests::Apm { provider: Some(ApmProvider::Giropay), })), - domain::BankRedirectData::Ideal { .. } => Ok(Self::Apm(requests::Apm { + payment_method_data::BankRedirectData::Ideal { .. } => Ok(Self::Apm(requests::Apm { provider: Some(ApmProvider::Ideal), })), - domain::BankRedirectData::Sofort { .. } => Ok(Self::Apm(requests::Apm { + payment_method_data::BankRedirectData::Sofort { .. } => Ok(Self::Apm(requests::Apm { provider: Some(ApmProvider::Sofort), })), _ => Err(errors::ConnectorError::NotImplemented("Payment method".to_string()).into()), @@ -534,22 +543,20 @@ impl TryFrom<&domain::BankRedirectData> for PaymentMethodData { } } -impl utils::MultipleCaptureSyncResponse for GlobalpayPaymentsResponse { +impl MultipleCaptureSyncResponse for GlobalpayPaymentsResponse { fn get_connector_capture_id(&self) -> String { self.id.clone() } - fn get_capture_attempt_status(&self) -> diesel_models::enums::AttemptStatus { - enums::AttemptStatus::from(self.status) + fn get_capture_attempt_status(&self) -> common_enums::AttemptStatus { + common_enums::AttemptStatus::from(self.status) } fn is_capture_response(&self) -> bool { true } - fn get_amount_captured( - &self, - ) -> Result, error_stack::Report> { + fn get_amount_captured(&self) -> Result, error_stack::Report> { match self.amount.clone() { Some(amount) => { let minor_amount = StringMinorUnitForConnector::convert_back( diff --git a/crates/router/src/connector/iatapay.rs b/crates/hyperswitch_connectors/src/connectors/iatapay.rs similarity index 71% rename from crates/router/src/connector/iatapay.rs rename to crates/hyperswitch_connectors/src/connectors/iatapay.rs index e694968ee04..9db00b61101 100644 --- a/crates/router/src/connector/iatapay.rs +++ b/crates/hyperswitch_connectors/src/connectors/iatapay.rs @@ -1,35 +1,53 @@ pub mod transformers; +use api_models::webhooks::IncomingWebhookEvent; use base64::Engine; use common_utils::{ + consts::BASE64_ENGINE, crypto, - ext_traits::ByteSliceExt, - request::RequestContent, + errors::CustomResult, + ext_traits::{ByteSliceExt, BytesExt}, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, FloatMajorUnit, FloatMajorUnitForConnector}, }; use error_stack::ResultExt; -use masking::PeekInterface; -use transformers as iatapay; - -use self::iatapay::IatapayPaymentsResponse; -use super::utils::{self as connector_utils, base64_decode}; -use crate::{ - configs::settings, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, +use hyperswitch_domain_models::{ + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - ErrorResponse, Response, + PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData, + RefundSyncRouterData, RefundsRouterData, }, - utils::BytesExt, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorSpecifications, + ConnectorValidation, + }, + configs::Connectors, + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{Mask, PeekInterface}; +use transformers::{self as iatapay, IatapayPaymentsResponse}; + +use crate::{ + constants::{headers, CONNECTOR_UNAUTHORIZED_ERROR}, + types::{RefreshTokenRouterData, ResponseRouterData}, + utils::{base64_decode, convert_amount, get_header_key_value}, }; #[derive(Clone)] @@ -58,12 +76,8 @@ impl api::RefundExecute for Iatapay {} impl api::RefundSync for Iatapay {} impl api::PaymentToken for Iatapay {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Iatapay +impl ConnectorIntegration + for Iatapay { // Not Implemented (R) } @@ -74,9 +88,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut headers = vec![( headers::CONTENT_TYPE.to_string(), self.get_content_type().to_string().into(), @@ -108,14 +122,14 @@ impl ConnectorCommon for Iatapay { api::CurrencyUnit::Base } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.iatapay.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = iatapay::IatapayAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -132,9 +146,9 @@ impl ConnectorCommon for Iatapay { let response_error_message = if res.response.is_empty() && res.status_code == 401 { ErrorResponse { status_code: res.status_code, - code: consts::NO_ERROR_CODE.to_string(), - message: consts::NO_ERROR_MESSAGE.to_string(), - reason: Some(consts::CONNECTOR_UNAUTHORIZED_ERROR.to_string()), + code: NO_ERROR_CODE.to_string(), + message: NO_ERROR_MESSAGE.to_string(), + reason: Some(CONNECTOR_UNAUTHORIZED_ERROR.to_string()), attempt_status: None, connector_transaction_id: None, } @@ -149,9 +163,7 @@ impl ConnectorCommon for Iatapay { ErrorResponse { status_code: res.status_code, code: response.error, - message: response - .message - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + message: response.message.unwrap_or(NO_ERROR_MESSAGE.to_string()), reason: response.reason, attempt_status: None, connector_transaction_id: None, @@ -163,19 +175,15 @@ impl ConnectorCommon for Iatapay { impl ConnectorValidation for Iatapay {} -impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { //TODO: implement sessions flow } -impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn get_url( &self, - _req: &types::RefreshTokenRouterData, - connectors: &settings::Connectors, + _req: &RefreshTokenRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}{}", self.base_url(connectors), "/oauth/token")) } @@ -186,15 +194,15 @@ impl ConnectorIntegration CustomResult)>, errors::ConnectorError> { + req: &RefreshTokenRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let auth: iatapay::IatapayAuthType = iatapay::IatapayAuthType::try_from(&req.connector_auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; let auth_id = format!("{}:{}", auth.client_id.peek(), auth.client_secret.peek()); - let auth_val: String = format!("Basic {}", consts::BASE64_ENGINE.encode(auth_id)); + let auth_val: String = format!("Basic {}", BASE64_ENGINE.encode(auth_id)); Ok(vec![ ( @@ -209,8 +217,8 @@ impl ConnectorIntegration CustomResult { let connector_req = iatapay::IatapayAuthUpdateRequest::try_from(req)?; Ok(RequestContent::FormUrlEncoded(Box::new(connector_req))) @@ -218,12 +226,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefreshTokenRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let req = Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .attach_default_headers() .headers(types::RefreshTokenType::get_headers(self, req, connectors)?) .url(&types::RefreshTokenType::get_url(self, req, connectors)?) @@ -237,10 +245,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: iatapay::IatapayAuthUpdateResponse = res .response .parse_struct("iatapay IatapayAuthUpdateResponse") @@ -249,7 +257,7 @@ impl ConnectorIntegration for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Iatapay".to_string()) .into(), @@ -303,14 +301,12 @@ impl } } -impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -320,18 +316,18 @@ impl ConnectorIntegration CustomResult { Ok(format!("{}/payments/", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -344,12 +340,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -366,17 +362,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: IatapayPaymentsResponse = res .response .parse_struct("Iatapay PaymentsAuthorizeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -393,14 +389,12 @@ impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -410,8 +404,8 @@ impl ConnectorIntegration CustomResult { let auth: iatapay::IatapayAuthType = iatapay::IatapayAuthType::try_from(&req.connector_auth_type)?; @@ -425,12 +419,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -440,17 +434,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: IatapayPaymentsResponse = res .response .parse_struct("iatapay PaymentsSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -467,14 +461,12 @@ impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn build_request( &self, - _req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err(errors::ConnectorError::FlowNotSupported { flow: "Capture".to_string(), connector: "Iatapay".to_string(), @@ -483,19 +475,14 @@ impl ConnectorIntegration - for Iatapay -{ -} +impl ConnectorIntegration for Iatapay {} -impl ConnectorIntegration - for Iatapay -{ +impl ConnectorIntegration for Iatapay { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -505,8 +492,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}{}{}{}", @@ -519,10 +506,10 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let refund_amount = connector_utils::convert_amount( + let refund_amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -535,11 +522,11 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -554,17 +541,17 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: iatapay::RefundResponse = res .response .parse_struct("iatapay RefundResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -581,12 +568,12 @@ impl ConnectorIntegration for Iatapay { +impl ConnectorIntegration for Iatapay { fn get_headers( &self, - req: &types::RefundSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -596,8 +583,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}{}{}", @@ -612,12 +599,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundSyncType::get_headers(self, req, connectors)?) @@ -627,17 +614,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: iatapay::RefundResponse = res .response .parse_struct("iatapay RefundSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -655,28 +642,27 @@ impl ConnectorIntegration, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Ok(Box::new(crypto::HmacSha256)) } fn get_webhook_source_verification_signature( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { - let base64_signature = - connector_utils::get_header_key_value("Authorization", request.headers)?; + let base64_signature = get_header_key_value("Authorization", request.headers)?; let base64_signature = base64_signature.replace("IATAPAY-HMAC-SHA256 ", ""); base64_decode(base64_signature) } fn get_webhook_source_verification_message( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _merchant_id: &common_utils::id_type::MerchantId, _connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { @@ -687,7 +673,7 @@ impl api::IncomingWebhook for Iatapay { fn get_webhook_object_reference_id( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let notif: iatapay::IatapayWebhookResponse = request .body @@ -729,18 +715,18 @@ impl api::IncomingWebhook for Iatapay { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let notif: iatapay::IatapayWebhookResponse = request .body .parse_struct("IatapayWebhookResponse") .change_context(errors::ConnectorError::WebhookEventTypeNotFound)?; - api::IncomingWebhookEvent::try_from(notif) + IncomingWebhookEvent::try_from(notif) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let notif: iatapay::IatapayWebhookResponse = request .body diff --git a/crates/router/src/connector/iatapay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs similarity index 68% rename from crates/router/src/connector/iatapay/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs index 641505780b4..702a7a9b19f 100644 --- a/crates/router/src/connector/iatapay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/iatapay/transformers.rs @@ -1,16 +1,35 @@ use std::collections::HashMap; -use common_utils::{errors::CustomResult, ext_traits::Encode, types::FloatMajorUnit}; +use api_models::webhooks::IncomingWebhookEvent; +use common_enums::enums; +use common_utils::{ + errors::CustomResult, ext_traits::Encode, request::Method, types::FloatMajorUnit, +}; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::{BankRedirectData, PaymentMethodData, RealTimePaymentData, UpiData}, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + refunds::{Execute, RSync}, + Authorize, + }, + router_request_types::{PaymentsAuthorizeData, ResponseId}, + router_response_types::{PaymentsResponseData, RedirectForm, RefundsResponseData}, + types::{self, RefundsRouterData}, +}; +use hyperswitch_interfaces::{ + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, +}; use masking::{Secret, SwitchStrategy}; use serde::{Deserialize, Serialize}; use crate::{ - connector::utils::{self as connector_util, PaymentsAuthorizeRequestData, RefundsRequestData}, - consts, - core::errors, - services, - types::{self, api, domain, storage::enums, PaymentsAuthorizeData}, + types::{RefundsResponseRouterData, ResponseRouterData}, + utils::{ + get_unimplemented_payment_method_error_message, is_payment_failure, is_refund_failure, + PaymentsAuthorizeRequestData, RefundsRequestData, + }, }; type Error = error_stack::Report; @@ -50,15 +69,15 @@ pub struct IatapayAuthUpdateResponse { pub expires_in: i64, } -impl TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::AccessToken { + response: Ok(AccessToken { token: item.response.access_token, expires: item.response.expires_in, }), @@ -105,114 +124,97 @@ pub struct IatapayPaymentsRequest { } impl - TryFrom< - &IatapayRouterData< - &types::RouterData< - api::payments::Authorize, - PaymentsAuthorizeData, - types::PaymentsResponseData, - >, - >, - > for IatapayPaymentsRequest + TryFrom<&IatapayRouterData<&RouterData>> + for IatapayPaymentsRequest { type Error = error_stack::Report; fn try_from( item: &IatapayRouterData< - &types::RouterData< - api::payments::Authorize, - PaymentsAuthorizeData, - types::PaymentsResponseData, - >, + &RouterData, >, ) -> Result { let return_url = item.router_data.request.get_router_return_url()?; // Iatapay processes transactions through the payment method selected based on the country - let (country, payer_info, preferred_checkout_method) = - match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::Upi(upi_type) => match upi_type { - domain::UpiData::UpiCollect(upi_data) => ( - common_enums::CountryAlpha2::IN, - upi_data.vpa_id.map(|id| PayerInfo { - token_id: id.switch_strategy(), - }), - None, - ), - domain::UpiData::UpiIntent(_) => ( - common_enums::CountryAlpha2::IN, - None, - Some(PreferredCheckoutMethod::Qr), - ), - }, - domain::PaymentMethodData::BankRedirect(bank_redirect_data) => { - match bank_redirect_data { - domain::BankRedirectData::Ideal { .. } => { - (common_enums::CountryAlpha2::NL, None, None) - } - domain::BankRedirectData::LocalBankRedirect {} => { - (common_enums::CountryAlpha2::AT, None, None) - } - domain::BankRedirectData::BancontactCard { .. } - | domain::BankRedirectData::Bizum {} - | domain::BankRedirectData::Blik { .. } - | domain::BankRedirectData::Eps { .. } - | domain::BankRedirectData::Giropay { .. } - | domain::BankRedirectData::Interac { .. } - | domain::BankRedirectData::OnlineBankingCzechRepublic { .. } - | domain::BankRedirectData::OnlineBankingFinland { .. } - | domain::BankRedirectData::OnlineBankingPoland { .. } - | domain::BankRedirectData::OnlineBankingSlovakia { .. } - | domain::BankRedirectData::OpenBankingUk { .. } - | domain::BankRedirectData::Przelewy24 { .. } - | domain::BankRedirectData::Sofort { .. } - | domain::BankRedirectData::Trustly { .. } - | domain::BankRedirectData::OnlineBankingFpx { .. } - | domain::BankRedirectData::OnlineBankingThailand { .. } => { - Err(errors::ConnectorError::NotImplemented( - connector_util::get_unimplemented_payment_method_error_message( - "iatapay", - ), - ))? - } - } - } - domain::PaymentMethodData::RealTimePayment(real_time_payment_data) => { - match *real_time_payment_data { - domain::RealTimePaymentData::DuitNow {} => { - (common_enums::CountryAlpha2::MY, None, None) - } - domain::RealTimePaymentData::Fps {} => { - (common_enums::CountryAlpha2::HK, None, None) - } - domain::RealTimePaymentData::PromptPay {} => { - (common_enums::CountryAlpha2::TH, None, None) - } - domain::RealTimePaymentData::VietQr {} => { - (common_enums::CountryAlpha2::VN, None, None) - } - } + let (country, payer_info, preferred_checkout_method) = match item + .router_data + .request + .payment_method_data + .clone() + { + PaymentMethodData::Upi(upi_type) => match upi_type { + UpiData::UpiCollect(upi_data) => ( + common_enums::CountryAlpha2::IN, + upi_data.vpa_id.map(|id| PayerInfo { + token_id: id.switch_strategy(), + }), + None, + ), + UpiData::UpiIntent(_) => ( + common_enums::CountryAlpha2::IN, + None, + Some(PreferredCheckoutMethod::Qr), + ), + }, + PaymentMethodData::BankRedirect(bank_redirect_data) => match bank_redirect_data { + BankRedirectData::Ideal { .. } => (common_enums::CountryAlpha2::NL, None, None), + BankRedirectData::LocalBankRedirect {} => { + (common_enums::CountryAlpha2::AT, None, None) } - domain::PaymentMethodData::Card(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + BankRedirectData::BancontactCard { .. } + | BankRedirectData::Bizum {} + | BankRedirectData::Blik { .. } + | BankRedirectData::Eps { .. } + | BankRedirectData::Giropay { .. } + | BankRedirectData::Interac { .. } + | BankRedirectData::OnlineBankingCzechRepublic { .. } + | BankRedirectData::OnlineBankingFinland { .. } + | BankRedirectData::OnlineBankingPoland { .. } + | BankRedirectData::OnlineBankingSlovakia { .. } + | BankRedirectData::OpenBankingUk { .. } + | BankRedirectData::Przelewy24 { .. } + | BankRedirectData::Sofort { .. } + | BankRedirectData::Trustly { .. } + | BankRedirectData::OnlineBankingFpx { .. } + | BankRedirectData::OnlineBankingThailand { .. } => { Err(errors::ConnectorError::NotImplemented( - connector_util::get_unimplemented_payment_method_error_message("iatapay"), + get_unimplemented_payment_method_error_message("iatapay"), ))? } - }; + }, + PaymentMethodData::RealTimePayment(real_time_payment_data) => { + match *real_time_payment_data { + RealTimePaymentData::DuitNow {} => { + (common_enums::CountryAlpha2::MY, None, None) + } + RealTimePaymentData::Fps {} => (common_enums::CountryAlpha2::HK, None, None), + RealTimePaymentData::PromptPay {} => { + (common_enums::CountryAlpha2::TH, None, None) + } + RealTimePaymentData::VietQr {} => (common_enums::CountryAlpha2::VN, None, None), + } + } + PaymentMethodData::Card(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + Err(errors::ConnectorError::NotImplemented( + get_unimplemented_payment_method_error_message("iatapay"), + ))? + } + }; let payload = Self { merchant_id: IatapayAuthType::try_from(&item.router_data.connector_auth_type)? .merchant_id, @@ -244,11 +246,11 @@ pub struct IatapayAuthType { pub(super) client_secret: Secret, } -impl TryFrom<&types::ConnectorAuthType> for IatapayAuthType { +impl TryFrom<&ConnectorAuthType> for IatapayAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { + fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { - types::ConnectorAuthType::SignatureKey { + ConnectorAuthType::SignatureKey { api_key, key1, api_secret, @@ -321,21 +323,21 @@ fn get_iatpay_response( ) -> CustomResult< ( enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { let status = enums::AttemptStatus::from(response.status); - let error = if connector_util::is_payment_failure(status) { - Some(types::ErrorResponse { + let error = if is_payment_failure(status) { + Some(ErrorResponse { code: response .failure_code - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .failure_details .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.failure_details, status_code, attempt_status: Some(status), @@ -346,8 +348,8 @@ fn get_iatpay_response( }; let form_fields = HashMap::new(); let id = match response.iata_payment_id.clone() { - Some(s) => types::ResponseId::ConnectorTransactionId(s), - None => types::ResponseId::NoResponseId, + Some(s) => ResponseId::ConnectorTransactionId(s), + None => ResponseId::NoResponseId, }; let connector_response_reference_id = response.merchant_payment_id.or(response.iata_payment_id); @@ -371,15 +373,15 @@ fn get_iatpay_response( } false => ( None, - Some(services::RedirectForm::Form { + Some(RedirectForm::Form { endpoint: checkout_methods.redirect.redirect_url, - method: services::Method::Get, + method: Method::Get, form_fields, }), ), }; - types::PaymentsResponseData::TransactionResponse { + PaymentsResponseData::TransactionResponse { resource_id: id, redirection_data: Box::new(redirection_data), mandate_reference: Box::new(None), @@ -390,7 +392,7 @@ fn get_iatpay_response( charge_id: None, } } - None => types::PaymentsResponseData::TransactionResponse { + None => PaymentsResponseData::TransactionResponse { resource_id: id.clone(), redirection_data: Box::new(None), mandate_reference: Box::new(None), @@ -405,13 +407,12 @@ fn get_iatpay_response( Ok((status, error, payment_response_data)) } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = Error; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let (status, error, payment_response_data) = get_iatpay_response(item.response, item.http_code)?; @@ -436,11 +437,9 @@ pub struct IatapayRefundRequest { pub notification_url: String, } -impl TryFrom<&IatapayRouterData<&types::RefundsRouterData>> for IatapayRefundRequest { +impl TryFrom<&IatapayRouterData<&RefundsRouterData>> for IatapayRefundRequest { type Error = error_stack::Report; - fn try_from( - item: &IatapayRouterData<&types::RefundsRouterData>, - ) -> Result { + fn try_from(item: &IatapayRouterData<&RefundsRouterData>) -> Result { Ok(Self { amount: item.amount, merchant_id: IatapayAuthType::try_from(&item.router_data.connector_auth_type)? @@ -506,32 +505,30 @@ pub struct RefundResponse { account_country: Option, } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { let refund_status = enums::RefundStatus::from(item.response.status); - let response = if connector_util::is_refund_failure(refund_status) { - Err(types::ErrorResponse { + let response = if is_refund_failure(refund_status) { + Err(ErrorResponse { code: item .response .failure_code - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: item .response .failure_details .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: item.response.failure_details, status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.iata_refund_id.clone()), }) } else { - Ok(types::RefundsResponseData { + Ok(RefundsResponseData { connector_refund_id: item.response.iata_refund_id.to_string(), refund_status, }) @@ -544,32 +541,30 @@ impl TryFrom> } } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { let refund_status = enums::RefundStatus::from(item.response.status); - let response = if connector_util::is_refund_failure(refund_status) { - Err(types::ErrorResponse { + let response = if is_refund_failure(refund_status) { + Err(ErrorResponse { code: item .response .failure_code - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: item .response .failure_details .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: item.response.failure_details, status_code: item.http_code, attempt_status: None, connector_transaction_id: Some(item.response.iata_refund_id.clone()), }) } else { - Ok(types::RefundsResponseData { + Ok(RefundsResponseData { connector_refund_id: item.response.iata_refund_id.to_string(), refund_status, }) @@ -627,7 +622,7 @@ pub enum IatapayWebhookResponse { IatapayRefundWebhookBody(IatapayRefundWebhookBody), } -impl TryFrom for api::IncomingWebhookEvent { +impl TryFrom for IncomingWebhookEvent { type Error = error_stack::Report; fn try_from(payload: IatapayWebhookResponse) -> CustomResult { match payload { diff --git a/crates/router/src/connector/itaubank.rs b/crates/hyperswitch_connectors/src/connectors/itaubank.rs similarity index 71% rename from crates/router/src/connector/itaubank.rs rename to crates/hyperswitch_connectors/src/connectors/itaubank.rs index 2087c72ba85..34956ace644 100644 --- a/crates/router/src/connector/itaubank.rs +++ b/crates/hyperswitch_connectors/src/connectors/itaubank.rs @@ -2,25 +2,51 @@ pub mod transformers; use std::fmt::Write; -use common_utils::types::{AmountConvertor, StringMajorUnit, StringMajorUnitForConnector}; +use api_models::webhooks::{IncomingWebhookEvent, ObjectReferenceId}; +use common_utils::{ + errors::CustomResult, + ext_traits::BytesExt, + request::{Method, Request, RequestBuilder, RequestContent}, + types::{AmountConvertor, StringMajorUnit, StringMajorUnitForConnector}, +}; use error_stack::{report, ResultExt}; -use hyperswitch_interfaces::consts; +use hyperswitch_domain_models::{ + router_data::{AccessToken, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData, SetupMandateRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorSpecifications, + ConnectorValidation, + }, + configs::Connectors, + consts::{ACCEPT_HEADER, NO_ERROR_CODE, NO_ERROR_MESSAGE, USER_AGENT}, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; use masking::PeekInterface; use transformers as itaubank; -use super::utils::{self as connector_utils, RefundsRequestData}; use crate::{ - configs::settings, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, - services::{self, request, ConnectorIntegration, ConnectorSpecifications, ConnectorValidation}, - types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - ErrorResponse, RequestContent, Response, - }, - utils::BytesExt, + constants::headers, + types::{RefreshTokenRouterData, ResponseRouterData}, + utils::{convert_amount, RefundsRequestData}, }; #[derive(Clone)] @@ -49,12 +75,8 @@ impl api::RefundExecute for Itaubank {} impl api::RefundSync for Itaubank {} impl api::PaymentToken for Itaubank {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Itaubank +impl ConnectorIntegration + for Itaubank { } @@ -64,9 +86,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let access_token = req.access_token .clone() @@ -81,11 +103,11 @@ where ), ( headers::ACCEPT.to_string(), - consts::ACCEPT_HEADER.to_string().into(), + ACCEPT_HEADER.to_string().into(), ), ( headers::USER_AGENT.to_string(), - consts::USER_AGENT.to_string().into(), + USER_AGENT.to_string().into(), ), ( headers::CONTENT_TYPE.to_string(), @@ -110,7 +132,7 @@ impl ConnectorCommon for Itaubank { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.itaubank.base_url.as_ref() } @@ -146,14 +168,11 @@ impl ConnectorCommon for Itaubank { Ok(ErrorResponse { status_code: res.status_code, - code: response - .error - .title - .unwrap_or(consts::NO_ERROR_CODE.to_string()), + code: response.error.title.unwrap_or(NO_ERROR_CODE.to_string()), message: response .error .detail - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or(NO_ERROR_MESSAGE.to_string()), reason, attempt_status: None, connector_transaction_id: None, @@ -163,18 +182,13 @@ impl ConnectorCommon for Itaubank { impl ConnectorValidation for Itaubank {} -impl ConnectorIntegration - for Itaubank -{ -} +impl ConnectorIntegration for Itaubank {} -impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn get_url( &self, - _req: &types::RefreshTokenRouterData, - connectors: &settings::Connectors, + _req: &RefreshTokenRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}api/oauth/jwt", self.base_url(connectors))) } @@ -183,9 +197,9 @@ impl ConnectorIntegration CustomResult)>, errors::ConnectorError> { + _req: &RefreshTokenRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let flow_header = vec![ ( headers::CONTENT_TYPE.to_string(), @@ -195,19 +209,19 @@ impl ConnectorIntegration CustomResult { let connector_req = itaubank::ItaubankAuthRequest::try_from(req)?; @@ -216,13 +230,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefreshTokenRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; let req = Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .attach_default_headers() .headers(types::RefreshTokenType::get_headers(self, req, connectors)?) .url(&types::RefreshTokenType::get_url(self, req, connectors)?) @@ -239,10 +253,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: itaubank::ItaubankUpdateTokenResponse = res .response .parse_struct("ItaubankUpdateTokenResponse") @@ -251,7 +265,7 @@ impl ConnectorIntegration for Itaubank +impl ConnectorIntegration + for Itaubank { fn build_request( &self, - _req: &types::SetupMandateRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &SetupMandateRouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err(errors::ConnectorError::FlowNotSupported { flow: "setup mandate".to_string(), connector: "itaubank".to_string(), @@ -306,14 +316,12 @@ impl } } -impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -323,8 +331,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}itau-ep9-gtw-pix-recebimentos-ext-v2/v2/cob", @@ -334,10 +342,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -350,13 +358,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -375,17 +383,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: itaubank::ItaubankPaymentsResponse = res .response .parse_struct("Itaubank PaymentsAuthorizeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -401,14 +409,12 @@ impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -418,8 +424,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}itau-ep9-gtw-pix-recebimentos-ext-v2/v2/cob/{}", @@ -433,13 +439,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -451,17 +457,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: itaubank::ItaubankPaymentsSyncResponse = res .response .parse_struct("itaubank PaymentsSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -477,14 +483,12 @@ impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -494,29 +498,29 @@ impl ConnectorIntegration CustomResult { Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) } fn get_request_body( &self, - _req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { Err(errors::ConnectorError::NotImplemented("get_request_body method".to_string()).into()) } fn build_request( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -533,17 +537,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: itaubank::ItaubankPaymentsResponse = res .response .parse_struct("Itaubank PaymentsCaptureResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -559,14 +563,12 @@ impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn build_request( &self, - _req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &PaymentsCancelRouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err(errors::ConnectorError::FlowNotSupported { flow: "void".to_string(), connector: "itaubank".to_string(), @@ -575,14 +577,12 @@ impl ConnectorIntegration - for Itaubank -{ +impl ConnectorIntegration for Itaubank { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -592,8 +592,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { let itaubank_metadata = req.request.get_connector_metadata()?; let pix_data: itaubank::ItaubankMetaData = serde_json::from_value(itaubank_metadata) @@ -614,10 +614,10 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let refund_amount = connector_utils::convert_amount( + let refund_amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -630,12 +630,12 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; - let request = services::RequestBuilder::new() - .method(services::Method::Put) + let request = RequestBuilder::new() + .method(Method::Put) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -652,17 +652,17 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: itaubank::RefundResponse = res .response .parse_struct("itaubank RefundResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -678,12 +678,12 @@ impl ConnectorIntegration for Itaubank { +impl ConnectorIntegration for Itaubank { fn get_headers( &self, - req: &types::RefundSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -693,8 +693,8 @@ impl ConnectorIntegration CustomResult { let itaubank_metadata = req.request.get_connector_metadata()?; let pix_data: itaubank::ItaubankMetaData = serde_json::from_value(itaubank_metadata) @@ -715,13 +715,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let auth_details = itaubank::ItaubankAuthType::try_from(&req.connector_auth_type)?; Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundSyncType::get_headers(self, req, connectors)?) @@ -736,17 +736,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: itaubank::RefundResponse = res .response .parse_struct("itaubank RefundResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -763,24 +763,24 @@ impl ConnectorIntegration, - ) -> CustomResult { + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_event_type( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_resource_object( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } diff --git a/crates/router/src/connector/itaubank/transformers.rs b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs similarity index 71% rename from crates/router/src/connector/itaubank/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs index 127f8526afe..c5d66d9a156 100644 --- a/crates/router/src/connector/itaubank/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/itaubank/transformers.rs @@ -1,16 +1,24 @@ -use api_models::payments; -use common_utils::{ext_traits::Encode, types::StringMajorUnit}; +use api_models::payments::QrCodeInformation; +use common_enums::enums; +use common_utils::{errors::CustomResult, ext_traits::Encode, types::StringMajorUnit}; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::{BankTransferData, PaymentMethodData}, + router_data::{AccessToken, ConnectorAuthType, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::ResponseId, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types, +}; +use hyperswitch_interfaces::errors; use masking::Secret; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use url::Url; use crate::{ - connector::utils::{self, RouterData}, - core::errors, - types::{self, api, domain, storage::enums}, - utils as crate_utils, + types::{RefundsResponseRouterData, ResponseRouterData}, + utils::{get_timestamp_in_milliseconds, QrImage, RouterData as _}, }; pub struct ItaubankRouterData { @@ -55,9 +63,9 @@ impl TryFrom<&ItaubankRouterData<&types::PaymentsAuthorizeRouterData>> for Itaub item: &ItaubankRouterData<&types::PaymentsAuthorizeRouterData>, ) -> Result { match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::BankTransfer(bank_transfer_data) => { + PaymentMethodData::BankTransfer(bank_transfer_data) => { match *bank_transfer_data { - domain::BankTransferData::Pix { pix_key, cpf, cnpj } => { + BankTransferData::Pix { pix_key, cpf, cnpj } => { let nome = item.router_data.get_optional_billing_full_name(); // cpf and cnpj are mutually exclusive let devedor = match (cnpj, cpf) { @@ -85,19 +93,19 @@ impl TryFrom<&ItaubankRouterData<&types::PaymentsAuthorizeRouterData>> for Itaub devedor, }) } - domain::BankTransferData::AchBankTransfer {} - | domain::BankTransferData::SepaBankTransfer {} - | domain::BankTransferData::BacsBankTransfer {} - | domain::BankTransferData::MultibancoBankTransfer {} - | domain::BankTransferData::PermataBankTransfer {} - | domain::BankTransferData::BcaBankTransfer {} - | domain::BankTransferData::BniVaBankTransfer {} - | domain::BankTransferData::BriVaBankTransfer {} - | domain::BankTransferData::CimbVaBankTransfer {} - | domain::BankTransferData::DanamonVaBankTransfer {} - | domain::BankTransferData::MandiriVaBankTransfer {} - | domain::BankTransferData::Pse {} - | domain::BankTransferData::LocalBankTransfer { .. } => { + BankTransferData::AchBankTransfer {} + | BankTransferData::SepaBankTransfer {} + | BankTransferData::BacsBankTransfer {} + | BankTransferData::MultibancoBankTransfer {} + | BankTransferData::PermataBankTransfer {} + | BankTransferData::BcaBankTransfer {} + | BankTransferData::BniVaBankTransfer {} + | BankTransferData::BriVaBankTransfer {} + | BankTransferData::CimbVaBankTransfer {} + | BankTransferData::DanamonVaBankTransfer {} + | BankTransferData::MandiriVaBankTransfer {} + | BankTransferData::Pse {} + | BankTransferData::LocalBankTransfer { .. } => { Err(errors::ConnectorError::NotImplemented( "Selected payment method through itaubank".to_string(), ) @@ -105,24 +113,24 @@ impl TryFrom<&ItaubankRouterData<&types::PaymentsAuthorizeRouterData>> for Itaub } } } - domain::PaymentMethodData::Card(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Card(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( "Selected payment method through itaubank".to_string(), ) @@ -139,11 +147,11 @@ pub struct ItaubankAuthType { pub(super) certificate_key: Option>, } -impl TryFrom<&types::ConnectorAuthType> for ItaubankAuthType { +impl TryFrom<&ConnectorAuthType> for ItaubankAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { + fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { - types::ConnectorAuthType::MultiAuthKey { + ConnectorAuthType::MultiAuthKey { api_key, key1, api_secret, @@ -154,7 +162,7 @@ impl TryFrom<&types::ConnectorAuthType> for ItaubankAuthType { certificate: Some(api_secret.to_owned()), certificate_key: Some(key2.to_owned()), }), - types::ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { + ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { client_secret: api_key.to_owned(), client_id: key1.to_owned(), certificate: None, @@ -206,15 +214,15 @@ pub struct ItaubankTokenErrorResponse { pub user_message: Option, } -impl TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::AccessToken { + response: Ok(AccessToken { token: item.response.access_token, expires: item.response.expires_in, }), @@ -261,26 +269,18 @@ pub struct ItaubankPixExpireTime { expiracao: i64, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - ItaubankPaymentsResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let connector_metadata = get_qr_code_data(&item.response)?; Ok(Self { status: enums::AttemptStatus::from(item.response.status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - item.response.txid.to_owned(), - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.txid.to_owned()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata, @@ -296,18 +296,18 @@ impl fn get_qr_code_data( response: &ItaubankPaymentsResponse, -) -> errors::CustomResult, errors::ConnectorError> { - let creation_time = utils::get_timestamp_in_milliseconds(&response.calendario.criacao); +) -> CustomResult, errors::ConnectorError> { + let creation_time = get_timestamp_in_milliseconds(&response.calendario.criacao); // convert expiration to milliseconds and add to creation time let expiration_time = creation_time + (response.calendario.expiracao * 1000); - let image_data = crate_utils::QrImage::new_from_data(response.pix_qr_value.clone()) + let image_data = QrImage::new_from_data(response.pix_qr_value.clone()) .change_context(errors::ConnectorError::ResponseHandlingFailed)?; let image_data_url = Url::parse(image_data.data.clone().as_str()) .change_context(errors::ConnectorError::ResponseHandlingFailed)?; - let qr_code_info = payments::QrCodeInformation::QrDataUrl { + let qr_code_info = QrCodeInformation::QrDataUrl { image_data_url, display_to_timestamp: Some(expiration_time), }; @@ -336,19 +336,12 @@ pub struct ItaubankMetaData { pub pix_id: Option, } -impl - TryFrom< - types::ResponseRouterData, - > for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - ItaubankPaymentsSyncResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let pix_data = item .response @@ -365,10 +358,8 @@ impl Ok(Self { status: enums::AttemptStatus::from(item.response.status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - item.response.txid.to_owned(), - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.txid.to_owned()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata, @@ -424,15 +415,15 @@ pub struct RefundResponse { status: RefundStatus, } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.rtr_id, refund_status: enums::RefundStatus::from(item.response.status), }), @@ -441,15 +432,13 @@ impl TryFrom> } } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.rtr_id.to_string(), refund_status: enums::RefundStatus::from(item.response.status), }), diff --git a/crates/router/src/connector/klarna.rs b/crates/hyperswitch_connectors/src/connectors/klarna.rs similarity index 78% rename from crates/router/src/connector/klarna.rs rename to crates/hyperswitch_connectors/src/connectors/klarna.rs index 9b0da0ade6d..dd0110d9593 100644 --- a/crates/router/src/connector/klarna.rs +++ b/crates/hyperswitch_connectors/src/connectors/klarna.rs @@ -1,34 +1,58 @@ pub mod transformers; -use api_models::enums; +use api_models::webhooks::IncomingWebhookEvent; use base64::Engine; +use common_enums::enums; use common_utils::{ - request::RequestContent, + consts::BASE64_ENGINE, + errors::CustomResult, + ext_traits::BytesExt, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, MinorUnit, MinorUnitForConnector}, }; use error_stack::{report, ResultExt}; -use masking::PeekInterface; +use hyperswitch_domain_models::{ + payment_method_data::{PayLaterData, PaymentMethodData}, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsSessionRouterData, PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorSpecifications, + ConnectorValidation, + }, + configs::Connectors, + consts::NO_ERROR_MESSAGE, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{Mask, PeekInterface}; use router_env::logger; use transformers as klarna; use crate::{ - configs::settings, - connector::{utils as connector_utils, utils::RefundsRequestData}, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorSpecifications, ConnectorValidation, + constants::headers, + types::ResponseRouterData, + utils::{ + construct_not_supported_error_report, convert_amount, get_http_header, + get_unimplemented_payment_method_error_message, missing_field_err, RefundsRequestData, }, - types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - domain, ErrorResponse, Response, - }, - utils::BytesExt, }; #[derive(Clone)] @@ -57,21 +81,18 @@ impl ConnectorCommon for Klarna { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.klarna.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = klarna::KlarnaAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; - let encoded_api_key = consts::BASE64_ENGINE.encode(format!( - "{}:{}", - auth.username.peek(), - auth.password.peek() - )); + let encoded_api_key = + BASE64_ENGINE.encode(format!("{}:{}", auth.username.peek(), auth.password.peek())); Ok(vec![( headers::AUTHORIZATION.to_string(), format!("Basic {encoded_api_key}").into_masked(), @@ -101,7 +122,7 @@ impl ConnectorCommon for Klarna { code: response.error_code, message: response .error_message - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or(NO_ERROR_MESSAGE.to_string()), reason, attempt_status: None, connector_transaction_id: None, @@ -122,7 +143,7 @@ impl ConnectorValidation for Klarna { | enums::CaptureMethod::Manual | enums::CaptureMethod::SequentialAutomatic => Ok(()), enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( - connector_utils::construct_not_supported_error_report(capture_method, self.id()), + construct_not_supported_error_report(capture_method, self.id()), ), } } @@ -138,35 +159,25 @@ impl api::PaymentSession for Klarna {} impl api::ConnectorAccessToken for Klarna {} impl api::PaymentToken for Klarna {} -impl - services::ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Klarna +impl ConnectorIntegration + for Klarna { // Not Implemented (R) } -impl - services::ConnectorIntegration< - api::AccessTokenAuth, - types::AccessTokenRequestData, - types::AccessToken, - > for Klarna -{ +impl ConnectorIntegration for Klarna { // Not Implemented (R) } impl ConnectorCommonExt for Klarna where - Self: services::ConnectorIntegration, + Self: ConnectorIntegration, { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), types::PaymentsAuthorizeType::get_content_type(self) @@ -195,18 +206,12 @@ fn build_region_specific_endpoint( Ok(base_url.replace("{{klarna_region}}", &klarna_region)) } -impl - services::ConnectorIntegration< - api::Session, - types::PaymentsSessionData, - types::PaymentsResponseData, - > for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::PaymentsSessionRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSessionRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -216,8 +221,8 @@ impl fn get_url( &self, - req: &types::PaymentsSessionRouterData, - connectors: &settings::Connectors, + req: &PaymentsSessionRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_region_specific_endpoint(self.base_url(connectors), &req.connector_meta_data)?; @@ -227,10 +232,10 @@ impl fn get_request_body( &self, - req: &types::PaymentsSessionRouterData, - _connectors: &settings::Connectors, + req: &PaymentsSessionRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -244,12 +249,12 @@ impl fn build_request( &self, - req: &types::PaymentsSessionRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsSessionRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsSessionType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSessionType::get_headers( @@ -264,10 +269,10 @@ impl fn handle_response( &self, - data: &types::PaymentsSessionRouterData, + data: &PaymentsSessionRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: klarna::KlarnaSessionResponse = res .response .parse_struct("KlarnaSessionResponse") @@ -276,7 +281,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -295,23 +300,13 @@ impl impl api::MandateSetup for Klarna {} -impl - services::ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Klarna -{ +impl ConnectorIntegration for Klarna { // Not Implemented(R) fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Klarna".to_string()) .into(), @@ -319,18 +314,12 @@ impl } } -impl - services::ConnectorIntegration< - api::Capture, - types::PaymentsCaptureData, - types::PaymentsResponseData, - > for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -340,8 +329,8 @@ impl fn get_url( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, + req: &PaymentsCaptureRouterData, + connectors: &Connectors, ) -> CustomResult { let order_id = req.request.connector_transaction_id.clone(); let endpoint = @@ -354,10 +343,10 @@ impl fn get_request_body( &self, - req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount_to_capture, req.request.currency, @@ -369,11 +358,11 @@ impl fn build_request( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -388,13 +377,13 @@ impl fn handle_response( &self, - data: &types::PaymentsCaptureRouterData, + data: &PaymentsCaptureRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { match res.headers { Some(headers) => { - let capture_id = connector_utils::get_http_header("Capture-Id", &headers) + let capture_id = get_http_header("Capture-Id", &headers) .attach_printable("Missing capture id in headers") .change_context(errors::ConnectorError::ResponseHandlingFailed)?; let response = klarna::KlarnaCaptureResponse { @@ -403,7 +392,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -424,22 +413,19 @@ impl } } -impl - services::ConnectorIntegration - for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_url( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, + req: &PaymentsSyncRouterData, + connectors: &Connectors, ) -> CustomResult { let order_id = req .request @@ -471,12 +457,12 @@ impl fn build_request( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -486,10 +472,10 @@ impl fn handle_response( &self, - data: &types::PaymentsSyncRouterData, + data: &PaymentsSyncRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: klarna::KlarnaPsyncResponse = res .response .parse_struct("klarna KlarnaPsyncResponse") @@ -498,7 +484,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -514,18 +500,12 @@ impl } } -impl - services::ConnectorIntegration< - api::Authorize, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - > for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -535,25 +515,25 @@ impl fn get_url( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { let payment_method_data = &req.request.payment_method_data; let payment_experience = req .request .payment_experience .as_ref() - .ok_or_else(connector_utils::missing_field_err("payment_experience"))?; + .ok_or_else(missing_field_err("payment_experience"))?; let payment_method_type = req .request .payment_method_type .as_ref() - .ok_or_else(connector_utils::missing_field_err("payment_method_type"))?; + .ok_or_else(missing_field_err("payment_method_type"))?; let endpoint = build_region_specific_endpoint(self.base_url(connectors), &req.connector_meta_data)?; match payment_method_data { - domain::PaymentMethodData::PayLater(domain::PayLaterData::KlarnaSdk { token }) => { + PaymentMethodData::PayLater(PayLaterData::KlarnaSdk { token }) => { match (payment_experience, payment_method_type) { ( common_enums::PaymentExperience::InvokeSdkClient, @@ -672,7 +652,7 @@ impl })), } } - domain::PaymentMethodData::PayLater(domain::PayLaterData::KlarnaRedirect {}) => { + PaymentMethodData::PayLater(PayLaterData::KlarnaRedirect {}) => { match (payment_experience, payment_method_type) { ( common_enums::PaymentExperience::RedirectToUrl, @@ -790,29 +770,27 @@ impl } } - domain::PaymentMethodData::Card(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Card(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(report!(errors::ConnectorError::NotImplemented( - connector_utils::get_unimplemented_payment_method_error_message( - req.connector.as_str(), - ), + get_unimplemented_payment_method_error_message(req.connector.as_str(),), ))) } } @@ -820,10 +798,10 @@ impl fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -836,12 +814,12 @@ impl fn build_request( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -858,10 +836,10 @@ impl fn handle_response( &self, - data: &types::PaymentsAuthorizeRouterData, + data: &PaymentsAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: klarna::KlarnaAuthResponse = res .response .parse_struct("KlarnaPaymentsResponse") @@ -870,7 +848,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -887,25 +865,19 @@ impl } } -impl - services::ConnectorIntegration< - api::Void, - types::PaymentsCancelData, - types::PaymentsResponseData, - > for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_url( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + connectors: &Connectors, ) -> CustomResult { let order_id = req.request.connector_transaction_id.clone(); let endpoint = @@ -918,12 +890,12 @@ impl fn build_request( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) @@ -936,10 +908,10 @@ impl fn handle_response( &self, - data: &types::PaymentsCancelRouterData, + data: &PaymentsCancelRouterData, _event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { logger::debug!("Expected zero bytes response, skipped parsing of the response"); let status = if res.status_code == 204 { @@ -947,7 +919,7 @@ impl } else { enums::AttemptStatus::VoidFailed }; - Ok(types::PaymentsCancelRouterData { + Ok(PaymentsCancelRouterData { status, ..data.clone() }) @@ -966,14 +938,12 @@ impl api::Refund for Klarna {} impl api::RefundExecute for Klarna {} impl api::RefundSync for Klarna {} -impl services::ConnectorIntegration - for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -983,8 +953,8 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { let order_id = req.request.connector_transaction_id.clone(); let endpoint = @@ -997,10 +967,10 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -1012,11 +982,11 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -1031,13 +1001,13 @@ impl services::ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { match res.headers { Some(headers) => { - let refund_id = connector_utils::get_http_header("Refund-Id", &headers) + let refund_id = get_http_header("Refund-Id", &headers) .attach_printable("Missing refund id in headers") .change_context(errors::ConnectorError::ResponseHandlingFailed)?; let response = klarna::KlarnaRefundResponse { @@ -1046,7 +1016,7 @@ impl services::ConnectorIntegration - for Klarna -{ +impl ConnectorIntegration for Klarna { fn get_headers( &self, - req: &types::RefundSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -1083,8 +1051,8 @@ impl services::ConnectorIntegration CustomResult { let order_id = req.request.connector_transaction_id.clone(); let refund_id = req.request.get_connector_refund_id()?; @@ -1098,12 +1066,12 @@ impl services::ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::RefundSyncType::get_url(self, req, connectors)?) .headers(types::RefundSyncType::get_headers(self, req, connectors)?) .build(), @@ -1112,17 +1080,17 @@ impl services::ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: klarna::KlarnaRefundSyncResponse = res .response .parse_struct("klarna KlarnaRefundSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -1139,24 +1107,24 @@ impl services::ConnectorIntegration, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_event_type( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { - Ok(api::IncomingWebhookEvent::EventNotSupported) + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { + Ok(IncomingWebhookEvent::EventNotSupported) } fn get_webhook_resource_object( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } diff --git a/crates/router/src/connector/klarna/transformers.rs b/crates/hyperswitch_connectors/src/connectors/klarna/transformers.rs similarity index 81% rename from crates/router/src/connector/klarna/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/klarna/transformers.rs index d1a0b80bad6..28584c2a7c4 100644 --- a/crates/router/src/connector/klarna/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/klarna/transformers.rs @@ -1,18 +1,28 @@ -use api_models::payments; +use api_models::payments::{KlarnaSessionTokenResponse, SessionToken}; +use common_enums::enums; use common_utils::{pii, types::MinorUnit}; use error_stack::{report, ResultExt}; use hyperswitch_domain_models::{ - router_data::KlarnaSdkResponse, router_response_types::RedirectForm, + payment_method_data::{PayLaterData, PaymentMethodData}, + router_data::{ + AdditionalPaymentMethodConnectorResponse, ConnectorAuthType, ConnectorResponseData, + KlarnaSdkResponse, RouterData, + }, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::{PaymentsCaptureData, ResponseId}, + router_response_types::{PaymentsResponseData, RedirectForm, RefundsResponseData}, + types, }; +use hyperswitch_interfaces::errors; use masking::{ExposeInterface, Secret}; use serde::{Deserialize, Serialize}; use crate::{ - connector::utils::{ - self, AddressData, AddressDetailsData, PaymentsAuthorizeRequestData, RouterData, + types::{ + PaymentsResponseRouterData, PaymentsSessionResponseRouterData, RefundsResponseRouterData, + ResponseRouterData, }, - core::errors, - types::{self, api, domain, storage::enums, transformers::ForeignFrom}, + utils::{self, AddressData, AddressDetailsData, PaymentsAuthorizeRequestData, RouterData as _}, }; #[derive(Debug, Serialize)] @@ -125,7 +135,7 @@ pub struct AuthorizedPaymentMethod { payment_type: String, } -impl From for types::AdditionalPaymentMethodConnectorResponse { +impl From for AdditionalPaymentMethodConnectorResponse { fn from(item: AuthorizedPaymentMethod) -> Self { Self::PayLater { klarna_sdk: Some(KlarnaSdkResponse { @@ -206,22 +216,20 @@ impl TryFrom<&KlarnaRouterData<&types::PaymentsSessionRouterData>> for KlarnaSes } } -impl TryFrom> +impl TryFrom> for types::PaymentsSessionRouterData { type Error = error_stack::Report; fn try_from( - item: types::PaymentsSessionResponseRouterData, + item: PaymentsSessionResponseRouterData, ) -> Result { let response = &item.response; Ok(Self { - response: Ok(types::PaymentsResponseData::SessionResponse { - session_token: api::SessionToken::Klarna(Box::new( - payments::KlarnaSessionTokenResponse { - session_token: response.client_token.clone().expose(), - session_id: response.session_id.clone(), - }, - )), + response: Ok(PaymentsResponseData::SessionResponse { + session_token: SessionToken::Klarna(Box::new(KlarnaSessionTokenResponse { + session_token: response.client_token.clone().expose(), + session_id: response.session_id.clone(), + })), }), ..item.data }) @@ -239,7 +247,7 @@ impl TryFrom<&KlarnaRouterData<&types::PaymentsAuthorizeRouterData>> for KlarnaP let return_url = item.router_data.request.get_router_return_url()?; let webhook_url = item.router_data.request.get_webhook_url()?; match payment_method_data { - domain::PaymentMethodData::PayLater(domain::PayLaterData::KlarnaSdk { .. }) => { + PaymentMethodData::PayLater(PayLaterData::KlarnaSdk { .. }) => { match request.order_details.clone() { Some(order_details) => Ok(Self { purchase_country: item.router_data.get_billing_country()?, @@ -277,7 +285,7 @@ impl TryFrom<&KlarnaRouterData<&types::PaymentsAuthorizeRouterData>> for KlarnaP })), } } - domain::PaymentMethodData::PayLater(domain::PayLaterData::KlarnaRedirect {}) => { + PaymentMethodData::PayLater(PayLaterData::KlarnaRedirect {}) => { match request.order_details.clone() { Some(order_details) => Ok(Self { purchase_country: item.router_data.get_billing_country()?, @@ -356,14 +364,12 @@ fn get_address_info( }) } -impl TryFrom> +impl TryFrom> for types::PaymentsAuthorizeRouterData { type Error = error_stack::Report; - fn try_from( - item: types::PaymentsResponseRouterData, - ) -> Result { + fn try_from(item: PaymentsResponseRouterData) -> Result { match item.response { KlarnaAuthResponse::KlarnaPaymentsAuthResponse(ref response) => { let connector_response = @@ -371,18 +377,16 @@ impl TryFrom> .authorized_payment_method .as_ref() .map(|authorized_payment_method| { - types::ConnectorResponseData::with_additional_payment_method_data( - types::AdditionalPaymentMethodConnectorResponse::from( + ConnectorResponseData::with_additional_payment_method_data( + AdditionalPaymentMethodConnectorResponse::from( authorized_payment_method.clone(), ), ) }); Ok(Self { - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - response.order_id.clone(), - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.order_id.clone()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -391,19 +395,17 @@ impl TryFrom> incremental_authorization_allowed: None, charge_id: None, }), - status: enums::AttemptStatus::foreign_from(( + status: get_fraud_status( response.fraud_status.clone(), item.data.request.is_auto_capture()?, - )), + ), connector_response, ..item.data }) } KlarnaAuthResponse::KlarnaCheckoutAuthResponse(ref response) => Ok(Self { - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - response.order_id.clone(), - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.order_id.clone()), redirection_data: Box::new(Some(RedirectForm::Html { html_data: response.html_snippet.clone(), })), @@ -414,10 +416,10 @@ impl TryFrom> incremental_authorization_allowed: None, charge_id: None, }), - status: enums::AttemptStatus::foreign_from(( + status: get_checkout_status( response.status.clone(), item.data.request.is_auto_capture()?, - )), + ), connector_response: None, ..item.data }), @@ -448,10 +450,10 @@ pub struct KlarnaAuthType { pub password: Secret, } -impl TryFrom<&types::ConnectorAuthType> for KlarnaAuthType { +impl TryFrom<&ConnectorAuthType> for KlarnaAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::BodyKey { api_key, key1 } = auth_type { + fn try_from(auth_type: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::BodyKey { api_key, key1 } = auth_type { Ok(Self { username: key1.to_owned(), password: api_key.to_owned(), @@ -477,34 +479,36 @@ pub enum KlarnaCheckoutStatus { CheckoutIncomplete, } -impl ForeignFrom<(KlarnaFraudStatus, bool)> for enums::AttemptStatus { - fn foreign_from((klarna_status, is_auto_capture): (KlarnaFraudStatus, bool)) -> Self { - match klarna_status { - KlarnaFraudStatus::Accepted => { - if is_auto_capture { - Self::Charged - } else { - Self::Authorized - } +fn get_fraud_status( + klarna_status: KlarnaFraudStatus, + is_auto_capture: bool, +) -> common_enums::AttemptStatus { + match klarna_status { + KlarnaFraudStatus::Accepted => { + if is_auto_capture { + common_enums::AttemptStatus::Charged + } else { + common_enums::AttemptStatus::Authorized } - KlarnaFraudStatus::Pending => Self::Pending, - KlarnaFraudStatus::Rejected => Self::Failure, } + KlarnaFraudStatus::Pending => common_enums::AttemptStatus::Pending, + KlarnaFraudStatus::Rejected => common_enums::AttemptStatus::Failure, } } -impl ForeignFrom<(KlarnaCheckoutStatus, bool)> for enums::AttemptStatus { - fn foreign_from((klarna_status, is_auto_capture): (KlarnaCheckoutStatus, bool)) -> Self { - match klarna_status { - KlarnaCheckoutStatus::CheckoutIncomplete => { - if is_auto_capture { - Self::AuthenticationPending - } else { - Self::Authorized - } +fn get_checkout_status( + klarna_status: KlarnaCheckoutStatus, + is_auto_capture: bool, +) -> common_enums::AttemptStatus { + match klarna_status { + KlarnaCheckoutStatus::CheckoutIncomplete => { + if is_auto_capture { + common_enums::AttemptStatus::AuthenticationPending + } else { + common_enums::AttemptStatus::Authorized } - KlarnaCheckoutStatus::CheckoutComplete => Self::Charged, } + KlarnaCheckoutStatus::CheckoutComplete => common_enums::AttemptStatus::Charged, } } @@ -552,21 +556,18 @@ impl From for enums::AttemptStatus { } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { match item.response { KlarnaPsyncResponse::KlarnaSDKPsyncResponse(response) => Ok(Self { status: enums::AttemptStatus::from(response.status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - response.order_id.clone(), - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.order_id.clone()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -580,14 +581,9 @@ impl ..item.data }), KlarnaPsyncResponse::KlarnaCheckoutPSyncResponse(response) => Ok(Self { - status: enums::AttemptStatus::foreign_from(( - response.status.clone(), - response.options.auto_capture, - )), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - response.order_id.clone(), - ), + status: get_checkout_status(response.status.clone(), response.options.auto_capture), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.order_id.clone()), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -632,22 +628,16 @@ pub struct KlarnaCaptureResponse { } impl - TryFrom< - types::ResponseRouterData< - F, - KlarnaCaptureResponse, - types::PaymentsCaptureData, - types::PaymentsResponseData, - >, - > for types::RouterData + TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, KlarnaCaptureResponse, - types::PaymentsCaptureData, - types::PaymentsResponseData, + PaymentsCaptureData, + PaymentsResponseData, >, ) -> Result { let connector_meta = serde_json::json!(KlarnaMeta { @@ -664,8 +654,8 @@ impl let resource_id = item.data.request.connector_transaction_id.clone(); Ok(Self { - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(resource_id), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(resource_id), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: Some(connector_meta), @@ -704,12 +694,12 @@ pub struct KlarnaRefundResponse { pub refund_id: String, } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { // https://docs.klarna.com/api/ordermanagement/#operation/refundOrder // If 201 status code, then Refund is Successful, other status codes are handled by the error handler @@ -719,7 +709,7 @@ impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { // https://docs.klarna.com/api/ordermanagement/#operation/get // If 200 status code, then Refund is Successful, other status codes are handled by the error handler @@ -748,7 +738,7 @@ impl TryFrom for Mifinity +impl ConnectorIntegration + for Mifinity { // Not Implemented (R) } @@ -70,9 +88,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![ ( headers::CONTENT_TYPE.to_string(), @@ -102,14 +120,14 @@ impl ConnectorCommon for Mifinity { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.mifinity.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = mifinity::MifinityAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -126,9 +144,9 @@ impl ConnectorCommon for Mifinity { if res.response.is_empty() { Ok(ErrorResponse { status_code: res.status_code, - code: consts::NO_ERROR_CODE.to_string(), - message: consts::NO_ERROR_MESSAGE.to_string(), - reason: Some(consts::CONNECTOR_UNAUTHORIZED_ERROR.to_string()), + code: NO_ERROR_CODE.to_string(), + message: NO_ERROR_MESSAGE.to_string(), + reason: Some(CONNECTOR_UNAUTHORIZED_ERROR.to_string()), attempt_status: None, connector_transaction_id: None, }) @@ -183,34 +201,23 @@ impl ConnectorValidation for Mifinity { //TODO: implement functions when support enabled } -impl ConnectorIntegration - for Mifinity -{ +impl ConnectorIntegration for Mifinity { //TODO: implement sessions flow } -impl ConnectorIntegration - for Mifinity -{ -} +impl ConnectorIntegration for Mifinity {} -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Mifinity +impl ConnectorIntegration + for Mifinity { } -impl ConnectorIntegration - for Mifinity -{ +impl ConnectorIntegration for Mifinity { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -220,8 +227,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}pegasus-ci/api/gateway/init-iframe", @@ -231,8 +238,8 @@ impl ConnectorIntegration CustomResult { let amount = convert_amount( self.amount_converter, @@ -247,12 +254,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -269,17 +276,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: mifinity::MifinityPaymentsResponse = res .response .parse_struct("Mifinity PaymentsAuthorizeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -302,14 +309,12 @@ impl ConnectorIntegration - for Mifinity -{ +impl ConnectorIntegration for Mifinity { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -319,8 +324,8 @@ impl ConnectorIntegration CustomResult { let merchant_id = &req.merchant_id; let payment_id = &req.connector_request_reference_id; @@ -334,12 +339,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -349,10 +354,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: mifinity::MifinityPsyncResponse = res .response .parse_struct("mifinity PaymentsSyncResponse") @@ -360,7 +365,7 @@ impl ConnectorIntegration - for Mifinity -{ +impl ConnectorIntegration for Mifinity { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -393,28 +396,28 @@ impl ConnectorIntegration CustomResult { Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) } fn get_request_body( &self, - _req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { Err(errors::ConnectorError::NotImplemented("get_request_body method".to_string()).into()) } fn build_request( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -429,17 +432,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: mifinity::MifinityPaymentsResponse = res .response .parse_struct("Mifinity PaymentsCaptureResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -455,19 +458,14 @@ impl ConnectorIntegration - for Mifinity -{ -} +impl ConnectorIntegration for Mifinity {} -impl ConnectorIntegration - for Mifinity -{ +impl ConnectorIntegration for Mifinity { fn build_request( &self, - _req: &types::RefundsRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RefundsRouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err(errors::ConnectorError::FlowNotSupported { flow: "Refunds".to_string(), connector: "Mifinity".to_string(), @@ -476,27 +474,27 @@ impl ConnectorIntegration for Mifinity {} +impl ConnectorIntegration for Mifinity {} #[async_trait::async_trait] -impl api::IncomingWebhook for Mifinity { +impl IncomingWebhook for Mifinity { fn get_webhook_object_reference_id( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_event_type( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_resource_object( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } diff --git a/crates/router/src/connector/mifinity/transformers.rs b/crates/hyperswitch_connectors/src/connectors/mifinity/transformers.rs similarity index 72% rename from crates/router/src/connector/mifinity/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/mifinity/transformers.rs index f913077d1dc..f89542d7810 100644 --- a/crates/router/src/connector/mifinity/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/mifinity/transformers.rs @@ -1,17 +1,24 @@ +use common_enums::enums; use common_utils::{ pii::{self, Email}, types::StringMajorUnit, }; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::{PaymentMethodData, WalletData}, + router_data::{ConnectorAuthType, RouterData}, + router_request_types::ResponseId, + router_response_types::{PaymentsResponseData, RedirectForm}, + types, +}; +use hyperswitch_interfaces::errors; use masking::Secret; use serde::{Deserialize, Serialize}; use time::Date; use crate::{ - connector::utils::{self, PaymentsAuthorizeRequestData, PhoneDetailsData, RouterData}, - core::errors, - services, - types::{self, domain, storage::enums}, + types::ResponseRouterData, + utils::{self, PaymentsAuthorizeRequestData, PhoneDetailsData, RouterData as _}, }; pub struct MifinityRouterData { @@ -102,8 +109,8 @@ impl TryFrom<&MifinityRouterData<&types::PaymentsAuthorizeRouterData>> for Mifin config: "merchant_connector_account.metadata", })?; match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::Wallet(wallet_data) => match wallet_data { - domain::WalletData::Mifinity(data) => { + PaymentMethodData::Wallet(wallet_data) => match wallet_data { + WalletData::Mifinity(data) => { let money = Money { amount: item.amount.clone(), currency: item.router_data.request.currency.to_string(), @@ -151,56 +158,56 @@ impl TryFrom<&MifinityRouterData<&types::PaymentsAuthorizeRouterData>> for Mifin language_preference, }) } - domain::WalletData::AliPayQr(_) - | domain::WalletData::AliPayRedirect(_) - | domain::WalletData::AliPayHkRedirect(_) - | domain::WalletData::AmazonPayRedirect(_) - | domain::WalletData::MomoRedirect(_) - | domain::WalletData::KakaoPayRedirect(_) - | domain::WalletData::GoPayRedirect(_) - | domain::WalletData::GcashRedirect(_) - | domain::WalletData::ApplePay(_) - | domain::WalletData::ApplePayRedirect(_) - | domain::WalletData::ApplePayThirdPartySdk(_) - | domain::WalletData::DanaRedirect {} - | domain::WalletData::GooglePay(_) - | domain::WalletData::GooglePayRedirect(_) - | domain::WalletData::GooglePayThirdPartySdk(_) - | domain::WalletData::MbWayRedirect(_) - | domain::WalletData::MobilePayRedirect(_) - | domain::WalletData::PaypalRedirect(_) - | domain::WalletData::PaypalSdk(_) - | domain::WalletData::Paze(_) - | domain::WalletData::SamsungPay(_) - | domain::WalletData::TwintRedirect {} - | domain::WalletData::VippsRedirect {} - | domain::WalletData::TouchNGoRedirect(_) - | domain::WalletData::WeChatPayRedirect(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::SwishQr(_) => Err(errors::ConnectorError::NotImplemented( + WalletData::AliPayQr(_) + | WalletData::AliPayRedirect(_) + | WalletData::AliPayHkRedirect(_) + | WalletData::AmazonPayRedirect(_) + | WalletData::MomoRedirect(_) + | WalletData::KakaoPayRedirect(_) + | WalletData::GoPayRedirect(_) + | WalletData::GcashRedirect(_) + | WalletData::ApplePay(_) + | WalletData::ApplePayRedirect(_) + | WalletData::ApplePayThirdPartySdk(_) + | WalletData::DanaRedirect {} + | WalletData::GooglePay(_) + | WalletData::GooglePayRedirect(_) + | WalletData::GooglePayThirdPartySdk(_) + | WalletData::MbWayRedirect(_) + | WalletData::MobilePayRedirect(_) + | WalletData::PaypalRedirect(_) + | WalletData::PaypalSdk(_) + | WalletData::Paze(_) + | WalletData::SamsungPay(_) + | WalletData::TwintRedirect {} + | WalletData::VippsRedirect {} + | WalletData::TouchNGoRedirect(_) + | WalletData::WeChatPayRedirect(_) + | WalletData::WeChatPayQr(_) + | WalletData::CashappQr(_) + | WalletData::SwishQr(_) => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Mifinity"), ) .into()), }, - domain::PaymentMethodData::Card(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Card(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Mifinity"), ) @@ -215,11 +222,11 @@ pub struct MifinityAuthType { pub(super) key: Secret, } -impl TryFrom<&types::ConnectorAuthType> for MifinityAuthType { +impl TryFrom<&ConnectorAuthType> for MifinityAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { + fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { - types::ConnectorAuthType::HeaderKey { api_key } => Ok(Self { + ConnectorAuthType::HeaderKey { api_key } => Ok(Self { key: api_key.to_owned(), }), _ => Err(errors::ConnectorError::FailedToObtainAuthType.into()), @@ -239,18 +246,12 @@ pub struct MifinityPayload { initialization_token: String, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - MifinityPaymentsResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let payload = item.response.payload.first(); match payload { @@ -259,9 +260,9 @@ impl let initialization_token = payload.initialization_token.clone(); Ok(Self { status: enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(trace_id.clone()), - redirection_data: Box::new(Some(services::RedirectForm::Mifinity { + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(trace_id.clone()), + redirection_data: Box::new(Some(RedirectForm::Mifinity { initialization_token, })), mandate_reference: Box::new(None), @@ -276,8 +277,8 @@ impl } None => Ok(Self { status: enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -323,13 +324,12 @@ pub enum MifinityPaymentStatus { NotCompleted, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let payload = item.response.payload.first(); @@ -343,8 +343,8 @@ impl let transaction_reference = payment_response.transaction_reference.clone(); Ok(Self { status: enums::AttemptStatus::from(status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( transaction_reference, ), redirection_data: Box::new(None), @@ -360,8 +360,8 @@ impl } None => Ok(Self { status: enums::AttemptStatus::from(status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -376,8 +376,8 @@ impl } None => Ok(Self { status: item.data.status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, diff --git a/crates/router/src/connector/nuvei.rs b/crates/hyperswitch_connectors/src/connectors/nuvei.rs similarity index 67% rename from crates/router/src/connector/nuvei.rs rename to crates/hyperswitch_connectors/src/connectors/nuvei.rs index c72bee24fa2..803a92b7c12 100644 --- a/crates/router/src/connector/nuvei.rs +++ b/crates/hyperswitch_connectors/src/connectors/nuvei.rs @@ -2,33 +2,56 @@ pub mod transformers; use std::fmt::Debug; -use ::common_utils::{ +use api_models::{payments::PaymentIdType, webhooks::IncomingWebhookEvent}; +use common_enums::{enums, CallConnectorAction, PaymentAction}; +use common_utils::{ crypto, - errors::ReportSwitchExt, - ext_traits::{BytesExt, ValueExt}, - request::RequestContent, + errors::{CustomResult, ReportSwitchExt}, + ext_traits::{ByteSliceExt, BytesExt, ValueExt}, + id_type, + request::{Method, Request, RequestBuilder, RequestContent}, }; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + AuthorizeSessionToken, CompleteAuthorize, PreProcessing, + }, + router_request_types::{ + AccessTokenRequestData, AuthorizeSessionTokenData, CompleteAuthorizeData, + PaymentMethodTokenizationData, PaymentsAuthorizeData, PaymentsCancelData, + PaymentsCaptureData, PaymentsPreProcessingData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsAuthorizeSessionTokenRouterData, + PaymentsCancelRouterData, PaymentsCaptureRouterData, PaymentsCompleteAuthorizeRouterData, + PaymentsPreProcessingRouterData, PaymentsSyncRouterData, RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorRedirectResponse, + ConnectorSpecifications, ConnectorValidation, + }, + configs::Connectors, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; use masking::ExposeInterface; use transformers as nuvei; -use super::utils::{self, is_mandate_supported, PaymentMethodDataType, RouterData}; use crate::{ - configs::settings, - core::{ - errors::{self, CustomResult}, - payments, - }, - events::connector_api_logs::ConnectorEvent, - headers, - services::{self, request, ConnectorIntegration, ConnectorSpecifications, ConnectorValidation}, - types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - storage::enums, - ErrorResponse, Response, - }, - utils::ByteSliceExt, + constants::headers, + types::ResponseRouterData, + utils::{self, is_mandate_supported, PaymentMethodDataType, RouterData as _}, }; #[derive(Debug, Clone)] @@ -40,9 +63,9 @@ where { fn build_headers( &self, - _req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let headers = vec![( headers::CONTENT_TYPE.to_string(), self.get_content_type().to_string().into(), @@ -60,14 +83,14 @@ impl ConnectorCommon for Nuvei { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.nuvei.base_url.as_ref() } fn get_auth_header( &self, - _auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + _auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { Ok(vec![]) } } @@ -93,7 +116,7 @@ impl ConnectorValidation for Nuvei { fn validate_mandate_payment( &self, pm_type: Option, - pm_data: types::domain::payments::PaymentMethodData, + pm_data: PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([PaymentMethodDataType::Card]); is_mandate_supported(pm_data, pm_type, mandate_supported_pmd, self.id()) @@ -104,12 +127,8 @@ impl api::Payment for Nuvei {} impl api::PaymentToken for Nuvei {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Nuvei +impl ConnectorIntegration + for Nuvei { // Not Implemented (R) } @@ -128,22 +147,12 @@ impl api::PaymentsCompleteAuthorize for Nuvei {} impl api::ConnectorAccessToken for Nuvei {} impl api::PaymentsPreProcessing for Nuvei {} -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Nuvei -{ +impl ConnectorIntegration for Nuvei { fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Nuvei".to_string()) .into(), @@ -151,18 +160,14 @@ impl } } -impl - ConnectorIntegration< - api::CompleteAuthorize, - types::CompleteAuthorizeData, - types::PaymentsResponseData, - > for Nuvei +impl ConnectorIntegration + for Nuvei { fn get_headers( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_content_type(&self) -> &'static str { @@ -170,8 +175,8 @@ impl } fn get_url( &self, - _req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, + _req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}ppp/api/v1/payment.do", @@ -180,8 +185,8 @@ impl } fn get_request_body( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCompleteAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { let meta: nuvei::NuveiMeta = utils::to_connector_meta(req.request.connector_meta.clone())?; let connector_req = nuvei::NuveiPaymentsRequest::try_from((req, meta.session_token))?; @@ -190,12 +195,12 @@ impl } fn build_request( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCompleteAuthorizeType::get_url( self, req, connectors, )?) @@ -211,10 +216,10 @@ impl } fn handle_response( &self, - data: &types::PaymentsCompleteAuthorizeRouterData, + data: &PaymentsCompleteAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -223,7 +228,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -240,14 +245,12 @@ impl } } -impl ConnectorIntegration - for Nuvei -{ +impl ConnectorIntegration for Nuvei { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -257,8 +260,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ppp/api/v1/voidTransaction.do", @@ -268,8 +271,8 @@ impl ConnectorIntegration CustomResult { let connector_req = nuvei::NuveiPaymentFlowRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -277,11 +280,11 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) @@ -294,17 +297,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") .switch()?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -321,19 +324,14 @@ impl ConnectorIntegration - for Nuvei -{ -} +impl ConnectorIntegration for Nuvei {} -impl ConnectorIntegration - for Nuvei -{ +impl ConnectorIntegration for Nuvei { fn get_headers( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -343,8 +341,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ppp/api/v1/getPaymentStatus.do", @@ -354,20 +352,20 @@ impl ConnectorIntegration CustomResult { let connector_req = nuvei::NuveiPaymentSyncRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) } fn build_request( &self, - req: &types::PaymentsSyncRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -388,10 +386,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -400,7 +398,7 @@ impl ConnectorIntegration - for Nuvei -{ +impl ConnectorIntegration for Nuvei { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -426,8 +422,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ppp/api/v1/settleTransaction.do", @@ -437,8 +433,8 @@ impl ConnectorIntegration CustomResult { let connector_req = nuvei::NuveiPaymentFlowRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -446,12 +442,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -466,10 +462,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -478,7 +474,7 @@ impl ConnectorIntegration - for Nuvei -{ -} +impl ConnectorIntegration for Nuvei {} #[async_trait::async_trait] -impl ConnectorIntegration - for Nuvei -{ +impl ConnectorIntegration for Nuvei { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -518,8 +509,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ppp/api/v1/payment.do", @@ -529,8 +520,8 @@ impl ConnectorIntegration CustomResult { let connector_req = nuvei::NuveiPaymentsRequest::try_from((req, req.get_session_token()?))?; @@ -539,12 +530,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -561,10 +552,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -573,7 +564,7 @@ impl ConnectorIntegration for Nuvei +impl ConnectorIntegration + for Nuvei { fn get_headers( &self, - req: &types::PaymentsAuthorizeSessionTokenRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsAuthorizeSessionTokenRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -611,8 +598,8 @@ impl fn get_url( &self, - _req: &types::PaymentsAuthorizeSessionTokenRouterData, - connectors: &settings::Connectors, + _req: &PaymentsAuthorizeSessionTokenRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}ppp/api/v1/getSessionToken.do", @@ -622,8 +609,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsAuthorizeSessionTokenRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeSessionTokenRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = nuvei::NuveiSessionRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -631,12 +618,12 @@ impl fn build_request( &self, - req: &types::PaymentsAuthorizeSessionTokenRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeSessionTokenRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsPreAuthorizeType::get_url( self, req, connectors, )?) @@ -653,17 +640,17 @@ impl fn handle_response( &self, - data: &types::PaymentsAuthorizeSessionTokenRouterData, + data: &PaymentsAuthorizeSessionTokenRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiSessionResponse = res.response.parse_struct("NuveiSessionResponse").switch()?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -679,18 +666,14 @@ impl } } -impl - ConnectorIntegration< - api::PreProcessing, - types::PaymentsPreProcessingData, - types::PaymentsResponseData, - > for Nuvei +impl ConnectorIntegration + for Nuvei { fn get_headers( &self, - req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -700,8 +683,8 @@ impl fn get_url( &self, - _req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, + _req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}ppp/api/v1/initPayment.do", @@ -711,8 +694,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsPreProcessingRouterData, - _connectors: &settings::Connectors, + req: &PaymentsPreProcessingRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = nuvei::NuveiPaymentsRequest::try_from((req, req.get_session_token()?))?; @@ -721,12 +704,12 @@ impl fn build_request( &self, - req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsPreProcessingType::get_url( self, req, connectors, )?) @@ -743,10 +726,10 @@ impl fn handle_response( &self, - data: &types::PaymentsPreProcessingRouterData, + data: &PaymentsPreProcessingRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -755,7 +738,7 @@ impl event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -772,12 +755,12 @@ impl } } -impl ConnectorIntegration for Nuvei { +impl ConnectorIntegration for Nuvei { fn get_headers( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -787,8 +770,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + _req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}ppp/api/v1/refundTransaction.do", @@ -798,8 +781,8 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = nuvei::NuveiPaymentFlowRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -807,11 +790,11 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -826,10 +809,10 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: nuvei::NuveiPaymentsResponse = res .response .parse_struct("NuveiPaymentsResponse") @@ -838,7 +821,7 @@ impl ConnectorIntegration for Nuvei {} +impl ConnectorIntegration for Nuvei {} #[async_trait::async_trait] -impl api::IncomingWebhook for Nuvei { +impl IncomingWebhook for Nuvei { fn get_webhook_source_verification_algorithm( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Ok(Box::new(crypto::Sha256)) } fn get_webhook_source_verification_signature( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, _connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { let signature = utils::get_header_key_value("advanceResponseChecksum", request.headers)?; @@ -877,8 +860,8 @@ impl api::IncomingWebhook for Nuvei { fn get_webhook_source_verification_message( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - _merchant_id: &common_utils::id_type::MerchantId, + request: &IncomingWebhookRequestDetails<'_>, + _merchant_id: &id_type::MerchantId, connector_webhook_secrets: &api_models::webhooks::ConnectorWebhookSecrets, ) -> CustomResult, errors::ConnectorError> { let body = serde_urlencoded::from_str::(&request.query_params) @@ -901,39 +884,35 @@ impl api::IncomingWebhook for Nuvei { fn get_webhook_object_reference_id( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let body = serde_urlencoded::from_str::(&request.query_params) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; Ok(api_models::webhooks::ObjectReferenceId::PaymentId( - api::PaymentIdType::ConnectorTransactionId(body.ppp_transaction_id), + PaymentIdType::ConnectorTransactionId(body.ppp_transaction_id), )) } fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let body = serde_urlencoded::from_str::(&request.query_params) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; match body.status { - nuvei::NuveiWebhookStatus::Approved => { - Ok(api::IncomingWebhookEvent::PaymentIntentSuccess) - } - nuvei::NuveiWebhookStatus::Declined => { - Ok(api::IncomingWebhookEvent::PaymentIntentFailure) - } + nuvei::NuveiWebhookStatus::Approved => Ok(IncomingWebhookEvent::PaymentIntentSuccess), + nuvei::NuveiWebhookStatus::Declined => Ok(IncomingWebhookEvent::PaymentIntentFailure), nuvei::NuveiWebhookStatus::Unknown | nuvei::NuveiWebhookStatus::Pending - | nuvei::NuveiWebhookStatus::Update => Ok(api::IncomingWebhookEvent::EventNotSupported), + | nuvei::NuveiWebhookStatus::Update => Ok(IncomingWebhookEvent::EventNotSupported), } } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let body = serde_urlencoded::from_str::(&request.query_params) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; @@ -943,19 +922,18 @@ impl api::IncomingWebhook for Nuvei { } } -impl services::ConnectorRedirectResponse for Nuvei { +impl ConnectorRedirectResponse for Nuvei { fn get_flow_type( &self, _query_params: &str, json_payload: Option, - action: services::PaymentAction, - ) -> CustomResult { + action: PaymentAction, + ) -> CustomResult { match action { - services::PaymentAction::PSync - | services::PaymentAction::PaymentAuthenticateCompleteAuthorize => { - Ok(payments::CallConnectorAction::Trigger) + PaymentAction::PSync | PaymentAction::PaymentAuthenticateCompleteAuthorize => { + Ok(CallConnectorAction::Trigger) } - services::PaymentAction::CompleteAuthorize => { + PaymentAction::CompleteAuthorize => { if let Some(payload) = json_payload { let redirect_response: nuvei::NuveiRedirectionResponse = payload.parse_value("NuveiRedirectionResponse").switch()?; @@ -966,16 +944,16 @@ impl services::ConnectorRedirectResponse for Nuvei { .switch()?; match acs_response.trans_status { None | Some(nuvei::LiabilityShift::Failed) => { - Ok(payments::CallConnectorAction::StatusUpdate { + Ok(CallConnectorAction::StatusUpdate { status: enums::AttemptStatus::AuthenticationFailed, error_code: None, error_message: None, }) } - _ => Ok(payments::CallConnectorAction::Trigger), + _ => Ok(CallConnectorAction::Trigger), } } else { - Ok(payments::CallConnectorAction::Trigger) + Ok(CallConnectorAction::Trigger) } } } diff --git a/crates/router/src/connector/nuvei/transformers.rs b/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs similarity index 72% rename from crates/router/src/connector/nuvei/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs index 136d0531d9a..84fb7bfecf2 100644 --- a/crates/router/src/connector/nuvei/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/nuvei/transformers.rs @@ -1,28 +1,62 @@ +use common_enums::enums; use common_utils::{ crypto::{self, GenerateDigest}, date_time, - ext_traits::Encode, + ext_traits::{Encode, OptionExt}, fp_utils, pii::{Email, IpAddress}, + request::Method, }; use error_stack::ResultExt; -use hyperswitch_domain_models::mandates::{MandateData, MandateDataType}; +use hyperswitch_domain_models::{ + mandates::{MandateData, MandateDataType}, + payment_method_data::{ + self, ApplePayWalletData, BankRedirectData, GooglePayWalletData, PayLaterData, + PaymentMethodData, WalletData, + }, + router_data::{ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + refunds::{Execute, RSync}, + Authorize, Capture, CompleteAuthorize, PSync, Void, + }, + router_request_types::{ + BrowserInformation, PaymentsAuthorizeData, PaymentsPreProcessingData, ResponseId, + }, + router_response_types::{ + MandateReference, PaymentsResponseData, RedirectForm, RefundsResponseData, + }, + types, +}; +use hyperswitch_interfaces::{ + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, +}; use masking::{ExposeInterface, PeekInterface, Secret}; -use reqwest::Url; use serde::{Deserialize, Serialize}; +use url::Url; use crate::{ - connector::utils::{ - self, AddressDetailsData, BrowserInformationData, PaymentsAuthorizeRequestData, - PaymentsCancelRequestData, PaymentsPreProcessingData, RouterData, + types::{ + PaymentsPreprocessingResponseRouterData, RefundsResponseRouterData, ResponseRouterData, + }, + utils::{ + self, AddressDetailsData, BrowserInformationData, ForeignTryFrom, + PaymentsAuthorizeRequestData, PaymentsCancelRequestData, PaymentsPreProcessingRequestData, + RouterData as _, }, - consts, - core::errors, - services, - types::{self, api, domain, storage::enums, transformers::ForeignTryFrom, BrowserInformation}, - utils::OptionExt, }; +fn to_boolean(string: String) -> bool { + let str = string.as_str(); + match str { + "true" => true, + "false" => false, + "yes" => true, + "no" => false, + _ => false, + } +} + trait NuveiAuthorizePreprocessingCommon { fn get_browser_info(&self) -> Option; fn get_related_transaction_id(&self) -> Option; @@ -37,13 +71,13 @@ trait NuveiAuthorizePreprocessingCommon { fn get_amount_required(&self) -> Result>; fn get_currency_required( &self, - ) -> Result>; + ) -> Result>; fn get_payment_method_data_required( &self, - ) -> Result>; + ) -> Result>; } -impl NuveiAuthorizePreprocessingCommon for types::PaymentsAuthorizeData { +impl NuveiAuthorizePreprocessingCommon for PaymentsAuthorizeData { fn get_browser_info(&self) -> Option { self.browser_info.clone() } @@ -84,17 +118,17 @@ impl NuveiAuthorizePreprocessingCommon for types::PaymentsAuthorizeData { fn get_currency_required( &self, - ) -> Result> { + ) -> Result> { Ok(self.currency) } fn get_payment_method_data_required( &self, - ) -> Result> { + ) -> Result> { Ok(self.payment_method_data.clone()) } } -impl NuveiAuthorizePreprocessingCommon for types::PaymentsPreProcessingData { +impl NuveiAuthorizePreprocessingCommon for PaymentsPreProcessingData { fn get_browser_info(&self) -> Option { self.browser_info.clone() } @@ -135,12 +169,12 @@ impl NuveiAuthorizePreprocessingCommon for types::PaymentsPreProcessingData { fn get_currency_required( &self, - ) -> Result> { + ) -> Result> { self.get_currency() } fn get_payment_method_data_required( &self, - ) -> Result> { + ) -> Result> { self.payment_method_data.clone().ok_or( errors::ConnectorError::MissingRequiredField { field_name: "payment_method_data", @@ -194,7 +228,7 @@ pub struct NuveiPaymentsRequest { pub merchant_site_id: Secret, pub client_request_id: Secret, pub amount: String, - pub currency: diesel_models::enums::Currency, + pub currency: enums::Currency, /// This ID uniquely identifies your consumer/user in your system. pub user_token_id: Option, pub client_unique_id: String, @@ -237,7 +271,7 @@ pub struct NuveiPaymentFlowRequest { pub merchant_site_id: Secret, pub client_request_id: String, pub amount: String, - pub currency: diesel_models::enums::Currency, + pub currency: enums::Currency, pub related_transaction_id: Option, pub checksum: Secret, } @@ -531,18 +565,17 @@ impl TryFrom<&types::PaymentsAuthorizeSessionTokenRouterData> for NuveiSessionRe } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { status: enums::AttemptStatus::Pending, session_token: Some(item.response.session_token.clone().expose()), - response: Ok(types::PaymentsResponseData::SessionTokenResponse { + response: Ok(PaymentsResponseData::SessionTokenResponse { session_token: item.response.session_token.expose(), }), ..item.data @@ -552,14 +585,14 @@ impl #[derive(Debug)] pub struct NuveiCardDetails { - card: domain::Card, + card: payment_method_data::Card, three_d: Option, card_holder_name: Option>, } -impl TryFrom for NuveiPaymentsRequest { +impl TryFrom for NuveiPaymentsRequest { type Error = error_stack::Report; - fn try_from(gpay_data: domain::GooglePayWalletData) -> Result { + fn try_from(gpay_data: GooglePayWalletData) -> Result { Ok(Self { payment_option: PaymentOption { card: Some(Card { @@ -579,8 +612,8 @@ impl TryFrom for NuveiPaymentsRequest { }) } } -impl From for NuveiPaymentsRequest { - fn from(apple_pay_data: domain::ApplePayWalletData) -> Self { +impl From for NuveiPaymentsRequest { + fn from(apple_pay_data: ApplePayWalletData) -> Self { Self { payment_option: PaymentOption { card: Some(Card { @@ -597,161 +630,159 @@ impl From for NuveiPaymentsRequest { } } -impl TryFrom for NuveiBIC { +impl TryFrom for NuveiBIC { type Error = error_stack::Report; - fn try_from(bank: common_enums::enums::BankNames) -> Result { + fn try_from(bank: enums::BankNames) -> Result { match bank { - common_enums::enums::BankNames::AbnAmro => Ok(Self::Abnamro), - common_enums::enums::BankNames::AsnBank => Ok(Self::ASNBank), - common_enums::enums::BankNames::Bunq => Ok(Self::Bunq), - common_enums::enums::BankNames::Ing => Ok(Self::Ing), - common_enums::enums::BankNames::Knab => Ok(Self::Knab), - common_enums::enums::BankNames::Rabobank => Ok(Self::Rabobank), - common_enums::enums::BankNames::SnsBank => Ok(Self::SNSBank), - common_enums::enums::BankNames::TriodosBank => Ok(Self::TriodosBank), - common_enums::enums::BankNames::VanLanschot => Ok(Self::VanLanschotBankiers), - common_enums::enums::BankNames::Moneyou => Ok(Self::Moneyou), - - common_enums::enums::BankNames::AmericanExpress - | common_enums::enums::BankNames::AffinBank - | common_enums::enums::BankNames::AgroBank - | common_enums::enums::BankNames::AllianceBank - | common_enums::enums::BankNames::AmBank - | common_enums::enums::BankNames::BankOfAmerica - | common_enums::enums::BankNames::BankOfChina - | common_enums::enums::BankNames::BankIslam - | common_enums::enums::BankNames::BankMuamalat - | common_enums::enums::BankNames::BankRakyat - | common_enums::enums::BankNames::BankSimpananNasional - | common_enums::enums::BankNames::Barclays - | common_enums::enums::BankNames::BlikPSP - | common_enums::enums::BankNames::CapitalOne - | common_enums::enums::BankNames::Chase - | common_enums::enums::BankNames::Citi - | common_enums::enums::BankNames::CimbBank - | common_enums::enums::BankNames::Discover - | common_enums::enums::BankNames::NavyFederalCreditUnion - | common_enums::enums::BankNames::PentagonFederalCreditUnion - | common_enums::enums::BankNames::SynchronyBank - | common_enums::enums::BankNames::WellsFargo - | common_enums::enums::BankNames::Handelsbanken - | common_enums::enums::BankNames::HongLeongBank - | common_enums::enums::BankNames::HsbcBank - | common_enums::enums::BankNames::KuwaitFinanceHouse - | common_enums::enums::BankNames::Regiobank - | common_enums::enums::BankNames::Revolut - | common_enums::enums::BankNames::ArzteUndApothekerBank - | common_enums::enums::BankNames::AustrianAnadiBankAg - | common_enums::enums::BankNames::BankAustria - | common_enums::enums::BankNames::Bank99Ag - | common_enums::enums::BankNames::BankhausCarlSpangler - | common_enums::enums::BankNames::BankhausSchelhammerUndSchatteraAg - | common_enums::enums::BankNames::BankMillennium - | common_enums::enums::BankNames::BankPEKAOSA - | common_enums::enums::BankNames::BawagPskAg - | common_enums::enums::BankNames::BksBankAg - | common_enums::enums::BankNames::BrullKallmusBankAg - | common_enums::enums::BankNames::BtvVierLanderBank - | common_enums::enums::BankNames::CapitalBankGraweGruppeAg - | common_enums::enums::BankNames::CeskaSporitelna - | common_enums::enums::BankNames::Dolomitenbank - | common_enums::enums::BankNames::EasybankAg - | common_enums::enums::BankNames::EPlatbyVUB - | common_enums::enums::BankNames::ErsteBankUndSparkassen - | common_enums::enums::BankNames::FrieslandBank - | common_enums::enums::BankNames::HypoAlpeadriabankInternationalAg - | common_enums::enums::BankNames::HypoNoeLbFurNiederosterreichUWien - | common_enums::enums::BankNames::HypoOberosterreichSalzburgSteiermark - | common_enums::enums::BankNames::HypoTirolBankAg - | common_enums::enums::BankNames::HypoVorarlbergBankAg - | common_enums::enums::BankNames::HypoBankBurgenlandAktiengesellschaft - | common_enums::enums::BankNames::KomercniBanka - | common_enums::enums::BankNames::MBank - | common_enums::enums::BankNames::MarchfelderBank - | common_enums::enums::BankNames::Maybank - | common_enums::enums::BankNames::OberbankAg - | common_enums::enums::BankNames::OsterreichischeArzteUndApothekerbank - | common_enums::enums::BankNames::OcbcBank - | common_enums::enums::BankNames::PayWithING - | common_enums::enums::BankNames::PlaceZIPKO - | common_enums::enums::BankNames::PlatnoscOnlineKartaPlatnicza - | common_enums::enums::BankNames::PosojilnicaBankEGen - | common_enums::enums::BankNames::PostovaBanka - | common_enums::enums::BankNames::PublicBank - | common_enums::enums::BankNames::RaiffeisenBankengruppeOsterreich - | common_enums::enums::BankNames::RhbBank - | common_enums::enums::BankNames::SchelhammerCapitalBankAg - | common_enums::enums::BankNames::StandardCharteredBank - | common_enums::enums::BankNames::SchoellerbankAg - | common_enums::enums::BankNames::SpardaBankWien - | common_enums::enums::BankNames::SporoPay - | common_enums::enums::BankNames::SantanderPrzelew24 - | common_enums::enums::BankNames::TatraPay - | common_enums::enums::BankNames::Viamo - | common_enums::enums::BankNames::VolksbankGruppe - | common_enums::enums::BankNames::VolkskreditbankAg - | common_enums::enums::BankNames::VrBankBraunau - | common_enums::enums::BankNames::UobBank - | common_enums::enums::BankNames::PayWithAliorBank - | common_enums::enums::BankNames::BankiSpoldzielcze - | common_enums::enums::BankNames::PayWithInteligo - | common_enums::enums::BankNames::BNPParibasPoland - | common_enums::enums::BankNames::BankNowySA - | common_enums::enums::BankNames::CreditAgricole - | common_enums::enums::BankNames::PayWithBOS - | common_enums::enums::BankNames::PayWithCitiHandlowy - | common_enums::enums::BankNames::PayWithPlusBank - | common_enums::enums::BankNames::ToyotaBank - | common_enums::enums::BankNames::VeloBank - | common_enums::enums::BankNames::ETransferPocztowy24 - | common_enums::enums::BankNames::PlusBank - | common_enums::enums::BankNames::EtransferPocztowy24 - | common_enums::enums::BankNames::BankiSpbdzielcze - | common_enums::enums::BankNames::BankNowyBfgSa - | common_enums::enums::BankNames::GetinBank - | common_enums::enums::BankNames::Blik - | common_enums::enums::BankNames::NoblePay - | common_enums::enums::BankNames::IdeaBank - | common_enums::enums::BankNames::EnveloBank - | common_enums::enums::BankNames::NestPrzelew - | common_enums::enums::BankNames::MbankMtransfer - | common_enums::enums::BankNames::Inteligo - | common_enums::enums::BankNames::PbacZIpko - | common_enums::enums::BankNames::BnpParibas - | common_enums::enums::BankNames::BankPekaoSa - | common_enums::enums::BankNames::VolkswagenBank - | common_enums::enums::BankNames::AliorBank - | common_enums::enums::BankNames::Boz - | common_enums::enums::BankNames::BangkokBank - | common_enums::enums::BankNames::KrungsriBank - | common_enums::enums::BankNames::KrungThaiBank - | common_enums::enums::BankNames::TheSiamCommercialBank - | common_enums::enums::BankNames::KasikornBank - | common_enums::enums::BankNames::OpenBankSuccess - | common_enums::enums::BankNames::OpenBankFailure - | common_enums::enums::BankNames::OpenBankCancelled - | common_enums::enums::BankNames::Aib - | common_enums::enums::BankNames::BankOfScotland - | common_enums::enums::BankNames::DanskeBank - | common_enums::enums::BankNames::FirstDirect - | common_enums::enums::BankNames::FirstTrust - | common_enums::enums::BankNames::Halifax - | common_enums::enums::BankNames::Lloyds - | common_enums::enums::BankNames::Monzo - | common_enums::enums::BankNames::NatWest - | common_enums::enums::BankNames::NationwideBank - | common_enums::enums::BankNames::RoyalBankOfScotland - | common_enums::enums::BankNames::Starling - | common_enums::enums::BankNames::TsbBank - | common_enums::enums::BankNames::TescoBank - | common_enums::enums::BankNames::Yoursafe - | common_enums::enums::BankNames::N26 - | common_enums::enums::BankNames::NationaleNederlanden - | common_enums::enums::BankNames::UlsterBank => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Nuvei"), - ))? - } + enums::BankNames::AbnAmro => Ok(Self::Abnamro), + enums::BankNames::AsnBank => Ok(Self::ASNBank), + enums::BankNames::Bunq => Ok(Self::Bunq), + enums::BankNames::Ing => Ok(Self::Ing), + enums::BankNames::Knab => Ok(Self::Knab), + enums::BankNames::Rabobank => Ok(Self::Rabobank), + enums::BankNames::SnsBank => Ok(Self::SNSBank), + enums::BankNames::TriodosBank => Ok(Self::TriodosBank), + enums::BankNames::VanLanschot => Ok(Self::VanLanschotBankiers), + enums::BankNames::Moneyou => Ok(Self::Moneyou), + + enums::BankNames::AmericanExpress + | enums::BankNames::AffinBank + | enums::BankNames::AgroBank + | enums::BankNames::AllianceBank + | enums::BankNames::AmBank + | enums::BankNames::BankOfAmerica + | enums::BankNames::BankOfChina + | enums::BankNames::BankIslam + | enums::BankNames::BankMuamalat + | enums::BankNames::BankRakyat + | enums::BankNames::BankSimpananNasional + | enums::BankNames::Barclays + | enums::BankNames::BlikPSP + | enums::BankNames::CapitalOne + | enums::BankNames::Chase + | enums::BankNames::Citi + | enums::BankNames::CimbBank + | enums::BankNames::Discover + | enums::BankNames::NavyFederalCreditUnion + | enums::BankNames::PentagonFederalCreditUnion + | enums::BankNames::SynchronyBank + | enums::BankNames::WellsFargo + | enums::BankNames::Handelsbanken + | enums::BankNames::HongLeongBank + | enums::BankNames::HsbcBank + | enums::BankNames::KuwaitFinanceHouse + | enums::BankNames::Regiobank + | enums::BankNames::Revolut + | enums::BankNames::ArzteUndApothekerBank + | enums::BankNames::AustrianAnadiBankAg + | enums::BankNames::BankAustria + | enums::BankNames::Bank99Ag + | enums::BankNames::BankhausCarlSpangler + | enums::BankNames::BankhausSchelhammerUndSchatteraAg + | enums::BankNames::BankMillennium + | enums::BankNames::BankPEKAOSA + | enums::BankNames::BawagPskAg + | enums::BankNames::BksBankAg + | enums::BankNames::BrullKallmusBankAg + | enums::BankNames::BtvVierLanderBank + | enums::BankNames::CapitalBankGraweGruppeAg + | enums::BankNames::CeskaSporitelna + | enums::BankNames::Dolomitenbank + | enums::BankNames::EasybankAg + | enums::BankNames::EPlatbyVUB + | enums::BankNames::ErsteBankUndSparkassen + | enums::BankNames::FrieslandBank + | enums::BankNames::HypoAlpeadriabankInternationalAg + | enums::BankNames::HypoNoeLbFurNiederosterreichUWien + | enums::BankNames::HypoOberosterreichSalzburgSteiermark + | enums::BankNames::HypoTirolBankAg + | enums::BankNames::HypoVorarlbergBankAg + | enums::BankNames::HypoBankBurgenlandAktiengesellschaft + | enums::BankNames::KomercniBanka + | enums::BankNames::MBank + | enums::BankNames::MarchfelderBank + | enums::BankNames::Maybank + | enums::BankNames::OberbankAg + | enums::BankNames::OsterreichischeArzteUndApothekerbank + | enums::BankNames::OcbcBank + | enums::BankNames::PayWithING + | enums::BankNames::PlaceZIPKO + | enums::BankNames::PlatnoscOnlineKartaPlatnicza + | enums::BankNames::PosojilnicaBankEGen + | enums::BankNames::PostovaBanka + | enums::BankNames::PublicBank + | enums::BankNames::RaiffeisenBankengruppeOsterreich + | enums::BankNames::RhbBank + | enums::BankNames::SchelhammerCapitalBankAg + | enums::BankNames::StandardCharteredBank + | enums::BankNames::SchoellerbankAg + | enums::BankNames::SpardaBankWien + | enums::BankNames::SporoPay + | enums::BankNames::SantanderPrzelew24 + | enums::BankNames::TatraPay + | enums::BankNames::Viamo + | enums::BankNames::VolksbankGruppe + | enums::BankNames::VolkskreditbankAg + | enums::BankNames::VrBankBraunau + | enums::BankNames::UobBank + | enums::BankNames::PayWithAliorBank + | enums::BankNames::BankiSpoldzielcze + | enums::BankNames::PayWithInteligo + | enums::BankNames::BNPParibasPoland + | enums::BankNames::BankNowySA + | enums::BankNames::CreditAgricole + | enums::BankNames::PayWithBOS + | enums::BankNames::PayWithCitiHandlowy + | enums::BankNames::PayWithPlusBank + | enums::BankNames::ToyotaBank + | enums::BankNames::VeloBank + | enums::BankNames::ETransferPocztowy24 + | enums::BankNames::PlusBank + | enums::BankNames::EtransferPocztowy24 + | enums::BankNames::BankiSpbdzielcze + | enums::BankNames::BankNowyBfgSa + | enums::BankNames::GetinBank + | enums::BankNames::Blik + | enums::BankNames::NoblePay + | enums::BankNames::IdeaBank + | enums::BankNames::EnveloBank + | enums::BankNames::NestPrzelew + | enums::BankNames::MbankMtransfer + | enums::BankNames::Inteligo + | enums::BankNames::PbacZIpko + | enums::BankNames::BnpParibas + | enums::BankNames::BankPekaoSa + | enums::BankNames::VolkswagenBank + | enums::BankNames::AliorBank + | enums::BankNames::Boz + | enums::BankNames::BangkokBank + | enums::BankNames::KrungsriBank + | enums::BankNames::KrungThaiBank + | enums::BankNames::TheSiamCommercialBank + | enums::BankNames::KasikornBank + | enums::BankNames::OpenBankSuccess + | enums::BankNames::OpenBankFailure + | enums::BankNames::OpenBankCancelled + | enums::BankNames::Aib + | enums::BankNames::BankOfScotland + | enums::BankNames::DanskeBank + | enums::BankNames::FirstDirect + | enums::BankNames::FirstTrust + | enums::BankNames::Halifax + | enums::BankNames::Lloyds + | enums::BankNames::Monzo + | enums::BankNames::NatWest + | enums::BankNames::NationwideBank + | enums::BankNames::RoyalBankOfScotland + | enums::BankNames::Starling + | enums::BankNames::TsbBank + | enums::BankNames::TescoBank + | enums::BankNames::Yoursafe + | enums::BankNames::N26 + | enums::BankNames::NationaleNederlanden + | enums::BankNames::UlsterBank => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Nuvei"), + ))?, } } } @@ -759,8 +790,8 @@ impl TryFrom for NuveiBIC { impl ForeignTryFrom<( AlternativePaymentMethodType, - Option, - &types::RouterData, + Option, + &RouterData, )> for NuveiPaymentsRequest where Req: NuveiAuthorizePreprocessingCommon, @@ -769,8 +800,8 @@ where fn foreign_try_from( data: ( AlternativePaymentMethodType, - Option, - &types::RouterData, + Option, + &RouterData, ), ) -> Result { let (payment_method, redirect, item) = data; @@ -806,7 +837,7 @@ where } ( AlternativePaymentMethodType::Ideal, - Some(domain::BankRedirectData::Ideal { bank_name, .. }), + Some(BankRedirectData::Ideal { bank_name, .. }), ) => { let address = item.get_billing_address()?; let first_name = address.get_first_name()?.clone(); @@ -842,7 +873,7 @@ where fn get_pay_later_info( payment_method_type: AlternativePaymentMethodType, - item: &types::RouterData, + item: &RouterData, ) -> Result> where Req: NuveiAuthorizePreprocessingCommon, @@ -872,137 +903,128 @@ where }) } -impl - TryFrom<( - &types::RouterData, - String, - )> for NuveiPaymentsRequest +impl TryFrom<(&RouterData, String)> for NuveiPaymentsRequest where Req: NuveiAuthorizePreprocessingCommon, { type Error = error_stack::Report; fn try_from( - data: ( - &types::RouterData, - String, - ), + data: (&RouterData, String), ) -> Result { let item = data.0; let request_data = match item.request.get_payment_method_data_required()?.clone() { - domain::PaymentMethodData::Card(card) => get_card_info(item, &card), - domain::PaymentMethodData::MandatePayment => Self::try_from(item), - domain::PaymentMethodData::Wallet(wallet) => match wallet { - domain::WalletData::GooglePay(gpay_data) => Self::try_from(gpay_data), - domain::WalletData::ApplePay(apple_pay_data) => Ok(Self::from(apple_pay_data)), - domain::WalletData::PaypalRedirect(_) => Self::foreign_try_from(( + PaymentMethodData::Card(card) => get_card_info(item, &card), + PaymentMethodData::MandatePayment => Self::try_from(item), + PaymentMethodData::Wallet(wallet) => match wallet { + WalletData::GooglePay(gpay_data) => Self::try_from(gpay_data), + WalletData::ApplePay(apple_pay_data) => Ok(Self::from(apple_pay_data)), + WalletData::PaypalRedirect(_) => Self::foreign_try_from(( AlternativePaymentMethodType::Expresscheckout, None, item, )), - domain::WalletData::AliPayQr(_) - | domain::WalletData::AliPayRedirect(_) - | domain::WalletData::AliPayHkRedirect(_) - | domain::WalletData::AmazonPayRedirect(_) - | domain::WalletData::MomoRedirect(_) - | domain::WalletData::KakaoPayRedirect(_) - | domain::WalletData::GoPayRedirect(_) - | domain::WalletData::GcashRedirect(_) - | domain::WalletData::ApplePayRedirect(_) - | domain::WalletData::ApplePayThirdPartySdk(_) - | domain::WalletData::DanaRedirect {} - | domain::WalletData::GooglePayRedirect(_) - | domain::WalletData::GooglePayThirdPartySdk(_) - | domain::WalletData::MbWayRedirect(_) - | domain::WalletData::MobilePayRedirect(_) - | domain::WalletData::PaypalSdk(_) - | domain::WalletData::Paze(_) - | domain::WalletData::SamsungPay(_) - | domain::WalletData::TwintRedirect {} - | domain::WalletData::VippsRedirect {} - | domain::WalletData::TouchNGoRedirect(_) - | domain::WalletData::WeChatPayRedirect(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::SwishQr(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( + WalletData::AliPayQr(_) + | WalletData::AliPayRedirect(_) + | WalletData::AliPayHkRedirect(_) + | WalletData::AmazonPayRedirect(_) + | WalletData::MomoRedirect(_) + | WalletData::KakaoPayRedirect(_) + | WalletData::GoPayRedirect(_) + | WalletData::GcashRedirect(_) + | WalletData::ApplePayRedirect(_) + | WalletData::ApplePayThirdPartySdk(_) + | WalletData::DanaRedirect {} + | WalletData::GooglePayRedirect(_) + | WalletData::GooglePayThirdPartySdk(_) + | WalletData::MbWayRedirect(_) + | WalletData::MobilePayRedirect(_) + | WalletData::PaypalSdk(_) + | WalletData::Paze(_) + | WalletData::SamsungPay(_) + | WalletData::TwintRedirect {} + | WalletData::VippsRedirect {} + | WalletData::TouchNGoRedirect(_) + | WalletData::WeChatPayRedirect(_) + | WalletData::CashappQr(_) + | WalletData::SwishQr(_) + | WalletData::WeChatPayQr(_) + | WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("nuvei"), ) .into()), }, - domain::PaymentMethodData::BankRedirect(redirect) => match redirect { - domain::BankRedirectData::Eps { .. } => Self::foreign_try_from(( + PaymentMethodData::BankRedirect(redirect) => match redirect { + BankRedirectData::Eps { .. } => Self::foreign_try_from(( AlternativePaymentMethodType::Eps, Some(redirect), item, )), - domain::BankRedirectData::Giropay { .. } => Self::foreign_try_from(( + BankRedirectData::Giropay { .. } => Self::foreign_try_from(( AlternativePaymentMethodType::Giropay, Some(redirect), item, )), - domain::BankRedirectData::Ideal { .. } => Self::foreign_try_from(( + BankRedirectData::Ideal { .. } => Self::foreign_try_from(( AlternativePaymentMethodType::Ideal, Some(redirect), item, )), - domain::BankRedirectData::Sofort { .. } => Self::foreign_try_from(( + BankRedirectData::Sofort { .. } => Self::foreign_try_from(( AlternativePaymentMethodType::Sofort, Some(redirect), item, )), - domain::BankRedirectData::BancontactCard { .. } - | domain::BankRedirectData::Bizum {} - | domain::BankRedirectData::Blik { .. } - | domain::BankRedirectData::Interac { .. } - | domain::BankRedirectData::OnlineBankingCzechRepublic { .. } - | domain::BankRedirectData::OnlineBankingFinland { .. } - | domain::BankRedirectData::OnlineBankingPoland { .. } - | domain::BankRedirectData::OnlineBankingSlovakia { .. } - | domain::BankRedirectData::Przelewy24 { .. } - | domain::BankRedirectData::Trustly { .. } - | domain::BankRedirectData::OnlineBankingFpx { .. } - | domain::BankRedirectData::OnlineBankingThailand { .. } - | domain::BankRedirectData::OpenBankingUk { .. } - | domain::BankRedirectData::LocalBankRedirect {} => { + BankRedirectData::BancontactCard { .. } + | BankRedirectData::Bizum {} + | BankRedirectData::Blik { .. } + | BankRedirectData::Interac { .. } + | BankRedirectData::OnlineBankingCzechRepublic { .. } + | BankRedirectData::OnlineBankingFinland { .. } + | BankRedirectData::OnlineBankingPoland { .. } + | BankRedirectData::OnlineBankingSlovakia { .. } + | BankRedirectData::Przelewy24 { .. } + | BankRedirectData::Trustly { .. } + | BankRedirectData::OnlineBankingFpx { .. } + | BankRedirectData::OnlineBankingThailand { .. } + | BankRedirectData::OpenBankingUk { .. } + | BankRedirectData::LocalBankRedirect {} => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("nuvei"), ) .into()) } }, - domain::PaymentMethodData::PayLater(pay_later_data) => match pay_later_data { - domain::PayLaterData::KlarnaRedirect { .. } => { + PaymentMethodData::PayLater(pay_later_data) => match pay_later_data { + PayLaterData::KlarnaRedirect { .. } => { get_pay_later_info(AlternativePaymentMethodType::Klarna, item) } - domain::PayLaterData::AfterpayClearpayRedirect { .. } => { + PayLaterData::AfterpayClearpayRedirect { .. } => { get_pay_later_info(AlternativePaymentMethodType::AfterPay, item) } - domain::PayLaterData::KlarnaSdk { .. } - | domain::PayLaterData::AffirmRedirect {} - | domain::PayLaterData::PayBrightRedirect {} - | domain::PayLaterData::WalleyRedirect {} - | domain::PayLaterData::AlmaRedirect {} - | domain::PayLaterData::AtomeRedirect {} => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("nuvei"), - ) - .into()) - } + PayLaterData::KlarnaSdk { .. } + | PayLaterData::AffirmRedirect {} + | PayLaterData::PayBrightRedirect {} + | PayLaterData::WalleyRedirect {} + | PayLaterData::AlmaRedirect {} + | PayLaterData::AtomeRedirect {} => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("nuvei"), + ) + .into()), }, - domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("nuvei"), ) @@ -1038,8 +1060,8 @@ where } fn get_card_info( - item: &types::RouterData, - card_details: &domain::Card, + item: &RouterData, + card_details: &payment_method_data::Card, ) -> Result> where Req: NuveiAuthorizePreprocessingCommon, @@ -1182,7 +1204,7 @@ impl TryFrom<(&types::PaymentsCompleteAuthorizeRouterData, Secret)> ) -> Result { let item = data.0; let request_data = match item.request.payment_method_data.clone() { - Some(domain::PaymentMethodData::Card(card)) => Ok(Self { + Some(PaymentMethodData::Card(card)) => Ok(Self { payment_option: PaymentOption::from(NuveiCardDetails { card, three_d: None, @@ -1190,24 +1212,24 @@ impl TryFrom<(&types::PaymentsCompleteAuthorizeRouterData, Secret)> }), ..Default::default() }), - Some(domain::PaymentMethodData::Wallet(..)) - | Some(domain::PaymentMethodData::PayLater(..)) - | Some(domain::PaymentMethodData::BankDebit(..)) - | Some(domain::PaymentMethodData::BankRedirect(..)) - | Some(domain::PaymentMethodData::BankTransfer(..)) - | Some(domain::PaymentMethodData::Crypto(..)) - | Some(domain::PaymentMethodData::MandatePayment) - | Some(domain::PaymentMethodData::GiftCard(..)) - | Some(domain::PaymentMethodData::Voucher(..)) - | Some(domain::PaymentMethodData::CardRedirect(..)) - | Some(domain::PaymentMethodData::Reward) - | Some(domain::PaymentMethodData::RealTimePayment(..)) - | Some(domain::PaymentMethodData::MobilePayment(..)) - | Some(domain::PaymentMethodData::Upi(..)) - | Some(domain::PaymentMethodData::OpenBanking(_)) - | Some(domain::PaymentMethodData::CardToken(..)) - | Some(domain::PaymentMethodData::NetworkToken(..)) - | Some(domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_)) + Some(PaymentMethodData::Wallet(..)) + | Some(PaymentMethodData::PayLater(..)) + | Some(PaymentMethodData::BankDebit(..)) + | Some(PaymentMethodData::BankRedirect(..)) + | Some(PaymentMethodData::BankTransfer(..)) + | Some(PaymentMethodData::Crypto(..)) + | Some(PaymentMethodData::MandatePayment) + | Some(PaymentMethodData::GiftCard(..)) + | Some(PaymentMethodData::Voucher(..)) + | Some(PaymentMethodData::CardRedirect(..)) + | Some(PaymentMethodData::Reward) + | Some(PaymentMethodData::RealTimePayment(..)) + | Some(PaymentMethodData::MobilePayment(..)) + | Some(PaymentMethodData::Upi(..)) + | Some(PaymentMethodData::OpenBanking(_)) + | Some(PaymentMethodData::CardToken(..)) + | Some(PaymentMethodData::NetworkToken(..)) + | Some(PaymentMethodData::CardDetailsForNetworkTransactionId(_)) | None => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("nuvei"), )), @@ -1306,12 +1328,12 @@ impl TryFrom for NuveiPaymentFlowRequest { #[derive(Debug, Clone, Default)] pub struct NuveiPaymentRequestData { pub amount: String, - pub currency: diesel_models::enums::Currency, + pub currency: enums::Currency, pub related_transaction_id: Option, pub client_request_id: String, - pub connector_auth_type: types::ConnectorAuthType, + pub connector_auth_type: ConnectorAuthType, pub session_token: Secret, - pub capture_method: Option, + pub capture_method: Option, } impl TryFrom<&types::PaymentsCaptureRouterData> for NuveiPaymentFlowRequest { @@ -1381,10 +1403,10 @@ pub struct NuveiAuthType { pub(super) merchant_secret: Secret, } -impl TryFrom<&types::ConnectorAuthType> for NuveiAuthType { +impl TryFrom<&ConnectorAuthType> for NuveiAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::SignatureKey { + fn try_from(auth_type: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::SignatureKey { api_key, key1, api_secret, @@ -1518,7 +1540,7 @@ fn get_payment_status(response: &NuveiPaymentsResponse) -> enums::AttemptStatus fn build_error_response( response: &NuveiPaymentsResponse, http_code: u16, -) -> Option> { +) -> Option> { match response.status { NuveiPaymentStatus::Error => Some(get_error_response( response.err_code, @@ -1548,30 +1570,28 @@ fn build_error_response( pub trait NuveiPaymentsGenericResponse {} -impl NuveiPaymentsGenericResponse for api::Authorize {} -impl NuveiPaymentsGenericResponse for api::CompleteAuthorize {} -impl NuveiPaymentsGenericResponse for api::Void {} -impl NuveiPaymentsGenericResponse for api::PSync {} -impl NuveiPaymentsGenericResponse for api::Capture {} +impl NuveiPaymentsGenericResponse for Authorize {} +impl NuveiPaymentsGenericResponse for CompleteAuthorize {} +impl NuveiPaymentsGenericResponse for Void {} +impl NuveiPaymentsGenericResponse for PSync {} +impl NuveiPaymentsGenericResponse for Capture {} -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData where F: NuveiPaymentsGenericResponse, { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let redirection_data = match item.data.payment_method { - diesel_models::enums::PaymentMethod::Wallet - | diesel_models::enums::PaymentMethod::BankRedirect => item + enums::PaymentMethod::Wallet | enums::PaymentMethod::BankRedirect => item .response .payment_option .as_ref() .and_then(|po| po.redirect_url.clone()) - .map(|base_url| services::RedirectForm::from((base_url, services::Method::Get))), + .map(|base_url| RedirectForm::from((base_url, Method::Get))), _ => item .response .payment_option @@ -1579,9 +1599,9 @@ where .and_then(|o| o.card.clone()) .and_then(|card| card.three_d) .and_then(|three_ds| three_ds.acs_url.zip(three_ds.c_req)) - .map(|(base_url, creq)| services::RedirectForm::Form { + .map(|(base_url, creq)| RedirectForm::Form { endpoint: base_url, - method: services::Method::Post, + method: Method::Post, form_fields: std::collections::HashMap::from([( "creq".to_string(), creq.expose(), @@ -1595,18 +1615,18 @@ where response: if let Some(err) = build_error_response(&response, item.http_code) { err } else { - Ok(types::PaymentsResponseData::TransactionResponse { + Ok(PaymentsResponseData::TransactionResponse { resource_id: response .transaction_id .map_or(response.order_id.clone(), Some) // For paypal there will be no transaction_id, only order_id will be present - .map(types::ResponseId::ConnectorTransactionId) + .map(ResponseId::ConnectorTransactionId) .ok_or(errors::ConnectorError::MissingConnectorTransactionID)?, redirection_data: Box::new(redirection_data), mandate_reference: Box::new( response .payment_option .and_then(|po| po.user_payment_option_id) - .map(|id| types::MandateReference { + .map(|id| MandateReference { connector_mandate_id: Some(id), payment_method_id: None, mandate_metadata: None, @@ -1635,12 +1655,12 @@ where } } -impl TryFrom> +impl TryFrom> for types::PaymentsPreProcessingRouterData { type Error = error_stack::Report; fn try_from( - item: types::PaymentsPreprocessingResponseRouterData, + item: PaymentsPreprocessingResponseRouterData, ) -> Result { let response = item.response; let is_enrolled_for_3ds = response @@ -1649,11 +1669,11 @@ impl TryFrom for enums::RefundStatus { } } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { response: get_refund_response( @@ -1694,12 +1714,12 @@ impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { response: get_refund_response( @@ -1714,15 +1734,12 @@ impl TryFrom } } -impl TryFrom<&types::RouterData> - for NuveiPaymentsRequest +impl TryFrom<&RouterData> for NuveiPaymentsRequest where Req: NuveiAuthorizePreprocessingCommon, { type Error = error_stack::Report; - fn try_from( - data: &types::RouterData, - ) -> Result { + fn try_from(data: &RouterData) -> Result { { let item = data; let connector_mandate_id = &item.request.get_connector_mandate_id(); @@ -1765,7 +1782,7 @@ fn get_refund_response( response: NuveiPaymentsResponse, http_code: u16, txn_id: String, -) -> Result { +) -> Result { let refund_status = response .transaction_status .clone() @@ -1779,7 +1796,7 @@ fn get_refund_response( Some(NuveiTransactionStatus::Error) => { get_error_response(response.gw_error_code, &response.gw_error_reason, http_code) } - _ => Ok(types::RefundsResponseData { + _ => Ok(RefundsResponseData { connector_refund_id: txn_id, refund_status, }), @@ -1791,14 +1808,14 @@ fn get_error_response( error_code: Option, error_msg: &Option, http_code: u16, -) -> Result { - Err(types::ErrorResponse { +) -> Result { + Err(ErrorResponse { code: error_code .map(|c| c.to_string()) - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: error_msg .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: None, status_code: http_code, attempt_status: None, diff --git a/crates/hyperswitch_connectors/src/constants.rs b/crates/hyperswitch_connectors/src/constants.rs index e83438d325b..b41dcf3422e 100644 --- a/crates/hyperswitch_connectors/src/constants.rs +++ b/crates/hyperswitch_connectors/src/constants.rs @@ -28,6 +28,8 @@ pub(crate) mod headers { pub(crate) const CORRELATION_ID: &str = "Correlation-Id"; pub(crate) const WP_API_VERSION: &str = "WP-Api-Version"; pub(crate) const SOURCE: &str = "Source"; + pub(crate) const USER_AGENT: &str = "User-Agent"; + pub(crate) const KEY: &str = "key"; } /// Unsupported response type error message diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index cfc65de64e8..f34b09e8f35 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -95,6 +95,7 @@ macro_rules! default_imp_for_authorize_session_token { } default_imp_for_authorize_session_token!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -103,6 +104,7 @@ default_imp_for_authorize_session_token!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -119,11 +121,15 @@ default_imp_for_authorize_session_token!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, @@ -134,6 +140,7 @@ default_imp_for_authorize_session_token!( connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -170,6 +177,7 @@ macro_rules! default_imp_for_calculate_tax { } default_imp_for_calculate_tax!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -178,6 +186,7 @@ default_imp_for_calculate_tax!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -194,11 +203,16 @@ default_imp_for_calculate_tax!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Nexinets, @@ -206,6 +220,7 @@ default_imp_for_calculate_tax!( connectors::Paybox, connectors::Nomupay, connectors::Novalnet, + connectors::Nuvei, connectors::Payeezy, connectors::Payu, connectors::Placetopay, @@ -245,6 +260,7 @@ macro_rules! default_imp_for_session_update { } default_imp_for_session_update!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -253,6 +269,7 @@ default_imp_for_session_update!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -268,8 +285,11 @@ default_imp_for_session_update!( connectors::Fiservemea, connectors::Forte, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Rapyd, connectors::Razorpay, connectors::Redsys, @@ -277,18 +297,21 @@ default_imp_for_session_update!( connectors::Stax, connectors::Square, connectors::Taxjar, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::UnifiedAuthenticationService, connectors::Fiuu, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Worldline, @@ -321,6 +344,7 @@ macro_rules! default_imp_for_post_session_tokens { } default_imp_for_post_session_tokens!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -328,6 +352,7 @@ default_imp_for_post_session_tokens!( connectors::Bankofamerica, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Billwerk, connectors::Cashtocode, @@ -345,25 +370,31 @@ default_imp_for_post_session_tokens!( connectors::Fiservemea, connectors::Forte, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Rapyd, connectors::Razorpay, connectors::Redsys, connectors::Shift4, connectors::Stax, connectors::Taxjar, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Fiuu, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Worldline, @@ -399,6 +430,7 @@ macro_rules! default_imp_for_complete_authorize { } default_imp_for_complete_authorize!( + connectors::Aci, connectors::Amazonpay, connectors::Bamboraapac, connectors::Bankofamerica, @@ -420,8 +452,12 @@ default_imp_for_complete_authorize!( connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, + connectors::Mifinity, connectors::Multisafepay, connectors::Nomupay, connectors::Novalnet, @@ -463,6 +499,7 @@ macro_rules! default_imp_for_incremental_authorization { } default_imp_for_incremental_authorization!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -471,6 +508,7 @@ default_imp_for_incremental_authorization!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -486,21 +524,27 @@ default_imp_for_incremental_authorization!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -538,6 +582,7 @@ macro_rules! default_imp_for_create_customer { } default_imp_for_create_customer!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -546,6 +591,7 @@ default_imp_for_create_customer!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -562,16 +608,22 @@ default_imp_for_create_customer!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, @@ -615,12 +667,13 @@ macro_rules! default_imp_for_connector_redirect_response { } default_imp_for_connector_redirect_response!( + connectors::Aci, connectors::Amazonpay, connectors::Billwerk, connectors::Bitpay, - connectors::Boku, connectors::Bamboraapac, connectors::Bankofamerica, + connectors::Boku, connectors::Cashtocode, connectors::Chargebee, connectors::Coinbase, @@ -638,8 +691,12 @@ default_imp_for_connector_redirect_response!( connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, + connectors::Mifinity, connectors::Multisafepay, connectors::Nexinets, connectors::Nexixpay, @@ -682,6 +739,7 @@ macro_rules! default_imp_for_pre_processing_steps{ } default_imp_for_pre_processing_steps!( + connectors::Aci, connectors::Amazonpay, connectors::Bambora, connectors::Bamboraapac, @@ -689,6 +747,7 @@ default_imp_for_pre_processing_steps!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -704,10 +763,14 @@ default_imp_for_pre_processing_steps!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, @@ -717,6 +780,7 @@ default_imp_for_pre_processing_steps!( connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -754,6 +818,7 @@ macro_rules! default_imp_for_post_processing_steps{ } default_imp_for_post_processing_steps!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -762,6 +827,7 @@ default_imp_for_post_processing_steps!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -778,21 +844,27 @@ default_imp_for_post_processing_steps!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -831,6 +903,7 @@ macro_rules! default_imp_for_approve { } default_imp_for_approve!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -839,6 +912,7 @@ default_imp_for_approve!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -855,21 +929,27 @@ default_imp_for_approve!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -908,6 +988,7 @@ macro_rules! default_imp_for_reject { } default_imp_for_reject!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -916,6 +997,7 @@ default_imp_for_reject!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -932,21 +1014,27 @@ default_imp_for_reject!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -985,6 +1073,7 @@ macro_rules! default_imp_for_webhook_source_verification { } default_imp_for_webhook_source_verification!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -993,6 +1082,7 @@ default_imp_for_webhook_source_verification!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1009,21 +1099,27 @@ default_imp_for_webhook_source_verification!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1063,6 +1159,7 @@ macro_rules! default_imp_for_accept_dispute { } default_imp_for_accept_dispute!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1071,6 +1168,7 @@ default_imp_for_accept_dispute!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1087,21 +1185,27 @@ default_imp_for_accept_dispute!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1140,6 +1244,7 @@ macro_rules! default_imp_for_submit_evidence { } default_imp_for_submit_evidence!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1148,6 +1253,7 @@ default_imp_for_submit_evidence!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1164,21 +1270,27 @@ default_imp_for_submit_evidence!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1217,6 +1329,7 @@ macro_rules! default_imp_for_defend_dispute { } default_imp_for_defend_dispute!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1225,6 +1338,7 @@ default_imp_for_defend_dispute!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1241,21 +1355,27 @@ default_imp_for_defend_dispute!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Helcim, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1303,6 +1423,7 @@ macro_rules! default_imp_for_file_upload { } default_imp_for_file_upload!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1311,6 +1432,7 @@ default_imp_for_file_upload!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1327,21 +1449,27 @@ default_imp_for_file_upload!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1373,6 +1501,7 @@ macro_rules! default_imp_for_payouts { } default_imp_for_payouts!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1381,6 +1510,7 @@ default_imp_for_payouts!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1396,11 +1526,16 @@ default_imp_for_payouts!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Nexinets, @@ -1408,6 +1543,7 @@ default_imp_for_payouts!( connectors::Paybox, connectors::Nomupay, connectors::Novalnet, + connectors::Nuvei, connectors::Payeezy, connectors::Payu, connectors::Placetopay, @@ -1450,6 +1586,7 @@ macro_rules! default_imp_for_payouts_create { #[cfg(feature = "payouts")] default_imp_for_payouts_create!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1458,6 +1595,7 @@ default_imp_for_payouts_create!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1474,21 +1612,27 @@ default_imp_for_payouts_create!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1529,6 +1673,7 @@ macro_rules! default_imp_for_payouts_retrieve { #[cfg(feature = "payouts")] default_imp_for_payouts_retrieve!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1537,6 +1682,7 @@ default_imp_for_payouts_retrieve!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1553,21 +1699,27 @@ default_imp_for_payouts_retrieve!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1608,6 +1760,7 @@ macro_rules! default_imp_for_payouts_eligibility { #[cfg(feature = "payouts")] default_imp_for_payouts_eligibility!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1616,6 +1769,7 @@ default_imp_for_payouts_eligibility!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1632,21 +1786,27 @@ default_imp_for_payouts_eligibility!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1687,6 +1847,7 @@ macro_rules! default_imp_for_payouts_fulfill { #[cfg(feature = "payouts")] default_imp_for_payouts_fulfill!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1695,6 +1856,7 @@ default_imp_for_payouts_fulfill!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1710,21 +1872,27 @@ default_imp_for_payouts_fulfill!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1765,6 +1933,7 @@ macro_rules! default_imp_for_payouts_cancel { #[cfg(feature = "payouts")] default_imp_for_payouts_cancel!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1773,6 +1942,7 @@ default_imp_for_payouts_cancel!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1789,21 +1959,27 @@ default_imp_for_payouts_cancel!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1844,6 +2020,7 @@ macro_rules! default_imp_for_payouts_quote { #[cfg(feature = "payouts")] default_imp_for_payouts_quote!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1852,6 +2029,7 @@ default_imp_for_payouts_quote!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1868,21 +2046,27 @@ default_imp_for_payouts_quote!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1923,6 +2107,7 @@ macro_rules! default_imp_for_payouts_recipient { #[cfg(feature = "payouts")] default_imp_for_payouts_recipient!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1931,6 +2116,7 @@ default_imp_for_payouts_recipient!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1947,21 +2133,27 @@ default_imp_for_payouts_recipient!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2002,6 +2194,7 @@ macro_rules! default_imp_for_payouts_recipient_account { #[cfg(feature = "payouts")] default_imp_for_payouts_recipient_account!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2010,6 +2203,7 @@ default_imp_for_payouts_recipient_account!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2026,21 +2220,27 @@ default_imp_for_payouts_recipient_account!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2081,6 +2281,7 @@ macro_rules! default_imp_for_frm_sale { #[cfg(feature = "frm")] default_imp_for_frm_sale!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2089,6 +2290,7 @@ default_imp_for_frm_sale!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2105,21 +2307,27 @@ default_imp_for_frm_sale!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2160,6 +2368,7 @@ macro_rules! default_imp_for_frm_checkout { #[cfg(feature = "frm")] default_imp_for_frm_checkout!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2168,6 +2377,7 @@ default_imp_for_frm_checkout!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2184,21 +2394,27 @@ default_imp_for_frm_checkout!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2239,6 +2455,7 @@ macro_rules! default_imp_for_frm_transaction { #[cfg(feature = "frm")] default_imp_for_frm_transaction!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2247,6 +2464,7 @@ default_imp_for_frm_transaction!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2263,21 +2481,27 @@ default_imp_for_frm_transaction!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2318,6 +2542,7 @@ macro_rules! default_imp_for_frm_fulfillment { #[cfg(feature = "frm")] default_imp_for_frm_fulfillment!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2326,6 +2551,7 @@ default_imp_for_frm_fulfillment!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2342,21 +2568,27 @@ default_imp_for_frm_fulfillment!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2397,6 +2629,7 @@ macro_rules! default_imp_for_frm_record_return { #[cfg(feature = "frm")] default_imp_for_frm_record_return!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2405,6 +2638,7 @@ default_imp_for_frm_record_return!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2421,21 +2655,27 @@ default_imp_for_frm_record_return!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2473,6 +2713,7 @@ macro_rules! default_imp_for_revoking_mandates { } default_imp_for_revoking_mandates!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2481,6 +2722,7 @@ default_imp_for_revoking_mandates!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2496,21 +2738,27 @@ default_imp_for_revoking_mandates!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -2548,6 +2796,7 @@ macro_rules! default_imp_for_uas_pre_authentication { } default_imp_for_uas_pre_authentication!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2556,6 +2805,7 @@ default_imp_for_uas_pre_authentication!( connectors::Billwerk, connectors::Bluesnap, connectors::Bitpay, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2573,19 +2823,25 @@ default_imp_for_uas_pre_authentication!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Payeezy, connectors::Payu, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Paybox, @@ -2623,6 +2879,7 @@ macro_rules! default_imp_for_uas_post_authentication { } default_imp_for_uas_post_authentication!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2631,6 +2888,7 @@ default_imp_for_uas_post_authentication!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2648,19 +2906,25 @@ default_imp_for_uas_post_authentication!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Payeezy, connectors::Payu, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Paybox, @@ -2698,6 +2962,7 @@ macro_rules! default_imp_for_uas_authentication { } default_imp_for_uas_authentication!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -2706,6 +2971,7 @@ default_imp_for_uas_authentication!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -2723,19 +2989,25 @@ default_imp_for_uas_authentication!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Payeezy, connectors::Payu, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Paybox, diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs index 51607778eca..d0241967acb 100644 --- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs +++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs @@ -213,6 +213,7 @@ default_imp_for_new_connector_integration_payment!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -230,21 +231,27 @@ default_imp_for_new_connector_integration_payment!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -283,6 +290,7 @@ macro_rules! default_imp_for_new_connector_integration_refund { } default_imp_for_new_connector_integration_refund!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -291,6 +299,7 @@ default_imp_for_new_connector_integration_refund!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -308,21 +317,27 @@ default_imp_for_new_connector_integration_refund!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -356,6 +371,7 @@ macro_rules! default_imp_for_new_connector_integration_connector_access_token { } default_imp_for_new_connector_integration_connector_access_token!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -364,6 +380,7 @@ default_imp_for_new_connector_integration_connector_access_token!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -381,21 +398,27 @@ default_imp_for_new_connector_integration_connector_access_token!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -435,6 +458,7 @@ macro_rules! default_imp_for_new_connector_integration_accept_dispute { } default_imp_for_new_connector_integration_accept_dispute!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -443,6 +467,7 @@ default_imp_for_new_connector_integration_accept_dispute!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -459,21 +484,27 @@ default_imp_for_new_connector_integration_accept_dispute!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -512,6 +543,7 @@ macro_rules! default_imp_for_new_connector_integration_submit_evidence { } default_imp_for_new_connector_integration_submit_evidence!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -520,6 +552,7 @@ default_imp_for_new_connector_integration_submit_evidence!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -536,21 +569,27 @@ default_imp_for_new_connector_integration_submit_evidence!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -589,6 +628,7 @@ macro_rules! default_imp_for_new_connector_integration_defend_dispute { } default_imp_for_new_connector_integration_defend_dispute!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -597,6 +637,7 @@ default_imp_for_new_connector_integration_defend_dispute!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -614,21 +655,27 @@ default_imp_for_new_connector_integration_defend_dispute!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -677,6 +724,7 @@ macro_rules! default_imp_for_new_connector_integration_file_upload { } default_imp_for_new_connector_integration_file_upload!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -685,6 +733,7 @@ default_imp_for_new_connector_integration_file_upload!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -702,21 +751,27 @@ default_imp_for_new_connector_integration_file_upload!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -757,6 +812,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_create { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_create!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -765,6 +821,7 @@ default_imp_for_new_connector_integration_payouts_create!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -782,21 +839,27 @@ default_imp_for_new_connector_integration_payouts_create!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -837,6 +900,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_eligibility { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_eligibility!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -845,6 +909,7 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -862,21 +927,27 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -917,6 +988,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_fulfill { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_fulfill!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -925,6 +997,7 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -942,21 +1015,27 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -997,6 +1076,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_cancel { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_cancel!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1005,6 +1085,7 @@ default_imp_for_new_connector_integration_payouts_cancel!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1022,21 +1103,27 @@ default_imp_for_new_connector_integration_payouts_cancel!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1077,6 +1164,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_quote { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_quote!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1085,6 +1173,7 @@ default_imp_for_new_connector_integration_payouts_quote!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1102,21 +1191,27 @@ default_imp_for_new_connector_integration_payouts_quote!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1157,6 +1252,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1165,6 +1261,7 @@ default_imp_for_new_connector_integration_payouts_recipient!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1182,21 +1279,27 @@ default_imp_for_new_connector_integration_payouts_recipient!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1237,6 +1340,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_sync { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_sync!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1245,6 +1349,7 @@ default_imp_for_new_connector_integration_payouts_sync!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1262,21 +1367,27 @@ default_imp_for_new_connector_integration_payouts_sync!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1317,6 +1428,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient_account #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient_account!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1325,6 +1437,7 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1342,21 +1455,27 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1395,6 +1514,7 @@ macro_rules! default_imp_for_new_connector_integration_webhook_source_verificati } default_imp_for_new_connector_integration_webhook_source_verification!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1403,6 +1523,7 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1420,21 +1541,27 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1475,6 +1602,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_sale { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_sale!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1483,6 +1611,7 @@ default_imp_for_new_connector_integration_frm_sale!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1500,21 +1629,27 @@ default_imp_for_new_connector_integration_frm_sale!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1555,6 +1690,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_checkout { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_checkout!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1563,6 +1699,7 @@ default_imp_for_new_connector_integration_frm_checkout!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1580,21 +1717,27 @@ default_imp_for_new_connector_integration_frm_checkout!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1635,6 +1778,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_transaction { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_transaction!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1643,6 +1787,7 @@ default_imp_for_new_connector_integration_frm_transaction!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1660,21 +1805,27 @@ default_imp_for_new_connector_integration_frm_transaction!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1715,6 +1866,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_fulfillment { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_fulfillment!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1723,6 +1875,7 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1740,21 +1893,27 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1795,6 +1954,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_record_return { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_record_return!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1803,6 +1963,7 @@ default_imp_for_new_connector_integration_frm_record_return!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1820,21 +1981,27 @@ default_imp_for_new_connector_integration_frm_record_return!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, @@ -1872,6 +2039,7 @@ macro_rules! default_imp_for_new_connector_integration_revoking_mandates { } default_imp_for_new_connector_integration_revoking_mandates!( + connectors::Aci, connectors::Airwallex, connectors::Amazonpay, connectors::Bambora, @@ -1880,6 +2048,7 @@ default_imp_for_new_connector_integration_revoking_mandates!( connectors::Billwerk, connectors::Bitpay, connectors::Bluesnap, + connectors::Braintree, connectors::Boku, connectors::Cashtocode, connectors::Chargebee, @@ -1897,21 +2066,27 @@ default_imp_for_new_connector_integration_revoking_mandates!( connectors::Fiservemea, connectors::Fiuu, connectors::Forte, + connectors::Globalpay, connectors::Globepay, connectors::Gocardless, connectors::Helcim, + connectors::Iatapay, connectors::Inespay, + connectors::Itaubank, connectors::Jpmorgan, + connectors::Klarna, connectors::Nomupay, connectors::Novalnet, connectors::Nexinets, connectors::Nexixpay, + connectors::Nuvei, connectors::Paybox, connectors::Payeezy, connectors::Payu, connectors::Placetopay, connectors::Powertranz, connectors::Prophetpay, + connectors::Mifinity, connectors::Mollie, connectors::Multisafepay, connectors::Rapyd, diff --git a/crates/hyperswitch_connectors/src/types.rs b/crates/hyperswitch_connectors/src/types.rs index f731450f386..e893238fd8d 100644 --- a/crates/hyperswitch_connectors/src/types.rs +++ b/crates/hyperswitch_connectors/src/types.rs @@ -2,17 +2,18 @@ use hyperswitch_domain_models::types::{PayoutsData, PayoutsResponseData}; use hyperswitch_domain_models::{ router_data::{AccessToken, RouterData}, - router_flow_types::{AccessTokenAuth, Capture, PSync, PreProcessing, Session, Void}, + router_flow_types::{AccessTokenAuth, Authorize, Capture, PSync, PreProcessing, Session, Void}, router_request_types::{ - AccessTokenRequestData, PaymentsCancelData, PaymentsCaptureData, PaymentsPreProcessingData, - PaymentsSessionData, PaymentsSyncData, RefundsData, + AccessTokenRequestData, PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, + PaymentsPreProcessingData, PaymentsSessionData, PaymentsSyncData, RefundsData, }, router_response_types::{PaymentsResponseData, RefundsResponseData}, }; pub(crate) type PaymentsSyncResponseRouterData = ResponseRouterData; - +pub(crate) type PaymentsResponseRouterData = + ResponseRouterData; pub(crate) type PaymentsCaptureResponseRouterData = ResponseRouterData; pub(crate) type RefundsResponseRouterData = diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs index 5f9820070c1..aec4d31072d 100644 --- a/crates/hyperswitch_connectors/src/utils.rs +++ b/crates/hyperswitch_connectors/src/utils.rs @@ -10,7 +10,7 @@ use common_enums::{ }; use common_utils::{ consts::BASE64_ENGINE, - errors::{CustomResult, ReportSwitchExt}, + errors::{CustomResult, ParsingError, ReportSwitchExt}, ext_traits::{OptionExt, StringExt, ValueExt}, id_type, pii::{self, Email, IpAddress}, @@ -29,6 +29,7 @@ use hyperswitch_domain_models::{ PaymentsCancelData, PaymentsCaptureData, PaymentsPreProcessingData, PaymentsSyncData, RefundsData, ResponseId, SetupMandateRequestData, }, + router_response_types::CaptureSyncResponse, types::OrderDetailsWithAmount, }; use hyperswitch_interfaces::{api, consts, errors, types::Response}; @@ -39,6 +40,7 @@ use regex::Regex; use router_env::logger; use serde::Serializer; use serde_json::Value; +use time::PrimitiveDateTime; use crate::{constants::UNSUPPORTED_ERROR_MESSAGE, types::RefreshTokenRouterData}; @@ -64,6 +66,11 @@ pub(crate) fn to_currency_base_unit_with_zero_decimal_check( .change_context(errors::ConnectorError::RequestEncodingFailed) } +pub(crate) fn get_timestamp_in_milliseconds(datetime: &PrimitiveDateTime) -> i64 { + let utc_datetime = datetime.assume_utc(); + utc_datetime.unix_timestamp() * 1000 +} + pub(crate) fn get_amount_as_string( currency_unit: &api::CurrencyUnit, amount: i64, @@ -76,6 +83,12 @@ pub(crate) fn get_amount_as_string( Ok(amount) } +pub(crate) fn base64_decode(data: String) -> Result, Error> { + BASE64_ENGINE + .decode(data) + .change_context(errors::ConnectorError::ResponseDeserializationFailed) +} + pub(crate) fn to_currency_base_unit( amount: i64, currency: enums::Currency, @@ -141,6 +154,47 @@ pub(crate) fn get_error_code_error_message_based_on_priority( .cloned() } +pub trait MultipleCaptureSyncResponse { + fn get_connector_capture_id(&self) -> String; + fn get_capture_attempt_status(&self) -> AttemptStatus; + fn is_capture_response(&self) -> bool; + fn get_connector_reference_id(&self) -> Option { + None + } + fn get_amount_captured(&self) -> Result, error_stack::Report>; +} + +pub(crate) fn construct_captures_response_hashmap( + capture_sync_response_list: Vec, +) -> CustomResult, errors::ConnectorError> +where + T: MultipleCaptureSyncResponse, +{ + let mut hashmap = HashMap::new(); + for capture_sync_response in capture_sync_response_list { + let connector_capture_id = capture_sync_response.get_connector_capture_id(); + if capture_sync_response.is_capture_response() { + hashmap.insert( + connector_capture_id.clone(), + CaptureSyncResponse::Success { + resource_id: ResponseId::ConnectorTransactionId(connector_capture_id), + status: capture_sync_response.get_capture_attempt_status(), + connector_response_reference_id: capture_sync_response + .get_connector_reference_id(), + amount: capture_sync_response + .get_amount_captured() + .change_context(errors::ConnectorError::AmountConversionFailed) + .attach_printable( + "failed to convert back captured response amount to minor unit", + )?, + }, + ); + } + } + + Ok(hashmap) +} + #[derive(Clone, Debug, serde::Serialize)] #[serde(rename_all = "camelCase")] pub struct GooglePayWalletData { @@ -305,6 +359,24 @@ pub(crate) fn convert_amount( .change_context(errors::ConnectorError::AmountConversionFailed) } +pub(crate) fn validate_currency( + request_currency: enums::Currency, + merchant_config_currency: Option, +) -> Result<(), errors::ConnectorError> { + let merchant_config_currency = + merchant_config_currency.ok_or(errors::ConnectorError::NoConnectorMetaData)?; + if request_currency != merchant_config_currency { + Err(errors::ConnectorError::NotSupported { + message: format!( + "currency {} is not supported for this merchant account", + request_currency + ), + connector: "Braintree", + })? + } + Ok(()) +} + pub(crate) fn convert_back_amount_to_minor_units( amount_convertor: &dyn AmountConvertor, amount: T, @@ -1703,6 +1775,7 @@ pub trait RefundsRequestData { fn get_connector_refund_id(&self) -> Result; fn get_webhook_url(&self) -> Result; fn get_browser_info(&self) -> Result; + fn get_connector_metadata(&self) -> Result; } impl RefundsRequestData for RefundsData { @@ -1728,6 +1801,11 @@ impl RefundsRequestData for RefundsData { .clone() .and_then(|browser_info| browser_info.language) } + fn get_connector_metadata(&self) -> Result { + self.connector_metadata + .clone() + .ok_or_else(missing_field_err("connector_metadata")) + } } pub trait PaymentsSetupMandateRequestData { @@ -1855,6 +1933,8 @@ impl PaymentsCompleteAuthorizeRequestData for CompleteAuthorizeData { } pub trait AddressData { fn get_optional_full_name(&self) -> Option>; + fn get_email(&self) -> Result; + fn get_phone_with_country_code(&self) -> Result, Error>; } impl AddressData for Address { @@ -1863,6 +1943,18 @@ impl AddressData for Address { .as_ref() .and_then(|billing_address| billing_address.get_optional_full_name()) } + + fn get_email(&self) -> Result { + self.email.clone().ok_or_else(missing_field_err("email")) + } + + fn get_phone_with_country_code(&self) -> Result, Error> { + self.phone + .clone() + .map(|phone_details| phone_details.get_number_with_country_code()) + .transpose()? + .ok_or_else(missing_field_err("phone")) + } } pub trait PaymentsPreProcessingRequestData { fn get_redirect_response_payload(&self) -> Result; diff --git a/crates/router/src/connector.rs b/crates/router/src/connector.rs index a8cdf2b6cf8..e6767fbb08b 100644 --- a/crates/router/src/connector.rs +++ b/crates/router/src/connector.rs @@ -1,22 +1,14 @@ -pub mod aci; pub mod adyen; pub mod adyenplatform; pub mod authorizedotnet; -pub mod braintree; pub mod checkout; #[cfg(feature = "dummy_connector")] pub mod dummyconnector; pub mod ebanx; -pub mod globalpay; pub mod gpayments; -pub mod iatapay; -pub mod itaubank; -pub mod klarna; -pub mod mifinity; pub mod netcetera; pub mod nmi; pub mod noon; -pub mod nuvei; pub mod opayo; pub mod opennode; pub mod payme; @@ -33,36 +25,39 @@ pub mod wellsfargopayout; pub mod wise; pub use hyperswitch_connectors::connectors::{ - airwallex, airwallex::Airwallex, amazonpay, amazonpay::Amazonpay, bambora, bambora::Bambora, - bamboraapac, bamboraapac::Bamboraapac, bankofamerica, bankofamerica::Bankofamerica, billwerk, - billwerk::Billwerk, bitpay, bitpay::Bitpay, bluesnap, bluesnap::Bluesnap, boku, boku::Boku, - cashtocode, cashtocode::Cashtocode, chargebee::Chargebee, coinbase, coinbase::Coinbase, - coingate, coingate::Coingate, cryptopay, cryptopay::Cryptopay, ctp_mastercard, + aci, aci::Aci, airwallex, airwallex::Airwallex, amazonpay, amazonpay::Amazonpay, bambora, + bambora::Bambora, bamboraapac, bamboraapac::Bamboraapac, bankofamerica, + bankofamerica::Bankofamerica, billwerk, billwerk::Billwerk, bitpay, bitpay::Bitpay, bluesnap, + bluesnap::Bluesnap, boku, boku::Boku, braintree, braintree::Braintree, cashtocode, + cashtocode::Cashtocode, chargebee::Chargebee, coinbase, coinbase::Coinbase, coingate, + coingate::Coingate, cryptopay, cryptopay::Cryptopay, ctp_mastercard, ctp_mastercard::CtpMastercard, cybersource, cybersource::Cybersource, datatrans, datatrans::Datatrans, deutschebank, deutschebank::Deutschebank, digitalvirgo, digitalvirgo::Digitalvirgo, dlocal, dlocal::Dlocal, elavon, elavon::Elavon, fiserv, fiserv::Fiserv, fiservemea, fiservemea::Fiservemea, fiuu, fiuu::Fiuu, forte, forte::Forte, - globepay, globepay::Globepay, gocardless, gocardless::Gocardless, helcim, helcim::Helcim, - inespay, inespay::Inespay, jpmorgan, jpmorgan::Jpmorgan, mollie, mollie::Mollie, multisafepay, + globalpay, globalpay::Globalpay, globepay, globepay::Globepay, gocardless, + gocardless::Gocardless, helcim, helcim::Helcim, iatapay, iatapay::Iatapay, inespay, + inespay::Inespay, itaubank, itaubank::Itaubank, jpmorgan, jpmorgan::Jpmorgan, klarna, + klarna::Klarna, mifinity, mifinity::Mifinity, mollie, mollie::Mollie, multisafepay, multisafepay::Multisafepay, nexinets, nexinets::Nexinets, nexixpay, nexixpay::Nexixpay, - nomupay, nomupay::Nomupay, novalnet, novalnet::Novalnet, paybox, paybox::Paybox, payeezy, - payeezy::Payeezy, payu, payu::Payu, placetopay, placetopay::Placetopay, powertranz, - powertranz::Powertranz, prophetpay, prophetpay::Prophetpay, rapyd, rapyd::Rapyd, razorpay, - razorpay::Razorpay, redsys, redsys::Redsys, shift4, shift4::Shift4, square, square::Square, - stax, stax::Stax, taxjar, taxjar::Taxjar, thunes, thunes::Thunes, tsys, tsys::Tsys, - unified_authentication_service, unified_authentication_service::UnifiedAuthenticationService, - volt, volt::Volt, wellsfargo, wellsfargo::Wellsfargo, worldline, worldline::Worldline, - worldpay, worldpay::Worldpay, xendit, xendit::Xendit, zen, zen::Zen, zsl, zsl::Zsl, + nomupay, nomupay::Nomupay, novalnet, novalnet::Novalnet, nuvei, nuvei::Nuvei, paybox, + paybox::Paybox, payeezy, payeezy::Payeezy, payu, payu::Payu, placetopay, + placetopay::Placetopay, powertranz, powertranz::Powertranz, prophetpay, prophetpay::Prophetpay, + rapyd, rapyd::Rapyd, razorpay, razorpay::Razorpay, redsys, redsys::Redsys, shift4, + shift4::Shift4, square, square::Square, stax, stax::Stax, taxjar, taxjar::Taxjar, thunes, + thunes::Thunes, tsys, tsys::Tsys, unified_authentication_service, + unified_authentication_service::UnifiedAuthenticationService, volt, volt::Volt, wellsfargo, + wellsfargo::Wellsfargo, worldline, worldline::Worldline, worldpay, worldpay::Worldpay, xendit, + xendit::Xendit, zen, zen::Zen, zsl, zsl::Zsl, }; #[cfg(feature = "dummy_connector")] pub use self::dummyconnector::DummyConnector; pub use self::{ - aci::Aci, adyen::Adyen, adyenplatform::Adyenplatform, authorizedotnet::Authorizedotnet, - braintree::Braintree, checkout::Checkout, ebanx::Ebanx, globalpay::Globalpay, - gpayments::Gpayments, iatapay::Iatapay, itaubank::Itaubank, klarna::Klarna, mifinity::Mifinity, - netcetera::Netcetera, nmi::Nmi, noon::Noon, nuvei::Nuvei, opayo::Opayo, opennode::Opennode, - payme::Payme, payone::Payone, paypal::Paypal, plaid::Plaid, riskified::Riskified, - signifyd::Signifyd, stripe::Stripe, threedsecureio::Threedsecureio, trustpay::Trustpay, - wellsfargopayout::Wellsfargopayout, wise::Wise, + adyen::Adyen, adyenplatform::Adyenplatform, authorizedotnet::Authorizedotnet, + checkout::Checkout, ebanx::Ebanx, gpayments::Gpayments, netcetera::Netcetera, nmi::Nmi, + noon::Noon, opayo::Opayo, opennode::Opennode, payme::Payme, payone::Payone, paypal::Paypal, + plaid::Plaid, riskified::Riskified, signifyd::Signifyd, stripe::Stripe, + threedsecureio::Threedsecureio, trustpay::Trustpay, wellsfargopayout::Wellsfargopayout, + wise::Wise, }; diff --git a/crates/router/src/consts.rs b/crates/router/src/consts.rs index d27ad5d6019..4d506449589 100644 --- a/crates/router/src/consts.rs +++ b/crates/router/src/consts.rs @@ -42,7 +42,6 @@ pub const DEFAULT_LIST_API_LIMIT: u16 = 10; // String literals pub(crate) const UNSUPPORTED_ERROR_MESSAGE: &str = "Unsupported response type"; pub(crate) const LOW_BALANCE_ERROR_MESSAGE: &str = "Insufficient balance in the payment method"; -pub(crate) const CONNECTOR_UNAUTHORIZED_ERROR: &str = "Authentication Error from the connector"; pub(crate) const CANNOT_CONTINUE_AUTH: &str = "Cannot continue with Authorization due to failed Liability Shift."; diff --git a/crates/router/src/core/payments/connector_integration_v2_impls.rs b/crates/router/src/core/payments/connector_integration_v2_impls.rs index 5263ec9fb28..7a43ec1a189 100644 --- a/crates/router/src/core/payments/connector_integration_v2_impls.rs +++ b/crates/router/src/core/payments/connector_integration_v2_impls.rs @@ -698,23 +698,15 @@ macro_rules! default_imp_for_new_connector_integration_payment { } default_imp_for_new_connector_integration_payment!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -747,23 +739,15 @@ macro_rules! default_imp_for_new_connector_integration_refund { } default_imp_for_new_connector_integration_refund!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -790,23 +774,15 @@ macro_rules! default_imp_for_new_connector_integration_connector_access_token { } default_imp_for_new_connector_integration_connector_access_token!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -855,23 +831,15 @@ macro_rules! default_imp_for_new_connector_integration_submit_evidence { } default_imp_for_new_connector_integration_accept_dispute!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -902,23 +870,15 @@ macro_rules! default_imp_for_new_connector_integration_defend_dispute { }; } default_imp_for_new_connector_integration_defend_dispute!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -933,23 +893,15 @@ default_imp_for_new_connector_integration_defend_dispute!( connector::Plaid ); default_imp_for_new_connector_integration_submit_evidence!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -991,23 +943,15 @@ macro_rules! default_imp_for_new_connector_integration_file_upload { } default_imp_for_new_connector_integration_file_upload!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1077,7 +1021,6 @@ default_imp_for_new_connector_integration_payouts!( connector::Nomupay, connector::Noon, connector::Novalnet, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Paybox, @@ -1130,23 +1073,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_create { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_create!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1180,23 +1115,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_eligibility { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_eligibility!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1230,23 +1157,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_fulfill { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_fulfill!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1280,23 +1199,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_cancel { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_cancel!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1330,23 +1241,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_quote { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_quote!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1380,23 +1283,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1431,22 +1326,14 @@ macro_rules! default_imp_for_new_connector_integration_payouts_sync { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_sync!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1480,23 +1367,15 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient_account #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient_account!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1528,23 +1407,15 @@ macro_rules! default_imp_for_new_connector_integration_webhook_source_verificati } default_imp_for_new_connector_integration_webhook_source_verification!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1614,7 +1485,6 @@ default_imp_for_new_connector_integration_frm!( connector::Nomupay, connector::Noon, connector::Novalnet, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Paybox, @@ -1667,23 +1537,15 @@ macro_rules! default_imp_for_new_connector_integration_frm_sale { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_sale!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1717,23 +1579,15 @@ macro_rules! default_imp_for_new_connector_integration_frm_checkout { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_checkout!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1767,23 +1621,15 @@ macro_rules! default_imp_for_new_connector_integration_frm_transaction { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_transaction!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1817,23 +1663,15 @@ macro_rules! default_imp_for_new_connector_integration_frm_fulfillment { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_fulfillment!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1867,23 +1705,15 @@ macro_rules! default_imp_for_new_connector_integration_frm_record_return { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_record_return!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1914,23 +1744,15 @@ macro_rules! default_imp_for_new_connector_integration_revoking_mandates { } default_imp_for_new_connector_integration_revoking_mandates!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -2110,22 +1932,14 @@ macro_rules! default_imp_for_new_connector_integration_uas { default_imp_for_new_connector_integration_uas!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, diff --git a/crates/router/src/core/payments/flows.rs b/crates/router/src/core/payments/flows.rs index 852b5d95209..6728d51558c 100644 --- a/crates/router/src/core/payments/flows.rs +++ b/crates/router/src/core/payments/flows.rs @@ -214,15 +214,10 @@ impl default_imp_for_complete_authorize!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Checkout, connector::Ebanx, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Noon, connector::Opayo, @@ -265,22 +260,14 @@ impl } default_imp_for_webhook_source_verification!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -324,22 +311,14 @@ impl default_imp_for_create_customer!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -385,14 +364,9 @@ impl services::ConnectorRedirectResponse for connector::DummyConnec default_imp_for_connector_redirect_response!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Ebanx, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Opayo, connector::Opennode, @@ -537,20 +511,12 @@ impl default_imp_for_accept_dispute!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -617,20 +583,12 @@ impl default_imp_for_file_upload!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Payme, connector::Payone, @@ -674,20 +632,12 @@ impl default_imp_for_submit_evidence!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Payme, connector::Payone, @@ -731,20 +681,12 @@ impl default_imp_for_defend_dispute!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Payme, connector::Payone, @@ -804,17 +746,10 @@ impl default_imp_for_pre_processing_steps!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Iatapay, - connector::Itaubank, - connector::Globalpay, connector::Gpayments, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Noon, connector::Opayo, @@ -844,22 +779,14 @@ default_imp_for_post_processing_steps!( connector::Adyenplatform, connector::Adyen, connector::Nmi, - connector::Nuvei, connector::Payme, connector::Paypal, connector::Stripe, connector::Trustpay, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Iatapay, - connector::Itaubank, - connector::Globalpay, connector::Gpayments, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Noon, connector::Opayo, @@ -884,20 +811,12 @@ macro_rules! default_imp_for_payouts { impl Payouts for connector::DummyConnector {} default_imp_for_payouts!( - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -939,20 +858,12 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_create!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -995,22 +906,14 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_retrieve!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1058,20 +961,12 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_eligibility!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1115,20 +1010,12 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_fulfill!( - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1170,20 +1057,12 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_cancel!( connector::Adyenplatform, - connector::Aci, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1227,21 +1106,13 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_quote!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1286,21 +1157,13 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_recipient!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1347,22 +1210,14 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_recipient_account!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1406,22 +1261,14 @@ impl default_imp_for_approve!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1466,22 +1313,14 @@ impl default_imp_for_reject!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1628,22 +1467,14 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_sale!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1688,22 +1519,14 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_checkout!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1748,22 +1571,14 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_transaction!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1808,22 +1623,14 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_fulfillment!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1868,22 +1675,14 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_record_return!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1926,22 +1725,14 @@ impl default_imp_for_incremental_authorization!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -1984,21 +1775,13 @@ impl } default_imp_for_revoking_mandates!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -2212,19 +1995,12 @@ impl { } default_imp_for_authorize_session_token!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, @@ -2269,21 +2045,13 @@ impl } default_imp_for_calculate_tax!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, - connector::Nuvei, connector::Nmi, connector::Noon, connector::Opayo, @@ -2327,21 +2095,13 @@ impl } default_imp_for_session_update!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, - connector::Nuvei, connector::Nmi, connector::Noon, connector::Opayo, @@ -2384,21 +2144,13 @@ impl } default_imp_for_post_session_tokens!( - connector::Aci, connector::Adyen, connector::Adyenplatform, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, - connector::Nuvei, connector::Nmi, connector::Noon, connector::Opayo, @@ -2445,22 +2197,14 @@ impl default_imp_for_uas_pre_authentication!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -2503,22 +2247,14 @@ impl default_imp_for_uas_post_authentication!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme, @@ -2561,22 +2297,14 @@ impl default_imp_for_uas_authentication!( connector::Adyenplatform, - connector::Aci, connector::Adyen, connector::Authorizedotnet, - connector::Braintree, connector::Checkout, connector::Ebanx, - connector::Globalpay, connector::Gpayments, - connector::Iatapay, - connector::Itaubank, - connector::Klarna, - connector::Mifinity, connector::Netcetera, connector::Nmi, connector::Noon, - connector::Nuvei, connector::Opayo, connector::Opennode, connector::Payme,