diff --git a/crates/hyperswitch_connectors/src/connectors.rs b/crates/hyperswitch_connectors/src/connectors.rs index 1336e55c33..57fed695df 100644 --- a/crates/hyperswitch_connectors/src/connectors.rs +++ b/crates/hyperswitch_connectors/src/connectors.rs @@ -1,4 +1,5 @@ pub mod aci; +pub mod adyen; pub mod airwallex; pub mod amazonpay; pub mod authorizedotnet; @@ -54,6 +55,7 @@ pub mod opennode; pub mod paybox; pub mod payeezy; pub mod payme; +pub mod paypal; pub mod paystack; pub mod payu; pub mod placetopay; @@ -81,19 +83,20 @@ pub mod zen; pub mod zsl; pub use self::{ - aci::Aci, airwallex::Airwallex, amazonpay::Amazonpay, authorizedotnet::Authorizedotnet, - bambora::Bambora, bamboraapac::Bamboraapac, bankofamerica::Bankofamerica, billwerk::Billwerk, - bitpay::Bitpay, bluesnap::Bluesnap, boku::Boku, braintree::Braintree, cashtocode::Cashtocode, - chargebee::Chargebee, checkout::Checkout, 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, - getnet::Getnet, globalpay::Globalpay, globepay::Globepay, gocardless::Gocardless, - helcim::Helcim, hipay::Hipay, iatapay::Iatapay, inespay::Inespay, itaubank::Itaubank, - jpmorgan::Jpmorgan, juspaythreedsserver::Juspaythreedsserver, klarna::Klarna, - mifinity::Mifinity, mollie::Mollie, moneris::Moneris, multisafepay::Multisafepay, - nexinets::Nexinets, nexixpay::Nexixpay, nomupay::Nomupay, noon::Noon, novalnet::Novalnet, - nuvei::Nuvei, opayo::Opayo, opennode::Opennode, paybox::Paybox, payeezy::Payeezy, payme::Payme, + aci::Aci, adyen::Adyen, airwallex::Airwallex, amazonpay::Amazonpay, + authorizedotnet::Authorizedotnet, bambora::Bambora, bamboraapac::Bamboraapac, + bankofamerica::Bankofamerica, billwerk::Billwerk, bitpay::Bitpay, bluesnap::Bluesnap, + boku::Boku, braintree::Braintree, cashtocode::Cashtocode, chargebee::Chargebee, + checkout::Checkout, 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, getnet::Getnet, + globalpay::Globalpay, globepay::Globepay, gocardless::Gocardless, helcim::Helcim, hipay::Hipay, + iatapay::Iatapay, inespay::Inespay, itaubank::Itaubank, jpmorgan::Jpmorgan, + juspaythreedsserver::Juspaythreedsserver, klarna::Klarna, mifinity::Mifinity, mollie::Mollie, + moneris::Moneris, multisafepay::Multisafepay, nexinets::Nexinets, nexixpay::Nexixpay, + nomupay::Nomupay, noon::Noon, novalnet::Novalnet, nuvei::Nuvei, opayo::Opayo, + opennode::Opennode, paybox::Paybox, payeezy::Payeezy, payme::Payme, paypal::Paypal, paystack::Paystack, payu::Payu, placetopay::Placetopay, powertranz::Powertranz, prophetpay::Prophetpay, rapyd::Rapyd, razorpay::Razorpay, recurly::Recurly, redsys::Redsys, shift4::Shift4, square::Square, stax::Stax, stripebilling::Stripebilling, taxjar::Taxjar, diff --git a/crates/router/src/connector/adyen.rs b/crates/hyperswitch_connectors/src/connectors/adyen.rs similarity index 66% rename from crates/router/src/connector/adyen.rs rename to crates/hyperswitch_connectors/src/connectors/adyen.rs index 7cefdda657..1e57cbbcf6 100644 --- a/crates/router/src/connector/adyen.rs +++ b/crates/hyperswitch_connectors/src/connectors/adyen.rs @@ -1,41 +1,92 @@ pub mod transformers; -use api_models::{enums::PaymentMethodType, webhooks::IncomingWebhookEvent}; + use base64::Engine; +use common_enums::enums::{self, PaymentMethodType}; use common_utils::{ - request::RequestContent, + consts, + errors::CustomResult, + ext_traits::{ByteSliceExt, OptionExt}, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, MinorUnit, MinorUnitForConnector}, }; -use diesel_models::{enums as storage_enums, enums}; use error_stack::{report, ResultExt}; -use hyperswitch_interfaces::webhooks::IncomingWebhookFlowError; -use masking::{ExposeInterface, Secret}; -use ring::hmac; -use router_env::{instrument, tracing}; - -use self::transformers as adyen; -use super::utils::is_mandate_supported; -#[cfg(feature = "payouts")] -use crate::connector::utils::PayoutsData; -use crate::{ - capture_method_not_supported, - configs::settings, - connector::utils::{convert_amount, PaymentMethodDataType}, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, logger, - services::{ - self, - request::{self, Mask}, - ConnectorSpecifications, ConnectorValidation, +use hyperswitch_domain_models::{ + api::ApplicationResponse, + payment_method_data::PaymentMethodData, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{ + Authorize, Capture, PSync, PaymentMethodToken, PreProcessing, Session, SetupMandate, + Void, + }, + refunds::{Execute, RSync}, + Accept, Defend, Evidence, Retrieve, Upload, + }, + router_request_types::{ + AcceptDisputeRequestData, AccessTokenRequestData, DefendDisputeRequestData, + PaymentMethodTokenizationData, PaymentsAuthorizeData, PaymentsCancelData, + PaymentsCaptureData, PaymentsPreProcessingData, PaymentsSessionData, PaymentsSyncData, + RefundsData, RetrieveFileRequestData, SetupMandateRequestData, SubmitEvidenceRequestData, + SyncRequestType, UploadFileRequestData, + }, + router_response_types::{ + AcceptDisputeResponse, DefendDisputeResponse, PaymentsResponseData, RefundsResponseData, + RetrieveFileResponse, SubmitEvidenceResponse, UploadFileResponse, }, types::{ - self, - api::{self, ConnectorCommon}, - domain, - transformers::{ForeignFrom, ForeignTryFrom}, + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsPreProcessingRouterData, PaymentsSyncRouterData, RefundsRouterData, + SetupMandateRouterData, }, - utils::{crypto, ByteSliceExt, BytesExt, OptionExt}, +}; +#[cfg(feature = "payouts")] +use hyperswitch_domain_models::{ + router_flow_types::payouts::{PoCancel, PoCreate, PoEligibility, PoFulfill}, + router_response_types::PayoutsResponseData, + types::{PayoutsData, PayoutsRouterData}, +}; +#[cfg(feature = "payouts")] +use hyperswitch_interfaces::types::{ + PayoutCancelType, PayoutCreateType, PayoutEligibilityType, PayoutFulfillType, +}; +use hyperswitch_interfaces::{ + api::{ + self, + disputes::{AcceptDispute, DefendDispute, Dispute, SubmitEvidence}, + files::{FilePurpose, FileUpload, RetrieveFile, UploadFile}, + CaptureSyncMethod, ConnectorCommon, ConnectorIntegration, ConnectorSpecifications, + ConnectorValidation, + }, + configs::Connectors, + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + disputes, errors, + events::connector_api_logs::ConnectorEvent, + types::{ + AcceptDisputeType, DefendDisputeType, PaymentsAuthorizeType, PaymentsCaptureType, + PaymentsPreProcessingType, PaymentsSyncType, PaymentsVoidType, RefundExecuteType, Response, + SetupMandateType, SubmitEvidenceType, + }, + webhooks::{IncomingWebhook, IncomingWebhookFlowError, IncomingWebhookRequestDetails}, +}; +use masking::{ExposeInterface, Mask, Maskable, Secret}; +use ring::hmac; +use router_env::{instrument, tracing}; +use transformers::{ + self as adyen, convert_payment_authorize_router_response, + convert_setup_mandate_router_data_to_authorize_router_data, +}; + +#[cfg(feature = "payouts")] +use crate::utils::PayoutsData as UtilsPayoutData; +use crate::{ + capture_method_not_supported, + constants::{self, headers}, + types::{ + AcceptDisputeRouterData, DefendDisputeRouterData, ResponseRouterData, + SubmitEvidenceRouterData, + }, + utils::{self as connector_utils, is_mandate_supported, ForeignTryFrom, PaymentMethodDataType}, }; const ADYEN_API_VERSION: &str = "v68"; @@ -60,8 +111,8 @@ impl ConnectorCommon for Adyen { } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = adyen::AdyenAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -69,16 +120,16 @@ impl ConnectorCommon for Adyen { auth.api_key.into_masked(), )]) } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.adyen.base_url.as_ref() } fn build_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { - let response: adyen::ErrorResponse = res + ) -> CustomResult { + let response: adyen::AdyenErrorResponse = res .response .parse_struct("ErrorResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; @@ -86,7 +137,7 @@ impl ConnectorCommon for Adyen { 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.error_code, message: response.message.to_owned(), @@ -100,7 +151,7 @@ impl ConnectorCommon for Adyen { impl ConnectorValidation for Adyen { fn validate_connector_against_payment_request( &self, - capture_method: Option, + capture_method: Option, _payment_method: enums::PaymentMethod, pmt: Option, ) -> CustomResult<(), errors::ConnectorError> { @@ -259,7 +310,7 @@ impl ConnectorValidation for Adyen { fn validate_mandate_payment( &self, pm_type: Option, - pm_data: domain::payments::PaymentMethodData, + pm_data: PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([ PaymentMethodDataType::Card, @@ -287,7 +338,7 @@ impl ConnectorValidation for Adyen { fn validate_psync_reference_id( &self, - data: &hyperswitch_domain_models::router_request_types::PaymentsSyncData, + data: &PaymentsSyncData, _is_three_ds: bool, _status: enums::AttemptStatus, _connector_meta_data: Option, @@ -314,23 +365,13 @@ impl api::MandateSetup for Adyen {} impl api::ConnectorAccessToken for Adyen {} impl api::PaymentToken for Adyen {} -impl - services::ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Adyen +impl ConnectorIntegration + for Adyen { // Not Implemented (R) } -impl - services::ConnectorIntegration< - api::AccessTokenAuth, - types::AccessTokenRequestData, - types::AccessToken, - > for Adyen -{ +impl ConnectorIntegration for Adyen { // Not Implemented (R) } @@ -353,23 +394,15 @@ fn build_env_specific_endpoint( } } -impl - services::ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::SetupMandateRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &SetupMandateRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::SetupMandateType::get_content_type(self) - .to_string() - .into(), + SetupMandateType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -378,8 +411,8 @@ impl fn get_url( &self, - req: &types::SetupMandateRouterData, - connectors: &settings::Connectors, + req: &SetupMandateRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( self.base_url(connectors), @@ -390,15 +423,15 @@ impl } fn get_request_body( &self, - req: &types::SetupMandateRouterData, - _connectors: &settings::Connectors, + req: &SetupMandateRouterData, + _connectors: &Connectors, ) -> CustomResult { - let authorize_req = types::PaymentsAuthorizeRouterData::foreign_from(( + let authorize_req = convert_payment_authorize_router_response(( req, - types::PaymentsAuthorizeData::foreign_from(req), + convert_setup_mandate_router_data_to_authorize_router_data(req), )); - let amount = convert_amount( + let amount = connector_utils::convert_amount( self.amount_converter, authorize_req.request.minor_amount, authorize_req.request.currency, @@ -411,38 +444,32 @@ impl } fn build_request( &self, - req: &types::SetupMandateRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &SetupMandateRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::SetupMandateType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&SetupMandateType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::SetupMandateType::get_headers(self, req, connectors)?) - .set_body(types::SetupMandateType::get_request_body( - self, req, connectors, - )?) + .headers(SetupMandateType::get_headers(self, req, connectors)?) + .set_body(SetupMandateType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::SetupMandateRouterData, + data: &SetupMandateRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, + res: Response, ) -> CustomResult< - types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, + RouterData, errors::ConnectorError, > where - api::SetupMandate: Clone, - types::SetupMandateRequestData: Clone, - types::PaymentsResponseData: Clone, + SetupMandate: Clone, + SetupMandateRequestData: Clone, + PaymentsResponseData: Clone, { let response: adyen::AdyenPaymentResponse = res .response @@ -450,8 +477,8 @@ impl .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::foreign_try_from(( - types::ResponseRouterData { + RouterData::foreign_try_from(( + ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -464,44 +491,32 @@ 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) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } impl api::PaymentSession for Adyen {} -impl - services::ConnectorIntegration< - api::Session, - types::PaymentsSessionData, - types::PaymentsResponseData, - > for Adyen -{ +impl ConnectorIntegration for Adyen { // Not Implemented (R) } -impl - services::ConnectorIntegration< - api::Capture, - types::PaymentsCaptureData, - types::PaymentsResponseData, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), self.common_get_content_type().to_string().into(), @@ -513,8 +528,8 @@ impl fn get_url( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, + req: &PaymentsCaptureRouterData, + connectors: &Connectors, ) -> CustomResult { let id = req.request.connector_transaction_id.as_str(); @@ -530,10 +545,10 @@ impl } fn get_request_body( &self, - req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount_to_capture = convert_amount( + let amount_to_capture = connector_utils::convert_amount( self.amount_converter, req.request.minor_amount_to_capture, req.request.currency, @@ -545,18 +560,16 @@ impl } 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) - .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(), @@ -564,10 +577,10 @@ impl } fn handle_response( &self, - data: &types::PaymentsCaptureRouterData, + data: &PaymentsCaptureRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenCaptureResponse = res .response .parse_struct("AdyenCaptureResponse") @@ -576,7 +589,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, @@ -585,36 +598,31 @@ 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) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } /// Payment Sync can be useful only incase of Redirect flow. /// For payments which doesn't involve redrection we have to rely on webhooks. -impl - services::ConnectorIntegration - for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_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::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); @@ -623,8 +631,8 @@ impl fn get_request_body( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, + req: &RouterData, + _connectors: &Connectors, ) -> CustomResult { let encoded_data = req .request @@ -670,8 +678,8 @@ impl fn get_url( &self, - req: &types::RouterData, - connectors: &settings::Connectors, + req: &RouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( self.base_url(connectors), @@ -686,9 +694,9 @@ impl fn build_request( &self, - req: &types::RouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &RouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { // Adyen doesn't support PSync flow. We use PSync flow to fetch payment details, // specifically the redirect URL that takes the user to their Payment page. In non-redirection flows, // we rely on webhooks to obtain the payment status since there is no encoded data available. @@ -701,14 +709,12 @@ impl .is_ok() { 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(), )) } else { @@ -718,11 +724,11 @@ impl fn handle_response( &self, - data: &types::RouterData, + data: &RouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { - logger::debug!(payment_sync_response=?res); + res: Response, + ) -> CustomResult { + router_env::logger::debug!(payment_sync_response=?res); let response: adyen::AdyenPaymentResponse = res .response .parse_struct("AdyenPaymentResponse") @@ -732,11 +738,11 @@ impl router_env::logger::info!(connector_response=?response); let is_multiple_capture_sync = match data.request.sync_type { - types::SyncRequestType::MultipleCaptureSync(_) => 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, @@ -750,48 +756,38 @@ 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) } fn get_multiple_capture_sync_method( &self, - ) -> CustomResult { - Ok(services::CaptureSyncMethod::Individual) + ) -> CustomResult { + Ok(CaptureSyncMethod::Individual) } fn get_5xx_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 Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> where - Self: services::ConnectorIntegration< - api::Authorize, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - >, + Self: ConnectorIntegration, { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PaymentsAuthorizeType::get_content_type(self) + PaymentsAuthorizeType::get_content_type(self) .to_string() .into(), )]; @@ -802,8 +798,8 @@ impl fn get_url( &self, - req: &types::PaymentsAuthorizeRouterData, - connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( self.base_url(connectors), @@ -815,10 +811,10 @@ impl fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = convert_amount( + let amount = connector_utils::convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -830,20 +826,16 @@ 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) - .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(), @@ -852,18 +844,18 @@ impl fn handle_response( &self, - data: &types::PaymentsAuthorizeRouterData, + data: &PaymentsAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenPaymentResponse = res .response .parse_struct("AdyenPaymentResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::foreign_try_from(( - types::ResponseRouterData { + RouterData::foreign_try_from(( + ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -877,38 +869,34 @@ 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) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } impl api::PaymentsPreProcessing for Adyen {} -impl - services::ConnectorIntegration< - api::PreProcessing, - types::PaymentsPreProcessingData, - types::PaymentsResponseData, - > for Adyen +impl ConnectorIntegration + for Adyen { fn get_headers( &self, - req: &types::PaymentsPreProcessingRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsPreProcessingRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PaymentsPreProcessingType::get_content_type(self) + PaymentsPreProcessingType::get_content_type(self) .to_string() .into(), )]; @@ -919,8 +907,8 @@ impl fn get_url( &self, - req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, + req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( self.base_url(connectors), @@ -935,8 +923,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsPreProcessingRouterData, - _connectors: &settings::Connectors, + req: &PaymentsPreProcessingRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::AdyenBalanceRequest::try_from(req)?; @@ -945,20 +933,18 @@ 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) - .url(&types::PaymentsPreProcessingType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsPreProcessingType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsPreProcessingType::get_headers( + .headers(PaymentsPreProcessingType::get_headers( self, req, connectors, )?) - .set_body(types::PaymentsPreProcessingType::get_request_body( + .set_body(PaymentsPreProcessingType::get_request_body( self, req, connectors, )?) .build(), @@ -967,10 +953,10 @@ impl fn handle_response( &self, - data: &types::PaymentsPreProcessingRouterData, + data: &PaymentsPreProcessingRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenBalanceResponse = res .response .parse_struct("AdyenBalanceResponse") @@ -991,14 +977,14 @@ impl })?, }; - let amount = convert_amount(self.amount_converter, amount, currency)?; + let amount = connector_utils::convert_amount(self.amount_converter, amount, currency)?; if response.balance.currency != currency || response.balance.value < amount { - Ok(types::RouterData { - response: Err(types::ErrorResponse { - code: consts::NO_ERROR_CODE.to_string(), - message: consts::NO_ERROR_MESSAGE.to_string(), - reason: Some(consts::LOW_BALANCE_ERROR_MESSAGE.to_string()), + Ok(RouterData { + response: Err(ErrorResponse { + code: NO_ERROR_CODE.to_string(), + message: NO_ERROR_MESSAGE.to_string(), + reason: Some(constants::LOW_BALANCE_ERROR_MESSAGE.to_string()), status_code: res.status_code, attempt_status: Some(enums::AttemptStatus::Failure), connector_transaction_id: Some(response.psp_reference), @@ -1006,7 +992,7 @@ impl ..data.clone() }) } else { - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -1017,36 +1003,30 @@ 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) } fn get_5xx_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 Adyen -{ +impl ConnectorIntegration for Adyen { 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(), )]; @@ -1057,8 +1037,8 @@ impl fn get_url( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + connectors: &Connectors, ) -> CustomResult { let id = req.request.connector_transaction_id.clone(); @@ -1075,8 +1055,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsCancelRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCancelRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::AdyenCancelRequest::try_from(req)?; @@ -1084,35 +1064,33 @@ 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) - .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: adyen::AdyenCancelResponse = res .response .parse_struct("AdyenCancelResponse") .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, @@ -1122,16 +1100,16 @@ 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) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -1147,13 +1125,11 @@ impl api::PayoutEligibility for Adyen {} impl api::PayoutFulfill for Adyen {} #[cfg(feature = "payouts")] -impl services::ConnectorIntegration - for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_url( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.payout_base_url.as_str(), @@ -1168,14 +1144,12 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PayoutCancelType::get_content_type(self) - .to_string() - .into(), + PayoutCancelType::get_content_type(self).to_string().into(), )]; let auth = adyen::AdyenAuthType::try_from(&req.connector_auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; @@ -1189,8 +1163,8 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &PayoutsRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::AdyenPayoutCancelRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -1198,17 +1172,15 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PayoutCancelType::get_url(self, req, connectors)?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PayoutCancelType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutCancelType::get_headers(self, req, connectors)?) - .set_body(types::PayoutCancelType::get_request_body( - self, req, connectors, - )?) + .headers(PayoutCancelType::get_headers(self, req, connectors)?) + .set_body(PayoutCancelType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) @@ -1217,17 +1189,17 @@ impl services::ConnectorIntegration, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: adyen::AdyenPayoutResponse = res .response .parse_struct("AdyenPayoutResponse") .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, @@ -1236,28 +1208,26 @@ impl services::ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } #[cfg(feature = "payouts")] -impl services::ConnectorIntegration - for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_url( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.payout_base_url.as_str(), @@ -1272,14 +1242,12 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PayoutCreateType::get_content_type(self) - .to_string() - .into(), + PayoutCreateType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -1288,10 +1256,10 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &PayoutsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = convert_amount( + let amount = connector_utils::convert_amount( self.amount_converter, req.request.minor_amount, req.request.destination_currency, @@ -1303,17 +1271,15 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PayoutCreateType::get_url(self, req, connectors)?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PayoutCreateType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutCreateType::get_headers(self, req, connectors)?) - .set_body(types::PayoutCreateType::get_request_body( - self, req, connectors, - )?) + .headers(PayoutCreateType::get_headers(self, req, connectors)?) + .set_body(PayoutCreateType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) @@ -1322,17 +1288,17 @@ impl services::ConnectorIntegration, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: adyen::AdyenPayoutResponse = res .response .parse_struct("AdyenPayoutResponse") .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, @@ -1341,32 +1307,26 @@ impl services::ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } #[cfg(feature = "payouts")] -impl - services::ConnectorIntegration< - api::PoEligibility, - types::PayoutsData, - types::PayoutsResponseData, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_url( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( self.base_url(connectors), @@ -1378,12 +1338,12 @@ impl fn get_headers( &self, - req: &types::PayoutsRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PayoutEligibilityType::get_content_type(self) + PayoutEligibilityType::get_content_type(self) .to_string() .into(), )]; @@ -1394,10 +1354,10 @@ impl fn get_request_body( &self, - req: &types::PayoutsRouterData, - _connectors: &settings::Connectors, + req: &PayoutsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = convert_amount( + let amount = connector_utils::convert_amount( self.amount_converter, req.request.minor_amount, req.request.destination_currency, @@ -1410,19 +1370,15 @@ impl fn build_request( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PayoutEligibilityType::get_url( - self, req, connectors, - )?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PayoutEligibilityType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutEligibilityType::get_headers( - self, req, connectors, - )?) - .set_body(types::PayoutEligibilityType::get_request_body( + .headers(PayoutEligibilityType::get_headers(self, req, connectors)?) + .set_body(PayoutEligibilityType::get_request_body( self, req, connectors, )?) .build(); @@ -1433,17 +1389,17 @@ impl #[instrument(skip_all)] fn handle_response( &self, - data: &types::PayoutsRouterData, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: adyen::AdyenPayoutResponse = res .response .parse_struct("AdyenPayoutResponse") .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, @@ -1452,28 +1408,26 @@ 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) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } #[cfg(feature = "payouts")] -impl services::ConnectorIntegration - for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_url( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.payout_base_url.as_str(), @@ -1486,23 +1440,21 @@ impl services::ConnectorIntegration + enums::PayoutType::Bank | enums::PayoutType::Wallet => "confirmThirdParty".to_string(), - storage_enums::PayoutType::Card => "payout".to_string(), + enums::PayoutType::Card => "payout".to_string(), } )) } fn get_headers( &self, - req: &types::PayoutsRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::PayoutFulfillType::get_content_type(self) - .to_string() - .into(), + PayoutFulfillType::get_content_type(self).to_string().into(), )]; let auth = adyen::AdyenAuthType::try_from(&req.connector_auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; @@ -1517,10 +1469,10 @@ impl services::ConnectorIntegration { + enums::PayoutType::Bank | enums::PayoutType::Wallet => { auth.review_key.unwrap_or(auth.api_key).into_masked() } - storage_enums::PayoutType::Card => auth.api_key.into_masked(), + enums::PayoutType::Card => auth.api_key.into_masked(), }, )]; header.append(&mut api_key); @@ -1529,10 +1481,10 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &PayoutsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let amount = convert_amount( + let amount = connector_utils::convert_amount( self.amount_converter, req.request.minor_amount, req.request.destination_currency, @@ -1545,19 +1497,15 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PayoutFulfillType::get_url(self, req, connectors)?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PayoutFulfillType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutFulfillType::get_headers( - self, req, connectors, - )?) - .set_body(types::PayoutFulfillType::get_request_body( - self, req, connectors, - )?) + .headers(PayoutFulfillType::get_headers(self, req, connectors)?) + .set_body(PayoutFulfillType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) @@ -1566,17 +1514,17 @@ impl services::ConnectorIntegration, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: adyen::AdyenPayoutResponse = res .response .parse_struct("AdyenPayoutResponse") .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, @@ -1585,16 +1533,16 @@ impl services::ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } fn get_5xx_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -1603,19 +1551,15 @@ impl api::Refund for Adyen {} impl api::RefundExecute for Adyen {} impl api::RefundSync for Adyen {} -impl services::ConnectorIntegration - for Adyen -{ +impl ConnectorIntegration for Adyen { 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_header = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_header); @@ -1624,8 +1568,8 @@ impl services::ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { let connector_payment_id = req.request.connector_transaction_id.clone(); @@ -1642,10 +1586,10 @@ impl services::ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { - let refund_amount = convert_amount( + let refund_amount = connector_utils::convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -1658,20 +1602,16 @@ 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(), )) } @@ -1679,17 +1619,17 @@ impl services::ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: adyen::AdyenRefundResponse = res .response .parse_struct("AdyenRefundResponse") .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, @@ -1699,28 +1639,25 @@ impl services::ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } fn get_5xx_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 - for Adyen -{ -} +impl ConnectorIntegration for Adyen {} fn get_webhook_object_from_body( body: &[u8], -) -> CustomResult { +) -> CustomResult { let mut webhook: adyen::AdyenIncomingWebhook = body.parse_struct("AdyenIncomingWebhook")?; let item_object = webhook @@ -1728,23 +1665,24 @@ fn get_webhook_object_from_body( .drain(..) .next() // TODO: ParsingError doesn't seem to be an apt error for this case - .ok_or(errors::ParsingError::UnknownError)?; + .ok_or(common_utils::errors::ParsingError::UnknownError)?; Ok(item_object.notification_request_item) } #[async_trait::async_trait] -impl api::IncomingWebhook for Adyen { +impl IncomingWebhook for Adyen { fn get_webhook_source_verification_algorithm( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult, errors::ConnectorError> { - Ok(Box::new(crypto::HmacSha256)) + _request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult, errors::ConnectorError> + { + Ok(Box::new(common_utils::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 notif_item = get_webhook_object_from_body(request.body) @@ -1756,7 +1694,7 @@ impl api::IncomingWebhook for Adyen { 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> { @@ -1780,10 +1718,10 @@ impl api::IncomingWebhook for Adyen { 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>, + _connector_account_details: common_utils::crypto::Encryptable>, connector_label: &str, ) -> CustomResult { let connector_webhook_secrets = self @@ -1818,7 +1756,7 @@ impl api::IncomingWebhook for Adyen { 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::WebhookReferenceIdNotFound)?; @@ -1862,20 +1800,20 @@ impl api::IncomingWebhook for Adyen { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let notif = get_webhook_object_from_body(request.body) .change_context(errors::ConnectorError::WebhookEventTypeNotFound)?; - Ok(IncomingWebhookEvent::foreign_from(( + Ok(transformers::get_adyen_webhook_event( notif.event_code, notif.success, notif.additional_data.dispute_status, - ))) + )) } 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::WebhookEventTypeNotFound)?; @@ -1887,22 +1825,19 @@ impl api::IncomingWebhook for Adyen { 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)?; - Ok(api::disputes::DisputePayload { + Ok(disputes::DisputePayload { amount: notif.amount.value.to_string(), currency: notif.amount.currency, dispute_stage: api_models::enums::DisputeStage::from(notif.event_code.clone()), @@ -1918,7 +1853,7 @@ impl api::IncomingWebhook for Adyen { fn get_mandate_details( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult< Option, errors::ConnectorError, @@ -1939,7 +1874,7 @@ impl api::IncomingWebhook for Adyen { fn get_network_txn_id( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult< Option, errors::ConnectorError, @@ -1959,28 +1894,20 @@ impl api::IncomingWebhook for Adyen { } } -impl api::Dispute for Adyen {} -impl api::DefendDispute for Adyen {} -impl api::AcceptDispute for Adyen {} -impl api::SubmitEvidence for Adyen {} +impl Dispute for Adyen {} +impl DefendDispute for Adyen {} +impl AcceptDispute for Adyen {} +impl SubmitEvidence for Adyen {} -impl - services::ConnectorIntegration< - api::Accept, - types::AcceptDisputeRequestData, - types::AcceptDisputeResponse, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::AcceptDisputeRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &AcceptDisputeRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::AcceptDisputeType::get_content_type(self) - .to_string() - .into(), + AcceptDisputeType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -1989,8 +1916,8 @@ impl fn get_url( &self, - req: &types::AcceptDisputeRouterData, - connectors: &settings::Connectors, + req: &AcceptDisputeRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.dispute_base_url.as_str(), @@ -2005,27 +1932,23 @@ impl fn build_request( &self, - req: &types::AcceptDisputeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &AcceptDisputeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::AcceptDisputeType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&AcceptDisputeType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::AcceptDisputeType::get_headers( - self, req, connectors, - )?) - .set_body(types::AcceptDisputeType::get_request_body( - self, req, connectors, - )?) + .headers(AcceptDisputeType::get_headers(self, req, connectors)?) + .set_body(AcceptDisputeType::get_request_body(self, req, connectors)?) .build(), )) } fn get_request_body( &self, - req: &types::AcceptDisputeRouterData, - _connectors: &settings::Connectors, + req: &AcceptDisputeRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::AdyenAcceptDisputeRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -2033,44 +1956,36 @@ impl fn handle_response( &self, - data: &types::AcceptDisputeRouterData, + data: &AcceptDisputeRouterData, _event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenDisputeResponse = res .response .parse_struct("AdyenDisputeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; - types::RouterData::foreign_try_from((data, response)) + RouterData::foreign_try_from((data, response)) .change_context(errors::ConnectorError::ResponseHandlingFailed) } 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::Defend, - types::DefendDisputeRequestData, - types::DefendDisputeResponse, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::DefendDisputeRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &DefendDisputeRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::DefendDisputeType::get_content_type(self) - .to_string() - .into(), + DefendDisputeType::get_content_type(self).to_string().into(), )]; let mut api_key = self.get_auth_header(&req.connector_auth_type)?; header.append(&mut api_key); @@ -2079,8 +1994,8 @@ impl fn get_url( &self, - req: &types::DefendDisputeRouterData, - connectors: &settings::Connectors, + req: &DefendDisputeRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.dispute_base_url.as_str(), @@ -2095,28 +2010,24 @@ impl fn build_request( &self, - req: &types::DefendDisputeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &DefendDisputeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::DefendDisputeType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&DefendDisputeType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::DefendDisputeType::get_headers( - self, req, connectors, - )?) - .set_body(types::DefendDisputeType::get_request_body( - self, req, connectors, - )?) + .headers(DefendDisputeType::get_headers(self, req, connectors)?) + .set_body(DefendDisputeType::get_request_body(self, req, connectors)?) .build(), )) } fn get_request_body( &self, - req: &types::DefendDisputeRouterData, - _connectors: &settings::Connectors, + req: &DefendDisputeRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::AdyenDefendDisputeRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -2124,42 +2035,36 @@ impl fn handle_response( &self, - data: &types::DefendDisputeRouterData, + data: &DefendDisputeRouterData, _event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenDisputeResponse = res .response .parse_struct("AdyenDisputeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; - types::RouterData::foreign_try_from((data, response)) + RouterData::foreign_try_from((data, response)) .change_context(errors::ConnectorError::ResponseHandlingFailed) } 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::Evidence, - types::SubmitEvidenceRequestData, - types::SubmitEvidenceResponse, - > for Adyen -{ +impl ConnectorIntegration for Adyen { fn get_headers( &self, - req: &types::SubmitEvidenceRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &SubmitEvidenceRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut header = vec![( headers::CONTENT_TYPE.to_string(), - types::SubmitEvidenceType::get_content_type(self) + SubmitEvidenceType::get_content_type(self) .to_string() .into(), )]; @@ -2170,8 +2075,8 @@ impl fn get_url( &self, - req: &types::SubmitEvidenceRouterData, - connectors: &settings::Connectors, + req: &SubmitEvidenceRouterData, + connectors: &Connectors, ) -> CustomResult { let endpoint = build_env_specific_endpoint( connectors.adyen.dispute_base_url.as_str(), @@ -2186,8 +2091,8 @@ impl fn get_request_body( &self, - req: &types::SubmitEvidenceRouterData, - _connectors: &settings::Connectors, + req: &SubmitEvidenceRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = adyen::Evidence::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -2195,73 +2100,55 @@ impl fn build_request( &self, - req: &types::SubmitEvidenceRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::SubmitEvidenceType::get_url(self, req, connectors)?) + req: &SubmitEvidenceRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&SubmitEvidenceType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::SubmitEvidenceType::get_headers( - self, req, connectors, - )?) - .set_body(types::SubmitEvidenceType::get_request_body( - self, req, connectors, - )?) + .headers(SubmitEvidenceType::get_headers(self, req, connectors)?) + .set_body(SubmitEvidenceType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) } fn handle_response( &self, - data: &types::SubmitEvidenceRouterData, + data: &SubmitEvidenceRouterData, _event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: adyen::AdyenDisputeResponse = res .response .parse_struct("AdyenDisputeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; - types::RouterData::foreign_try_from((data, response)) + RouterData::foreign_try_from((data, response)) .change_context(errors::ConnectorError::ResponseHandlingFailed) } 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 api::UploadFile for Adyen {} -impl api::RetrieveFile for Adyen {} -impl - services::ConnectorIntegration< - api::Retrieve, - types::RetrieveFileRequestData, - types::RetrieveFileResponse, - > for Adyen -{ -} -impl - services::ConnectorIntegration< - api::Upload, - types::UploadFileRequestData, - types::UploadFileResponse, - > for Adyen -{ -} +impl UploadFile for Adyen {} +impl RetrieveFile for Adyen {} +impl ConnectorIntegration for Adyen {} +impl ConnectorIntegration for Adyen {} #[async_trait::async_trait] -impl api::FileUpload for Adyen { +impl FileUpload for Adyen { fn validate_file_upload( &self, - purpose: api::FilePurpose, + purpose: FilePurpose, file_size: i32, file_type: mime::Mime, ) -> CustomResult<(), errors::ConnectorError> { match purpose { - api::FilePurpose::DisputeEvidence => { + FilePurpose::DisputeEvidence => { let supported_file_types = ["image/jpeg", "image/jpg", "image/png", "application/pdf"]; if !supported_file_types.contains(&file_type.to_string().as_str()) { diff --git a/crates/router/src/connector/adyen/transformers.rs b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs similarity index 81% rename from crates/router/src/connector/adyen/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs index 0920887962..13a29f16a0 100644 --- a/crates/router/src/connector/adyen/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/adyen/transformers.rs @@ -1,36 +1,70 @@ -#[cfg(feature = "payouts")] -use api_models::payouts::PayoutMethodData; -use api_models::{enums, payments, webhooks}; -use cards::CardNumber; -use common_utils::{errors::ParsingError, ext_traits::Encode, id_type, pii, types::MinorUnit}; -use error_stack::{report, ResultExt}; -use hyperswitch_domain_models::{ - network_tokenization::NetworkTokenNumber, router_request_types::SubmitEvidenceRequestData, -}; -use masking::{ExposeInterface, PeekInterface}; -use reqwest::Url; -use serde::{Deserialize, Serialize}; -use time::{Duration, OffsetDateTime, PrimitiveDateTime}; +use std::marker::PhantomData; #[cfg(feature = "payouts")] -use crate::{connector::utils::PayoutsData, types::api::payouts, utils::OptionExt}; -use crate::{ - connector::utils::{ - self, missing_field_err, AddressDetailsData, BrowserInformationData, CardData, - NetworkTokenData, PaymentsAuthorizeRequestData, PhoneDetailsData, RouterData, +use api_models::payouts::{self, PayoutMethodData}; +use api_models::{ + enums, + payments::{self, QrCodeInformation, VoucherNextStepData}, +}; +use cards::CardNumber; +use common_enums::enums as storage_enums; +#[cfg(feature = "payouts")] +use common_utils::ext_traits::OptionExt; +use common_utils::{ + errors::{CustomResult, ParsingError}, + ext_traits::Encode, + pii::Email, + request::Method, + types::MinorUnit, +}; +use error_stack::{report, ResultExt}; +use hyperswitch_domain_models::{ + network_tokenization::NetworkTokenNumber, + payment_method_data::{ + BankDebitData, BankRedirectData, BankTransferData, Card, CardRedirectData, GiftCardData, + NetworkTokenData, PayLaterData, PaymentMethodData, VoucherData, WalletData, + }, + router_data::{ + ConnectorAuthType, ErrorResponse, PaymentMethodBalance, PaymentMethodToken, RouterData, + }, + router_request_types::{ + PaymentsAuthorizeData, PaymentsPreProcessingData, ResponseId, SubmitEvidenceRequestData, + }, + router_response_types::{ + AcceptDisputeResponse, DefendDisputeResponse, MandateReference, PaymentsResponseData, + RedirectForm, RefundsResponseData, SubmitEvidenceResponse, }, - consts, - core::errors, - pii::{Email, Secret}, - services, types::{ - self, - api::enums as api_enums, - domain, - storage::enums as storage_enums, - transformers::{ForeignFrom, ForeignTryFrom}, + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsPreProcessingRouterData, RefundsRouterData, SetupMandateRouterData, + }, +}; +#[cfg(feature = "payouts")] +use hyperswitch_domain_models::{ + router_response_types::PayoutsResponseData, types::PayoutsRouterData, +}; +use hyperswitch_interfaces::{ + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, +}; +use masking::{ExposeInterface, PeekInterface, Secret}; +use serde::{Deserialize, Serialize}; +use time::{Duration, OffsetDateTime, PrimitiveDateTime}; +use url::Url; + +#[cfg(feature = "payouts")] +use crate::{types::PayoutsResponseRouterData, utils::PayoutsData}; +use crate::{ + types::{ + AcceptDisputeRouterData, DefendDisputeRouterData, PaymentsCancelResponseRouterData, + PaymentsCaptureResponseRouterData, RefundsResponseRouterData, ResponseRouterData, + SubmitEvidenceRouterData, + }, + utils::{ + self, is_manual_capture, missing_field_err, AddressDetailsData, BrowserInformationData, + CardData, ForeignTryFrom, NetworkTokenData as UtilsNetworkTokenData, + PaymentsAuthorizeRequestData, PhoneDetailsData, RouterData as OtherRouterData, }, - utils as crate_utils, }; type Error = error_stack::Report; @@ -55,9 +89,11 @@ pub struct AdyenConnectorMetadataObject { pub endpoint_prefix: Option, } -impl TryFrom<&Option> for AdyenConnectorMetadataObject { +impl TryFrom<&Option> for AdyenConnectorMetadataObject { type Error = error_stack::Report; - fn try_from(meta_data: &Option) -> Result { + fn try_from( + meta_data: &Option, + ) -> Result { let metadata: Self = utils::to_connector_meta_from_secret::(meta_data.clone()) .change_context(errors::ConnectorError::InvalidConnectorConfig { config: "metadata", @@ -123,7 +159,7 @@ pub struct ShopperName { #[serde(rename_all = "camelCase")] pub struct Address { city: String, - country: api_enums::CountryAlpha2, + country: enums::CountryAlpha2, house_number_or_name: Secret, postal_code: Secret, state_or_province: Option>, @@ -160,7 +196,7 @@ pub struct AdyenPaymentRequest<'a> { store_payment_method: Option, shopper_name: Option, #[serde(rename = "shopperIP")] - shopper_ip: Option>, + shopper_ip: Option>, shopper_locale: Option, shopper_email: Option, shopper_statement: Option, @@ -168,10 +204,10 @@ pub struct AdyenPaymentRequest<'a> { telephone_number: Option>, billing_address: Option
, delivery_address: Option
, - country_code: Option, + country_code: Option, line_items: Option>, channel: Option, - metadata: Option, + metadata: Option, merchant_order_reference: Option, splits: Option>, store: Option, @@ -256,40 +292,40 @@ pub struct AdyenBalanceResponse { /// This implementation will be used only in Authorize, Automatic capture flow. /// It is also being used in Psync flow, However Psync will be called only after create payment call that too in redirect flow. -impl ForeignFrom<(bool, AdyenStatus, Option)> - for storage_enums::AttemptStatus -{ - fn foreign_from( - (is_manual_capture, adyen_status, pmt): ( - bool, - AdyenStatus, - Option, - ), - ) -> Self { - match adyen_status { - AdyenStatus::AuthenticationFinished => Self::AuthenticationSuccessful, - AdyenStatus::AuthenticationNotRequired | AdyenStatus::Received => Self::Pending, - AdyenStatus::Authorised => match is_manual_capture { - true => Self::Authorized, - // In case of Automatic capture Authorized is the final status of the payment - false => Self::Charged, - }, - AdyenStatus::Cancelled => Self::Voided, - AdyenStatus::ChallengeShopper - | AdyenStatus::RedirectShopper - | AdyenStatus::PresentToShopper => Self::AuthenticationPending, - AdyenStatus::Error | AdyenStatus::Refused => Self::Failure, - AdyenStatus::Pending => match pmt { - Some(common_enums::PaymentMethodType::Pix) => Self::AuthenticationPending, - _ => Self::Pending, - }, - #[cfg(feature = "payouts")] - AdyenStatus::PayoutConfirmReceived => Self::Started, - #[cfg(feature = "payouts")] - AdyenStatus::PayoutSubmitReceived => Self::Pending, - #[cfg(feature = "payouts")] - AdyenStatus::PayoutDeclineReceived => Self::Voided, +fn get_adyen_payment_status( + is_manual_capture: bool, + adyen_status: AdyenStatus, + pmt: Option, +) -> storage_enums::AttemptStatus { + match adyen_status { + AdyenStatus::AuthenticationFinished => { + storage_enums::AttemptStatus::AuthenticationSuccessful } + AdyenStatus::AuthenticationNotRequired | AdyenStatus::Received => { + storage_enums::AttemptStatus::Pending + } + AdyenStatus::Authorised => match is_manual_capture { + true => storage_enums::AttemptStatus::Authorized, + // In case of Automatic capture Authorized is the final status of the payment + false => storage_enums::AttemptStatus::Charged, + }, + AdyenStatus::Cancelled => storage_enums::AttemptStatus::Voided, + AdyenStatus::ChallengeShopper + | AdyenStatus::RedirectShopper + | AdyenStatus::PresentToShopper => storage_enums::AttemptStatus::AuthenticationPending, + AdyenStatus::Error | AdyenStatus::Refused => storage_enums::AttemptStatus::Failure, + AdyenStatus::Pending => match pmt { + Some(common_enums::PaymentMethodType::Pix) => { + storage_enums::AttemptStatus::AuthenticationPending + } + _ => storage_enums::AttemptStatus::Pending, + }, + #[cfg(feature = "payouts")] + AdyenStatus::PayoutConfirmReceived => storage_enums::AttemptStatus::Started, + #[cfg(feature = "payouts")] + AdyenStatus::PayoutSubmitReceived => storage_enums::AttemptStatus::Pending, + #[cfg(feature = "payouts")] + AdyenStatus::PayoutDeclineReceived => storage_enums::AttemptStatus::Voided, } } @@ -362,7 +398,7 @@ pub struct AdyenThreeDS { #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(untagged)] pub enum AdyenPaymentResponse { - Response(Box), + Response(Box), PresentToShopper(Box), QrCodeResponse(Box), RedirectionResponse(Box), @@ -372,7 +408,7 @@ pub enum AdyenPaymentResponse { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct Response { +pub struct AdyenResponse { psp_reference: String, result_code: AdyenStatus, amount: Option, @@ -502,7 +538,7 @@ pub struct AdyenPtsAction { pub struct AdyenRedirectAction { payment_method_type: PaymentType, url: Option, - method: Option, + method: Option, #[serde(rename = "type")] type_of_response: ActionType, data: Option>, @@ -641,7 +677,7 @@ pub enum AdyenPaymentMethod<'a> { #[serde(rename = "givex")] PaymentMethodBalance(Box), #[serde(rename = "giftcard")] - AdyenGiftCard(Box), + AdyenGiftCard(Box), #[serde(rename = "swish")] Swish, #[serde(rename = "benefit")] @@ -683,7 +719,7 @@ pub struct BalancePmData { #[derive(Debug, Clone, Serialize)] #[serde(rename_all = "camelCase")] -pub struct GiftCardData { +pub struct AdyenGiftCardData { brand: GiftCardBrand, number: Secret, cvc: Secret, @@ -738,9 +774,9 @@ pub enum OnlineBankingCzechRepublicBanks { CS, } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for JCSVoucherData { +impl TryFrom<&PaymentsAuthorizeRouterData> for JCSVoucherData { type Error = Error; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { + fn try_from(item: &PaymentsAuthorizeRouterData) -> Result { Ok(Self { first_name: item.get_billing_first_name()?, last_name: item.get_optional_billing_last_name(), @@ -1529,16 +1565,16 @@ impl TryFrom<&common_enums::BankNames> for AdyenTestBankNames<'_> { } } -impl TryFrom<&types::ConnectorAuthType> for AdyenAuthType { +impl TryFrom<&ConnectorAuthType> for AdyenAuthType { 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 { api_key: api_key.to_owned(), merchant_account: key1.to_owned(), review_key: None, }), - types::ConnectorAuthType::SignatureKey { + ConnectorAuthType::SignatureKey { api_key, key1, api_secret, @@ -1552,11 +1588,9 @@ impl TryFrom<&types::ConnectorAuthType> for AdyenAuthType { } } -impl TryFrom<&AdyenRouterData<&types::PaymentsAuthorizeRouterData>> for AdyenPaymentRequest<'_> { +impl TryFrom<&AdyenRouterData<&PaymentsAuthorizeRouterData>> for AdyenPaymentRequest<'_> { type Error = Error; - fn try_from( - item: &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - ) -> Result { + fn try_from(item: &AdyenRouterData<&PaymentsAuthorizeRouterData>) -> Result { match item .router_data .request @@ -1566,45 +1600,43 @@ impl TryFrom<&AdyenRouterData<&types::PaymentsAuthorizeRouterData>> for AdyenPay { Some(mandate_ref) => AdyenPaymentRequest::try_from((item, mandate_ref)), None => match item.router_data.request.payment_method_data { - domain::PaymentMethodData::Card(ref card) => { - AdyenPaymentRequest::try_from((item, card)) - } - domain::PaymentMethodData::Wallet(ref wallet) => { + PaymentMethodData::Card(ref card) => AdyenPaymentRequest::try_from((item, card)), + PaymentMethodData::Wallet(ref wallet) => { AdyenPaymentRequest::try_from((item, wallet)) } - domain::PaymentMethodData::PayLater(ref pay_later) => { + PaymentMethodData::PayLater(ref pay_later) => { AdyenPaymentRequest::try_from((item, pay_later)) } - domain::PaymentMethodData::BankRedirect(ref bank_redirect) => { + PaymentMethodData::BankRedirect(ref bank_redirect) => { AdyenPaymentRequest::try_from((item, bank_redirect)) } - domain::PaymentMethodData::BankDebit(ref bank_debit) => { + PaymentMethodData::BankDebit(ref bank_debit) => { AdyenPaymentRequest::try_from((item, bank_debit)) } - domain::PaymentMethodData::BankTransfer(ref bank_transfer) => { + PaymentMethodData::BankTransfer(ref bank_transfer) => { AdyenPaymentRequest::try_from((item, bank_transfer.as_ref())) } - domain::PaymentMethodData::CardRedirect(ref card_redirect_data) => { + PaymentMethodData::CardRedirect(ref card_redirect_data) => { AdyenPaymentRequest::try_from((item, card_redirect_data)) } - domain::PaymentMethodData::Voucher(ref voucher_data) => { + PaymentMethodData::Voucher(ref voucher_data) => { AdyenPaymentRequest::try_from((item, voucher_data)) } - domain::PaymentMethodData::GiftCard(ref gift_card_data) => { + PaymentMethodData::GiftCard(ref gift_card_data) => { AdyenPaymentRequest::try_from((item, gift_card_data.as_ref())) } - domain::PaymentMethodData::NetworkToken(ref token_data) => { + PaymentMethodData::NetworkToken(ref token_data) => { AdyenPaymentRequest::try_from((item, token_data)) } - domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Adyen"), ))? @@ -1614,29 +1646,25 @@ impl TryFrom<&AdyenRouterData<&types::PaymentsAuthorizeRouterData>> for AdyenPay } } -impl TryFrom<&types::PaymentsPreProcessingRouterData> for AdyenBalanceRequest<'_> { +impl TryFrom<&PaymentsPreProcessingRouterData> for AdyenBalanceRequest<'_> { type Error = Error; - fn try_from(item: &types::PaymentsPreProcessingRouterData) -> Result { + fn try_from(item: &PaymentsPreProcessingRouterData) -> Result { let payment_method = match &item.request.payment_method_data { - Some(domain::PaymentMethodData::GiftCard(gift_card_data)) => { - match gift_card_data.as_ref() { - domain::GiftCardData::Givex(gift_card_data) => { - let balance_pm = BalancePmData { - number: gift_card_data.number.clone(), - cvc: gift_card_data.cvc.clone(), - }; - Ok(AdyenPaymentMethod::PaymentMethodBalance(Box::new( - balance_pm, - ))) - } - domain::GiftCardData::PaySafeCard {} => { - Err(errors::ConnectorError::FlowNotSupported { - flow: "Balance".to_string(), - connector: "adyen".to_string(), - }) - } + Some(PaymentMethodData::GiftCard(gift_card_data)) => match gift_card_data.as_ref() { + GiftCardData::Givex(gift_card_data) => { + let balance_pm = BalancePmData { + number: gift_card_data.number.clone(), + cvc: gift_card_data.cvc.clone(), + }; + Ok(AdyenPaymentMethod::PaymentMethodBalance(Box::new( + balance_pm, + ))) } - } + GiftCardData::PaySafeCard {} => Err(errors::ConnectorError::FlowNotSupported { + flow: "Balance".to_string(), + connector: "adyen".to_string(), + }), + }, _ => Err(errors::ConnectorError::FlowNotSupported { flow: "Balance".to_string(), connector: "adyen".to_string(), @@ -1650,8 +1678,8 @@ impl TryFrom<&types::PaymentsPreProcessingRouterData> for AdyenBalanceRequest<'_ } } -impl From<&types::PaymentsAuthorizeRouterData> for AdyenShopperInteraction { - fn from(item: &types::PaymentsAuthorizeRouterData) -> Self { +impl From<&PaymentsAuthorizeRouterData> for AdyenShopperInteraction { + fn from(item: &PaymentsAuthorizeRouterData) -> Self { match item.request.off_session { Some(true) => Self::ContinuedAuthentication, _ => Self::Ecommerce, @@ -1661,7 +1689,7 @@ impl From<&types::PaymentsAuthorizeRouterData> for AdyenShopperInteraction { type RecurringDetails = (Option, Option, Option); fn get_recurring_processing_model( - item: &types::PaymentsAuthorizeRouterData, + item: &PaymentsAuthorizeRouterData, ) -> Result { match (item.request.setup_future_usage, item.request.off_session) { (Some(storage_enums::FutureUsage::OffSession), _) => { @@ -1691,9 +1719,7 @@ fn get_recurring_processing_model( } } -fn get_browser_info( - item: &types::PaymentsAuthorizeRouterData, -) -> Result, Error> { +fn get_browser_info(item: &PaymentsAuthorizeRouterData) -> Result, Error> { if item.auth_type == storage_enums::AuthenticationType::ThreeDs || item.payment_method == storage_enums::PaymentMethod::Card || item.payment_method == storage_enums::PaymentMethod::BankRedirect @@ -1716,15 +1742,14 @@ fn get_browser_info( } } -fn get_additional_data(item: &types::PaymentsAuthorizeRouterData) -> Option { +fn get_additional_data(item: &PaymentsAuthorizeRouterData) -> Option { let (authorisation_type, manual_capture) = match item.request.capture_method { - Some(diesel_models::enums::CaptureMethod::Manual) - | Some(diesel_models::enums::CaptureMethod::ManualMultiple) => { + Some(storage_enums::CaptureMethod::Manual) | Some(enums::CaptureMethod::ManualMultiple) => { (Some(AuthType::PreAuth), Some("true".to_string())) } _ => (None, None), }; - let execute_three_d = if matches!(item.auth_type, enums::AuthenticationType::ThreeDs) { + let execute_three_d = if matches!(item.auth_type, storage_enums::AuthenticationType::ThreeDs) { Some("true".to_string()) } else { None @@ -1756,7 +1781,7 @@ fn get_channel_type(pm_type: Option) -> Option }) } -fn get_amount_data(item: &AdyenRouterData<&types::PaymentsAuthorizeRouterData>) -> Amount { +fn get_amount_data(item: &AdyenRouterData<&PaymentsAuthorizeRouterData>) -> Amount { Amount { currency: item.router_data.request.currency, value: item.amount.to_owned(), @@ -1782,7 +1807,7 @@ pub fn get_address_info( }) } -fn get_line_items(item: &AdyenRouterData<&types::PaymentsAuthorizeRouterData>) -> Vec { +fn get_line_items(item: &AdyenRouterData<&PaymentsAuthorizeRouterData>) -> Vec { let order_details = item.router_data.request.order_details.clone(); match order_details { Some(od) => od @@ -1811,7 +1836,7 @@ fn get_line_items(item: &AdyenRouterData<&types::PaymentsAuthorizeRouterData>) - } } -fn get_telephone_number(item: &types::PaymentsAuthorizeRouterData) -> Option> { +fn get_telephone_number(item: &PaymentsAuthorizeRouterData) -> Option> { let phone = item .get_optional_billing() .and_then(|billing| billing.phone.as_ref()); @@ -1838,32 +1863,32 @@ fn get_shopper_name( fn get_country_code( address: Option<&hyperswitch_domain_models::address::Address>, -) -> Option { +) -> Option { address.and_then(|billing| billing.address.as_ref().and_then(|address| address.country)) } -fn get_social_security_number(voucher_data: &domain::VoucherData) -> Option> { +fn get_social_security_number(voucher_data: &VoucherData) -> Option> { match voucher_data { - domain::VoucherData::Boleto(boleto_data) => boleto_data.social_security_number.clone(), - domain::VoucherData::Alfamart { .. } - | domain::VoucherData::Indomaret { .. } - | domain::VoucherData::Efecty - | domain::VoucherData::PagoEfectivo - | domain::VoucherData::RedCompra - | domain::VoucherData::Oxxo - | domain::VoucherData::RedPagos - | domain::VoucherData::SevenEleven { .. } - | domain::VoucherData::Lawson { .. } - | domain::VoucherData::MiniStop { .. } - | domain::VoucherData::FamilyMart { .. } - | domain::VoucherData::Seicomart { .. } - | domain::VoucherData::PayEasy { .. } => None, + VoucherData::Boleto(boleto_data) => boleto_data.social_security_number.clone(), + VoucherData::Alfamart { .. } + | VoucherData::Indomaret { .. } + | VoucherData::Efecty + | VoucherData::PagoEfectivo + | VoucherData::RedCompra + | VoucherData::Oxxo + | VoucherData::RedPagos + | VoucherData::SevenEleven { .. } + | VoucherData::Lawson { .. } + | VoucherData::MiniStop { .. } + | VoucherData::FamilyMart { .. } + | VoucherData::Seicomart { .. } + | VoucherData::PayEasy { .. } => None, } } fn build_shopper_reference( - customer_id: &Option, - merchant_id: id_type::MerchantId, + customer_id: &Option, + merchant_id: common_utils::id_type::MerchantId, ) -> Option { customer_id.clone().map(|c_id| { format!( @@ -1874,15 +1899,13 @@ fn build_shopper_reference( }) } -impl TryFrom<(&domain::BankDebitData, &types::PaymentsAuthorizeRouterData)> - for AdyenPaymentMethod<'_> -{ +impl TryFrom<(&BankDebitData, &PaymentsAuthorizeRouterData)> for AdyenPaymentMethod<'_> { type Error = Error; fn try_from( - (bank_debit_data, item): (&domain::BankDebitData, &types::PaymentsAuthorizeRouterData), + (bank_debit_data, item): (&BankDebitData, &PaymentsAuthorizeRouterData), ) -> Result { match bank_debit_data { - domain::BankDebitData::AchBankDebit { + BankDebitData::AchBankDebit { account_number, routing_number, .. @@ -1893,13 +1916,13 @@ impl TryFrom<(&domain::BankDebitData, &types::PaymentsAuthorizeRouterData)> owner_name: item.get_billing_full_name()?, }, ))), - domain::BankDebitData::SepaBankDebit { iban, .. } => Ok( - AdyenPaymentMethod::SepaDirectDebit(Box::new(SepaDirectDebitData { + BankDebitData::SepaBankDebit { iban, .. } => Ok(AdyenPaymentMethod::SepaDirectDebit( + Box::new(SepaDirectDebitData { owner_name: item.get_billing_full_name()?, iban_number: iban.clone(), - })), - ), - domain::BankDebitData::BacsBankDebit { + }), + )), + BankDebitData::BacsBankDebit { account_number, sort_code, .. @@ -1911,56 +1934,7 @@ impl TryFrom<(&domain::BankDebitData, &types::PaymentsAuthorizeRouterData)> }, ))), - domain::BankDebitData::BecsBankDebit { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Adyen"), - ) - .into()) - } - } - } -} - -impl TryFrom<(&domain::VoucherData, &types::PaymentsAuthorizeRouterData)> - for AdyenPaymentMethod<'_> -{ - type Error = Error; - fn try_from( - (voucher_data, item): (&domain::VoucherData, &types::PaymentsAuthorizeRouterData), - ) -> Result { - match voucher_data { - domain::VoucherData::Boleto { .. } => Ok(AdyenPaymentMethod::BoletoBancario), - domain::VoucherData::Alfamart(_) => Ok(AdyenPaymentMethod::Alfamart(Box::new( - DokuBankData::try_from(item)?, - ))), - - domain::VoucherData::Indomaret(_) => Ok(AdyenPaymentMethod::Indomaret(Box::new( - DokuBankData::try_from(item)?, - ))), - - domain::VoucherData::Oxxo => Ok(AdyenPaymentMethod::Oxxo), - domain::VoucherData::SevenEleven(_) => Ok(AdyenPaymentMethod::SevenEleven(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::Lawson(_) => Ok(AdyenPaymentMethod::Lawson(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::MiniStop(_) => Ok(AdyenPaymentMethod::MiniStop(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::FamilyMart(_) => Ok(AdyenPaymentMethod::FamilyMart(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::Seicomart(_) => Ok(AdyenPaymentMethod::Seicomart(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::PayEasy(_) => Ok(AdyenPaymentMethod::PayEasy(Box::new( - JCSVoucherData::try_from(item)?, - ))), - domain::VoucherData::Efecty - | domain::VoucherData::PagoEfectivo - | domain::VoucherData::RedCompra - | domain::VoucherData::RedPagos => Err(errors::ConnectorError::NotImplemented( + BankDebitData::BecsBankDebit { .. } => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Adyen"), ) .into()), @@ -1968,13 +1942,58 @@ impl TryFrom<(&domain::VoucherData, &types::PaymentsAuthorizeRouterData)> } } -impl TryFrom<&domain::GiftCardData> for AdyenPaymentMethod<'_> { +impl TryFrom<(&VoucherData, &PaymentsAuthorizeRouterData)> for AdyenPaymentMethod<'_> { type Error = Error; - fn try_from(gift_card_data: &domain::GiftCardData) -> Result { + fn try_from( + (voucher_data, item): (&VoucherData, &PaymentsAuthorizeRouterData), + ) -> Result { + match voucher_data { + VoucherData::Boleto { .. } => Ok(AdyenPaymentMethod::BoletoBancario), + VoucherData::Alfamart(_) => Ok(AdyenPaymentMethod::Alfamart(Box::new( + DokuBankData::try_from(item)?, + ))), + + VoucherData::Indomaret(_) => Ok(AdyenPaymentMethod::Indomaret(Box::new( + DokuBankData::try_from(item)?, + ))), + + VoucherData::Oxxo => Ok(AdyenPaymentMethod::Oxxo), + VoucherData::SevenEleven(_) => Ok(AdyenPaymentMethod::SevenEleven(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::Lawson(_) => Ok(AdyenPaymentMethod::Lawson(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::MiniStop(_) => Ok(AdyenPaymentMethod::MiniStop(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::FamilyMart(_) => Ok(AdyenPaymentMethod::FamilyMart(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::Seicomart(_) => Ok(AdyenPaymentMethod::Seicomart(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::PayEasy(_) => Ok(AdyenPaymentMethod::PayEasy(Box::new( + JCSVoucherData::try_from(item)?, + ))), + VoucherData::Efecty + | VoucherData::PagoEfectivo + | VoucherData::RedCompra + | VoucherData::RedPagos => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Adyen"), + ) + .into()), + } + } +} + +impl TryFrom<&GiftCardData> for AdyenPaymentMethod<'_> { + type Error = Error; + fn try_from(gift_card_data: &GiftCardData) -> Result { match gift_card_data { - domain::GiftCardData::PaySafeCard {} => Ok(AdyenPaymentMethod::PaySafeCard), - domain::GiftCardData::Givex(givex_data) => { - let gift_card_pm = GiftCardData { + GiftCardData::PaySafeCard {} => Ok(AdyenPaymentMethod::PaySafeCard), + GiftCardData::Givex(givex_data) => { + let gift_card_pm = AdyenGiftCardData { brand: GiftCardBrand::Givex, number: givex_data.number.clone(), cvc: givex_data.cvc.clone(), @@ -2001,10 +2020,10 @@ fn get_adyen_card_network(card_network: common_enums::CardNetwork) -> Option>)> for AdyenPaymentMethod<'_> { +impl TryFrom<(&Card, Option>)> for AdyenPaymentMethod<'_> { type Error = Error; fn try_from( - (card, card_holder_name): (&domain::Card, Option>), + (card, card_holder_name): (&Card, Option>), ) -> Result { let adyen_card = AdyenCard { number: card.card_number.clone(), @@ -2074,68 +2093,64 @@ impl TryFrom<&utils::CardIssuer> for CardBrand { } } -impl TryFrom<(&domain::WalletData, &types::PaymentsAuthorizeRouterData)> - for AdyenPaymentMethod<'_> -{ +impl TryFrom<(&WalletData, &PaymentsAuthorizeRouterData)> for AdyenPaymentMethod<'_> { type Error = Error; - fn try_from( - value: (&domain::WalletData, &types::PaymentsAuthorizeRouterData), - ) -> Result { + fn try_from(value: (&WalletData, &PaymentsAuthorizeRouterData)) -> Result { let (wallet_data, item) = value; match wallet_data { - domain::WalletData::GooglePay(data) => { + WalletData::GooglePay(data) => { let gpay_data = AdyenGPay { google_pay_token: Secret::new(data.tokenization_data.token.to_owned()), }; Ok(AdyenPaymentMethod::Gpay(Box::new(gpay_data))) } - domain::WalletData::ApplePay(data) => { + WalletData::ApplePay(data) => { let apple_pay_data = AdyenApplePay { apple_pay_token: Secret::new(data.payment_data.to_string()), }; Ok(AdyenPaymentMethod::ApplePay(Box::new(apple_pay_data))) } - domain::WalletData::PaypalRedirect(_) => Ok(AdyenPaymentMethod::AdyenPaypal), - domain::WalletData::AliPayRedirect(_) => Ok(AdyenPaymentMethod::AliPay), - domain::WalletData::AliPayHkRedirect(_) => Ok(AdyenPaymentMethod::AliPayHk), - domain::WalletData::GoPayRedirect(_) => { + WalletData::PaypalRedirect(_) => Ok(AdyenPaymentMethod::AdyenPaypal), + WalletData::AliPayRedirect(_) => Ok(AdyenPaymentMethod::AliPay), + WalletData::AliPayHkRedirect(_) => Ok(AdyenPaymentMethod::AliPayHk), + WalletData::GoPayRedirect(_) => { let go_pay_data = GoPayData {}; Ok(AdyenPaymentMethod::GoPay(Box::new(go_pay_data))) } - domain::WalletData::KakaoPayRedirect(_) => { + WalletData::KakaoPayRedirect(_) => { let kakao_pay_data = KakaoPayData {}; Ok(AdyenPaymentMethod::Kakaopay(Box::new(kakao_pay_data))) } - domain::WalletData::GcashRedirect(_) => { + WalletData::GcashRedirect(_) => { let gcash_data = GcashData {}; Ok(AdyenPaymentMethod::Gcash(Box::new(gcash_data))) } - domain::WalletData::MomoRedirect(_) => { + WalletData::MomoRedirect(_) => { let momo_data = MomoData {}; Ok(AdyenPaymentMethod::Momo(Box::new(momo_data))) } - domain::WalletData::TouchNGoRedirect(_) => { + WalletData::TouchNGoRedirect(_) => { let touch_n_go_data = TouchNGoData {}; Ok(AdyenPaymentMethod::TouchNGo(Box::new(touch_n_go_data))) } - domain::WalletData::MbWayRedirect(_) => { + WalletData::MbWayRedirect(_) => { let phone_details = item.get_billing_phone()?; let mbway_data = MbwayData { telephone_number: phone_details.get_number_with_country_code()?, }; Ok(AdyenPaymentMethod::Mbway(Box::new(mbway_data))) } - domain::WalletData::MobilePayRedirect(_) => Ok(AdyenPaymentMethod::MobilePay), - domain::WalletData::WeChatPayRedirect(_) => Ok(AdyenPaymentMethod::WeChatPayWeb), - domain::WalletData::SamsungPay(samsung_data) => { + WalletData::MobilePayRedirect(_) => Ok(AdyenPaymentMethod::MobilePay), + WalletData::WeChatPayRedirect(_) => Ok(AdyenPaymentMethod::WeChatPayWeb), + WalletData::SamsungPay(samsung_data) => { let data = SamsungPayPmData { samsung_pay_token: samsung_data.payment_credential.token_data.data.to_owned(), }; Ok(AdyenPaymentMethod::SamsungPay(Box::new(data))) } - domain::WalletData::Paze(_) => match item.payment_method_token.clone() { - Some(types::PaymentMethodToken::PazeDecrypt(paze_decrypted_data)) => { + WalletData::Paze(_) => match item.payment_method_token.clone() { + Some(PaymentMethodToken::PazeDecrypt(paze_decrypted_data)) => { let data = AdyenPazeData { number: paze_decrypted_data.token.payment_token, expiry_month: paze_decrypted_data.token.token_expiration_month, @@ -2156,20 +2171,20 @@ impl TryFrom<(&domain::WalletData, &types::PaymentsAuthorizeRouterData)> ) .into()), }, - domain::WalletData::TwintRedirect { .. } => Ok(AdyenPaymentMethod::Twint), - domain::WalletData::VippsRedirect { .. } => Ok(AdyenPaymentMethod::Vipps), - domain::WalletData::DanaRedirect { .. } => Ok(AdyenPaymentMethod::Dana), - domain::WalletData::SwishQr(_) => Ok(AdyenPaymentMethod::Swish), - domain::WalletData::AliPayQr(_) - | domain::WalletData::AmazonPayRedirect(_) - | domain::WalletData::ApplePayRedirect(_) - | domain::WalletData::ApplePayThirdPartySdk(_) - | domain::WalletData::GooglePayRedirect(_) - | domain::WalletData::GooglePayThirdPartySdk(_) - | domain::WalletData::PaypalSdk(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( + WalletData::TwintRedirect { .. } => Ok(AdyenPaymentMethod::Twint), + WalletData::VippsRedirect { .. } => Ok(AdyenPaymentMethod::Vipps), + WalletData::DanaRedirect { .. } => Ok(AdyenPaymentMethod::Dana), + WalletData::SwishQr(_) => Ok(AdyenPaymentMethod::Swish), + WalletData::AliPayQr(_) + | WalletData::AmazonPayRedirect(_) + | WalletData::ApplePayRedirect(_) + | WalletData::ApplePayThirdPartySdk(_) + | WalletData::GooglePayRedirect(_) + | WalletData::GooglePayThirdPartySdk(_) + | WalletData::PaypalSdk(_) + | WalletData::WeChatPayQr(_) + | WalletData::CashappQr(_) + | WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Adyen"), ) .into()), @@ -2190,8 +2205,8 @@ pub fn check_required_field<'a, T>( impl TryFrom<( - &domain::PayLaterData, - &Option, + &PayLaterData, + &Option, &Option, &Option, &Option, @@ -2203,8 +2218,8 @@ impl type Error = Error; fn try_from( value: ( - &domain::PayLaterData, - &Option, + &PayLaterData, + &Option, &Option, &Option, &Option, @@ -2224,14 +2239,14 @@ impl delivery_address, ) = value; match pay_later_data { - domain::payments::PayLaterData::KlarnaRedirect { .. } => { + PayLaterData::KlarnaRedirect { .. } => { check_required_field(shopper_email, "email")?; check_required_field(shopper_reference, "customer_id")?; check_required_field(country_code, "billing.country")?; Ok(AdyenPaymentMethod::AdyenKlarna) } - domain::payments::PayLaterData::AffirmRedirect { .. } => { + PayLaterData::AffirmRedirect { .. } => { check_required_field(shopper_email, "email")?; check_required_field(shopper_name, "billing.first_name, billing.last_name")?; check_required_field(telephone_number, "billing.phone")?; @@ -2239,7 +2254,7 @@ impl Ok(AdyenPaymentMethod::AdyenAffirm) } - domain::payments::PayLaterData::AfterpayClearpayRedirect { .. } => { + PayLaterData::AfterpayClearpayRedirect { .. } => { check_required_field(shopper_email, "email")?; check_required_field(shopper_name, "billing.first_name, billing.last_name")?; check_required_field(delivery_address, "shipping")?; @@ -2247,10 +2262,10 @@ impl if let Some(country) = country_code { match country { - api_enums::CountryAlpha2::IT - | api_enums::CountryAlpha2::FR - | api_enums::CountryAlpha2::ES - | api_enums::CountryAlpha2::GB => Ok(AdyenPaymentMethod::ClearPay), + storage_enums::CountryAlpha2::IT + | storage_enums::CountryAlpha2::FR + | storage_enums::CountryAlpha2::ES + | storage_enums::CountryAlpha2::GB => Ok(AdyenPaymentMethod::ClearPay), _ => Ok(AdyenPaymentMethod::AfterPay), } } else { @@ -2259,7 +2274,7 @@ impl })? } } - domain::payments::PayLaterData::PayBrightRedirect { .. } => { + PayLaterData::PayBrightRedirect { .. } => { check_required_field(shopper_name, "billing.first_name, billing.last_name")?; check_required_field(telephone_number, "billing.phone")?; check_required_field(shopper_email, "email")?; @@ -2268,51 +2283,41 @@ impl check_required_field(country_code, "billing.country")?; Ok(AdyenPaymentMethod::PayBright) } - domain::payments::PayLaterData::WalleyRedirect { .. } => { + PayLaterData::WalleyRedirect { .. } => { //[TODO: Line items specific sub-fields are mandatory] check_required_field(telephone_number, "billing.phone")?; check_required_field(shopper_email, "email")?; Ok(AdyenPaymentMethod::Walley) } - domain::payments::PayLaterData::AlmaRedirect { .. } => { + PayLaterData::AlmaRedirect { .. } => { check_required_field(telephone_number, "billing.phone")?; check_required_field(shopper_email, "email")?; check_required_field(billing_address, "billing")?; check_required_field(delivery_address, "shipping")?; Ok(AdyenPaymentMethod::AlmaPayLater) } - domain::payments::PayLaterData::AtomeRedirect { .. } => { + PayLaterData::AtomeRedirect { .. } => { check_required_field(shopper_email, "email")?; check_required_field(shopper_name, "billing.first_name, billing.last_name")?; check_required_field(telephone_number, "billing.phone")?; check_required_field(billing_address, "billing")?; Ok(AdyenPaymentMethod::Atome) } - domain::payments::PayLaterData::KlarnaSdk { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Adyen"), - ) - .into()) - } + PayLaterData::KlarnaSdk { .. } => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Adyen"), + ) + .into()), } } } -impl - TryFrom<( - &domain::BankRedirectData, - &types::PaymentsAuthorizeRouterData, - )> for AdyenPaymentMethod<'_> -{ +impl TryFrom<(&BankRedirectData, &PaymentsAuthorizeRouterData)> for AdyenPaymentMethod<'_> { type Error = Error; fn try_from( - (bank_redirect_data, item): ( - &domain::BankRedirectData, - &types::PaymentsAuthorizeRouterData, - ), + (bank_redirect_data, item): (&BankRedirectData, &PaymentsAuthorizeRouterData), ) -> Result { match bank_redirect_data { - domain::BankRedirectData::BancontactCard { + BankRedirectData::BancontactCard { card_number, card_exp_month, card_exp_year, @@ -2341,8 +2346,8 @@ impl cvc: None, network_payment_reference: None, }))), - domain::BankRedirectData::Bizum { .. } => Ok(AdyenPaymentMethod::Bizum), - domain::BankRedirectData::Blik { blik_code } => { + BankRedirectData::Bizum { .. } => Ok(AdyenPaymentMethod::Bizum), + BankRedirectData::Blik { blik_code } => { Ok(AdyenPaymentMethod::Blik(Box::new(BlikRedirectionData { blik_code: Secret::new(blik_code.clone().ok_or( errors::ConnectorError::MissingRequiredField { @@ -2351,8 +2356,8 @@ impl )?), }))) } - domain::BankRedirectData::Eps { bank_name, .. } => Ok(AdyenPaymentMethod::Eps( - Box::new(BankRedirectionWithIssuer { + BankRedirectData::Eps { bank_name, .. } => Ok(AdyenPaymentMethod::Eps(Box::new( + BankRedirectionWithIssuer { issuer: Some( AdyenTestBankNames::try_from(&bank_name.ok_or( errors::ConnectorError::MissingRequiredField { @@ -2361,40 +2366,40 @@ impl )?)? .0, ), - }), - )), - domain::BankRedirectData::Ideal { .. } => Ok(AdyenPaymentMethod::Ideal), - domain::BankRedirectData::OnlineBankingCzechRepublic { issuer } => { + }, + ))), + BankRedirectData::Ideal { .. } => Ok(AdyenPaymentMethod::Ideal), + BankRedirectData::OnlineBankingCzechRepublic { issuer } => { Ok(AdyenPaymentMethod::OnlineBankingCzechRepublic(Box::new( OnlineBankingCzechRepublicData { issuer: OnlineBankingCzechRepublicBanks::try_from(issuer)?, }, ))) } - domain::BankRedirectData::OnlineBankingFinland { .. } => { + BankRedirectData::OnlineBankingFinland { .. } => { Ok(AdyenPaymentMethod::OnlineBankingFinland) } - domain::BankRedirectData::OnlineBankingPoland { issuer } => Ok( + BankRedirectData::OnlineBankingPoland { issuer } => Ok( AdyenPaymentMethod::OnlineBankingPoland(Box::new(OnlineBankingPolandData { issuer: OnlineBankingPolandBanks::try_from(issuer)?, })), ), - domain::BankRedirectData::OnlineBankingSlovakia { issuer } => Ok( + BankRedirectData::OnlineBankingSlovakia { issuer } => Ok( AdyenPaymentMethod::OnlineBankingSlovakia(Box::new(OnlineBankingSlovakiaData { issuer: OnlineBankingSlovakiaBanks::try_from(issuer)?, })), ), - domain::BankRedirectData::OnlineBankingFpx { issuer } => Ok( + BankRedirectData::OnlineBankingFpx { issuer } => Ok( AdyenPaymentMethod::OnlineBankingFpx(Box::new(OnlineBankingFpxData { issuer: OnlineBankingFpxIssuer::try_from(issuer)?, })), ), - domain::BankRedirectData::OnlineBankingThailand { issuer } => Ok( + BankRedirectData::OnlineBankingThailand { issuer } => Ok( AdyenPaymentMethod::OnlineBankingThailand(Box::new(OnlineBankingThailandData { issuer: OnlineBankingThailandIssuer::try_from(issuer)?, })), ), - domain::BankRedirectData::OpenBankingUk { issuer, .. } => Ok( + BankRedirectData::OpenBankingUk { issuer, .. } => Ok( AdyenPaymentMethod::OpenBankingUK(Box::new(OpenBankingUKData { issuer: match issuer { Some(bank_name) => Some(OpenBankingUKIssuer::try_from(bank_name)?), @@ -2402,65 +2407,13 @@ impl }, })), ), - domain::BankRedirectData::Trustly { .. } => Ok(AdyenPaymentMethod::Trustly), - domain::BankRedirectData::Giropay { .. } - | domain::BankRedirectData::Eft { .. } - | domain::BankRedirectData::Interac { .. } - | domain::BankRedirectData::LocalBankRedirect {} - | domain::BankRedirectData::Przelewy24 { .. } - | domain::BankRedirectData::Sofort { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Adyen"), - ) - .into()) - } - } - } -} - -impl - TryFrom<( - &domain::BankTransferData, - &types::PaymentsAuthorizeRouterData, - )> for AdyenPaymentMethod<'_> -{ - type Error = Error; - fn try_from( - (bank_transfer_data, item): ( - &domain::BankTransferData, - &types::PaymentsAuthorizeRouterData, - ), - ) -> Result { - match bank_transfer_data { - domain::BankTransferData::PermataBankTransfer {} => Ok( - AdyenPaymentMethod::PermataBankTransfer(Box::new(DokuBankData::try_from(item)?)), - ), - - domain::BankTransferData::BcaBankTransfer {} => Ok( - AdyenPaymentMethod::BcaBankTransfer(Box::new(DokuBankData::try_from(item)?)), - ), - domain::BankTransferData::BniVaBankTransfer {} => Ok(AdyenPaymentMethod::BniVa( - Box::new(DokuBankData::try_from(item)?), - )), - domain::BankTransferData::BriVaBankTransfer {} => Ok(AdyenPaymentMethod::BriVa( - Box::new(DokuBankData::try_from(item)?), - )), - domain::BankTransferData::CimbVaBankTransfer {} => Ok(AdyenPaymentMethod::CimbVa( - Box::new(DokuBankData::try_from(item)?), - )), - domain::BankTransferData::DanamonVaBankTransfer {} => Ok( - AdyenPaymentMethod::DanamonVa(Box::new(DokuBankData::try_from(item)?)), - ), - domain::BankTransferData::MandiriVaBankTransfer {} => Ok( - AdyenPaymentMethod::MandiriVa(Box::new(DokuBankData::try_from(item)?)), - ), - domain::BankTransferData::Pix { .. } => Ok(AdyenPaymentMethod::Pix), - domain::BankTransferData::AchBankTransfer { .. } - | domain::BankTransferData::SepaBankTransfer { .. } - | domain::BankTransferData::BacsBankTransfer { .. } - | domain::BankTransferData::MultibancoBankTransfer { .. } - | domain::BankTransferData::LocalBankTransfer { .. } - | domain::BankTransferData::Pse {} => Err(errors::ConnectorError::NotImplemented( + BankRedirectData::Trustly { .. } => Ok(AdyenPaymentMethod::Trustly), + BankRedirectData::Giropay { .. } + | BankRedirectData::Eft { .. } + | BankRedirectData::Interac { .. } + | BankRedirectData::LocalBankRedirect {} + | BankRedirectData::Przelewy24 { .. } + | BankRedirectData::Sofort { .. } => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Adyen"), ) .into()), @@ -2468,9 +2421,51 @@ impl } } -impl TryFrom<&types::PaymentsAuthorizeRouterData> for DokuBankData { +impl TryFrom<(&BankTransferData, &PaymentsAuthorizeRouterData)> for AdyenPaymentMethod<'_> { type Error = Error; - fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result { + fn try_from( + (bank_transfer_data, item): (&BankTransferData, &PaymentsAuthorizeRouterData), + ) -> Result { + match bank_transfer_data { + BankTransferData::PermataBankTransfer {} => Ok( + AdyenPaymentMethod::PermataBankTransfer(Box::new(DokuBankData::try_from(item)?)), + ), + + BankTransferData::BcaBankTransfer {} => Ok(AdyenPaymentMethod::BcaBankTransfer( + Box::new(DokuBankData::try_from(item)?), + )), + BankTransferData::BniVaBankTransfer {} => Ok(AdyenPaymentMethod::BniVa(Box::new( + DokuBankData::try_from(item)?, + ))), + BankTransferData::BriVaBankTransfer {} => Ok(AdyenPaymentMethod::BriVa(Box::new( + DokuBankData::try_from(item)?, + ))), + BankTransferData::CimbVaBankTransfer {} => Ok(AdyenPaymentMethod::CimbVa(Box::new( + DokuBankData::try_from(item)?, + ))), + BankTransferData::DanamonVaBankTransfer {} => Ok(AdyenPaymentMethod::DanamonVa( + Box::new(DokuBankData::try_from(item)?), + )), + BankTransferData::MandiriVaBankTransfer {} => Ok(AdyenPaymentMethod::MandiriVa( + Box::new(DokuBankData::try_from(item)?), + )), + BankTransferData::Pix { .. } => Ok(AdyenPaymentMethod::Pix), + BankTransferData::AchBankTransfer { .. } + | BankTransferData::SepaBankTransfer { .. } + | BankTransferData::BacsBankTransfer { .. } + | BankTransferData::MultibancoBankTransfer { .. } + | BankTransferData::LocalBankTransfer { .. } + | BankTransferData::Pse {} => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Adyen"), + ) + .into()), + } + } +} + +impl TryFrom<&PaymentsAuthorizeRouterData> for DokuBankData { + type Error = Error; + fn try_from(item: &PaymentsAuthorizeRouterData) -> Result { Ok(Self { first_name: item.get_billing_first_name()?, last_name: item.get_optional_billing_last_name(), @@ -2479,35 +2474,31 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for DokuBankData { } } -impl TryFrom<&domain::payments::CardRedirectData> for AdyenPaymentMethod<'_> { +impl TryFrom<&CardRedirectData> for AdyenPaymentMethod<'_> { type Error = Error; - fn try_from( - card_redirect_data: &domain::payments::CardRedirectData, - ) -> Result { + fn try_from(card_redirect_data: &CardRedirectData) -> Result { match card_redirect_data { - domain::CardRedirectData::Knet {} => Ok(AdyenPaymentMethod::Knet), - domain::CardRedirectData::Benefit {} => Ok(AdyenPaymentMethod::Benefit), - domain::CardRedirectData::MomoAtm {} => Ok(AdyenPaymentMethod::MomoAtm), - domain::CardRedirectData::CardRedirect {} => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Adyen"), - ) - .into()) - } + CardRedirectData::Knet {} => Ok(AdyenPaymentMethod::Knet), + CardRedirectData::Benefit {} => Ok(AdyenPaymentMethod::Benefit), + CardRedirectData::MomoAtm {} => Ok(AdyenPaymentMethod::MomoAtm), + CardRedirectData::CardRedirect {} => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Adyen"), + ) + .into()), } } } impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, payments::MandateReferenceId, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, payments::MandateReferenceId, ), ) -> Result { @@ -2540,7 +2531,7 @@ impl } payments::MandateReferenceId::NetworkMandateId(network_mandate_id) => { match item.router_data.request.payment_method_data { - domain::PaymentMethodData::CardDetailsForNetworkTransactionId( + PaymentMethodData::CardDetailsForNetworkTransactionId( ref card_details_for_network_transaction_id, ) => { let brand = match card_details_for_network_transaction_id @@ -2572,34 +2563,32 @@ impl AdyenPaymentMethod::AdyenCard(Box::new(adyen_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::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::Card(_) => { - Err(errors::ConnectorError::NotSupported { - message: "Network tokenization for payment method".to_string(), - connector: "Adyen", - })? - } + 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::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::Card(_) => Err(errors::ConnectorError::NotSupported { + message: "Network tokenization for payment method".to_string(), + connector: "Adyen", + })?, } } payments::MandateReferenceId::NetworkTokenWithNTI(network_mandate_id) => { match item.router_data.request.payment_method_data { - domain::PaymentMethodData::NetworkToken(ref token_data) => { + PaymentMethodData::NetworkToken(ref token_data) => { let card_issuer = token_data.get_card_issuer()?; let brand = CardBrand::try_from(&card_issuer)?; let card_holder_name = item.router_data.get_optional_billing_full_name(); @@ -2618,24 +2607,24 @@ 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::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::MobilePayment(_) - | 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::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotSupported { message: "Network tokenization for payment method".to_string(), connector: "Adyen", @@ -2684,18 +2673,10 @@ impl }) } } -impl - TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::Card, - )> for AdyenPaymentRequest<'_> -{ +impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &Card)> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( - value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::Card, - ), + value: (&AdyenRouterData<&PaymentsAuthorizeRouterData>, &Card), ) -> Result { let (item, card_data) = value; let amount = get_amount_data(item); @@ -2762,16 +2743,16 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankDebitData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankDebitData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankDebitData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankDebitData, ), ) -> Result { let (item, bank_debit_data) = value; @@ -2828,19 +2809,13 @@ impl } } -impl - TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::VoucherData, - )> for AdyenPaymentRequest<'_> +impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &VoucherData)> + for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( - value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::VoucherData, - ), + value: (&AdyenRouterData<&PaymentsAuthorizeRouterData>, &VoucherData), ) -> Result { let (item, voucher_data) = value; let amount = get_amount_data(item); @@ -2900,16 +2875,16 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankTransferData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankTransferData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankTransferData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankTransferData, ), ) -> Result { let (item, bank_transfer_data) = value; @@ -2963,16 +2938,16 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::GiftCardData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &GiftCardData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::GiftCardData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &GiftCardData, ), ) -> Result { let (item, gift_card_data) = value; @@ -3026,15 +3001,15 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::BankRedirectData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &BankRedirectData, ), ) -> Result { let (item, bank_redirect_data) = value; @@ -3094,13 +3069,11 @@ impl } fn get_redirect_extra_details( - item: &types::PaymentsAuthorizeRouterData, -) -> errors::CustomResult<(Option, Option), errors::ConnectorError> -{ + item: &PaymentsAuthorizeRouterData, +) -> CustomResult<(Option, Option), errors::ConnectorError> { match item.request.payment_method_data { - domain::PaymentMethodData::BankRedirect( - domain::BankRedirectData::Trustly { .. } - | domain::BankRedirectData::OpenBankingUk { .. }, + PaymentMethodData::BankRedirect( + BankRedirectData::Trustly { .. } | BankRedirectData::OpenBankingUk { .. }, ) => { let country = item.get_optional_billing_country(); Ok((None, country)) @@ -3110,9 +3083,9 @@ fn get_redirect_extra_details( } fn get_shopper_email( - item: &types::PaymentsAuthorizeRouterData, + item: &PaymentsAuthorizeRouterData, is_mandate_payment: bool, -) -> errors::CustomResult, errors::ConnectorError> { +) -> CustomResult, errors::ConnectorError> { if is_mandate_payment { let payment_method_type = item .request @@ -3128,18 +3101,12 @@ fn get_shopper_email( } } -impl - TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::WalletData, - )> for AdyenPaymentRequest<'_> +impl TryFrom<(&AdyenRouterData<&PaymentsAuthorizeRouterData>, &WalletData)> + for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( - value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::WalletData, - ), + value: (&AdyenRouterData<&PaymentsAuthorizeRouterData>, &WalletData), ) -> Result { let (item, wallet_data) = value; let amount = get_amount_data(item); @@ -3157,18 +3124,16 @@ impl let shopper_email = get_shopper_email(item.router_data, store_payment_method.is_some())?; let billing_address = get_address_info(item.router_data.get_optional_billing()).and_then(Result::ok); - let mpi_data = if let domain::WalletData::Paze(_) = wallet_data { + let mpi_data = if let WalletData::Paze(_) = wallet_data { match item.router_data.payment_method_token.clone() { - Some(types::PaymentMethodToken::PazeDecrypt(paze_decrypted_data)) => { - Some(AdyenMpiData { - directory_response: "Y".to_string(), - authentication_response: "Y".to_string(), - token_authentication_verification_value: paze_decrypted_data - .token - .payment_account_reference, - eci: paze_decrypted_data.eci, - }) - } + Some(PaymentMethodToken::PazeDecrypt(paze_decrypted_data)) => Some(AdyenMpiData { + directory_response: "Y".to_string(), + authentication_response: "Y".to_string(), + token_authentication_verification_value: paze_decrypted_data + .token + .payment_account_reference, + eci: paze_decrypted_data.eci, + }), _ => None, } } else { @@ -3215,15 +3180,15 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::PayLaterData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &PayLaterData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::PayLaterData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &PayLaterData, ), ) -> Result { let (item, paylater_data) = value; @@ -3301,15 +3266,15 @@ impl impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::payments::CardRedirectData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &CardRedirectData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::payments::CardRedirectData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &CardRedirectData, ), ) -> Result { let (item, card_redirect_data) = value; @@ -3371,9 +3336,9 @@ impl } } -impl TryFrom<&types::PaymentsCancelRouterData> for AdyenCancelRequest { +impl TryFrom<&PaymentsCancelRouterData> for AdyenCancelRequest { type Error = Error; - fn try_from(item: &types::PaymentsCancelRouterData) -> Result { + fn try_from(item: &PaymentsCancelRouterData) -> Result { let auth_type = AdyenAuthType::try_from(&item.connector_auth_type)?; Ok(Self { merchant_account: auth_type.merchant_account, @@ -3403,17 +3368,15 @@ fn get_adyen_split_request( (split_request.store.clone(), Some(splits)) } -impl TryFrom> - for types::PaymentsCancelRouterData -{ +impl TryFrom> for PaymentsCancelRouterData { type Error = Error; fn try_from( - item: types::PaymentsCancelResponseRouterData, + item: PaymentsCancelResponseRouterData, ) -> Result { Ok(Self { - status: enums::AttemptStatus::Pending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + status: storage_enums::AttemptStatus::Pending, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( item.response.payment_psp_reference, ), redirection_data: Box::new(None), @@ -3431,26 +3394,26 @@ impl TryFrom> impl TryFrom< - types::ResponseRouterData< + ResponseRouterData< F, AdyenBalanceResponse, - types::PaymentsPreProcessingData, - types::PaymentsResponseData, + PaymentsPreProcessingData, + PaymentsResponseData, >, - > for types::RouterData + > for RouterData { type Error = Error; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, AdyenBalanceResponse, - types::PaymentsPreProcessingData, - types::PaymentsResponseData, + PaymentsPreProcessingData, + PaymentsResponseData, >, ) -> Result { Ok(Self { - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.psp_reference), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.psp_reference), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -3459,7 +3422,7 @@ impl incremental_authorization_allowed: None, charges: None, }), - payment_method_balance: Some(types::PaymentMethodBalance { + payment_method_balance: Some(PaymentMethodBalance { currency: item.response.balance.currency, amount: item.response.balance.value, }), @@ -3469,32 +3432,31 @@ impl } pub fn get_adyen_response( - response: Response, + response: AdyenResponse, is_capture_manual: bool, status_code: u16, - pmt: Option, -) -> errors::CustomResult< + pmt: Option, +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { - let status = - storage_enums::AttemptStatus::foreign_from((is_capture_manual, response.result_code, pmt)); + let status = get_adyen_payment_status(is_capture_manual, response.result_code, pmt); let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() || status == storage_enums::AttemptStatus::Failure { - Some(types::ErrorResponse { + Some(ErrorResponse { code: response .refusal_reason_code - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason, status_code, attempt_status: None, @@ -3507,7 +3469,7 @@ pub fn get_adyen_response( .additional_data .as_ref() .and_then(|data| data.recurring_detail_reference.to_owned()) - .map(|mandate_id| types::MandateReference { + .map(|mandate_id| MandateReference { connector_mandate_id: Some(mandate_id.expose()), payment_method_id: None, mandate_metadata: None, @@ -3524,8 +3486,8 @@ pub fn get_adyen_response( None => None, }; - let payments_response_data = types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(response.psp_reference), + let payments_response_data = PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(response.psp_reference), redirection_data: Box::new(None), mandate_reference: Box::new(mandate_reference), connector_metadata: None, @@ -3542,11 +3504,11 @@ pub fn get_webhook_response( is_capture_manual: bool, is_multiple_capture_psync_flow: bool, status_code: u16, -) -> errors::CustomResult< +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { @@ -3558,15 +3520,15 @@ pub fn get_webhook_response( || response.refusal_reason_code.is_some() || status == storage_enums::AttemptStatus::Failure { - Some(types::ErrorResponse { + Some(ErrorResponse { code: response .refusal_reason_code .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason.clone(), status_code, attempt_status: None, @@ -3582,13 +3544,13 @@ pub fn get_webhook_response( Ok(( status, error, - types::PaymentsResponseData::MultipleCaptureResponse { + PaymentsResponseData::MultipleCaptureResponse { capture_sync_response_list, }, )) } else { - let payments_response_data = types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + let payments_response_data = PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( response .payment_reference .unwrap_or(response.transaction_id), @@ -3609,33 +3571,29 @@ pub fn get_redirection_response( response: RedirectionResponse, is_manual_capture: bool, status_code: u16, - pmt: Option, -) -> errors::CustomResult< + pmt: Option, +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { - let status = storage_enums::AttemptStatus::foreign_from(( - is_manual_capture, - response.result_code.clone(), - pmt, - )); + let status = get_adyen_payment_status(is_manual_capture, response.result_code.clone(), pmt); let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() || status == storage_enums::AttemptStatus::Failure { - Some(types::ErrorResponse { + Some(ErrorResponse { code: response .refusal_reason_code .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason.to_owned(), status_code, attempt_status: None, @@ -3652,9 +3610,9 @@ pub fn get_redirection_response( .map(|(key, value)| (key.to_string(), value.to_string())), ) }); - services::RedirectForm::Form { + RedirectForm::Form { endpoint: url.to_string(), - method: response.action.method.unwrap_or(services::Method::Get), + method: response.action.method.unwrap_or(Method::Get), form_fields, } }); @@ -3666,10 +3624,10 @@ pub fn get_redirection_response( None => None, }; - let payments_response_data = types::PaymentsResponseData::TransactionResponse { + let payments_response_data = PaymentsResponseData::TransactionResponse { resource_id: match response.psp_reference.as_ref() { - Some(psp) => types::ResponseId::ConnectorTransactionId(psp.to_string()), - None => types::ResponseId::NoResponseId, + Some(psp) => ResponseId::ConnectorTransactionId(psp.to_string()), + None => ResponseId::NoResponseId, }, redirection_data: Box::new(redirection_data), mandate_reference: Box::new(None), @@ -3689,33 +3647,29 @@ pub fn get_present_to_shopper_response( response: PresentToShopperResponse, is_manual_capture: bool, status_code: u16, - pmt: Option, -) -> errors::CustomResult< + pmt: Option, +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { - let status = storage_enums::AttemptStatus::foreign_from(( - is_manual_capture, - response.result_code.clone(), - pmt, - )); + let status = get_adyen_payment_status(is_manual_capture, response.result_code.clone(), pmt); let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() || status == storage_enums::AttemptStatus::Failure { - Some(types::ErrorResponse { + Some(ErrorResponse { code: response .refusal_reason_code .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason.to_owned(), status_code, attempt_status: None, @@ -3735,10 +3689,10 @@ pub fn get_present_to_shopper_response( let connector_metadata = get_present_to_shopper_metadata(&response)?; // We don't get connector transaction id for redirections in Adyen. - let payments_response_data = types::PaymentsResponseData::TransactionResponse { + let payments_response_data = PaymentsResponseData::TransactionResponse { resource_id: match response.psp_reference.as_ref() { - Some(psp) => types::ResponseId::ConnectorTransactionId(psp.to_string()), - None => types::ResponseId::NoResponseId, + Some(psp) => ResponseId::ConnectorTransactionId(psp.to_string()), + None => ResponseId::NoResponseId, }, redirection_data: Box::new(None), mandate_reference: Box::new(None), @@ -3758,33 +3712,29 @@ pub fn get_qr_code_response( response: QrCodeResponseResponse, is_manual_capture: bool, status_code: u16, - pmt: Option, -) -> errors::CustomResult< + pmt: Option, +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { - let status = storage_enums::AttemptStatus::foreign_from(( - is_manual_capture, - response.result_code.clone(), - pmt, - )); + let status = get_adyen_payment_status(is_manual_capture, response.result_code.clone(), pmt); let error = if response.refusal_reason.is_some() || response.refusal_reason_code.is_some() || status == storage_enums::AttemptStatus::Failure { - Some(types::ErrorResponse { + Some(ErrorResponse { code: response .refusal_reason_code .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason.to_owned(), status_code, attempt_status: None, @@ -3803,10 +3753,10 @@ pub fn get_qr_code_response( }; let connector_metadata = get_qr_metadata(&response)?; - let payments_response_data = types::PaymentsResponseData::TransactionResponse { + let payments_response_data = PaymentsResponseData::TransactionResponse { resource_id: match response.psp_reference.as_ref() { - Some(psp) => types::ResponseId::ConnectorTransactionId(psp.to_string()), - None => types::ResponseId::NoResponseId, + Some(psp) => ResponseId::ConnectorTransactionId(psp.to_string()), + None => ResponseId::NoResponseId, }, redirection_data: Box::new(None), mandate_reference: Box::new(None), @@ -3826,31 +3776,30 @@ pub fn get_redirection_error_response( response: RedirectionErrorResponse, is_manual_capture: bool, status_code: u16, - pmt: Option, -) -> errors::CustomResult< + pmt: Option, +) -> CustomResult< ( storage_enums::AttemptStatus, - Option, - types::PaymentsResponseData, + Option, + PaymentsResponseData, ), errors::ConnectorError, > { - let status = - storage_enums::AttemptStatus::foreign_from((is_manual_capture, response.result_code, pmt)); - let error = Some(types::ErrorResponse { + let status = get_adyen_payment_status(is_manual_capture, response.result_code, pmt); + let error = Some(ErrorResponse { code: status.to_string(), message: response .refusal_reason .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.refusal_reason, status_code, attempt_status: None, connector_transaction_id: response.psp_reference.clone(), }); // We don't get connector transaction id for redirections in Adyen. - let payments_response_data = types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + let payments_response_data = PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -3868,8 +3817,8 @@ pub fn get_redirection_error_response( pub fn get_qr_metadata( response: &QrCodeResponseResponse, -) -> errors::CustomResult, errors::ConnectorError> { - let image_data = crate_utils::QrImage::new_from_data(response.action.qr_code_data.clone()) +) -> CustomResult, errors::ConnectorError> { + let image_data = utils::QrImage::new_from_data(response.action.qr_code_data.clone()) .change_context(errors::ConnectorError::ResponseHandlingFailed)?; let image_data_url = Url::parse(image_data.data.clone().as_str()).ok(); @@ -3882,7 +3831,7 @@ pub fn get_qr_metadata( if let (Some(image_data_url), Some(qr_code_url)) = (image_data_url.clone(), qr_code_url.clone()) { - let qr_code_info = payments::QrCodeInformation::QrCodeUrl { + let qr_code_info = QrCodeInformation::QrCodeUrl { image_data_url, qr_code_url, display_to_timestamp, @@ -3891,7 +3840,7 @@ pub fn get_qr_metadata( .transpose() .change_context(errors::ConnectorError::ResponseHandlingFailed) } else if let (None, Some(qr_code_url)) = (image_data_url.clone(), qr_code_url.clone()) { - let qr_code_info = payments::QrCodeInformation::QrCodeImageUrl { + let qr_code_info = QrCodeInformation::QrCodeImageUrl { qr_code_url, display_to_timestamp, }; @@ -3899,7 +3848,7 @@ pub fn get_qr_metadata( .transpose() .change_context(errors::ConnectorError::ResponseHandlingFailed) } else if let (Some(image_data_url), None) = (image_data_url, qr_code_url) { - let qr_code_info = payments::QrCodeInformation::QrDataUrl { + let qr_code_info = QrCodeInformation::QrDataUrl { image_data_url, display_to_timestamp, }; @@ -3920,7 +3869,7 @@ pub struct WaitScreenData { pub fn get_wait_screen_metadata( next_action: &RedirectionResponse, -) -> errors::CustomResult, errors::ConnectorError> { +) -> CustomResult, errors::ConnectorError> { match next_action.action.payment_method_type { PaymentType::Blik => { let current_time = OffsetDateTime::now_utc().unix_timestamp_nanos(); @@ -4005,7 +3954,7 @@ pub fn get_wait_screen_metadata( pub fn get_present_to_shopper_metadata( response: &PresentToShopperResponse, -) -> errors::CustomResult, errors::ConnectorError> { +) -> CustomResult, errors::ConnectorError> { let reference = response.action.reference.clone(); let expires_at = response .action @@ -4022,7 +3971,7 @@ pub fn get_present_to_shopper_metadata( | PaymentType::FamilyMart | PaymentType::Seicomart | PaymentType::PayEasy => { - let voucher_data = payments::VoucherNextStepData { + let voucher_data = VoucherNextStepData { expires_at, reference, download_url: response.action.download_url.clone(), @@ -4107,22 +4056,22 @@ pub fn get_present_to_shopper_metadata( impl ForeignTryFrom<( - types::ResponseRouterData, + ResponseRouterData, Option, bool, - Option, - )> for types::RouterData + Option, + )> for RouterData { type Error = Error; fn foreign_try_from( (item, capture_method, is_multiple_capture_psync_flow, pmt): ( - types::ResponseRouterData, + ResponseRouterData, Option, bool, - Option, + Option, ), ) -> Result { - let is_manual_capture = utils::is_manual_capture(capture_method); + let is_manual_capture = is_manual_capture(capture_method); let (status, error, payment_response_data) = match item.response { AdyenPaymentResponse::Response(response) => { get_adyen_response(*response, is_manual_capture, item.http_code, pmt)? @@ -4163,11 +4112,9 @@ pub struct AdyenCaptureRequest { reference: String, } -impl TryFrom<&AdyenRouterData<&types::PaymentsCaptureRouterData>> for AdyenCaptureRequest { +impl TryFrom<&AdyenRouterData<&PaymentsCaptureRouterData>> for AdyenCaptureRequest { type Error = Error; - fn try_from( - item: &AdyenRouterData<&types::PaymentsCaptureRouterData>, - ) -> Result { + fn try_from(item: &AdyenRouterData<&PaymentsCaptureRouterData>) -> Result { let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?; let reference = match item.router_data.request.multiple_capture_data.clone() { // if multiple capture request, send capture_id as our reference for the capture @@ -4200,12 +4147,12 @@ pub struct AdyenCaptureResponse { splits: Option>, } -impl TryFrom> - for types::PaymentsCaptureRouterData +impl TryFrom> + for PaymentsCaptureRouterData { type Error = Error; fn try_from( - item: types::PaymentsCaptureResponseRouterData, + item: PaymentsCaptureResponseRouterData, ) -> Result { let connector_transaction_id = if item.data.request.multiple_capture_data.is_some() { item.response.psp_reference.clone() @@ -4222,8 +4169,8 @@ impl TryFrom> // through refund notification webhook // For more info: https://docs.adyen.com/online-payments/capture status: storage_enums::AttemptStatus::Pending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(connector_transaction_id), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(connector_transaction_id), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -4261,43 +4208,10 @@ fn construct_charge_response( ) } -/* -// This is a repeated code block from Stripe inegration. Can we avoid the repetition in every integration -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum AdyenPaymentStatus { - Succeeded, - Failed, - Processing, - RequiresCustomerAction, - RequiresPaymentMethod, - RequiresConfirmation, -} - -// Default always be Processing -impl Default for AdyenPaymentStatus { - fn default() -> Self { - AdyenPaymentStatus::Processing - } -} - -impl From for enums::Status { - fn from(item: AdyenPaymentStatus) -> Self { - match item { - AdyenPaymentStatus::Succeeded => enums::Status::Charged, - AdyenPaymentStatus::Failed => enums::Status::Failure, - AdyenPaymentStatus::Processing - | AdyenPaymentStatus::RequiresCustomerAction - | AdyenPaymentStatus::RequiresPaymentMethod - | AdyenPaymentStatus::RequiresConfirmation => enums::Status::Pending, - } - } -} -*/ // Refund Request Transform -impl TryFrom<&AdyenRouterData<&types::RefundsRouterData>> for AdyenRefundRequest { +impl TryFrom<&AdyenRouterData<&RefundsRouterData>> for AdyenRefundRequest { type Error = Error; - fn try_from(item: &AdyenRouterData<&types::RefundsRouterData>) -> Result { + fn try_from(item: &AdyenRouterData<&RefundsRouterData>) -> Result { let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?; let (store, splits) = match item .router_data @@ -4324,15 +4238,13 @@ impl TryFrom<&AdyenRouterData<&types::RefundsRouterData>> for AdyenRefundR } // Refund Response Transform -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.psp_reference, // From the docs, the only value returned is "received", outcome of refund is available // through refund notification webhook @@ -4346,7 +4258,7 @@ impl TryFrom> #[derive(Debug, Default, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] -pub struct ErrorResponse { +pub struct AdyenErrorResponse { pub status: i32, pub error_code: String, pub message: String, @@ -4483,75 +4395,93 @@ fn is_success_scenario(is_success: String) -> bool { is_success.as_str() == "true" } -impl ForeignFrom<(WebhookEventCode, String, Option)> - for webhooks::IncomingWebhookEvent -{ - fn foreign_from( - (code, is_success, dispute_status): (WebhookEventCode, String, Option), - ) -> Self { - match code { - WebhookEventCode::Authorisation => { - if is_success_scenario(is_success) { - Self::PaymentIntentSuccess - } else { - Self::PaymentIntentFailure - } +pub(crate) fn get_adyen_webhook_event( + code: WebhookEventCode, + is_success: String, + dispute_status: Option, +) -> api_models::webhooks::IncomingWebhookEvent { + match code { + WebhookEventCode::Authorisation => { + if is_success_scenario(is_success) { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentSuccess + } else { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentFailure } - WebhookEventCode::Refund | WebhookEventCode::CancelOrRefund => { - if is_success_scenario(is_success) { - Self::RefundSuccess - } else { - Self::RefundFailure - } - } - WebhookEventCode::Cancellation => { - if is_success_scenario(is_success) { - Self::PaymentIntentCancelled - } else { - Self::PaymentIntentCancelFailure - } - } - WebhookEventCode::RefundFailed | WebhookEventCode::RefundReversed => { - Self::RefundFailure - } - WebhookEventCode::NotificationOfChargeback => Self::DisputeOpened, - WebhookEventCode::Chargeback => match dispute_status { - Some(DisputeStatus::Won) => Self::DisputeWon, - Some(DisputeStatus::Lost) | None => Self::DisputeLost, - Some(_) => Self::DisputeOpened, - }, - WebhookEventCode::ChargebackReversed => match dispute_status { - Some(DisputeStatus::Pending) => Self::DisputeChallenged, - _ => Self::DisputeWon, - }, - WebhookEventCode::SecondChargeback => Self::DisputeLost, - WebhookEventCode::PrearbitrationWon => match dispute_status { - Some(DisputeStatus::Pending) => Self::DisputeOpened, - _ => Self::DisputeWon, - }, - WebhookEventCode::PrearbitrationLost => Self::DisputeLost, - WebhookEventCode::Capture => { - if is_success_scenario(is_success) { - Self::PaymentIntentCaptureSuccess - } else { - Self::PaymentIntentCaptureFailure - } - } - WebhookEventCode::CaptureFailed => Self::PaymentIntentCaptureFailure, - #[cfg(feature = "payouts")] - WebhookEventCode::PayoutThirdparty => Self::PayoutCreated, - #[cfg(feature = "payouts")] - WebhookEventCode::PayoutDecline => Self::PayoutFailure, - #[cfg(feature = "payouts")] - WebhookEventCode::PayoutExpire => Self::PayoutExpired, - #[cfg(feature = "payouts")] - WebhookEventCode::PayoutReversed => Self::PayoutReversed, - WebhookEventCode::Unknown => Self::EventNotSupported, } + WebhookEventCode::Refund | WebhookEventCode::CancelOrRefund => { + if is_success_scenario(is_success) { + api_models::webhooks::IncomingWebhookEvent::RefundSuccess + } else { + api_models::webhooks::IncomingWebhookEvent::RefundFailure + } + } + WebhookEventCode::Cancellation => { + if is_success_scenario(is_success) { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentCancelled + } else { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentCancelFailure + } + } + WebhookEventCode::RefundFailed | WebhookEventCode::RefundReversed => { + api_models::webhooks::IncomingWebhookEvent::RefundFailure + } + WebhookEventCode::NotificationOfChargeback => { + api_models::webhooks::IncomingWebhookEvent::DisputeOpened + } + WebhookEventCode::Chargeback => match dispute_status { + Some(DisputeStatus::Won) => api_models::webhooks::IncomingWebhookEvent::DisputeWon, + Some(DisputeStatus::Lost) | None => { + api_models::webhooks::IncomingWebhookEvent::DisputeLost + } + Some(_) => api_models::webhooks::IncomingWebhookEvent::DisputeOpened, + }, + WebhookEventCode::ChargebackReversed => match dispute_status { + Some(DisputeStatus::Pending) => { + api_models::webhooks::IncomingWebhookEvent::DisputeChallenged + } + _ => api_models::webhooks::IncomingWebhookEvent::DisputeWon, + }, + WebhookEventCode::SecondChargeback => { + api_models::webhooks::IncomingWebhookEvent::DisputeLost + } + WebhookEventCode::PrearbitrationWon => match dispute_status { + Some(DisputeStatus::Pending) => { + api_models::webhooks::IncomingWebhookEvent::DisputeOpened + } + _ => api_models::webhooks::IncomingWebhookEvent::DisputeWon, + }, + WebhookEventCode::PrearbitrationLost => { + api_models::webhooks::IncomingWebhookEvent::DisputeLost + } + WebhookEventCode::Capture => { + if is_success_scenario(is_success) { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentCaptureSuccess + } else { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentCaptureFailure + } + } + WebhookEventCode::CaptureFailed => { + api_models::webhooks::IncomingWebhookEvent::PaymentIntentCaptureFailure + } + #[cfg(feature = "payouts")] + WebhookEventCode::PayoutThirdparty => { + api_models::webhooks::IncomingWebhookEvent::PayoutCreated + } + #[cfg(feature = "payouts")] + WebhookEventCode::PayoutDecline => { + api_models::webhooks::IncomingWebhookEvent::PayoutFailure + } + #[cfg(feature = "payouts")] + WebhookEventCode::PayoutExpire => api_models::webhooks::IncomingWebhookEvent::PayoutExpired, + #[cfg(feature = "payouts")] + WebhookEventCode::PayoutReversed => { + api_models::webhooks::IncomingWebhookEvent::PayoutReversed + } + WebhookEventCode::Unknown => api_models::webhooks::IncomingWebhookEvent::EventNotSupported, } } -impl From for enums::DisputeStage { +impl From for storage_enums::DisputeStage { fn from(code: WebhookEventCode) -> Self { match code { WebhookEventCode::NotificationOfChargeback => Self::PreDispute, @@ -4595,8 +4525,8 @@ impl From for AdyenWebhookResponse { fn from(notif: AdyenNotificationRequestItemWH) -> Self { let (refusal_reason, refusal_reason_code) = if !is_success_scenario(notif.success.clone()) { ( - notif.reason.or(Some(consts::NO_ERROR_MESSAGE.to_string())), - Some(consts::NO_ERROR_CODE.to_string()), + notif.reason.or(Some(NO_ERROR_MESSAGE.to_string())), + Some(NO_ERROR_CODE.to_string()), ) } else { (None, None) @@ -4672,10 +4602,10 @@ impl utils::MultipleCaptureSyncResponse for AdyenWebhookResponse { self.transaction_id.clone() } - fn get_capture_attempt_status(&self) -> enums::AttemptStatus { + fn get_capture_attempt_status(&self) -> storage_enums::AttemptStatus { match self.status { - AdyenWebhookStatus::Captured => enums::AttemptStatus::Charged, - _ => enums::AttemptStatus::CaptureFailed, + AdyenWebhookStatus::Captured => storage_enums::AttemptStatus::Charged, + _ => storage_enums::AttemptStatus::CaptureFailed, } } @@ -4905,9 +4835,9 @@ impl TryFrom<&PayoutMethodData> for PayoutCardDetails { // Payouts eligibility request transform #[cfg(feature = "payouts")] -impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutEligibilityRequest { +impl TryFrom<&AdyenRouterData<&PayoutsRouterData>> for AdyenPayoutEligibilityRequest { type Error = Error; - fn try_from(item: &AdyenRouterData<&types::PayoutsRouterData>) -> Result { + fn try_from(item: &AdyenRouterData<&PayoutsRouterData>) -> Result { let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?; let payout_method_data = PayoutCardDetails::try_from(&item.router_data.get_payout_method_data()?)?; @@ -4926,9 +4856,9 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutE // Payouts create request transform #[cfg(feature = "payouts")] -impl TryFrom<&types::PayoutsRouterData> for AdyenPayoutCancelRequest { +impl TryFrom<&PayoutsRouterData> for AdyenPayoutCancelRequest { type Error = Error; - fn try_from(item: &types::PayoutsRouterData) -> Result { + fn try_from(item: &PayoutsRouterData) -> Result { let auth_type = AdyenAuthType::try_from(&item.connector_auth_type)?; let merchant_account = auth_type.merchant_account; @@ -4947,9 +4877,9 @@ impl TryFrom<&types::PayoutsRouterData> for AdyenPayoutCancelRequest { // Payouts cancel request transform #[cfg(feature = "payouts")] -impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutCreateRequest { +impl TryFrom<&AdyenRouterData<&PayoutsRouterData>> for AdyenPayoutCreateRequest { type Error = Error; - fn try_from(item: &AdyenRouterData<&types::PayoutsRouterData>) -> Result { + fn try_from(item: &AdyenRouterData<&PayoutsRouterData>) -> Result { let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?; let merchant_account = auth_type.merchant_account; let (owner_name, customer_email) = item @@ -4971,7 +4901,7 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutC })?, PayoutMethodData::Bank(bd) => { let bank_details = match bd { - payouts::BankPayout::Sepa(b) => PayoutBankDetails { + payouts::Bank::Sepa(b) => PayoutBankDetails { bank_name: b.bank_name, country_code: b.bank_country_code, bank_city: b.bank_city, @@ -4980,15 +4910,15 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutC iban: b.iban, tax_id: None, }, - payouts::BankPayout::Ach(..) => Err(errors::ConnectorError::NotSupported { + payouts::Bank::Ach(..) => Err(errors::ConnectorError::NotSupported { message: "Bank transfer via ACH is not supported".to_string(), connector: "Adyen", })?, - payouts::BankPayout::Bacs(..) => Err(errors::ConnectorError::NotSupported { + payouts::Bank::Bacs(..) => Err(errors::ConnectorError::NotSupported { message: "Bank transfer via Bacs is not supported".to_string(), connector: "Adyen", })?, - payouts::BankPayout::Pix(..) => Err(errors::ConnectorError::NotSupported { + payouts::Bank::Pix(..) => Err(errors::ConnectorError::NotSupported { message: "Bank transfer via Pix is not supported".to_string(), connector: "Adyen", })?, @@ -5022,7 +4952,7 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutC } PayoutMethodData::Wallet(wallet_data) => { let additional_data = match wallet_data { - api_models::payouts::Wallet::Paypal(paypal_data) => PayoutAdditionalData { + payouts::Wallet::Paypal(paypal_data) => PayoutAdditionalData { token_data_type: PayoutTokenDataType::PayPal, email_id: paypal_data.email.clone().ok_or( errors::ConnectorError::MissingRequiredField { @@ -5030,12 +4960,10 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutC }, )?, }, - api_models::payouts::Wallet::Venmo(_) => { - Err(errors::ConnectorError::NotSupported { - message: "Venmo Wallet is not supported".to_string(), - connector: "Adyen", - })? - } + payouts::Wallet::Venmo(_) => Err(errors::ConnectorError::NotSupported { + message: "Venmo Wallet is not supported".to_string(), + connector: "Adyen", + })?, }; let address: &hyperswitch_domain_models::address::AddressDetails = item.router_data.get_billing_address()?; @@ -5073,9 +5001,9 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutC // Payouts fulfill request transform #[cfg(feature = "payouts")] -impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutFulfillRequest { +impl TryFrom<&AdyenRouterData<&PayoutsRouterData>> for AdyenPayoutFulfillRequest { type Error = Error; - fn try_from(item: &AdyenRouterData<&types::PayoutsRouterData>) -> Result { + fn try_from(item: &AdyenRouterData<&PayoutsRouterData>) -> Result { let auth_type = AdyenAuthType::try_from(&item.router_data.connector_auth_type)?; let payout_type = item.router_data.request.get_payout_type()?; let merchant_account = auth_type.merchant_account; @@ -5119,12 +5047,10 @@ impl TryFrom<&AdyenRouterData<&types::PayoutsRouterData>> for AdyenPayoutF // Payouts response transform #[cfg(feature = "payouts")] -impl TryFrom> - for types::PayoutsRouterData -{ +impl TryFrom> for PayoutsRouterData { type Error = Error; fn try_from( - item: types::PayoutsResponseRouterData, + item: PayoutsResponseRouterData, ) -> Result { let response: AdyenPayoutResponse = item.response; let payout_eligible = response @@ -5149,7 +5075,7 @@ impl TryFrom> ); Ok(Self { - response: Ok(types::PayoutsResponseData { + response: Ok(PayoutsResponseData { status, connector_payout_id: Some(response.psp_reference), payout_eligible, @@ -5178,8 +5104,8 @@ impl From for storage_enums::PayoutStatus { } fn get_merchant_account_code( - auth_type: &types::ConnectorAuthType, -) -> errors::CustomResult, errors::ConnectorError> { + auth_type: &ConnectorAuthType, +) -> CustomResult, errors::ConnectorError> { let auth = AdyenAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(auth.merchant_account.clone()) @@ -5199,9 +5125,9 @@ pub struct AdyenDisputeResponse { pub success: bool, } -impl TryFrom<&types::AcceptDisputeRouterData> for AdyenAcceptDisputeRequest { +impl TryFrom<&AcceptDisputeRouterData> for AdyenAcceptDisputeRequest { type Error = Error; - fn try_from(item: &types::AcceptDisputeRouterData) -> Result { + fn try_from(item: &AcceptDisputeRouterData) -> Result { let merchant_account_code = get_merchant_account_code(&item.connector_auth_type)?; Ok(Self { dispute_psp_reference: item.clone().request.connector_dispute_id, @@ -5218,9 +5144,9 @@ pub struct AdyenDefendDisputeRequest { defense_reason_code: String, } -impl TryFrom<&types::DefendDisputeRouterData> for AdyenDefendDisputeRequest { +impl TryFrom<&DefendDisputeRouterData> for AdyenDefendDisputeRequest { type Error = Error; - fn try_from(item: &types::DefendDisputeRouterData) -> Result { + fn try_from(item: &DefendDisputeRouterData) -> Result { let merchant_account_code = get_merchant_account_code(&item.connector_auth_type)?; Ok(Self { dispute_psp_reference: item.request.connector_dispute_id.clone(), @@ -5246,9 +5172,9 @@ pub struct DefenseDocuments { defense_document_type_code: String, } -impl TryFrom<&types::SubmitEvidenceRouterData> for Evidence { +impl TryFrom<&SubmitEvidenceRouterData> for Evidence { type Error = error_stack::Report; - fn try_from(item: &types::SubmitEvidenceRouterData) -> Result { + fn try_from(item: &SubmitEvidenceRouterData) -> Result { let merchant_account_code = get_merchant_account_code(&item.connector_auth_type)?; let submit_evidence_request_data = item.request.clone(); Ok(Self { @@ -5348,31 +5274,31 @@ fn get_content(item: Vec) -> String { String::from_utf8_lossy(&item).to_string() } -impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::AcceptDisputeRouterData { +impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for AcceptDisputeRouterData { type Error = errors::ConnectorError; fn foreign_try_from(item: (&Self, AdyenDisputeResponse)) -> Result { let (data, response) = item; if response.success { - Ok(types::AcceptDisputeRouterData { - response: Ok(types::AcceptDisputeResponse { - dispute_status: api_enums::DisputeStatus::DisputeAccepted, + Ok(AcceptDisputeRouterData { + response: Ok(AcceptDisputeResponse { + dispute_status: storage_enums::DisputeStatus::DisputeAccepted, connector_status: None, }), ..data.clone() }) } else { - Ok(types::AcceptDisputeRouterData { - response: Err(types::ErrorResponse { + Ok(AcceptDisputeRouterData { + response: Err(ErrorResponse { code: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.error_message, status_code: data.connector_http_status_code.ok_or( errors::ConnectorError::MissingRequiredField { @@ -5388,29 +5314,29 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::AcceptDisputeRoute } } -impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::SubmitEvidenceRouterData { +impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for SubmitEvidenceRouterData { type Error = errors::ConnectorError; fn foreign_try_from(item: (&Self, AdyenDisputeResponse)) -> Result { let (data, response) = item; if response.success { - Ok(types::SubmitEvidenceRouterData { - response: Ok(types::SubmitEvidenceResponse { - dispute_status: api_enums::DisputeStatus::DisputeChallenged, + Ok(SubmitEvidenceRouterData { + response: Ok(SubmitEvidenceResponse { + dispute_status: storage_enums::DisputeStatus::DisputeChallenged, connector_status: None, }), ..data.clone() }) } else { - Ok(types::SubmitEvidenceRouterData { - response: Err(types::ErrorResponse { + Ok(SubmitEvidenceRouterData { + response: Err(ErrorResponse { code: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.error_message, status_code: data.connector_http_status_code.ok_or( errors::ConnectorError::MissingRequiredField { @@ -5426,31 +5352,31 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::SubmitEvidenceRout } } -impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::DefendDisputeRouterData { +impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for DefendDisputeRouterData { type Error = errors::ConnectorError; fn foreign_try_from(item: (&Self, AdyenDisputeResponse)) -> Result { let (data, response) = item; if response.success { - Ok(types::DefendDisputeRouterData { - response: Ok(types::DefendDisputeResponse { - dispute_status: api_enums::DisputeStatus::DisputeChallenged, + Ok(DefendDisputeRouterData { + response: Ok(DefendDisputeResponse { + dispute_status: storage_enums::DisputeStatus::DisputeChallenged, connector_status: None, }), ..data.clone() }) } else { - Ok(types::DefendDisputeRouterData { - response: Err(types::ErrorResponse { + Ok(DefendDisputeRouterData { + response: Err(ErrorResponse { code: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response .error_message .clone() - .unwrap_or_else(|| consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or_else(|| NO_ERROR_MESSAGE.to_string()), reason: response.error_message, status_code: data.connector_http_status_code.ok_or( errors::ConnectorError::MissingRequiredField { @@ -5466,10 +5392,10 @@ impl ForeignTryFrom<(&Self, AdyenDisputeResponse)> for types::DefendDisputeRoute } } -impl TryFrom<(&domain::NetworkTokenData, Option>)> for AdyenPaymentMethod<'_> { +impl TryFrom<(&NetworkTokenData, Option>)> for AdyenPaymentMethod<'_> { type Error = Error; fn try_from( - (token_data, card_holder_name): (&domain::NetworkTokenData, Option>), + (token_data, card_holder_name): (&NetworkTokenData, Option>), ) -> Result { let adyen_network_token = AdyenNetworkTokenData { number: token_data.get_network_token(), @@ -5487,15 +5413,15 @@ impl TryFrom<(&domain::NetworkTokenData, Option>)> for AdyenPayme impl TryFrom<( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::NetworkTokenData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &NetworkTokenData, )> for AdyenPaymentRequest<'_> { type Error = Error; fn try_from( value: ( - &AdyenRouterData<&types::PaymentsAuthorizeRouterData>, - &domain::NetworkTokenData, + &AdyenRouterData<&PaymentsAuthorizeRouterData>, + &NetworkTokenData, ), ) -> Result { let (item, token_data) = value; @@ -5569,3 +5495,106 @@ impl }) } } + +pub(crate) fn convert_setup_mandate_router_data_to_authorize_router_data( + data: &SetupMandateRouterData, +) -> PaymentsAuthorizeData { + PaymentsAuthorizeData { + currency: data.request.currency, + payment_method_data: data.request.payment_method_data.clone(), + confirm: data.request.confirm, + statement_descriptor_suffix: data.request.statement_descriptor_suffix.clone(), + mandate_id: data.request.mandate_id.clone(), + setup_future_usage: data.request.setup_future_usage, + off_session: data.request.off_session, + setup_mandate_details: data.request.setup_mandate_details.clone(), + router_return_url: data.request.router_return_url.clone(), + email: data.request.email.clone(), + customer_name: data.request.customer_name.clone(), + amount: 0, + order_tax_amount: Some(MinorUnit::zero()), + minor_amount: MinorUnit::new(0), + statement_descriptor: None, + capture_method: None, + webhook_url: None, + complete_authorize_url: None, + browser_info: data.request.browser_info.clone(), + order_details: None, + order_category: None, + session_token: None, + enrolled_for_3ds: true, + related_transaction_id: None, + payment_experience: None, + payment_method_type: None, + customer_id: None, + surcharge_details: None, + request_incremental_authorization: data.request.request_incremental_authorization, + metadata: None, + authentication_data: None, + customer_acceptance: data.request.customer_acceptance.clone(), + split_payments: None, // TODO: allow charges on mandates? + merchant_order_reference_id: None, + integrity_object: None, + additional_payment_method_data: None, + shipping_cost: data.request.shipping_cost, + merchant_account_id: None, + merchant_config_currency: None, + } +} + +pub(crate) fn convert_payment_authorize_router_response( + item: (&RouterData, T2), +) -> RouterData { + let data = item.0; + let request = item.1; + RouterData { + flow: PhantomData, + request, + merchant_id: data.merchant_id.clone(), + connector: data.connector.clone(), + attempt_id: data.attempt_id.clone(), + tenant_id: data.tenant_id.clone(), + status: data.status, + payment_method: data.payment_method, + connector_auth_type: data.connector_auth_type.clone(), + description: data.description.clone(), + address: data.address.clone(), + auth_type: data.auth_type, + connector_meta_data: data.connector_meta_data.clone(), + connector_wallets_details: data.connector_wallets_details.clone(), + amount_captured: data.amount_captured, + minor_amount_captured: data.minor_amount_captured, + access_token: data.access_token.clone(), + response: data.response.clone(), + payment_id: data.payment_id.clone(), + session_token: data.session_token.clone(), + reference_id: data.reference_id.clone(), + customer_id: data.customer_id.clone(), + payment_method_token: None, + preprocessing_id: None, + connector_customer: data.connector_customer.clone(), + recurring_mandate_payment_data: data.recurring_mandate_payment_data.clone(), + connector_request_reference_id: data.connector_request_reference_id.clone(), + #[cfg(feature = "payouts")] + payout_method_data: data.payout_method_data.clone(), + #[cfg(feature = "payouts")] + quote_id: data.quote_id.clone(), + test_mode: data.test_mode, + payment_method_status: None, + payment_method_balance: data.payment_method_balance.clone(), + connector_api_version: data.connector_api_version.clone(), + connector_http_status_code: data.connector_http_status_code, + external_latency: data.external_latency, + apple_pay_flow: data.apple_pay_flow.clone(), + frm_metadata: data.frm_metadata.clone(), + dispute_id: data.dispute_id.clone(), + refund_id: data.refund_id.clone(), + connector_response: data.connector_response.clone(), + integrity_check: Ok(()), + additional_merchant_data: data.additional_merchant_data.clone(), + header_payload: data.header_payload.clone(), + connector_mandate_request_reference_id: data.connector_mandate_request_reference_id.clone(), + authentication_id: data.authentication_id.clone(), + psd2_sca_exemption_type: data.psd2_sca_exemption_type, + } +} diff --git a/crates/router/src/connector/paypal.rs b/crates/hyperswitch_connectors/src/connectors/paypal.rs similarity index 74% rename from crates/router/src/connector/paypal.rs rename to crates/hyperswitch_connectors/src/connectors/paypal.rs index c7aef2ddb2..1859deeaad 100644 --- a/crates/router/src/connector/paypal.rs +++ b/crates/hyperswitch_connectors/src/connectors/paypal.rs @@ -2,50 +2,85 @@ pub mod transformers; use std::fmt::Write; use base64::Engine; +use common_enums::{enums, CallConnectorAction, PaymentAction}; use common_utils::{ + consts, + errors::CustomResult, ext_traits::ByteSliceExt, - request::RequestContent, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, MinorUnit, StringMajorUnit, StringMajorUnitForConnector}, }; -use diesel_models::enums; use error_stack::ResultExt; -use masking::{ExposeInterface, PeekInterface, Secret}; -use router_env::logger; -#[cfg(feature = "payouts")] -use router_env::{instrument, tracing}; -use transformers as paypal; - -use self::transformers::{auth_headers, PaypalAuthResponse, PaypalMeta, PaypalWebhookEventType}; -use super::utils::{ - ConnectorErrorType, PaymentMethodDataType, PaymentsAuthorizeRequestData, - PaymentsCompleteAuthorizeRequestData, -}; -use crate::{ - configs::settings, - connector::utils::{ - self as connector_utils, to_connector_meta, ConnectorErrorTypeMapping, RefundsRequestData, +use hyperswitch_domain_models::{ + payment_method_data::{PaymentMethodData, WalletData}, + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{ + Authorize, Capture, PSync, PaymentMethodToken, PostSessionTokens, PreProcessing, + SdkSessionUpdate, Session, SetupMandate, Void, + }, + refunds::{Execute, RSync}, + CompleteAuthorize, VerifyWebhookSource, }, - consts, - core::{ - errors::{self, CustomResult}, - payments, + router_request_types::{ + AccessTokenRequestData, CompleteAuthorizeData, PaymentMethodTokenizationData, + PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, + PaymentsPostSessionTokensData, PaymentsPreProcessingData, PaymentsSessionData, + PaymentsSyncData, RefundsData, ResponseId, SdkPaymentsSessionUpdateData, + SetupMandateRequestData, VerifyWebhookSourceRequestData, }, - db::domain, - events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorSpecifications, ConnectorValidation, PaymentAction, + router_response_types::{ + PaymentsResponseData, RefundsResponseData, VerifyWebhookSourceResponseData, }, types::{ - self, - api::{self, CompleteAuthorize, ConnectorCommon, ConnectorCommonExt, VerifyWebhookSource}, - storage::enums as storage_enums, - transformers::{ForeignFrom, ForeignTryFrom}, - ConnectorAuthType, ErrorResponse, Response, + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsCompleteAuthorizeRouterData, PaymentsPostSessionTokensRouterData, + PaymentsPreProcessingRouterData, PaymentsSyncRouterData, RefreshTokenRouterData, + RefundSyncRouterData, RefundsRouterData, SdkSessionUpdateRouterData, + SetupMandateRouterData, VerifyWebhookSourceRouterData, + }, +}; +#[cfg(feature = "payouts")] +use hyperswitch_domain_models::{ + router_flow_types::payouts::{PoCreate, PoFulfill, PoSync}, + router_response_types::PayoutsResponseData, + types::{PayoutsData, PayoutsRouterData}, +}; +#[cfg(feature = "payouts")] +use hyperswitch_interfaces::types::{PayoutFulfillType, PayoutSyncType}; +use hyperswitch_interfaces::{ + api::{ + self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorRedirectResponse, + ConnectorSpecifications, ConnectorValidation, + }, + configs::Connectors, + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + disputes, errors, + events::connector_api_logs::ConnectorEvent, + types::{ + PaymentsAuthorizeType, PaymentsCaptureType, PaymentsCompleteAuthorizeType, + PaymentsPostSessionTokensType, PaymentsPreProcessingType, PaymentsSyncType, + PaymentsVoidType, RefreshTokenType, RefundExecuteType, RefundSyncType, Response, + SdkSessionUpdateType, SetupMandateType, VerifyWebhookSourceType, + }, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{ExposeInterface, Mask, Maskable, PeekInterface, Secret}; +#[cfg(feature = "payouts")] +use router_env::{instrument, tracing}; +use transformers::{ + self as paypal, auth_headers, PaypalAuthResponse, PaypalMeta, PaypalWebhookEventType, +}; + +use crate::{ + constants::{self, headers}, + types::ResponseRouterData, + utils::{ + self as connector_utils, to_connector_meta, ConnectorErrorType, ConnectorErrorTypeMapping, + ForeignTryFrom, PaymentMethodDataType, PaymentsAuthorizeRequestData, + PaymentsCompleteAuthorizeRequestData, RefundsRequestData, }, - utils::BytesExt, }; #[derive(Clone)] @@ -136,10 +171,10 @@ impl Paypal { code: option_error_code_message .clone() .map(|error_code_message| error_code_message.error_code) - .unwrap_or(consts::NO_ERROR_CODE.to_string()), + .unwrap_or(NO_ERROR_CODE.to_string()), message: option_error_code_message .map(|error_code_message| error_code_message.error_message) - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or(NO_ERROR_MESSAGE.to_string()), reason: error_reason.or(Some(response.message)), attempt_status: None, connector_transaction_id: response.debug_id, @@ -153,9 +188,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() @@ -236,14 +271,14 @@ impl ConnectorCommon for Paypal { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.paypal.base_url.as_ref() } fn get_auth_header( &self, auth_type: &ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + ) -> CustomResult)>, errors::ConnectorError> { let auth = paypal::PaypalAuthType::try_from(auth_type)?; let credentials = auth.get_credentials()?; @@ -308,10 +343,10 @@ impl ConnectorCommon for Paypal { code: option_error_code_message .clone() .map(|error_code_message| error_code_message.error_code) - .unwrap_or(consts::NO_ERROR_CODE.to_string()), + .unwrap_or(NO_ERROR_CODE.to_string()), message: option_error_code_message .map(|error_code_message| error_code_message.error_message) - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or(NO_ERROR_MESSAGE.to_string()), reason, attempt_status: None, connector_transaction_id: response.debug_id, @@ -338,8 +373,8 @@ impl ConnectorValidation for Paypal { } fn validate_mandate_payment( &self, - pm_type: Option, - pm_data: domain::PaymentMethodData, + pm_type: Option, + pm_data: PaymentMethodData, ) -> CustomResult<(), errors::ConnectorError> { let mandate_supported_pmd = std::collections::HashSet::from([ PaymentMethodDataType::Card, @@ -350,27 +385,18 @@ impl ConnectorValidation for Paypal { } } -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Paypal -{ -} - -impl ConnectorIntegration +impl ConnectorIntegration for Paypal { } -impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal {} + +impl ConnectorIntegration for Paypal { fn get_url( &self, - _req: &types::RefreshTokenRouterData, - connectors: &settings::Connectors, + _req: &RefreshTokenRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}v1/oauth2/token", self.base_url(connectors))) } @@ -379,9 +405,9 @@ impl ConnectorIntegration CustomResult)>, errors::ConnectorError> { + req: &RefreshTokenRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let auth = paypal::PaypalAuthType::try_from(&req.connector_auth_type)?; let credentials = auth.get_credentials()?; let auth_val = credentials.generate_authorization_value(); @@ -389,17 +415,15 @@ impl ConnectorIntegration CustomResult { let connector_req = paypal::PaypalAuthUpdateRequest::try_from(req)?; @@ -408,17 +432,15 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefreshTokenRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let req = Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .headers(types::RefreshTokenType::get_headers(self, req, connectors)?) - .url(&types::RefreshTokenType::get_url(self, req, connectors)?) - .set_body(types::RefreshTokenType::get_request_body( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Post) + .headers(RefreshTokenType::get_headers(self, req, connectors)?) + .url(&RefreshTokenType::get_url(self, req, connectors)?) + .set_body(RefreshTokenType::get_request_body(self, req, connectors)?) .build(), ); @@ -427,10 +449,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalAuthUpdateResponse = res .response .parse_struct("Paypal PaypalAuthUpdateResponse") @@ -439,7 +461,7 @@ impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { fn get_url( &self, - _req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + _req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}v1/payments/payouts", self.base_url(connectors))) } fn get_headers( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_request_body( &self, - req: &types::PayoutsRouterData, - _connectors: &settings::Connectors, + req: &PayoutsRouterData, + _connectors: &Connectors, ) -> CustomResult { let amount = connector_utils::convert_amount( self.amount_converter, @@ -508,19 +528,15 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PayoutFulfillType::get_url(self, req, connectors)?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PayoutFulfillType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutFulfillType::get_headers( - self, req, connectors, - )?) - .set_body(types::PayoutFulfillType::get_request_body( - self, req, connectors, - )?) + .headers(PayoutFulfillType::get_headers(self, req, connectors)?) + .set_body(PayoutFulfillType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) @@ -529,10 +545,10 @@ impl ConnectorIntegration, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: paypal::PaypalFulfillResponse = res .response .parse_struct("PaypalFulfillResponse") @@ -541,7 +557,7 @@ impl ConnectorIntegration for Paypal { +impl ConnectorIntegration for Paypal { fn get_url( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, + req: &PayoutsRouterData, + connectors: &Connectors, ) -> CustomResult { let batch_id = req.request.connector_payout_id.clone().ok_or( errors::ConnectorError::MissingRequiredField { @@ -578,22 +594,22 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn build_request( &self, - req: &types::PayoutsRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Get) - .url(&types::PayoutSyncType::get_url(self, req, connectors)?) + req: &PayoutsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Get) + .url(&PayoutSyncType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PayoutSyncType::get_headers(self, req, connectors)?) + .headers(PayoutSyncType::get_headers(self, req, connectors)?) .build(); Ok(Some(request)) @@ -602,10 +618,10 @@ impl ConnectorIntegration, + data: &PayoutsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: paypal::PaypalFulfillResponse = res .response .parse_struct("PaypalFulfillResponse") @@ -614,7 +630,7 @@ impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { fn build_request( &self, - _req: &types::PayoutsRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &PayoutsRouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { // Eligibility check for wallet is not implemented Err( errors::ConnectorError::NotImplemented("Payout Eligibility for Paypal".to_string()) @@ -648,18 +662,12 @@ impl ConnectorIntegration for Paypal -{ +impl ConnectorIntegration for Paypal { fn get_headers( &self, - req: &types::SetupMandateRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &SetupMandateRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_content_type(&self) -> &'static str { @@ -667,8 +675,8 @@ impl } fn get_url( &self, - _req: &types::SetupMandateRouterData, - connectors: &settings::Connectors, + _req: &SetupMandateRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}v3/vault/payment-tokens/", @@ -677,8 +685,8 @@ impl } fn get_request_body( &self, - req: &types::SetupMandateRouterData, - _connectors: &settings::Connectors, + req: &SetupMandateRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = paypal::PaypalZeroMandateRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -686,35 +694,33 @@ impl fn build_request( &self, - req: &types::SetupMandateRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &SetupMandateRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::SetupMandateType::get_url(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Post) + .url(&SetupMandateType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::SetupMandateType::get_headers(self, req, connectors)?) - .set_body(types::SetupMandateType::get_request_body( - self, req, connectors, - )?) + .headers(SetupMandateType::get_headers(self, req, connectors)?) + .set_body(SetupMandateType::get_request_body(self, req, connectors)?) .build(), )) } fn handle_response( &self, - data: &types::SetupMandateRouterData, + data: &SetupMandateRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalSetupMandatesResponse = res .response .parse_struct("PaypalSetupMandatesResponse") .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, @@ -730,18 +736,14 @@ impl } } -impl - ConnectorIntegration< - api::PostSessionTokens, - types::PaymentsPostSessionTokensData, - types::PaymentsResponseData, - > for Paypal +impl ConnectorIntegration + for Paypal { fn get_headers( &self, - req: &types::PaymentsPostSessionTokensRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsPostSessionTokensRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } fn get_content_type(&self) -> &'static str { @@ -749,27 +751,27 @@ impl } fn get_url( &self, - _req: &types::PaymentsPostSessionTokensRouterData, - connectors: &settings::Connectors, + _req: &PaymentsPostSessionTokensRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}v2/checkout/orders", self.base_url(connectors))) } fn build_request( &self, - req: &types::PaymentsPostSessionTokensRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsPostSessionTokensRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsPostSessionTokensType::get_url( + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsPostSessionTokensType::get_url( self, req, connectors, )?) .attach_default_headers() - .headers(types::PaymentsPostSessionTokensType::get_headers( + .headers(PaymentsPostSessionTokensType::get_headers( self, req, connectors, )?) - .set_body(types::PaymentsPostSessionTokensType::get_request_body( + .set_body(PaymentsPostSessionTokensType::get_request_body( self, req, connectors, )?) .build(), @@ -778,8 +780,8 @@ impl fn get_request_body( &self, - req: &types::PaymentsPostSessionTokensRouterData, - _connectors: &settings::Connectors, + req: &PaymentsPostSessionTokensRouterData, + _connectors: &Connectors, ) -> CustomResult { let amount = connector_utils::convert_amount( self.amount_converter, @@ -809,17 +811,17 @@ impl fn handle_response( &self, - data: &types::PaymentsPostSessionTokensRouterData, + data: &PaymentsPostSessionTokensRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalRedirectResponse = res .response .parse_struct("PaypalRedirectResponse") .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, @@ -835,18 +837,14 @@ impl } } -impl - ConnectorIntegration< - api::SdkSessionUpdate, - types::SdkPaymentsSessionUpdateData, - types::PaymentsResponseData, - > for Paypal +impl ConnectorIntegration + for Paypal { fn get_headers( &self, - req: &types::SdkSessionUpdateRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &SdkSessionUpdateRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -856,8 +854,8 @@ impl fn get_url( &self, - req: &types::SdkSessionUpdateRouterData, - connectors: &settings::Connectors, + req: &SdkSessionUpdateRouterData, + connectors: &Connectors, ) -> CustomResult { let session_id = req.request @@ -875,20 +873,16 @@ impl fn build_request( &self, - req: &types::SdkSessionUpdateRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &SdkSessionUpdateRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Patch) - .url(&types::SdkSessionUpdateType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Patch) + .url(&SdkSessionUpdateType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::SdkSessionUpdateType::get_headers( - self, req, connectors, - )?) - .set_body(types::SdkSessionUpdateType::get_request_body( + .headers(SdkSessionUpdateType::get_headers(self, req, connectors)?) + .set_body(SdkSessionUpdateType::get_request_body( self, req, connectors, )?) .build(), @@ -897,8 +891,8 @@ impl fn get_request_body( &self, - req: &types::SdkSessionUpdateRouterData, - _connectors: &settings::Connectors, + req: &SdkSessionUpdateRouterData, + _connectors: &Connectors, ) -> CustomResult { let order_amount = connector_utils::convert_amount( self.amount_converter, @@ -937,11 +931,11 @@ impl fn handle_response( &self, - data: &types::SdkSessionUpdateRouterData, + data: &SdkSessionUpdateRouterData, _event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { - logger::debug!("Expected zero bytes response, skipped parsing of the response"); + ) -> CustomResult { + router_env::logger::debug!("Expected zero bytes response, skipped parsing of the response"); // https://developer.paypal.com/docs/api/orders/v2/#orders_patch // If 204 status code, then the session was updated successfully. let status = if res.status_code == 204 { @@ -949,8 +943,8 @@ impl } else { enums::SessionUpdateStatus::Failure }; - Ok(types::SdkSessionUpdateRouterData { - response: Ok(types::PaymentsResponseData::SessionUpdateResponse { status }), + Ok(SdkSessionUpdateRouterData { + response: Ok(PaymentsResponseData::SessionUpdateResponse { status }), ..data.clone() }) } @@ -964,14 +958,12 @@ impl } } -impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { 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) } @@ -981,13 +973,11 @@ impl ConnectorIntegration CustomResult { match &req.request.payment_method_data { - domain::PaymentMethodData::Wallet(domain::WalletData::PaypalSdk( - paypal_wallet_data, - )) => { + PaymentMethodData::Wallet(WalletData::PaypalSdk(paypal_wallet_data)) => { let authorize_url = if req.request.is_auto_capture()? { "capture".to_string() } else { @@ -1005,8 +995,8 @@ impl ConnectorIntegration CustomResult { let amount = connector_utils::convert_amount( self.amount_converter, @@ -1026,32 +1016,22 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let payment_method_data = req.request.payment_method_data.clone(); let req = match payment_method_data { - domain::PaymentMethodData::Wallet(domain::WalletData::PaypalSdk(_)) => { - services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsAuthorizeType::get_url( - self, req, connectors, - )?) - .headers(types::PaymentsAuthorizeType::get_headers( - self, req, connectors, - )?) - .build() - } - _ => services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsAuthorizeType::get_url( - self, req, connectors, - )?) + PaymentMethodData::Wallet(WalletData::PaypalSdk(_)) => RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsAuthorizeType::get_url(self, req, connectors)?) + .headers(PaymentsAuthorizeType::get_headers(self, req, connectors)?) + .build(), + _ => 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(), @@ -1062,10 +1042,10 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: PaypalAuthResponse = res.response .parse_struct("paypal PaypalAuthResponse") @@ -1075,7 +1055,7 @@ impl ConnectorIntegration { 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, @@ -1093,7 +1073,7 @@ impl ConnectorIntegration { 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, @@ -1113,25 +1093,21 @@ impl ConnectorIntegration for Paypal +impl ConnectorIntegration + for Paypal { 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) } fn get_url( &self, - req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, + req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, ) -> CustomResult { let order_id = req .request @@ -1147,17 +1123,15 @@ 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::Get) - .url(&types::PaymentsPreProcessingType::get_url( - self, req, connectors, - )?) + RequestBuilder::new() + .method(Method::Get) + .url(&PaymentsPreProcessingType::get_url(self, req, connectors)?) .attach_default_headers() - .headers(types::PaymentsPreProcessingType::get_headers( + .headers(PaymentsPreProcessingType::get_headers( self, req, connectors, )?) .build(), @@ -1166,10 +1140,10 @@ impl fn handle_response( &self, - data: &types::PaymentsPreProcessingRouterData, + data: &PaymentsPreProcessingRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalPreProcessingResponse = res .response .parse_struct("paypal PaypalPreProcessingResponse") @@ -1217,10 +1191,10 @@ impl | (Some(paypal::EnrollmentStatus::NotReady), None, paypal::LiabilityShift::No) | (Some(paypal::EnrollmentStatus::Unavailable), None, paypal::LiabilityShift::No) | (Some(paypal::EnrollmentStatus::Bypassed), None, paypal::LiabilityShift::No) => { - Ok(types::PaymentsPreProcessingRouterData { - status: storage_enums::AttemptStatus::AuthenticationSuccessful, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + Ok(PaymentsPreProcessingRouterData { + status: enums::AttemptStatus::AuthenticationSuccessful, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -1232,14 +1206,14 @@ impl ..data.clone() }) } - _ => Ok(types::PaymentsPreProcessingRouterData { + _ => Ok(PaymentsPreProcessingRouterData { response: Err(ErrorResponse { attempt_status: Some(enums::AttemptStatus::Failure), - 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(), connector_transaction_id: None, reason: Some(format!("{} Connector Responsded with LiabilityShift: {:?}, EnrollmentStatus: {:?}, and AuthenticationStatus: {:?}", - consts::CANNOT_CONTINUE_AUTH, + constants::CANNOT_CONTINUE_AUTH, liability_response .payment_source .card @@ -1268,10 +1242,10 @@ impl } // if card does not supports 3DS check for liability paypal::PaypalPreProcessingResponse::PaypalNonLiabilityResponse(_) => { - Ok(types::PaymentsPreProcessingRouterData { - status: storage_enums::AttemptStatus::AuthenticationSuccessful, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + Ok(PaymentsPreProcessingRouterData { + status: enums::AttemptStatus::AuthenticationSuccessful, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -1295,18 +1269,14 @@ impl } } -impl - ConnectorIntegration< - CompleteAuthorize, - types::CompleteAuthorizeData, - types::PaymentsResponseData, - > for Paypal +impl ConnectorIntegration + for Paypal { 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) } @@ -1316,8 +1286,8 @@ impl fn get_url( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { let complete_authorize_url = if req.request.is_auto_capture()? { "capture".to_string() @@ -1336,16 +1306,16 @@ 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, )?) - .headers(types::PaymentsCompleteAuthorizeType::get_headers( + .headers(PaymentsCompleteAuthorizeType::get_headers( self, req, connectors, )?) .build(), @@ -1354,17 +1324,17 @@ impl fn handle_response( &self, - data: &types::PaymentsCompleteAuthorizeRouterData, + data: &PaymentsCompleteAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalOrdersResponse = res .response .parse_struct("paypal PaypalOrdersResponse") .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, @@ -1380,14 +1350,12 @@ impl } } -impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { 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) } @@ -1397,8 +1365,8 @@ impl ConnectorIntegration CustomResult { let paypal_meta: PaypalMeta = to_connector_meta(req.request.connector_meta.clone())?; match req.payment_method { @@ -1449,32 +1417,32 @@ 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)?) - .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Get) + .url(&PaymentsSyncType::get_url(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: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalSyncResponse = res .response .parse_struct("paypal SyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::foreign_try_from(( - types::ResponseRouterData { + RouterData::foreign_try_from(( + ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -1492,14 +1460,12 @@ impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { 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) } @@ -1509,8 +1475,8 @@ impl ConnectorIntegration CustomResult { let paypal_meta: PaypalMeta = to_connector_meta(req.request.connector_meta.clone())?; let authorize_id = paypal_meta.authorize_id.ok_or( @@ -1527,8 +1493,8 @@ impl ConnectorIntegration CustomResult { let amount_to_capture = connector_utils::convert_amount( self.amount_converter, @@ -1543,17 +1509,15 @@ 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)?) - .headers(types::PaymentsCaptureType::get_headers( - self, req, connectors, - )?) - .set_body(types::PaymentsCaptureType::get_request_body( + RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsCaptureType::get_url(self, req, connectors)?) + .headers(PaymentsCaptureType::get_headers(self, req, connectors)?) + .set_body(PaymentsCaptureType::get_request_body( self, req, connectors, )?) .build(), @@ -1562,17 +1526,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalCaptureResponse = res .response .parse_struct("Paypal 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, @@ -1588,14 +1552,12 @@ impl ConnectorIntegration - for Paypal -{ +impl ConnectorIntegration for Paypal { 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) } @@ -1605,8 +1567,8 @@ impl ConnectorIntegration CustomResult { let paypal_meta: PaypalMeta = to_connector_meta(req.request.connector_meta.clone())?; let authorize_id = paypal_meta.authorize_id.ok_or( @@ -1623,13 +1585,13 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) - .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&PaymentsVoidType::get_url(self, req, connectors)?) + .headers(PaymentsVoidType::get_headers(self, req, connectors)?) .build(); Ok(Some(request)) @@ -1637,17 +1599,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalPaymentsCancelResponse = res .response .parse_struct("PaymentCancelResponse") .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, @@ -1662,12 +1624,12 @@ impl ConnectorIntegration for Paypal { +impl ConnectorIntegration for Paypal { 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) } @@ -1677,8 +1639,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { let paypal_meta: PaypalMeta = to_connector_meta(req.request.connector_metadata.clone())?; let capture_id = paypal_meta.capture_id.ok_or( @@ -1695,8 +1657,8 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { let amount = connector_utils::convert_amount( self.amount_converter, @@ -1711,18 +1673,14 @@ 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)?) - .headers(types::RefundExecuteType::get_headers( - self, req, connectors, - )?) - .set_body(types::RefundExecuteType::get_request_body( - self, req, connectors, - )?) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&RefundExecuteType::get_url(self, req, connectors)?) + .headers(RefundExecuteType::get_headers(self, req, connectors)?) + .set_body(RefundExecuteType::get_request_body(self, req, connectors)?) .build(); Ok(Some(request)) @@ -1730,17 +1688,17 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: paypal::RefundResponse = res.response .parse_struct("paypal 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, @@ -1756,12 +1714,12 @@ impl ConnectorIntegration for Paypal { +impl ConnectorIntegration for Paypal { 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) } @@ -1771,8 +1729,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}v2/payments/refunds/{}", @@ -1783,31 +1741,31 @@ 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)?) - .headers(types::RefundSyncType::get_headers(self, req, connectors)?) + RequestBuilder::new() + .method(Method::Get) + .url(&RefundSyncType::get_url(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: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::RefundSyncResponse = res .response .parse_struct("paypal 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, @@ -1826,19 +1784,19 @@ impl ConnectorIntegration for Paypal { fn get_headers( &self, - req: &types::RouterData< + req: &RouterData< VerifyWebhookSource, - types::VerifyWebhookSourceRequestData, - types::VerifyWebhookSourceResponseData, + VerifyWebhookSourceRequestData, + VerifyWebhookSourceResponseData, >, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let auth = paypal::PaypalAuthType::try_from(&req.connector_auth_type)?; let credentials = auth.get_credentials()?; let auth_val = credentials.generate_authorization_value(); @@ -1846,7 +1804,7 @@ impl Ok(vec![ ( headers::CONTENT_TYPE.to_string(), - types::VerifyWebhookSourceType::get_content_type(self) + VerifyWebhookSourceType::get_content_type(self) .to_string() .into(), ), @@ -1860,12 +1818,12 @@ impl fn get_url( &self, - _req: &types::RouterData< + _req: &RouterData< VerifyWebhookSource, - types::VerifyWebhookSourceRequestData, - types::VerifyWebhookSourceResponseData, + VerifyWebhookSourceRequestData, + VerifyWebhookSourceResponseData, >, - connectors: &settings::Connectors, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}v1/notifications/verify-webhook-signature", @@ -1875,18 +1833,14 @@ impl fn build_request( &self, - req: &types::VerifyWebhookSourceRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) - .url(&types::VerifyWebhookSourceType::get_url( - self, req, connectors, - )?) - .headers(types::VerifyWebhookSourceType::get_headers( - self, req, connectors, - )?) - .set_body(types::VerifyWebhookSourceType::get_request_body( + req: &VerifyWebhookSourceRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) + .url(&VerifyWebhookSourceType::get_url(self, req, connectors)?) + .headers(VerifyWebhookSourceType::get_headers(self, req, connectors)?) + .set_body(VerifyWebhookSourceType::get_request_body( self, req, connectors, )?) .build(); @@ -1895,12 +1849,12 @@ impl fn get_request_body( &self, - req: &types::RouterData< + req: &RouterData< VerifyWebhookSource, - types::VerifyWebhookSourceRequestData, - types::VerifyWebhookSourceResponseData, + VerifyWebhookSourceRequestData, + VerifyWebhookSourceResponseData, >, - _connectors: &settings::Connectors, + _connectors: &Connectors, ) -> CustomResult { let connector_req = paypal::PaypalSourceVerificationRequest::try_from(&req.request)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -1908,17 +1862,17 @@ impl fn handle_response( &self, - data: &types::VerifyWebhookSourceRouterData, + data: &VerifyWebhookSourceRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: paypal::PaypalSourceVerificationResponse = res .response .parse_struct("paypal PaypalSourceVerificationResponse") .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, @@ -1934,10 +1888,10 @@ impl } #[async_trait::async_trait] -impl api::IncomingWebhook for Paypal { +impl IncomingWebhook for Paypal { fn get_webhook_object_reference_id( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let payload: paypal::PaypalWebhooksBody = request @@ -1984,8 +1938,8 @@ impl api::IncomingWebhook for Paypal { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let payload: paypal::PaypalWebooksEventType = request .body .parse_struct("PaypalWebooksEventType") @@ -2013,15 +1967,15 @@ impl api::IncomingWebhook for Paypal { | PaypalWebhookEventType::Unknown => None, }; - Ok(api::IncomingWebhookEvent::foreign_from(( + Ok(transformers::get_payapl_webhooks_event( payload.event_type, outcome, - ))) + )) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let details: paypal::PaypalWebhooksBody = request @@ -2044,8 +1998,8 @@ impl api::IncomingWebhook for Paypal { fn get_dispute_details( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let webhook_payload: paypal::PaypalWebhooksBody = request .body .parse_struct("PaypalWebhooksBody") @@ -2058,7 +2012,7 @@ impl api::IncomingWebhook for Paypal { .attach_printable("Expected Dispute webhooks,but found other webhooks")? } transformers::PaypalResource::PaypalDisputeWebhooks(payload) => { - Ok(api::disputes::DisputePayload { + Ok(disputes::DisputePayload { amount: connector_utils::to_currency_lower_unit( payload.dispute_amount.value.get_amount_as_string(), payload.dispute_amount.currency_code, @@ -2080,18 +2034,18 @@ impl api::IncomingWebhook for Paypal { } } -impl services::ConnectorRedirectResponse for Paypal { +impl ConnectorRedirectResponse for Paypal { fn get_flow_type( &self, _query_params: &str, _json_payload: Option, action: PaymentAction, - ) -> CustomResult { + ) -> CustomResult { match action { PaymentAction::PSync | PaymentAction::CompleteAuthorize | PaymentAction::PaymentAuthenticateCompleteAuthorize => { - Ok(payments::CallConnectorAction::Trigger) + Ok(CallConnectorAction::Trigger) } } } diff --git a/crates/router/src/connector/paypal/transformers.rs b/crates/hyperswitch_connectors/src/connectors/paypal/transformers.rs similarity index 77% rename from crates/router/src/connector/paypal/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/paypal/transformers.rs index 80a702512c..9acf279e91 100644 --- a/crates/router/src/connector/paypal/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/paypal/transformers.rs @@ -1,28 +1,57 @@ -use api_models::enums; +#[cfg(feature = "payouts")] +use api_models::payouts::{PayoutMethodData, Wallet as WalletPayout}; +use api_models::{enums, webhooks::IncomingWebhookEvent}; use base64::Engine; +use common_enums::enums as storage_enums; #[cfg(feature = "payouts")] use common_utils::pii::Email; -use common_utils::{errors::CustomResult, types::StringMajorUnit}; +use common_utils::{consts, errors::CustomResult, request::Method, types::StringMajorUnit}; use error_stack::ResultExt; -use hyperswitch_domain_models::router_response_types::MandateReference; +use hyperswitch_domain_models::{ + payment_method_data::{ + BankDebitData, BankRedirectData, BankTransferData, CardRedirectData, GiftCardData, + PayLaterData, PaymentMethodData, VoucherData, WalletData, + }, + router_data::{AccessToken, ConnectorAuthType, RouterData}, + router_flow_types::{ + payments::{Authorize, PostSessionTokens}, + refunds::{Execute, RSync}, + VerifyWebhookSource, + }, + router_request_types::{ + PaymentsAuthorizeData, PaymentsPostSessionTokensData, PaymentsSyncData, ResponseId, + VerifyWebhookSourceRequestData, + }, + router_response_types::{ + MandateReference, PaymentsResponseData, RedirectForm, RefundsResponseData, + VerifyWebhookSourceResponseData, VerifyWebhookStatus, + }, + types::{ + PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, + PaymentsPostSessionTokensRouterData, RefreshTokenRouterData, RefundsRouterData, + SdkSessionUpdateRouterData, SetupMandateRouterData, VerifyWebhookSourceRouterData, + }, +}; +#[cfg(feature = "payouts")] +use hyperswitch_domain_models::{ + router_flow_types::PoFulfill, router_response_types::PayoutsResponseData, + types::PayoutsRouterData, +}; +use hyperswitch_interfaces::errors; use masking::{ExposeInterface, Secret}; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; use url::Url; +use utils::ForeignTryFrom; +#[cfg(feature = "payouts")] +use crate::{constants, types::PayoutsResponseRouterData}; use crate::{ - connector::utils::{ + types::{PaymentsCaptureResponseRouterData, RefundsResponseRouterData, ResponseRouterData}, + utils::{ self, missing_field_err, to_connector_meta, AccessTokenRequestInfo, AddressDetailsData, - CardData, PaymentsAuthorizeRequestData, PaymentsPostSessionTokensRequestData, RouterData, - }, - consts, - core::errors, - services, - types::{ - self, api, domain, - storage::enums as storage_enums, - transformers::{ForeignFrom, ForeignTryFrom}, - ConnectorAuthType, VerifyWebhookSourceResponseData, + CardData, PaymentsAuthorizeRequestData, PaymentsPostSessionTokensRequestData, + RouterData as OtherRouterData, }, }; @@ -101,8 +130,8 @@ pub struct OrderRequestAmount { pub breakdown: AmountBreakdown, } -impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for OrderRequestAmount { - fn from(item: &PaypalRouterData<&types::PaymentsAuthorizeRouterData>) -> Self { +impl From<&PaypalRouterData<&PaymentsAuthorizeRouterData>> for OrderRequestAmount { + fn from(item: &PaypalRouterData<&PaymentsAuthorizeRouterData>) -> Self { Self { currency_code: item.router_data.request.currency, value: item.amount.clone(), @@ -124,12 +153,10 @@ impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for OrderReque } } -impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> - for OrderRequestAmount -{ +impl TryFrom<&PaypalRouterData<&PaymentsPostSessionTokensRouterData>> for OrderRequestAmount { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>, + item: &PaypalRouterData<&PaymentsPostSessionTokensRouterData>, ) -> Result { Ok(Self { currency_code: item.router_data.request.currency, @@ -156,11 +183,9 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> } } -impl TryFrom<&PaypalRouterData<&types::SdkSessionUpdateRouterData>> for OrderRequestAmount { +impl TryFrom<&PaypalRouterData<&SdkSessionUpdateRouterData>> for OrderRequestAmount { type Error = error_stack::Report; - fn try_from( - item: &PaypalRouterData<&types::SdkSessionUpdateRouterData>, - ) -> Result { + fn try_from(item: &PaypalRouterData<&SdkSessionUpdateRouterData>) -> Result { Ok(Self { currency_code: item.router_data.request.currency, value: item.amount.clone(), @@ -225,8 +250,8 @@ pub struct ItemDetails { tax: Option, } -impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for ItemDetails { - fn from(item: &PaypalRouterData<&types::PaymentsAuthorizeRouterData>) -> Self { +impl From<&PaypalRouterData<&PaymentsAuthorizeRouterData>> for ItemDetails { + fn from(item: &PaypalRouterData<&PaymentsAuthorizeRouterData>) -> Self { Self { name: format!( "Payment for invoice {}", @@ -242,10 +267,10 @@ impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for ItemDetail } } -impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> for ItemDetails { +impl TryFrom<&PaypalRouterData<&PaymentsPostSessionTokensRouterData>> for ItemDetails { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>, + item: &PaypalRouterData<&PaymentsPostSessionTokensRouterData>, ) -> Result { Ok(Self { name: format!( @@ -266,11 +291,9 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> for } } -impl TryFrom<&PaypalRouterData<&types::SdkSessionUpdateRouterData>> for ItemDetails { +impl TryFrom<&PaypalRouterData<&SdkSessionUpdateRouterData>> for ItemDetails { type Error = error_stack::Report; - fn try_from( - item: &PaypalRouterData<&types::SdkSessionUpdateRouterData>, - ) -> Result { + fn try_from(item: &PaypalRouterData<&SdkSessionUpdateRouterData>) -> Result { Ok(Self { name: format!( "Payment for invoice {}", @@ -311,8 +334,8 @@ pub struct ShippingAddress { name: Option, } -impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for ShippingAddress { - fn from(item: &PaypalRouterData<&types::PaymentsAuthorizeRouterData>) -> Self { +impl From<&PaypalRouterData<&PaymentsAuthorizeRouterData>> for ShippingAddress { + fn from(item: &PaypalRouterData<&PaymentsAuthorizeRouterData>) -> Self { Self { address: get_address_info(item.router_data.get_optional_shipping()), name: Some(ShippingName { @@ -326,8 +349,8 @@ impl From<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for ShippingAd } } -impl From<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> for ShippingAddress { - fn from(item: &PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>) -> Self { +impl From<&PaypalRouterData<&PaymentsPostSessionTokensRouterData>> for ShippingAddress { + fn from(item: &PaypalRouterData<&PaymentsPostSessionTokensRouterData>) -> Self { Self { address: get_address_info(item.router_data.get_optional_shipping()), name: Some(ShippingName { @@ -583,19 +606,12 @@ pub struct Customer { id: String, } -impl - TryFrom< - types::ResponseRouterData, - > for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - PaypalSetupMandatesResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let info_response = item.response; @@ -614,8 +630,8 @@ impl }; Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(info_response.id.clone()), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(info_response.id.clone()), redirection_data: Box::new(None), mandate_reference: Box::new(mandate_reference), connector_metadata: None, @@ -628,41 +644,37 @@ impl }) } } -impl TryFrom<&types::SetupMandateRouterData> for PaypalZeroMandateRequest { +impl TryFrom<&SetupMandateRouterData> for PaypalZeroMandateRequest { type Error = error_stack::Report; - fn try_from(item: &types::SetupMandateRouterData) -> Result { + fn try_from(item: &SetupMandateRouterData) -> Result { let payment_source = match item.request.payment_method_data.clone() { - domain::PaymentMethodData::Card(ccard) => { - ZeroMandateSourceItem::Card(CardMandateRequest { - billing_address: get_address_info(item.get_optional_billing()), - expiry: Some(ccard.get_expiry_date_as_yyyymm("-")), - name: item.get_optional_billing_full_name(), - number: Some(ccard.card_number), - }) - } + PaymentMethodData::Card(ccard) => ZeroMandateSourceItem::Card(CardMandateRequest { + billing_address: get_address_info(item.get_optional_billing()), + expiry: Some(ccard.get_expiry_date_as_yyyymm("-")), + name: item.get_optional_billing_full_name(), + number: Some(ccard.card_number), + }), - domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::CardRedirect(_) - | 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::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::MobilePayment(_) => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ))? - } + PaymentMethodData::Wallet(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::MobilePayment(_) => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ))?, }; Ok(Self { payment_source }) @@ -684,43 +696,39 @@ fn get_address_info( } } fn get_payment_source( - item: &types::PaymentsAuthorizeRouterData, - bank_redirection_data: &domain::BankRedirectData, + item: &PaymentsAuthorizeRouterData, + bank_redirection_data: &BankRedirectData, ) -> Result> { match bank_redirection_data { - domain::BankRedirectData::Eps { bank_name: _, .. } => { - Ok(PaymentSourceItem::Eps(RedirectRequest { - name: item.get_billing_full_name()?, - country_code: item.get_billing_country()?, - experience_context: ContextStruct { - return_url: item.request.complete_authorize_url.clone(), - cancel_url: item.request.complete_authorize_url.clone(), - shipping_preference: if item.get_optional_shipping_country().is_some() { - ShippingPreference::SetProvidedAddress - } else { - ShippingPreference::GetFromFile - }, - user_action: Some(UserAction::PayNow), + BankRedirectData::Eps { bank_name: _, .. } => Ok(PaymentSourceItem::Eps(RedirectRequest { + name: item.get_billing_full_name()?, + country_code: item.get_billing_country()?, + experience_context: ContextStruct { + return_url: item.request.complete_authorize_url.clone(), + cancel_url: item.request.complete_authorize_url.clone(), + shipping_preference: if item.get_optional_shipping_country().is_some() { + ShippingPreference::SetProvidedAddress + } else { + ShippingPreference::GetFromFile }, - })) - } - domain::BankRedirectData::Giropay { .. } => { - Ok(PaymentSourceItem::Giropay(RedirectRequest { - name: item.get_billing_full_name()?, - country_code: item.get_billing_country()?, - experience_context: ContextStruct { - return_url: item.request.complete_authorize_url.clone(), - cancel_url: item.request.complete_authorize_url.clone(), - shipping_preference: if item.get_optional_shipping_country().is_some() { - ShippingPreference::SetProvidedAddress - } else { - ShippingPreference::GetFromFile - }, - user_action: Some(UserAction::PayNow), + user_action: Some(UserAction::PayNow), + }, + })), + BankRedirectData::Giropay { .. } => Ok(PaymentSourceItem::Giropay(RedirectRequest { + name: item.get_billing_full_name()?, + country_code: item.get_billing_country()?, + experience_context: ContextStruct { + return_url: item.request.complete_authorize_url.clone(), + cancel_url: item.request.complete_authorize_url.clone(), + shipping_preference: if item.get_optional_shipping_country().is_some() { + ShippingPreference::SetProvidedAddress + } else { + ShippingPreference::GetFromFile }, - })) - } - domain::BankRedirectData::Ideal { bank_name: _, .. } => { + user_action: Some(UserAction::PayNow), + }, + })), + BankRedirectData::Ideal { bank_name: _, .. } => { Ok(PaymentSourceItem::IDeal(RedirectRequest { name: item.get_billing_full_name()?, country_code: item.get_billing_country()?, @@ -736,7 +744,7 @@ fn get_payment_source( }, })) } - domain::BankRedirectData::Sofort { + BankRedirectData::Sofort { preferred_language: _, .. } => Ok(PaymentSourceItem::Sofort(RedirectRequest { @@ -753,30 +761,26 @@ fn get_payment_source( user_action: Some(UserAction::PayNow), }, })), - domain::BankRedirectData::BancontactCard { .. } - | domain::BankRedirectData::Blik { .. } - | domain::BankRedirectData::Przelewy24 { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ) - .into()) - } - domain::BankRedirectData::Bizum {} - | domain::BankRedirectData::Eft { .. } - | domain::BankRedirectData::Interac { .. } - | domain::BankRedirectData::OnlineBankingCzechRepublic { .. } - | domain::BankRedirectData::OnlineBankingFinland { .. } - | domain::BankRedirectData::OnlineBankingPoland { .. } - | domain::BankRedirectData::OnlineBankingSlovakia { .. } - | domain::BankRedirectData::OpenBankingUk { .. } - | domain::BankRedirectData::Trustly { .. } - | domain::BankRedirectData::OnlineBankingFpx { .. } - | domain::BankRedirectData::OnlineBankingThailand { .. } - | domain::BankRedirectData::LocalBankRedirect {} => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ))? - } + BankRedirectData::BancontactCard { .. } + | BankRedirectData::Blik { .. } + | BankRedirectData::Przelewy24 { .. } => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ) + .into()), + BankRedirectData::Bizum {} + | BankRedirectData::Eft { .. } + | BankRedirectData::Interac { .. } + | BankRedirectData::OnlineBankingCzechRepublic { .. } + | BankRedirectData::OnlineBankingFinland { .. } + | BankRedirectData::OnlineBankingPoland { .. } + | BankRedirectData::OnlineBankingSlovakia { .. } + | BankRedirectData::OpenBankingUk { .. } + | BankRedirectData::Trustly { .. } + | BankRedirectData::OnlineBankingFpx { .. } + | BankRedirectData::OnlineBankingThailand { .. } + | BankRedirectData::LocalBankRedirect {} => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ))?, } } @@ -790,12 +794,10 @@ fn get_payee(auth_type: &PaypalAuthType) -> Option { }) } -impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> - for PaypalPaymentsRequest -{ +impl TryFrom<&PaypalRouterData<&PaymentsPostSessionTokensRouterData>> for PaypalPaymentsRequest { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>, + item: &PaypalRouterData<&PaymentsPostSessionTokensRouterData>, ) -> Result { let intent = if item.router_data.request.is_auto_capture()? { PaypalPaymentIntent::Capture @@ -853,12 +855,10 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsPostSessionTokensRouterData>> } } -impl TryFrom<&PaypalRouterData<&types::SdkSessionUpdateRouterData>> for PaypalUpdateOrderRequest { +impl TryFrom<&PaypalRouterData<&SdkSessionUpdateRouterData>> for PaypalUpdateOrderRequest { type Error = error_stack::Report; - fn try_from( - item: &PaypalRouterData<&types::SdkSessionUpdateRouterData>, - ) -> Result { + fn try_from(item: &PaypalRouterData<&SdkSessionUpdateRouterData>) -> Result { let op = PaypalOperationType::Replace; // Create separate paths for amount and items @@ -886,10 +886,10 @@ impl TryFrom<&PaypalRouterData<&types::SdkSessionUpdateRouterData>> for PaypalUp } } -impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalPaymentsRequest { +impl TryFrom<&PaypalRouterData<&PaymentsAuthorizeRouterData>> for PaypalPaymentsRequest { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PaymentsAuthorizeRouterData>, + item: &PaypalRouterData<&PaymentsAuthorizeRouterData>, ) -> Result { let paypal_auth: PaypalAuthType = PaypalAuthType::try_from(&item.router_data.connector_auth_type)?; @@ -920,7 +920,7 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP }]; match item.router_data.request.payment_method_data { - domain::PaymentMethodData::Card(ref ccard) => { + PaymentMethodData::Card(ref ccard) => { let card = item.router_data.request.get_card()?; let expiry = Some(card.get_expiry_date_as_yyyymm("-")); @@ -961,8 +961,8 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP payment_source, }) } - domain::PaymentMethodData::Wallet(ref wallet_data) => match wallet_data { - domain::WalletData::PaypalRedirect(_) => { + PaymentMethodData::Wallet(ref wallet_data) => match wallet_data { + WalletData::PaypalRedirect(_) => { let payment_source = Some(PaymentSourceItem::Paypal( PaypalRedirectionRequest::PaypalRedirectionStruct( PaypalRedirectionStruct { @@ -1010,7 +1010,7 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP payment_source, }) } - domain::WalletData::PaypalSdk(_) => { + WalletData::PaypalSdk(_) => { let payment_source = Some(PaymentSourceItem::Paypal( PaypalRedirectionRequest::PaypalRedirectionStruct( PaypalRedirectionStruct { @@ -1042,37 +1042,37 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP payment_source, }) } - 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::SamsungPay(_) - | domain::WalletData::TwintRedirect {} - | domain::WalletData::VippsRedirect {} - | domain::WalletData::TouchNGoRedirect(_) - | domain::WalletData::WeChatPayRedirect(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::SwishQr(_) - | domain::WalletData::Mifinity(_) - | domain::WalletData::Paze(_) => 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::SamsungPay(_) + | WalletData::TwintRedirect {} + | WalletData::VippsRedirect {} + | WalletData::TouchNGoRedirect(_) + | WalletData::WeChatPayRedirect(_) + | WalletData::WeChatPayQr(_) + | WalletData::CashappQr(_) + | WalletData::SwishQr(_) + | WalletData::Mifinity(_) + | WalletData::Paze(_) => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Paypal"), ))?, }, - domain::PaymentMethodData::BankRedirect(ref bank_redirection_data) => { + PaymentMethodData::BankRedirect(ref bank_redirection_data) => { let bank_redirect_intent = if item.router_data.request.is_auto_capture()? { PaypalPaymentIntent::Capture } else { @@ -1091,21 +1091,19 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP payment_source, }) } - domain::PaymentMethodData::CardRedirect(ref card_redirect_data) => { + PaymentMethodData::CardRedirect(ref card_redirect_data) => { Self::try_from(card_redirect_data) } - domain::PaymentMethodData::PayLater(ref paylater_data) => Self::try_from(paylater_data), - domain::PaymentMethodData::BankDebit(ref bank_debit_data) => { - Self::try_from(bank_debit_data) - } - domain::PaymentMethodData::BankTransfer(ref bank_transfer_data) => { + PaymentMethodData::PayLater(ref paylater_data) => Self::try_from(paylater_data), + PaymentMethodData::BankDebit(ref bank_debit_data) => Self::try_from(bank_debit_data), + PaymentMethodData::BankTransfer(ref bank_transfer_data) => { Self::try_from(bank_transfer_data.as_ref()) } - domain::PaymentMethodData::Voucher(ref voucher_data) => Self::try_from(voucher_data), - domain::PaymentMethodData::GiftCard(ref giftcard_data) => { + PaymentMethodData::Voucher(ref voucher_data) => Self::try_from(voucher_data), + PaymentMethodData::GiftCard(ref giftcard_data) => { Self::try_from(giftcard_data.as_ref()) } - domain::PaymentMethodData::MandatePayment => { + PaymentMethodData::MandatePayment => { let payment_method_type = item .router_data .get_recurring_mandate_payment_data()? @@ -1235,15 +1233,15 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP payment_source: payment_source?, }) } - domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::MobilePayment(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::MobilePayment(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Paypal"), ) @@ -1253,106 +1251,14 @@ impl TryFrom<&PaypalRouterData<&types::PaymentsAuthorizeRouterData>> for PaypalP } } -impl TryFrom<&domain::payments::CardRedirectData> for PaypalPaymentsRequest { +impl TryFrom<&CardRedirectData> for PaypalPaymentsRequest { type Error = error_stack::Report; - fn try_from(value: &domain::payments::CardRedirectData) -> Result { + fn try_from(value: &CardRedirectData) -> Result { match value { - domain::payments::CardRedirectData::Knet {} - | domain::payments::CardRedirectData::Benefit {} - | domain::payments::CardRedirectData::MomoAtm {} - | domain::payments::CardRedirectData::CardRedirect {} => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ) - .into()) - } - } - } -} - -impl TryFrom<&domain::PayLaterData> for PaypalPaymentsRequest { - type Error = error_stack::Report; - fn try_from(value: &domain::PayLaterData) -> Result { - match value { - domain::PayLaterData::KlarnaRedirect { .. } - | domain::PayLaterData::KlarnaSdk { .. } - | domain::PayLaterData::AffirmRedirect {} - | domain::PayLaterData::AfterpayClearpayRedirect { .. } - | domain::PayLaterData::PayBrightRedirect {} - | domain::PayLaterData::WalleyRedirect {} - | domain::PayLaterData::AlmaRedirect {} - | domain::PayLaterData::AtomeRedirect {} => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ) - .into()) - } - } - } -} - -impl TryFrom<&domain::BankDebitData> for PaypalPaymentsRequest { - type Error = error_stack::Report; - fn try_from(value: &domain::BankDebitData) -> Result { - match value { - domain::BankDebitData::AchBankDebit { .. } - | domain::BankDebitData::SepaBankDebit { .. } - | domain::BankDebitData::BecsBankDebit { .. } - | domain::BankDebitData::BacsBankDebit { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ) - .into()) - } - } - } -} - -impl TryFrom<&domain::BankTransferData> for PaypalPaymentsRequest { - type Error = error_stack::Report; - fn try_from(value: &domain::BankTransferData) -> Result { - match value { - 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::Pix { .. } - | domain::BankTransferData::Pse {} - | domain::BankTransferData::LocalBankTransfer { .. } => { - Err(errors::ConnectorError::NotImplemented( - utils::get_unimplemented_payment_method_error_message("Paypal"), - ) - .into()) - } - } - } -} - -impl TryFrom<&domain::VoucherData> for PaypalPaymentsRequest { - type Error = error_stack::Report; - fn try_from(value: &domain::VoucherData) -> Result { - match value { - domain::VoucherData::Boleto(_) - | domain::VoucherData::Efecty - | domain::VoucherData::PagoEfectivo - | domain::VoucherData::RedCompra - | domain::VoucherData::RedPagos - | domain::VoucherData::Alfamart(_) - | domain::VoucherData::Indomaret(_) - | domain::VoucherData::Oxxo - | domain::VoucherData::SevenEleven(_) - | domain::VoucherData::Lawson(_) - | domain::VoucherData::MiniStop(_) - | domain::VoucherData::FamilyMart(_) - | domain::VoucherData::Seicomart(_) - | domain::VoucherData::PayEasy(_) => Err(errors::ConnectorError::NotImplemented( + CardRedirectData::Knet {} + | CardRedirectData::Benefit {} + | CardRedirectData::MomoAtm {} + | CardRedirectData::CardRedirect {} => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Paypal"), ) .into()), @@ -1360,11 +1266,97 @@ impl TryFrom<&domain::VoucherData> for PaypalPaymentsRequest { } } -impl TryFrom<&domain::GiftCardData> for PaypalPaymentsRequest { +impl TryFrom<&PayLaterData> for PaypalPaymentsRequest { type Error = error_stack::Report; - fn try_from(value: &domain::GiftCardData) -> Result { + fn try_from(value: &PayLaterData) -> Result { match value { - domain::GiftCardData::Givex(_) | domain::GiftCardData::PaySafeCard {} => { + PayLaterData::KlarnaRedirect { .. } + | PayLaterData::KlarnaSdk { .. } + | PayLaterData::AffirmRedirect {} + | PayLaterData::AfterpayClearpayRedirect { .. } + | PayLaterData::PayBrightRedirect {} + | PayLaterData::WalleyRedirect {} + | PayLaterData::AlmaRedirect {} + | PayLaterData::AtomeRedirect {} => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ) + .into()), + } + } +} + +impl TryFrom<&BankDebitData> for PaypalPaymentsRequest { + type Error = error_stack::Report; + fn try_from(value: &BankDebitData) -> Result { + match value { + BankDebitData::AchBankDebit { .. } + | BankDebitData::SepaBankDebit { .. } + | BankDebitData::BecsBankDebit { .. } + | BankDebitData::BacsBankDebit { .. } => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ) + .into()), + } + } +} + +impl TryFrom<&BankTransferData> for PaypalPaymentsRequest { + type Error = error_stack::Report; + fn try_from(value: &BankTransferData) -> Result { + match value { + BankTransferData::AchBankTransfer { .. } + | BankTransferData::SepaBankTransfer { .. } + | BankTransferData::BacsBankTransfer { .. } + | BankTransferData::MultibancoBankTransfer { .. } + | BankTransferData::PermataBankTransfer { .. } + | BankTransferData::BcaBankTransfer { .. } + | BankTransferData::BniVaBankTransfer { .. } + | BankTransferData::BriVaBankTransfer { .. } + | BankTransferData::CimbVaBankTransfer { .. } + | BankTransferData::DanamonVaBankTransfer { .. } + | BankTransferData::MandiriVaBankTransfer { .. } + | BankTransferData::Pix { .. } + | BankTransferData::Pse {} + | BankTransferData::LocalBankTransfer { .. } => { + Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ) + .into()) + } + } + } +} + +impl TryFrom<&VoucherData> for PaypalPaymentsRequest { + type Error = error_stack::Report; + fn try_from(value: &VoucherData) -> Result { + match value { + VoucherData::Boleto(_) + | VoucherData::Efecty + | VoucherData::PagoEfectivo + | VoucherData::RedCompra + | VoucherData::RedPagos + | VoucherData::Alfamart(_) + | VoucherData::Indomaret(_) + | VoucherData::Oxxo + | VoucherData::SevenEleven(_) + | VoucherData::Lawson(_) + | VoucherData::MiniStop(_) + | VoucherData::FamilyMart(_) + | VoucherData::Seicomart(_) + | VoucherData::PayEasy(_) => Err(errors::ConnectorError::NotImplemented( + utils::get_unimplemented_payment_method_error_message("Paypal"), + ) + .into()), + } + } +} + +impl TryFrom<&GiftCardData> for PaypalPaymentsRequest { + type Error = error_stack::Report; + fn try_from(value: &GiftCardData) -> Result { + match value { + GiftCardData::Givex(_) | GiftCardData::PaySafeCard {} => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Paypal"), ) @@ -1380,9 +1372,9 @@ pub struct PaypalAuthUpdateRequest { client_id: Secret, client_secret: Secret, } -impl TryFrom<&types::RefreshTokenRouterData> for PaypalAuthUpdateRequest { +impl TryFrom<&RefreshTokenRouterData> for PaypalAuthUpdateRequest { type Error = error_stack::Report; - fn try_from(item: &types::RefreshTokenRouterData) -> Result { + fn try_from(item: &RefreshTokenRouterData) -> Result { Ok(Self { grant_type: "client_credentials".to_string(), client_id: item.get_request_id()?, @@ -1398,15 +1390,15 @@ pub struct PaypalAuthUpdateResponse { 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, }), @@ -1525,22 +1517,25 @@ pub enum PaypalOrderStatus { Approved, } -impl ForeignFrom<(PaypalOrderStatus, PaypalPaymentIntent)> for storage_enums::AttemptStatus { - fn foreign_from(item: (PaypalOrderStatus, PaypalPaymentIntent)) -> Self { - match item.0 { - PaypalOrderStatus::Completed => { - if item.1 == PaypalPaymentIntent::Authorize { - Self::Authorized - } else { - Self::Charged - } +pub(crate) fn get_order_status( + item: PaypalOrderStatus, + intent: PaypalPaymentIntent, +) -> storage_enums::AttemptStatus { + match item { + PaypalOrderStatus::Completed => { + if intent == PaypalPaymentIntent::Authorize { + storage_enums::AttemptStatus::Authorized + } else { + storage_enums::AttemptStatus::Charged } - PaypalOrderStatus::Voided => Self::Voided, - PaypalOrderStatus::Created | PaypalOrderStatus::Saved | PaypalOrderStatus::Pending => { - Self::Pending - } - PaypalOrderStatus::Approved => Self::AuthenticationSuccessful, - PaypalOrderStatus::PayerActionRequired => Self::AuthenticationPending, + } + PaypalOrderStatus::Voided => storage_enums::AttemptStatus::Voided, + PaypalOrderStatus::Created | PaypalOrderStatus::Saved | PaypalOrderStatus::Pending => { + storage_enums::AttemptStatus::Pending + } + PaypalOrderStatus::Approved => storage_enums::AttemptStatus::AuthenticationSuccessful, + PaypalOrderStatus::PayerActionRequired => { + storage_enums::AttemptStatus::AuthenticationPending } } } @@ -1769,13 +1764,12 @@ fn get_id_based_on_intent( .ok_or_else(|| errors::ConnectorError::MissingConnectorTransactionID.into()) } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let purchase_units = item .response @@ -1793,7 +1787,7 @@ impl next_action: None, order_id: None, }), - types::ResponseId::ConnectorTransactionId(item.response.id.clone()), + ResponseId::ConnectorTransactionId(item.response.id.clone()), ), PaypalPaymentIntent::Authorize => ( @@ -1804,7 +1798,7 @@ impl next_action: None, order_id: None, }), - types::ResponseId::ConnectorTransactionId(item.response.id.clone()), + ResponseId::ConnectorTransactionId(item.response.id.clone()), ), PaypalPaymentIntent::Authenticate => { @@ -1833,7 +1827,7 @@ impl let status = storage_enums::AttemptStatus::from(status); Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { + response: Ok(PaymentsResponseData::TransactionResponse { resource_id: order_id, redirection_data: Box::new(None), mandate_reference: Box::new(Some(MandateReference { @@ -1882,37 +1876,27 @@ fn get_redirect_url( impl ForeignTryFrom<( - types::ResponseRouterData< - F, - PaypalSyncResponse, - types::PaymentsSyncData, - types::PaymentsResponseData, - >, + ResponseRouterData, Option, - )> for types::RouterData + )> for RouterData { type Error = error_stack::Report; fn foreign_try_from( (item, payment_experience): ( - types::ResponseRouterData< - F, - PaypalSyncResponse, - types::PaymentsSyncData, - types::PaymentsResponseData, - >, + ResponseRouterData, Option, ), ) -> Result { match item.response { PaypalSyncResponse::PaypalOrdersSyncResponse(response) => { - Self::try_from(types::ResponseRouterData { + Self::try_from(ResponseRouterData { response, data: item.data, http_code: item.http_code, }) } PaypalSyncResponse::PaypalRedirectSyncResponse(response) => Self::foreign_try_from(( - types::ResponseRouterData { + ResponseRouterData { response, data: item.data, http_code: item.http_code, @@ -1920,14 +1904,14 @@ impl payment_experience, )), PaypalSyncResponse::PaypalPaymentsSyncResponse(response) => { - Self::try_from(types::ResponseRouterData { + Self::try_from(ResponseRouterData { response, data: item.data, http_code: item.http_code, }) } PaypalSyncResponse::PaypalThreeDsSyncResponse(response) => { - Self::try_from(types::ResponseRouterData { + Self::try_from(ResponseRouterData { response, data: item.data, http_code: item.http_code, @@ -1939,21 +1923,18 @@ impl impl ForeignTryFrom<( - types::ResponseRouterData, + ResponseRouterData, Option, - )> for types::RouterData + )> for RouterData { type Error = error_stack::Report; fn foreign_try_from( (item, payment_experience): ( - types::ResponseRouterData, + ResponseRouterData, Option, ), ) -> Result { - let status = storage_enums::AttemptStatus::foreign_from(( - item.response.clone().status, - item.response.intent.clone(), - )); + let status = get_order_status(item.response.clone().status, item.response.intent.clone()); let link = get_redirect_url(item.response.links.clone())?; // For Paypal SDK flow, we need to trigger SDK client and then complete authorize @@ -1973,11 +1954,11 @@ impl let purchase_units = item.response.purchase_units.first(); Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.id.clone()), - redirection_data: Box::new(Some(services::RedirectForm::from(( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id.clone()), + redirection_data: Box::new(Some(RedirectForm::from(( link.ok_or(errors::ConnectorError::ResponseDeserializationFailed)?, - services::Method::Get, + Method::Get, )))), mandate_reference: Box::new(None), connector_metadata: Some(connector_meta), @@ -1995,27 +1976,24 @@ impl impl TryFrom< - types::ResponseRouterData< - api::Authorize, + ResponseRouterData< + Authorize, PaypalRedirectResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, - > for types::PaymentsAuthorizeRouterData + > for PaymentsAuthorizeRouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - api::Authorize, + item: ResponseRouterData< + Authorize, PaypalRedirectResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, ) -> Result { - let status = storage_enums::AttemptStatus::foreign_from(( - item.response.clone().status, - item.response.intent.clone(), - )); + let status = get_order_status(item.response.clone().status, item.response.intent.clone()); let link = get_redirect_url(item.response.links.clone())?; let connector_meta = serde_json::json!(PaypalMeta { @@ -2028,11 +2006,11 @@ impl let purchase_units = item.response.purchase_units.first(); Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.id.clone()), - redirection_data: Box::new(Some(services::RedirectForm::from(( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id.clone()), + redirection_data: Box::new(Some(RedirectForm::from(( link.ok_or(errors::ConnectorError::ResponseDeserializationFailed)?, - services::Method::Get, + Method::Get, )))), mandate_reference: Box::new(None), connector_metadata: Some(connector_meta), @@ -2050,28 +2028,25 @@ impl impl TryFrom< - types::ResponseRouterData< - api::PostSessionTokens, + ResponseRouterData< + PostSessionTokens, PaypalRedirectResponse, - types::PaymentsPostSessionTokensData, - types::PaymentsResponseData, + PaymentsPostSessionTokensData, + PaymentsResponseData, >, - > for types::PaymentsPostSessionTokensRouterData + > for PaymentsPostSessionTokensRouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - api::PostSessionTokens, + item: ResponseRouterData< + PostSessionTokens, PaypalRedirectResponse, - types::PaymentsPostSessionTokensData, - types::PaymentsResponseData, + PaymentsPostSessionTokensData, + PaymentsResponseData, >, ) -> Result { - let status = storage_enums::AttemptStatus::foreign_from(( - item.response.clone().status, - item.response.intent.clone(), - )); + let status = get_order_status(item.response.clone().status, item.response.intent.clone()); // For Paypal SDK flow, we need to trigger SDK client and then Confirm let next_action = Some(api_models::payments::NextActionCall::Confirm); @@ -2086,8 +2061,8 @@ impl Ok(Self { 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: Some(connector_meta), @@ -2103,29 +2078,24 @@ impl impl TryFrom< - types::ResponseRouterData< - F, - PaypalThreeDsSyncResponse, - types::PaymentsSyncData, - types::PaymentsResponseData, - >, - > for types::RouterData + ResponseRouterData, + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, PaypalThreeDsSyncResponse, - types::PaymentsSyncData, - types::PaymentsResponseData, + PaymentsSyncData, + PaymentsResponseData, >, ) -> Result { Ok(Self { // status is hardcoded because this try_from will only be reached in card 3ds before the completion of complete authorize flow. // also force sync won't be hit in terminal status thus leaving us with only one status to get here. status: storage_enums::AttemptStatus::AuthenticationPending, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.id), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id), redirection_data: Box::new(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -2141,21 +2111,16 @@ impl impl TryFrom< - types::ResponseRouterData< - F, - PaypalThreeDsResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, - >, - > for types::RouterData + ResponseRouterData, + > for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< + item: ResponseRouterData< F, PaypalThreeDsResponse, - types::PaymentsAuthorizeData, - types::PaymentsResponseData, + PaymentsAuthorizeData, + PaymentsResponseData, >, ) -> Result { let connector_meta = serde_json::json!(PaypalMeta { @@ -2166,16 +2131,16 @@ impl order_id: None, }); - let status = storage_enums::AttemptStatus::foreign_from(( + let status = get_order_status( item.response.clone().status, PaypalPaymentIntent::Authenticate, - )); + ); let link = get_redirect_url(item.response.links.clone())?; Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId(item.response.id), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(item.response.id), redirection_data: Box::new(Some(paypal_threeds_link(( link, item.data.request.complete_authorize_url.clone(), @@ -2194,7 +2159,7 @@ impl fn paypal_threeds_link( (redirect_url, complete_auth_url): (Option, Option), -) -> CustomResult { +) -> CustomResult { let mut redirect_url = redirect_url.ok_or(errors::ConnectorError::ResponseDeserializationFailed)?; let complete_auth_url = @@ -2213,31 +2178,24 @@ fn paypal_threeds_link( // Do not include query params in the endpoint redirect_url.set_query(None); - Ok(services::RedirectForm::Form { + Ok(RedirectForm::Form { endpoint: redirect_url.to_string(), - method: services::Method::Get, + method: Method::Get, form_fields, }) } -impl - TryFrom< - types::ResponseRouterData, - > for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - PaypalPaymentsSyncResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { Ok(Self { status: storage_enums::AttemptStatus::from(item.response.status), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( item.response .supplementary_data .related_ids @@ -2325,12 +2283,10 @@ pub struct PayoutAmount { } #[cfg(feature = "payouts")] -impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> - for PaypalFulfillRequest -{ +impl TryFrom<&PaypalRouterData<&PayoutsRouterData>> for PaypalFulfillRequest { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PayoutsRouterData>, + item: &PaypalRouterData<&PayoutsRouterData>, ) -> Result { let item_data = PaypalPayoutItem::try_from(item)?; Ok(Self { @@ -2343,10 +2299,10 @@ impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> } #[cfg(feature = "payouts")] -impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> for PaypalPayoutItem { +impl TryFrom<&PaypalRouterData<&PayoutsRouterData>> for PaypalPayoutItem { type Error = error_stack::Report; fn try_from( - item: &PaypalRouterData<&types::PayoutsRouterData>, + item: &PaypalRouterData<&PayoutsRouterData>, ) -> Result { let amount = PayoutAmount { value: item.amount.clone(), @@ -2354,8 +2310,8 @@ impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> for P }; let payout_method_data = match item.router_data.get_payout_method_data()? { - api::PayoutMethodData::Wallet(wallet_data) => match wallet_data { - api::WalletPayout::Paypal(data) => { + PayoutMethodData::Wallet(wallet_data) => match wallet_data { + WalletPayout::Paypal(data) => { let (recipient_type, receiver) = match (data.email, data.telephone_number, data.paypal_id) { (Some(email), _, _) => ( @@ -2381,7 +2337,7 @@ impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> for P receiver, } } - api::WalletPayout::Venmo(data) => { + WalletPayout::Venmo(data) => { let receiver = PaypalPayoutDataType::OtherType(data.telephone_number.ok_or( errors::ConnectorError::MissingRequiredField { field_name: "telephone_number", @@ -2404,7 +2360,7 @@ impl TryFrom<&PaypalRouterData<&types::PayoutsRouterData>> for P amount, payout_method_data, note: item.router_data.description.to_owned(), - notification_language: consts::DEFAULT_NOTIFICATION_SCRIPT_LANGUAGE.to_string(), + notification_language: constants::DEFAULT_NOTIFICATION_SCRIPT_LANGUAGE.to_string(), }) } } @@ -2434,30 +2390,26 @@ pub enum PaypalFulfillStatus { } #[cfg(feature = "payouts")] -impl ForeignFrom for storage_enums::PayoutStatus { - fn foreign_from(status: PaypalFulfillStatus) -> Self { - match status { - PaypalFulfillStatus::Success => Self::Success, - PaypalFulfillStatus::Denied => Self::Failed, - PaypalFulfillStatus::Cancelled => Self::Cancelled, - PaypalFulfillStatus::Pending | PaypalFulfillStatus::Processing => Self::Pending, +pub(crate) fn get_payout_status(status: PaypalFulfillStatus) -> storage_enums::PayoutStatus { + match status { + PaypalFulfillStatus::Success => storage_enums::PayoutStatus::Success, + PaypalFulfillStatus::Denied => storage_enums::PayoutStatus::Failed, + PaypalFulfillStatus::Cancelled => storage_enums::PayoutStatus::Cancelled, + PaypalFulfillStatus::Pending | PaypalFulfillStatus::Processing => { + storage_enums::PayoutStatus::Pending } } } #[cfg(feature = "payouts")] -impl TryFrom> - for types::PayoutsRouterData -{ +impl TryFrom> for PayoutsRouterData { type Error = error_stack::Report; fn try_from( - item: types::PayoutsResponseRouterData, + item: PayoutsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::PayoutsResponseData { - status: Some(storage_enums::PayoutStatus::foreign_from( - item.response.batch_header.batch_status, - )), + response: Ok(PayoutsResponseData { + status: Some(get_payout_status(item.response.batch_header.batch_status)), connector_payout_id: Some(item.response.batch_header.payout_batch_id), payout_eligible: None, should_add_next_step_to_process_tracker: false, @@ -2475,13 +2427,9 @@ pub struct PaypalPaymentsCaptureRequest { final_capture: bool, } -impl TryFrom<&PaypalRouterData<&types::PaymentsCaptureRouterData>> - for PaypalPaymentsCaptureRequest -{ +impl TryFrom<&PaypalRouterData<&PaymentsCaptureRouterData>> for PaypalPaymentsCaptureRequest { type Error = error_stack::Report; - fn try_from( - item: &PaypalRouterData<&types::PaymentsCaptureRouterData>, - ) -> Result { + fn try_from(item: &PaypalRouterData<&PaymentsCaptureRouterData>) -> Result { let amount = OrderAmount { currency_code: item.router_data.request.currency, value: item.amount.clone(), @@ -2536,12 +2484,12 @@ impl From for storage_enums::AttemptStatus { } } -impl TryFrom> - for types::PaymentsCaptureRouterData +impl TryFrom> + for PaymentsCaptureRouterData { type Error = error_stack::Report; fn try_from( - item: types::PaymentsCaptureResponseRouterData, + item: PaymentsCaptureResponseRouterData, ) -> Result { let status = storage_enums::AttemptStatus::from(item.response.status); let amount_captured = match status { @@ -2576,8 +2524,8 @@ impl TryFrom> to_connector_meta(item.data.request.connector_meta.clone())?; Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( item.data.request.connector_transaction_id.clone(), ), redirection_data: Box::new(None), @@ -2617,27 +2565,20 @@ pub struct PaypalPaymentsCancelResponse { invoice_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, - PaypalPaymentsCancelResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let status = match item.response.status { PaypalCancelStatus::Voided => storage_enums::AttemptStatus::Voided, }; Ok(Self { status, - 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(None), mandate_reference: Box::new(None), connector_metadata: None, @@ -2659,11 +2600,9 @@ pub struct PaypalRefundRequest { pub amount: OrderAmount, } -impl TryFrom<&PaypalRouterData<&types::RefundsRouterData>> for PaypalRefundRequest { +impl TryFrom<&PaypalRouterData<&RefundsRouterData>> for PaypalRefundRequest { type Error = error_stack::Report; - fn try_from( - item: &PaypalRouterData<&types::RefundsRouterData>, - ) -> Result { + fn try_from(item: &PaypalRouterData<&RefundsRouterData>) -> Result { Ok(Self { amount: OrderAmount { currency_code: item.router_data.request.currency, @@ -2700,15 +2639,13 @@ pub struct RefundResponse { amount: Option, } -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: storage_enums::RefundStatus::from(item.response.status), }), @@ -2723,15 +2660,13 @@ pub struct RefundSyncResponse { status: RefundStatus, } -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: storage_enums::RefundStatus::from(item.response.status), }), @@ -2930,34 +2865,41 @@ pub struct PaypalWebooksEventType { pub event_type: PaypalWebhookEventType, } -impl ForeignFrom<(PaypalWebhookEventType, Option)> for api::IncomingWebhookEvent { - fn foreign_from((event, outcome): (PaypalWebhookEventType, Option)) -> Self { - match event { - PaypalWebhookEventType::PaymentCaptureCompleted - | PaypalWebhookEventType::CheckoutOrderCompleted => Self::PaymentIntentSuccess, - PaypalWebhookEventType::PaymentCapturePending - | PaypalWebhookEventType::CheckoutOrderProcessed => Self::PaymentIntentProcessing, - PaypalWebhookEventType::PaymentCaptureDeclined => Self::PaymentIntentFailure, - PaypalWebhookEventType::PaymentCaptureRefunded => Self::RefundSuccess, - PaypalWebhookEventType::CustomerDisputeCreated => Self::DisputeOpened, - PaypalWebhookEventType::RiskDisputeCreated => Self::DisputeAccepted, - PaypalWebhookEventType::CustomerDisputeResolved => { - if let Some(outcome_code) = outcome { - Self::from(outcome_code) - } else { - Self::EventNotSupported - } - } - PaypalWebhookEventType::PaymentAuthorizationCreated - | PaypalWebhookEventType::PaymentAuthorizationVoided - | PaypalWebhookEventType::CheckoutOrderApproved - | PaypalWebhookEventType::CustomerDisputedUpdated - | PaypalWebhookEventType::Unknown => Self::EventNotSupported, +pub(crate) fn get_payapl_webhooks_event( + event: PaypalWebhookEventType, + outcome: Option, +) -> IncomingWebhookEvent { + match event { + PaypalWebhookEventType::PaymentCaptureCompleted + | PaypalWebhookEventType::CheckoutOrderCompleted => { + IncomingWebhookEvent::PaymentIntentSuccess } + PaypalWebhookEventType::PaymentCapturePending + | PaypalWebhookEventType::CheckoutOrderProcessed => { + IncomingWebhookEvent::PaymentIntentProcessing + } + PaypalWebhookEventType::PaymentCaptureDeclined => { + IncomingWebhookEvent::PaymentIntentFailure + } + PaypalWebhookEventType::PaymentCaptureRefunded => IncomingWebhookEvent::RefundSuccess, + PaypalWebhookEventType::CustomerDisputeCreated => IncomingWebhookEvent::DisputeOpened, + PaypalWebhookEventType::RiskDisputeCreated => IncomingWebhookEvent::DisputeAccepted, + PaypalWebhookEventType::CustomerDisputeResolved => { + if let Some(outcome_code) = outcome { + IncomingWebhookEvent::from(outcome_code) + } else { + IncomingWebhookEvent::EventNotSupported + } + } + PaypalWebhookEventType::PaymentAuthorizationCreated + | PaypalWebhookEventType::PaymentAuthorizationVoided + | PaypalWebhookEventType::CheckoutOrderApproved + | PaypalWebhookEventType::CustomerDisputedUpdated + | PaypalWebhookEventType::Unknown => IncomingWebhookEvent::EventNotSupported, } } -impl From for api::IncomingWebhookEvent { +impl From for IncomingWebhookEvent { fn from(outcome_code: OutcomeCode) -> Self { match outcome_code { OutcomeCode::ResolvedBuyerFavour => Self::DisputeLost, @@ -3007,35 +2949,33 @@ pub enum PaypalSourceVerificationStatus { impl TryFrom< - types::ResponseRouterData< - api::VerifyWebhookSource, + ResponseRouterData< + VerifyWebhookSource, PaypalSourceVerificationResponse, - types::VerifyWebhookSourceRequestData, + VerifyWebhookSourceRequestData, VerifyWebhookSourceResponseData, >, - > for types::VerifyWebhookSourceRouterData + > for VerifyWebhookSourceRouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - api::VerifyWebhookSource, + item: ResponseRouterData< + VerifyWebhookSource, PaypalSourceVerificationResponse, - types::VerifyWebhookSourceRequestData, + VerifyWebhookSourceRequestData, VerifyWebhookSourceResponseData, >, ) -> Result { Ok(Self { response: Ok(VerifyWebhookSourceResponseData { - verify_webhook_status: types::VerifyWebhookStatus::from( - item.response.verification_status, - ), + verify_webhook_status: VerifyWebhookStatus::from(item.response.verification_status), }), ..item.data }) } } -impl From for types::VerifyWebhookStatus { +impl From for VerifyWebhookStatus { fn from(item: PaypalSourceVerificationStatus) -> Self { match item { PaypalSourceVerificationStatus::Success => Self::SourceVerified, @@ -3159,9 +3099,9 @@ impl TryFrom for PaypalOrderStatus { } } -impl TryFrom<&types::VerifyWebhookSourceRequestData> for PaypalSourceVerificationRequest { +impl TryFrom<&VerifyWebhookSourceRequestData> for PaypalSourceVerificationRequest { type Error = error_stack::Report; - fn try_from(req: &types::VerifyWebhookSourceRequestData) -> Result { + fn try_from(req: &VerifyWebhookSourceRequestData) -> Result { let req_body = serde_json::from_slice(&req.webhook_body) .change_context(errors::ConnectorError::WebhookBodyDecodingFailed)?; Ok(Self { diff --git a/crates/hyperswitch_connectors/src/constants.rs b/crates/hyperswitch_connectors/src/constants.rs index 51767bf327..8d8c10a4e9 100644 --- a/crates/hyperswitch_connectors/src/constants.rs +++ b/crates/hyperswitch_connectors/src/constants.rs @@ -47,3 +47,9 @@ pub const LOW_BALANCE_ERROR_MESSAGE: &str = "Insufficient balance in the payment pub const DUIT_NOW_BRAND_COLOR: &str = "#ED2E67"; pub const DUIT_NOW_BRAND_TEXT: &str = "MALAYSIA NATIONAL QR"; + +pub(crate) const CANNOT_CONTINUE_AUTH: &str = + "Cannot continue with Authorization due to failed Liability Shift."; + +#[cfg(feature = "payouts")] +pub(crate) const DEFAULT_NOTIFICATION_SCRIPT_LANGUAGE: &str = "en-US"; diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index aef839b436..4b47db0f94 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -107,6 +107,7 @@ macro_rules! default_imp_for_authorize_session_token { default_imp_for_authorize_session_token!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -156,6 +157,7 @@ default_imp_for_authorize_session_token!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -203,6 +205,7 @@ macro_rules! default_imp_for_calculate_tax { default_imp_for_calculate_tax!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -257,6 +260,7 @@ default_imp_for_calculate_tax!( connectors::Nuvei, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -300,6 +304,7 @@ macro_rules! default_imp_for_session_update { default_imp_for_session_update!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -398,6 +403,7 @@ macro_rules! default_imp_for_post_session_tokens { default_imp_for_post_session_tokens!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -498,6 +504,7 @@ macro_rules! default_imp_for_complete_authorize { default_imp_for_complete_authorize!( connectors::Aci, + connectors::Adyen, connectors::Amazonpay, connectors::Bamboraapac, connectors::Bankofamerica, @@ -579,6 +586,7 @@ macro_rules! default_imp_for_incremental_authorization { default_imp_for_incremental_authorization!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -628,6 +636,7 @@ default_imp_for_incremental_authorization!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -676,6 +685,7 @@ macro_rules! default_imp_for_create_customer { default_imp_for_create_customer!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -729,6 +739,7 @@ default_imp_for_create_customer!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -775,6 +786,7 @@ macro_rules! default_imp_for_connector_redirect_response { default_imp_for_connector_redirect_response!( connectors::Aci, + connectors::Adyen, connectors::Amazonpay, connectors::Billwerk, connectors::Bitpay, @@ -945,6 +957,7 @@ macro_rules! default_imp_for_post_processing_steps{ default_imp_for_post_processing_steps!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -995,6 +1008,7 @@ default_imp_for_post_processing_steps!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1044,6 +1058,7 @@ macro_rules! default_imp_for_approve { default_imp_for_approve!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1094,6 +1109,7 @@ default_imp_for_approve!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1143,6 +1159,7 @@ macro_rules! default_imp_for_reject { default_imp_for_reject!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1193,6 +1210,7 @@ default_imp_for_reject!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1242,6 +1260,7 @@ macro_rules! default_imp_for_webhook_source_verification { default_imp_for_webhook_source_verification!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1391,6 +1410,7 @@ default_imp_for_accept_dispute!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1489,6 +1509,7 @@ default_imp_for_submit_evidence!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1587,6 +1608,7 @@ default_imp_for_defend_dispute!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1694,6 +1716,7 @@ default_imp_for_file_upload!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1934,6 +1957,7 @@ macro_rules! default_imp_for_payouts_retrieve { #[cfg(feature = "payouts")] default_imp_for_payouts_retrieve!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2083,6 +2107,7 @@ default_imp_for_payouts_eligibility!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2282,6 +2307,7 @@ default_imp_for_payouts_cancel!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2333,6 +2359,7 @@ macro_rules! default_imp_for_payouts_quote { #[cfg(feature = "payouts")] default_imp_for_payouts_quote!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2382,6 +2409,7 @@ default_imp_for_payouts_quote!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2433,6 +2461,7 @@ macro_rules! default_imp_for_payouts_recipient { #[cfg(feature = "payouts")] default_imp_for_payouts_recipient!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2482,6 +2511,7 @@ default_imp_for_payouts_recipient!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2533,6 +2563,7 @@ macro_rules! default_imp_for_payouts_recipient_account { #[cfg(feature = "payouts")] default_imp_for_payouts_recipient_account!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2582,6 +2613,7 @@ default_imp_for_payouts_recipient_account!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2633,6 +2665,7 @@ macro_rules! default_imp_for_frm_sale { #[cfg(feature = "frm")] default_imp_for_frm_sale!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2683,6 +2716,7 @@ default_imp_for_frm_sale!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2734,6 +2768,7 @@ macro_rules! default_imp_for_frm_checkout { #[cfg(feature = "frm")] default_imp_for_frm_checkout!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2784,6 +2819,7 @@ default_imp_for_frm_checkout!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2835,6 +2871,7 @@ macro_rules! default_imp_for_frm_transaction { #[cfg(feature = "frm")] default_imp_for_frm_transaction!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2885,6 +2922,7 @@ default_imp_for_frm_transaction!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2936,6 +2974,7 @@ macro_rules! default_imp_for_frm_fulfillment { #[cfg(feature = "frm")] default_imp_for_frm_fulfillment!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2986,6 +3025,7 @@ default_imp_for_frm_fulfillment!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -3037,6 +3077,7 @@ macro_rules! default_imp_for_frm_record_return { #[cfg(feature = "frm")] default_imp_for_frm_record_return!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3087,6 +3128,7 @@ default_imp_for_frm_record_return!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -3135,6 +3177,7 @@ macro_rules! default_imp_for_revoking_mandates { default_imp_for_revoking_mandates!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3183,6 +3226,7 @@ default_imp_for_revoking_mandates!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -3231,6 +3275,7 @@ macro_rules! default_imp_for_uas_pre_authentication { default_imp_for_uas_pre_authentication!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3280,6 +3325,7 @@ default_imp_for_uas_pre_authentication!( connectors::Nuvei, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Powertranz, @@ -3327,6 +3373,7 @@ macro_rules! default_imp_for_uas_post_authentication { default_imp_for_uas_post_authentication!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3376,6 +3423,7 @@ default_imp_for_uas_post_authentication!( connectors::Nuvei, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Powertranz, @@ -3423,6 +3471,7 @@ macro_rules! default_imp_for_uas_authentication { default_imp_for_uas_authentication!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3481,6 +3530,7 @@ default_imp_for_uas_authentication!( connectors::Moneris, connectors::Multisafepay, connectors::Paybox, + connectors::Paypal, connectors::Placetopay, connectors::Rapyd, connectors::Razorpay, @@ -3520,6 +3570,7 @@ macro_rules! default_imp_for_uas_authentication_confirmation { default_imp_for_uas_authentication_confirmation!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3578,6 +3629,7 @@ default_imp_for_uas_authentication_confirmation!( connectors::Multisafepay, connectors::Paybox, connectors::Payme, + connectors::Paypal, connectors::Placetopay, connectors::Rapyd, connectors::Razorpay, @@ -3616,6 +3668,7 @@ macro_rules! default_imp_for_revenue_recovery_record_back { default_imp_for_revenue_recovery_record_back!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3667,6 +3720,7 @@ default_imp_for_revenue_recovery_record_back!( connectors::Payeezy, connectors::Paystack, connectors::Payu, + connectors::Paypal, connectors::Powertranz, connectors::Prophetpay, connectors::Mifinity, @@ -3716,6 +3770,7 @@ macro_rules! default_imp_for_additional_revenue_recovery_call { default_imp_for_additional_revenue_recovery_call!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -3767,6 +3822,7 @@ default_imp_for_additional_revenue_recovery_call!( connectors::Payeezy, connectors::Paystack, connectors::Payu, + connectors::Paypal, connectors::Powertranz, connectors::Prophetpay, connectors::Mifinity, diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs index de2d3a8735..a3a196afa7 100644 --- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs +++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs @@ -256,6 +256,7 @@ default_imp_for_new_connector_integration_payment!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -305,6 +306,7 @@ macro_rules! default_imp_for_new_connector_integration_refund { default_imp_for_new_connector_integration_refund!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -356,6 +358,7 @@ default_imp_for_new_connector_integration_refund!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -400,6 +403,7 @@ macro_rules! default_imp_for_new_connector_integration_connector_access_token { default_imp_for_new_connector_integration_connector_access_token!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -451,6 +455,7 @@ default_imp_for_new_connector_integration_connector_access_token!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -501,6 +506,7 @@ macro_rules! default_imp_for_new_connector_integration_accept_dispute { default_imp_for_new_connector_integration_accept_dispute!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -551,6 +557,7 @@ default_imp_for_new_connector_integration_accept_dispute!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -600,6 +607,7 @@ macro_rules! default_imp_for_new_connector_integration_submit_evidence { default_imp_for_new_connector_integration_submit_evidence!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -650,6 +658,7 @@ default_imp_for_new_connector_integration_submit_evidence!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -699,6 +708,7 @@ macro_rules! default_imp_for_new_connector_integration_defend_dispute { default_imp_for_new_connector_integration_defend_dispute!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -750,6 +760,7 @@ default_imp_for_new_connector_integration_defend_dispute!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -809,6 +820,7 @@ macro_rules! default_imp_for_new_connector_integration_file_upload { default_imp_for_new_connector_integration_file_upload!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -860,6 +872,7 @@ default_imp_for_new_connector_integration_file_upload!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -911,6 +924,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -962,6 +976,7 @@ default_imp_for_new_connector_integration_payouts_create!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1013,6 +1028,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1064,6 +1080,7 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1115,6 +1132,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1166,6 +1184,7 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1217,6 +1236,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1268,6 +1288,7 @@ default_imp_for_new_connector_integration_payouts_cancel!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1319,6 +1340,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1370,6 +1392,7 @@ default_imp_for_new_connector_integration_payouts_quote!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1421,6 +1444,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1472,6 +1496,7 @@ default_imp_for_new_connector_integration_payouts_recipient!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1523,6 +1548,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1574,6 +1600,7 @@ default_imp_for_new_connector_integration_payouts_sync!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1625,6 +1652,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1676,6 +1704,7 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1725,6 +1754,7 @@ macro_rules! default_imp_for_new_connector_integration_webhook_source_verificati default_imp_for_new_connector_integration_webhook_source_verification!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1776,6 +1806,7 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1827,6 +1858,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1878,6 +1910,7 @@ default_imp_for_new_connector_integration_frm_sale!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -1929,6 +1962,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -1980,6 +2014,7 @@ default_imp_for_new_connector_integration_frm_checkout!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2031,6 +2066,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2082,6 +2118,7 @@ default_imp_for_new_connector_integration_frm_transaction!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2133,6 +2170,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2184,6 +2222,7 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2235,6 +2274,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::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, @@ -2286,6 +2326,7 @@ default_imp_for_new_connector_integration_frm_record_return!( connectors::Paybox, connectors::Payeezy, connectors::Payme, + connectors::Paypal, connectors::Paystack, connectors::Payu, connectors::Placetopay, @@ -2334,6 +2375,7 @@ macro_rules! default_imp_for_new_connector_integration_revoking_mandates { default_imp_for_new_connector_integration_revoking_mandates!( connectors::Aci, + connectors::Adyen, connectors::Airwallex, connectors::Amazonpay, connectors::Authorizedotnet, diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs index 7f9fb65b0f..b082962e40 100644 --- a/crates/hyperswitch_connectors/src/utils.rs +++ b/crates/hyperswitch_connectors/src/utils.rs @@ -45,8 +45,9 @@ use hyperswitch_domain_models::{ router_request_types::{ AuthenticationData, BrowserInformation, CompleteAuthorizeData, ConnectorCustomerData, MandateRevokeRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, - PaymentsCancelData, PaymentsCaptureData, PaymentsPreProcessingData, PaymentsSyncData, - RefundsData, ResponseId, SetupMandateRequestData, + PaymentsCancelData, PaymentsCaptureData, PaymentsPostSessionTokensData, + PaymentsPreProcessingData, PaymentsSyncData, RefundsData, ResponseId, + SetupMandateRequestData, }, router_response_types::CaptureSyncResponse, types::OrderDetailsWithAmount, @@ -288,6 +289,11 @@ where json.parse_value(std::any::type_name::()).switch() } +pub(crate) fn is_manual_capture(capture_method: Option) -> bool { + capture_method == Some(enums::CaptureMethod::Manual) + || capture_method == Some(enums::CaptureMethod::ManualMultiple) +} + pub(crate) fn generate_random_bytes(length: usize) -> Vec { // returns random bytes of length n let mut rng = rand::thread_rng(); @@ -1270,6 +1276,7 @@ pub trait AddressDetailsData { fn get_optional_line2(&self) -> Option>; fn get_optional_first_name(&self) -> Option>; fn get_optional_last_name(&self) -> Option>; + fn get_optional_country(&self) -> Option; } impl AddressDetailsData for AddressDetails { @@ -1491,6 +1498,10 @@ impl AddressDetailsData for AddressDetails { fn get_optional_last_name(&self) -> Option> { self.last_name.clone() } + + fn get_optional_country(&self) -> Option { + self.country + } } pub trait AdditionalCardInfo { @@ -1891,6 +1902,22 @@ impl PaymentsSyncRequestData for PaymentsSyncData { } } +pub trait PaymentsPostSessionTokensRequestData { + fn is_auto_capture(&self) -> Result; +} + +impl PaymentsPostSessionTokensRequestData for PaymentsPostSessionTokensData { + fn is_auto_capture(&self) -> Result { + match self.capture_method { + Some(enums::CaptureMethod::Automatic) + | None + | Some(enums::CaptureMethod::SequentialAutomatic) => Ok(true), + Some(enums::CaptureMethod::Manual) => Ok(false), + Some(_) => Err(errors::ConnectorError::CaptureMethodNotSupported.into()), + } + } +} + pub trait PaymentsCancelRequestData { fn get_optional_language_from_browser_info(&self) -> Option; fn get_amount(&self) -> Result; @@ -2339,6 +2366,24 @@ impl CryptoData for payment_method_data::CryptoData { } } +#[macro_export] +macro_rules! capture_method_not_supported { + ($connector:expr, $capture_method:expr) => { + Err(errors::ConnectorError::NotSupported { + message: format!("{} for selected payment method", $capture_method), + connector: $connector, + } + .into()) + }; + ($connector:expr, $capture_method:expr, $payment_method_type:expr) => { + Err(errors::ConnectorError::NotSupported { + message: format!("{} for {}", $capture_method, $payment_method_type), + connector: $connector, + } + .into()) + }; +} + #[macro_export] macro_rules! unimplemented_payment_method { ($payment_method:expr, $connector:expr) => { diff --git a/crates/hyperswitch_domain_models/src/types.rs b/crates/hyperswitch_domain_models/src/types.rs index 10a4273b72..b3dde94269 100644 --- a/crates/hyperswitch_domain_models/src/types.rs +++ b/crates/hyperswitch_domain_models/src/types.rs @@ -7,8 +7,8 @@ use crate::{ Authenticate, AuthenticationConfirmation, Authorize, AuthorizeSessionToken, CalculateTax, Capture, CompleteAuthorize, CreateConnectorCustomer, Execute, GetAdditionalRevenueRecoveryDetails, IncrementalAuthorization, PSync, PaymentMethodToken, - PostAuthenticate, PostSessionTokens, PreAuthenticate, PreProcessing, RSync, Session, - SetupMandate, Void, + PostAuthenticate, PostSessionTokens, PreAuthenticate, PreProcessing, RSync, + SdkSessionUpdate, Session, SetupMandate, VerifyWebhookSource, Void, }, router_request_types::{ revenue_recovery::{ @@ -24,14 +24,15 @@ use crate::{ PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsIncrementalAuthorizationData, PaymentsPostSessionTokensData, PaymentsPreProcessingData, PaymentsSessionData, PaymentsSyncData, - PaymentsTaxCalculationData, RefundsData, SetupMandateRequestData, + PaymentsTaxCalculationData, RefundsData, SdkPaymentsSessionUpdateData, + SetupMandateRequestData, VerifyWebhookSourceRequestData, }, router_response_types::{ revenue_recovery::{ GetAdditionalRevenueRecoveryResponseData, RevenueRecoveryRecordBackResponse, }, MandateRevokeResponseData, PaymentsResponseData, RefundsResponseData, - TaxCalculationResponseData, + TaxCalculationResponseData, VerifyWebhookSourceResponseData, }, }; #[cfg(feature = "payouts")] @@ -82,6 +83,14 @@ pub type PaymentsIncrementalAuthorizationRouterData = RouterData< PaymentsIncrementalAuthorizationData, PaymentsResponseData, >; +pub type SdkSessionUpdateRouterData = + RouterData; + +pub type VerifyWebhookSourceRouterData = RouterData< + VerifyWebhookSource, + VerifyWebhookSourceRequestData, + VerifyWebhookSourceResponseData, +>; #[cfg(feature = "payouts")] pub type PayoutsRouterData = RouterData; diff --git a/crates/router/src/connector.rs b/crates/router/src/connector.rs index d37b22eb3d..3d8ca2345c 100644 --- a/crates/router/src/connector.rs +++ b/crates/router/src/connector.rs @@ -1,4 +1,3 @@ -pub mod adyen; pub mod adyenplatform; #[cfg(feature = "dummy_connector")] pub mod dummyconnector; @@ -7,7 +6,6 @@ pub mod gpayments; pub mod netcetera; pub mod nmi; pub mod payone; -pub mod paypal; pub mod plaid; pub mod riskified; pub mod signifyd; @@ -18,25 +16,26 @@ pub mod wellsfargopayout; pub mod wise; pub use hyperswitch_connectors::connectors::{ - aci, aci::Aci, airwallex, airwallex::Airwallex, amazonpay, amazonpay::Amazonpay, - authorizedotnet, authorizedotnet::Authorizedotnet, 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, - checkout, checkout::Checkout, 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, getnet, getnet::Getnet, globalpay, globalpay::Globalpay, - globepay, globepay::Globepay, gocardless, gocardless::Gocardless, helcim, helcim::Helcim, - hipay, hipay::Hipay, iatapay, iatapay::Iatapay, inespay, inespay::Inespay, itaubank, - itaubank::Itaubank, jpmorgan, jpmorgan::Jpmorgan, juspaythreedsserver, - juspaythreedsserver::Juspaythreedsserver, klarna, klarna::Klarna, mifinity, mifinity::Mifinity, - mollie, mollie::Mollie, moneris, moneris::Moneris, multisafepay, multisafepay::Multisafepay, - nexinets, nexinets::Nexinets, nexixpay, nexixpay::Nexixpay, nomupay, nomupay::Nomupay, noon, - noon::Noon, novalnet, novalnet::Novalnet, nuvei, nuvei::Nuvei, opayo, opayo::Opayo, opennode, - opennode::Opennode, paybox, paybox::Paybox, payeezy, payeezy::Payeezy, payme, payme::Payme, + aci, aci::Aci, adyen, adyen::Adyen, airwallex, airwallex::Airwallex, amazonpay, + amazonpay::Amazonpay, authorizedotnet, authorizedotnet::Authorizedotnet, 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, checkout, checkout::Checkout, 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, + getnet, getnet::Getnet, globalpay, globalpay::Globalpay, globepay, globepay::Globepay, + gocardless, gocardless::Gocardless, helcim, helcim::Helcim, hipay, hipay::Hipay, iatapay, + iatapay::Iatapay, inespay, inespay::Inespay, itaubank, itaubank::Itaubank, jpmorgan, + jpmorgan::Jpmorgan, juspaythreedsserver, juspaythreedsserver::Juspaythreedsserver, klarna, + klarna::Klarna, mifinity, mifinity::Mifinity, mollie, mollie::Mollie, moneris, + moneris::Moneris, multisafepay, multisafepay::Multisafepay, nexinets, nexinets::Nexinets, + nexixpay, nexixpay::Nexixpay, nomupay, nomupay::Nomupay, noon, noon::Noon, novalnet, + novalnet::Novalnet, nuvei, nuvei::Nuvei, opayo, opayo::Opayo, opennode, opennode::Opennode, + paybox, paybox::Paybox, payeezy, payeezy::Payeezy, payme, payme::Payme, paypal, paypal::Paypal, paystack, paystack::Paystack, payu, payu::Payu, placetopay, placetopay::Placetopay, powertranz, powertranz::Powertranz, prophetpay, prophetpay::Prophetpay, rapyd, rapyd::Rapyd, razorpay, razorpay::Razorpay, recurly::Recurly, redsys, redsys::Redsys, shift4, shift4::Shift4, square, @@ -50,8 +49,7 @@ pub use hyperswitch_connectors::connectors::{ #[cfg(feature = "dummy_connector")] pub use self::dummyconnector::DummyConnector; pub use self::{ - adyen::Adyen, adyenplatform::Adyenplatform, ebanx::Ebanx, gpayments::Gpayments, - netcetera::Netcetera, nmi::Nmi, payone::Payone, paypal::Paypal, plaid::Plaid, - riskified::Riskified, signifyd::Signifyd, stripe::Stripe, threedsecureio::Threedsecureio, - wellsfargopayout::Wellsfargopayout, wise::Wise, + adyenplatform::Adyenplatform, ebanx::Ebanx, gpayments::Gpayments, netcetera::Netcetera, + nmi::Nmi, payone::Payone, plaid::Plaid, riskified::Riskified, signifyd::Signifyd, + stripe::Stripe, threedsecureio::Threedsecureio, wellsfargopayout::Wellsfargopayout, wise::Wise, }; diff --git a/crates/router/src/consts.rs b/crates/router/src/consts.rs index 57ec34227b..b343ebccee 100644 --- a/crates/router/src/consts.rs +++ b/crates/router/src/consts.rs @@ -41,12 +41,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 CANNOT_CONTINUE_AUTH: &str = - "Cannot continue with Authorization due to failed Liability Shift."; -#[cfg(feature = "payouts")] -pub(crate) const DEFAULT_NOTIFICATION_SCRIPT_LANGUAGE: &str = "en-US"; // General purpose base64 engines 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 88eb4f3885..1346cf1575 100644 --- a/crates/router/src/core/payments/connector_integration_v2_impls.rs +++ b/crates/router/src/core/payments/connector_integration_v2_impls.rs @@ -698,14 +698,12 @@ macro_rules! default_imp_for_new_connector_integration_payment { } default_imp_for_new_connector_integration_payment!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -732,14 +730,12 @@ macro_rules! default_imp_for_new_connector_integration_refund { } default_imp_for_new_connector_integration_refund!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -760,14 +756,12 @@ macro_rules! default_imp_for_new_connector_integration_connector_access_token { } default_imp_for_new_connector_integration_connector_access_token!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -810,14 +804,12 @@ macro_rules! default_imp_for_new_connector_integration_submit_evidence { } default_imp_for_new_connector_integration_accept_dispute!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -842,14 +834,12 @@ macro_rules! default_imp_for_new_connector_integration_defend_dispute { }; } default_imp_for_new_connector_integration_defend_dispute!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -858,14 +848,12 @@ default_imp_for_new_connector_integration_defend_dispute!( connector::Plaid ); default_imp_for_new_connector_integration_submit_evidence!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -901,14 +889,12 @@ macro_rules! default_imp_for_new_connector_integration_file_upload { } default_imp_for_new_connector_integration_file_upload!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1030,14 +1016,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_create { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_create!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1065,14 +1049,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_eligibility { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_eligibility!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1100,14 +1082,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_fulfill { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_fulfill!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1135,14 +1115,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_cancel { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_cancel!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1170,14 +1148,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_quote { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_quote!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1205,14 +1181,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1241,13 +1215,11 @@ macro_rules! default_imp_for_new_connector_integration_payouts_sync { #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_sync!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1275,14 +1247,12 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient_account #[cfg(feature = "payouts")] default_imp_for_new_connector_integration_payouts_recipient_account!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1308,14 +1278,12 @@ macro_rules! default_imp_for_new_connector_integration_webhook_source_verificati } default_imp_for_new_connector_integration_webhook_source_verification!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1438,14 +1406,12 @@ macro_rules! default_imp_for_new_connector_integration_frm_sale { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_sale!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1473,14 +1439,12 @@ macro_rules! default_imp_for_new_connector_integration_frm_checkout { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_checkout!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1508,14 +1472,12 @@ macro_rules! default_imp_for_new_connector_integration_frm_transaction { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_transaction!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1543,14 +1505,12 @@ macro_rules! default_imp_for_new_connector_integration_frm_fulfillment { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_fulfillment!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1578,14 +1538,12 @@ macro_rules! default_imp_for_new_connector_integration_frm_record_return { #[cfg(feature = "frm")] default_imp_for_new_connector_integration_frm_record_return!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1610,14 +1568,12 @@ macro_rules! default_imp_for_new_connector_integration_revoking_mandates { } default_imp_for_new_connector_integration_revoking_mandates!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -1806,13 +1762,11 @@ macro_rules! default_imp_for_new_connector_integration_uas { default_imp_for_new_connector_integration_uas!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, diff --git a/crates/router/src/core/payments/flows.rs b/crates/router/src/core/payments/flows.rs index 0d056d2ac4..5f72756231 100644 --- a/crates/router/src/core/payments/flows.rs +++ b/crates/router/src/core/payments/flows.rs @@ -217,7 +217,6 @@ impl default_imp_for_complete_authorize!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, @@ -258,7 +257,6 @@ impl } default_imp_for_webhook_source_verification!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, @@ -302,13 +300,11 @@ impl default_imp_for_create_customer!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -348,7 +344,6 @@ impl services::ConnectorRedirectResponse for connector::DummyConnec default_imp_for_connector_redirect_response!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, @@ -505,7 +500,6 @@ default_imp_for_accept_dispute!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -571,7 +565,6 @@ default_imp_for_file_upload!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -614,7 +607,6 @@ default_imp_for_submit_evidence!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -657,7 +649,6 @@ default_imp_for_defend_dispute!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -737,9 +728,7 @@ impl default_imp_for_post_processing_steps!( connector::Adyenplatform, - connector::Adyen, connector::Nmi, - connector::Paypal, connector::Stripe, connector::Ebanx, connector::Gpayments, @@ -845,7 +834,6 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_retrieve!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, @@ -897,7 +885,6 @@ default_imp_for_payouts_eligibility!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -979,7 +966,6 @@ default_imp_for_payouts_cancel!( connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1017,12 +1003,10 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_quote!( connector::Adyenplatform, - connector::Adyen, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1061,12 +1045,10 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_recipient!( connector::Adyenplatform, - connector::Adyen, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1107,13 +1089,11 @@ impl #[cfg(feature = "payouts")] default_imp_for_payouts_recipient_account!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1151,13 +1131,11 @@ impl default_imp_for_approve!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1196,13 +1174,11 @@ impl default_imp_for_reject!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1350,13 +1326,11 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_sale!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Stripe, connector::Threedsecureio, @@ -1395,13 +1369,11 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_checkout!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Stripe, connector::Threedsecureio, @@ -1440,13 +1412,11 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_transaction!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Stripe, connector::Threedsecureio, @@ -1485,13 +1455,11 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_fulfillment!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Stripe, connector::Threedsecureio, @@ -1530,13 +1498,11 @@ impl #[cfg(feature = "frm")] default_imp_for_frm_record_return!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Stripe, connector::Threedsecureio, @@ -1573,13 +1539,11 @@ impl default_imp_for_incremental_authorization!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1616,13 +1580,11 @@ impl } default_imp_for_revoking_mandates!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1837,14 +1799,12 @@ impl { } default_imp_for_authorize_session_token!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1880,14 +1840,12 @@ impl } default_imp_for_calculate_tax!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -1923,7 +1881,6 @@ impl } default_imp_for_session_update!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, @@ -1965,7 +1922,6 @@ impl } default_imp_for_post_session_tokens!( - connector::Adyen, connector::Adyenplatform, connector::Ebanx, connector::Gpayments, @@ -2011,13 +1967,11 @@ impl default_imp_for_uas_pre_authentication!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -2054,13 +2008,11 @@ impl default_imp_for_uas_post_authentication!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -2086,13 +2038,11 @@ macro_rules! default_imp_for_uas_authentication_confirmation { default_imp_for_uas_authentication_confirmation!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -2142,13 +2092,11 @@ impl default_imp_for_uas_authentication!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -2297,13 +2245,11 @@ impl default_imp_for_revenue_recovery_record_back!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd, @@ -2343,13 +2289,11 @@ impl default_imp_for_additional_revenue_recovery_call!( connector::Adyenplatform, - connector::Adyen, connector::Ebanx, connector::Gpayments, connector::Netcetera, connector::Nmi, connector::Payone, - connector::Paypal, connector::Plaid, connector::Riskified, connector::Signifyd,