diff --git a/crates/hyperswitch_connectors/src/connectors.rs b/crates/hyperswitch_connectors/src/connectors.rs index 93c398a5e4f..43675cab8c3 100644 --- a/crates/hyperswitch_connectors/src/connectors.rs +++ b/crates/hyperswitch_connectors/src/connectors.rs @@ -17,6 +17,8 @@ pub mod multisafepay; pub mod nexixpay; pub mod novalnet; pub mod powertranz; +pub mod razorpay; +pub mod shift4; pub mod square; pub mod stax; pub mod taxjar; @@ -30,6 +32,7 @@ pub use self::{ coinbase::Coinbase, cryptopay::Cryptopay, deutschebank::Deutschebank, digitalvirgo::Digitalvirgo, dlocal::Dlocal, fiserv::Fiserv, fiservemea::Fiservemea, fiuu::Fiuu, globepay::Globepay, helcim::Helcim, mollie::Mollie, multisafepay::Multisafepay, - nexixpay::Nexixpay, novalnet::Novalnet, powertranz::Powertranz, square::Square, stax::Stax, - taxjar::Taxjar, thunes::Thunes, tsys::Tsys, volt::Volt, worldline::Worldline, + nexixpay::Nexixpay, novalnet::Novalnet, powertranz::Powertranz, razorpay::Razorpay, + shift4::Shift4, square::Square, stax::Stax, taxjar::Taxjar, thunes::Thunes, tsys::Tsys, + volt::Volt, worldline::Worldline, }; diff --git a/crates/router/src/connector/razorpay.rs b/crates/hyperswitch_connectors/src/connectors/razorpay.rs similarity index 70% rename from crates/router/src/connector/razorpay.rs rename to crates/hyperswitch_connectors/src/connectors/razorpay.rs index 3dcb636b42a..e05be5b107f 100644 --- a/crates/router/src/connector/razorpay.rs +++ b/crates/hyperswitch_connectors/src/connectors/razorpay.rs @@ -1,31 +1,48 @@ pub mod transformers; +use api_models::webhooks::{self, IncomingWebhookEvent}; use common_utils::{ - ext_traits::ByteSliceExt, + errors::CustomResult, + ext_traits::{ByteSliceExt, BytesExt}, + request::{Method, Request, RequestBuilder, RequestContent}, types::{AmountConvertor, FloatMajorUnit, FloatMajorUnitForConnector}, }; use error_stack::{Report, ResultExt}; -use masking::ExposeInterface; -use transformers as razorpay; - -use super::utils::{self as connector_utils}; -use crate::{ - configs::settings, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, logger, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorValidation, +use hyperswitch_domain_models::{ + router_data::{AccessToken, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - ErrorResponse, RequestContent, Response, + PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, PaymentsSyncRouterData, + RefundSyncRouterData, RefundsRouterData, }, - utils::BytesExt, +}; +use hyperswitch_interfaces::{ + api::{self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorValidation}, + configs::Connectors, + consts::NO_ERROR_CODE, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::{ExposeInterface, Mask}; +use router_env::logger; +use transformers as razorpay; + +use crate::{ + constants::headers, + types::ResponseRouterData, + utils::{convert_amount, handle_json_response_deserialization_failure}, }; #[derive(Clone)] @@ -54,12 +71,8 @@ impl api::RefundExecute for Razorpay {} impl api::RefundSync for Razorpay {} impl api::PaymentToken for Razorpay {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Razorpay +impl ConnectorIntegration + for Razorpay { // Not Implemented (R) } @@ -70,9 +83,9 @@ where { fn build_headers( &self, - _req: &types::RouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + _req: &RouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let header = vec![ ( headers::CONTENT_TYPE.to_string(), @@ -100,7 +113,7 @@ impl ConnectorCommon for Razorpay { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.razorpay.base_url.as_ref() } @@ -144,7 +157,7 @@ impl ConnectorCommon for Razorpay { razorpay::ErrorResponse::RazorpayStringError(error_string) => { Ok(ErrorResponse { status_code: res.status_code, - code: consts::NO_ERROR_CODE.to_string(), + code: NO_ERROR_CODE.to_string(), message: error_string.clone(), reason: Some(error_string.clone()), attempt_status: None, @@ -156,7 +169,7 @@ impl ConnectorCommon for Razorpay { Err(error_msg) => { event_builder.map(|event| event.set_error(serde_json::json!({"error": res.response.escape_ascii().to_string(), "status_code": res.status_code}))); logger::error!(deserialization_error =? error_msg); - crate::utils::handle_json_response_deserialization_failure(res, "razorpay") + handle_json_response_deserialization_failure(res, "razorpay") } } } @@ -166,34 +179,23 @@ impl ConnectorValidation for Razorpay { //TODO: implement functions when support enabled } -impl ConnectorIntegration - for Razorpay -{ +impl ConnectorIntegration for Razorpay { //TODO: implement sessions flow } -impl ConnectorIntegration - for Razorpay -{ -} +impl ConnectorIntegration for Razorpay {} -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Razorpay +impl ConnectorIntegration + for Razorpay { } -impl ConnectorIntegration - for Razorpay -{ +impl ConnectorIntegration for Razorpay { 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) } @@ -203,8 +205,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}gatewayProxy/txn/sendCollect", @@ -214,10 +216,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_amount, req.request.currency, @@ -230,12 +232,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -252,17 +254,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: razorpay::RazorpayPaymentsResponse = res .response .parse_struct("Razorpay PaymentsAuthorizeResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -278,14 +280,12 @@ impl ConnectorIntegration - for Razorpay -{ +impl ConnectorIntegration for Razorpay { 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) } @@ -295,8 +295,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}gatewayProxy/sync/transaction", @@ -306,10 +306,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.amount, req.request.currency, @@ -322,11 +322,11 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -339,17 +339,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: razorpay::RazorpaySyncResponse = res .response .parse_struct("razorpay PaymentsSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -365,14 +365,12 @@ impl ConnectorIntegration - for Razorpay -{ +impl ConnectorIntegration for Razorpay { 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) } @@ -382,28 +380,28 @@ impl ConnectorIntegration CustomResult { Err(errors::ConnectorError::NotImplemented("get_url method".to_string()).into()) } fn get_request_body( &self, - _req: &types::PaymentsCaptureRouterData, - _connectors: &settings::Connectors, + _req: &PaymentsCaptureRouterData, + _connectors: &Connectors, ) -> CustomResult { Err(errors::ConnectorError::NotImplemented("get_request_body method".to_string()).into()) } fn build_request( &self, - req: &types::PaymentsCaptureRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -418,17 +416,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: razorpay::RazorpayPaymentsResponse = res .response .parse_struct("Razorpay 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, @@ -444,19 +442,14 @@ impl ConnectorIntegration - for Razorpay -{ -} +impl ConnectorIntegration for Razorpay {} -impl ConnectorIntegration - for Razorpay -{ +impl ConnectorIntegration for Razorpay { 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) } @@ -466,18 +459,18 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + _req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}gatewayProxy/refund", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::RefundsRouterData, - connectors: &settings::Connectors, + req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -490,11 +483,11 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -509,17 +502,17 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: Response, - ) -> CustomResult, errors::ConnectorError> { + ) -> CustomResult, errors::ConnectorError> { let response: razorpay::RefundResponse = res .response .parse_struct("razorpay 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, @@ -535,12 +528,12 @@ impl ConnectorIntegration for Razorpay { +impl ConnectorIntegration for Razorpay { 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) } @@ -550,8 +543,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}gatewayProxy/sync/refund", @@ -561,10 +554,10 @@ impl ConnectorIntegration CustomResult { - let amount = connector_utils::convert_amount( + let amount = convert_amount( self.amount_converter, req.request.minor_refund_amount, req.request.currency, @@ -577,12 +570,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundSyncType::get_headers(self, req, connectors)?) @@ -595,17 +588,17 @@ impl ConnectorIntegration, res: Response, - ) -> CustomResult { + ) -> CustomResult { let response: razorpay::RefundResponse = res .response .parse_struct("razorpay 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, @@ -622,17 +615,17 @@ impl ConnectorIntegration, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let webhook_resource_object = get_webhook_object_from_body(request.body)?; match webhook_resource_object.refund { - Some(refund_data) => Ok(api_models::webhooks::ObjectReferenceId::RefundId( - api_models::webhooks::RefundIdType::ConnectorRefundId(refund_data.entity.id), + Some(refund_data) => Ok(webhooks::ObjectReferenceId::RefundId( + webhooks::RefundIdType::ConnectorRefundId(refund_data.entity.id), )), - None => Ok(api_models::webhooks::ObjectReferenceId::PaymentId( + None => Ok(webhooks::ObjectReferenceId::PaymentId( api_models::payments::PaymentIdType::ConnectorTransactionId( webhook_resource_object.payment.entity.id, ), @@ -642,7 +635,7 @@ impl api::IncomingWebhook for Razorpay { 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: common_utils::crypto::Encryptable< @@ -655,17 +648,15 @@ impl api::IncomingWebhook for Razorpay { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let webhook_resource_object = get_webhook_object_from_body(request.body)?; - Ok(api_models::webhooks::IncomingWebhookEvent::try_from( - webhook_resource_object, - )?) + Ok(IncomingWebhookEvent::try_from(webhook_resource_object)?) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let webhook_resource_object = get_webhook_object_from_body(request.body)?; Ok(Box::new(webhook_resource_object)) diff --git a/crates/router/src/connector/razorpay/transformers.rs b/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs similarity index 90% rename from crates/router/src/connector/razorpay/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs index fde72cac100..a75b7cc6ce9 100644 --- a/crates/router/src/connector/razorpay/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/razorpay/transformers.rs @@ -1,20 +1,28 @@ +use common_enums::enums; use common_utils::{ pii::{self, Email}, types::FloatMajorUnit, }; use error_stack::ResultExt; -use hyperswitch_domain_models::payment_method_data::UpiCollectData; +use hyperswitch_domain_models::{ + payment_method_data::{PaymentMethodData, UpiCollectData, UpiData}, + router_data::{ConnectorAuthType, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::ResponseId, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types, +}; +use hyperswitch_interfaces::{ + configs::Connectors, + consts::{NO_ERROR_CODE, NO_ERROR_MESSAGE}, + errors, +}; use masking::Secret; use rand::Rng; use serde::{Deserialize, Serialize}; use time::PrimitiveDateTime; -use crate::{ - configs::settings, - consts, - core::errors, - types::{self, api, domain, storage::enums}, -}; +use crate::types::{RefundsResponseRouterData, ResponseRouterData}; pub struct RazorpayRouterData { pub amount: FloatMajorUnit, @@ -367,41 +375,42 @@ fn generate_12_digit_number() -> u64 { impl TryFrom<( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, )> for RazorpayPaymentsRequest { type Error = error_stack::Report; fn try_from( (item, data): ( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let request = &item.router_data.request; let txn_card_info = match request.payment_method_data.clone() { - domain::PaymentMethodData::Upi(upi_type) => match upi_type { - domain::UpiData::UpiCollect(upi_data) => TxnCardInfo::try_from((item, upi_data)), - hyperswitch_domain_models::payment_method_data::UpiData::UpiIntent(_) => Err( - errors::ConnectorError::NotImplemented("Payment methods".to_string()).into(), - ), + PaymentMethodData::Upi(upi_type) => match upi_type { + UpiData::UpiCollect(upi_data) => TxnCardInfo::try_from((item, upi_data)), + UpiData::UpiIntent(_) => Err(errors::ConnectorError::NotImplemented( + "Payment methods".to_string(), + ) + .into()), }, - 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::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::Card(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented("Payment methods".to_string()).into()) } }?; @@ -457,7 +466,7 @@ impl TryFrom<&RazorpayRouterData<&types::PaymentsAuthorizeRouterData>> for Secon impl TryFrom<( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, )> for MerchantAccount { type Error = error_stack::Report; @@ -465,7 +474,7 @@ impl fn try_from( (_item, data): ( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let merchant_data = JuspayAuthData::try_from(data)?; @@ -483,7 +492,7 @@ impl impl TryFrom<( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, )> for OrderReference { type Error = error_stack::Report; @@ -491,7 +500,7 @@ impl fn try_from( (item, data): ( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let ref_id = generate_12_digit_number(); @@ -529,7 +538,7 @@ impl let item = payment_data.0; let upi_data = payment_data.1; let ref_id = generate_12_digit_number(); - let pm = common_enums::enums::PaymentMethod::Upi; + let pm = enums::PaymentMethod::Upi; Ok(Self { txn_detail_id: ref_id.to_string(), txn_id: item.router_data.connector_request_reference_id.clone(), @@ -550,7 +559,7 @@ impl impl TryFrom<( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, )> for TxnDetail { type Error = error_stack::Report; @@ -558,7 +567,7 @@ impl fn try_from( (item, data): ( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let ref_id = generate_12_digit_number(); @@ -597,7 +606,7 @@ impl impl TryFrom<( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, )> for MerchantGatewayAccount { type Error = error_stack::Report; @@ -605,7 +614,7 @@ impl fn try_from( (item, data): ( &RazorpayRouterData<&types::PaymentsAuthorizeRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let ref_id = generate_12_digit_number(); @@ -649,11 +658,11 @@ pub struct RazorpayAuthType { pub(super) razorpay_secret: Secret, } -impl TryFrom<&types::ConnectorAuthType> for RazorpayAuthType { +impl TryFrom<&ConnectorAuthType> for RazorpayAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { + fn try_from(auth_type: &ConnectorAuthType) -> Result { match auth_type { - types::ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { + ConnectorAuthType::BodyKey { api_key, key1 } => Ok(Self { razorpay_id: api_key.to_owned(), razorpay_secret: key1.to_owned(), }), @@ -665,11 +674,11 @@ impl TryFrom<&types::ConnectorAuthType> for RazorpayAuthType { pub struct JuspayAuthData { pub(super) merchant_id: Secret, } -impl TryFrom<&settings::Connectors> for JuspayAuthData { +impl TryFrom<&Connectors> for JuspayAuthData { type Error = error_stack::Report; - fn try_from(connector_param: &settings::Connectors) -> Result { - let settings::Connectors { razorpay, .. } = connector_param; + fn try_from(connector_param: &Connectors) -> Result { + let Connectors { razorpay, .. } = connector_param; Ok(Self { merchant_id: razorpay.merchant_id.clone(), }) @@ -767,28 +776,20 @@ impl From for TxnStatus { } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData< - F, - RazorpayPaymentsResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { let second_factor = item.response.contents.second_factor; let status = enums::AttemptStatus::from(item.response.contents.txn_status); match second_factor { Some(second_factor) => Ok(Self { status, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( - second_factor.epg_txn_id, - ), + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId(second_factor.epg_txn_id), redirection_data: None, mandate_reference: None, connector_metadata: None, @@ -806,10 +807,10 @@ impl .pgr_info .resp_message .clone() - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()); + .unwrap_or(NO_ERROR_MESSAGE.to_string()); Ok(Self { status, - response: Err(types::ErrorResponse { + response: Err(hyperswitch_domain_models::router_data::ErrorResponse { code: item.response.contents.pgr_info.resp_code.clone(), message: message_code.clone(), reason: Some(message_code.clone()), @@ -859,7 +860,7 @@ pub struct AccountDetails { impl TryFrom<( RazorpayRouterData<&types::PaymentsSyncRouterData>, - &settings::Connectors, + &Connectors, )> for RazorpayCreateSyncRequest { type Error = error_stack::Report; @@ -867,7 +868,7 @@ impl fn try_from( (item, data): ( RazorpayRouterData<&types::PaymentsSyncRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let ref_id = generate_12_digit_number(); @@ -996,18 +997,17 @@ impl From for enums::AttemptStatus { } } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { Ok(Self { status: 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.second_factor.epg_txn_id, ), redirection_data: None, @@ -1071,14 +1071,14 @@ pub struct PaymentGatewayResponse { impl TryFrom<( &RazorpayRouterData<&types::RefundsRouterData>, - &settings::Connectors, + &Connectors, )> for RazorpayRefundRequest { type Error = error_stack::Report; fn try_from( (item, data): ( &RazorpayRouterData<&types::RefundsRouterData>, - &settings::Connectors, + &Connectors, ), ) -> Result { let ref_id = generate_12_digit_number(); @@ -1166,7 +1166,7 @@ impl let payment_source: Secret = Secret::new("".to_string()); - let pm = common_enums::enums::PaymentMethod::Upi; + let pm = enums::PaymentMethod::Upi; let txn_card_info = TxnCardInfo { txn_detail_id: ref_id.to_string(), @@ -1244,34 +1244,34 @@ pub struct RefundRes { date_created: Option, } -impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { let epg_txn_id = item.response.refund.epg_txn_id.clone(); let refund_status = enums::RefundStatus::from(item.response.refund.status); let response = match epg_txn_id { - Some(epg_txn_id) => Ok(types::RefundsResponseData { + Some(epg_txn_id) => Ok(RefundsResponseData { connector_refund_id: epg_txn_id, refund_status, }), - None => Err(types::ErrorResponse { + None => Err(hyperswitch_domain_models::router_data::ErrorResponse { code: item .response .refund .error_message .clone() - .unwrap_or(consts::NO_ERROR_CODE.to_string()), + .unwrap_or(NO_ERROR_CODE.to_string()), message: item .response .refund .response_code .clone() - .unwrap_or(consts::NO_ERROR_MESSAGE.to_string()), + .unwrap_or(NO_ERROR_MESSAGE.to_string()), reason: item.response.refund.response_code.clone(), status_code: item.http_code, attempt_status: None, @@ -1285,15 +1285,13 @@ impl TryFrom> } } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item .data .request diff --git a/crates/router/src/connector/shift4.rs b/crates/hyperswitch_connectors/src/connectors/shift4.rs similarity index 68% rename from crates/router/src/connector/shift4.rs rename to crates/hyperswitch_connectors/src/connectors/shift4.rs index 895487db3ba..3bd76cd3b69 100644 --- a/crates/router/src/connector/shift4.rs +++ b/crates/hyperswitch_connectors/src/connectors/shift4.rs @@ -2,29 +2,51 @@ pub mod transformers; use std::fmt::Debug; -use common_utils::{ext_traits::ByteSliceExt, request::RequestContent}; -use diesel_models::enums; +use api_models::webhooks::IncomingWebhookEvent; +use common_enums::enums; +use common_utils::{ + errors::CustomResult, + ext_traits::{ByteSliceExt, BytesExt}, + request::{Method, Request, RequestBuilder, RequestContent}, +}; use error_stack::{report, ResultExt}; -use transformers as shift4; - -use super::utils::{self as connector_utils, RefundsRequestData}; -use crate::{ - configs::settings, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, - services::{ - self, - request::{self, Mask}, - ConnectorIntegration, ConnectorValidation, +use http::header::ACCEPT; +use hyperswitch_domain_models::{ + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + CompleteAuthorize, PreProcessing, + }, + router_request_types::{ + AccessTokenRequestData, CompleteAuthorizeData, PaymentMethodTokenizationData, + PaymentsAuthorizeData, PaymentsCancelData, PaymentsCaptureData, PaymentsPreProcessingData, + PaymentsSessionData, PaymentsSyncData, RefundsData, SetupMandateRequestData, }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - ErrorResponse, + PaymentsAuthorizeRouterData, PaymentsCaptureRouterData, + PaymentsCompleteAuthorizeRouterData, PaymentsPreProcessingRouterData, + PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData, }, - utils::BytesExt, +}; +use hyperswitch_interfaces::{ + api::{self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorValidation}, + configs::Connectors, + consts::NO_ERROR_CODE, + errors, + events::connector_api_logs::ConnectorEvent, + types::{self, Response}, + webhooks::{IncomingWebhook, IncomingWebhookRequestDetails}, +}; +use masking::Mask; +use transformers as shift4; + +use crate::{ + constants::headers, + types::ResponseRouterData, + utils::{construct_not_supported_error_report, RefundsRequestData}, }; #[derive(Debug, Clone)] @@ -36,16 +58,16 @@ where { fn build_headers( &self, - req: &types::RouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut headers = vec![ ( headers::CONTENT_TYPE.to_string(), self.get_content_type().to_string().into(), ), ( - headers::ACCEPT.to_string(), + ACCEPT.to_string(), self.get_content_type().to_string().into(), ), ]; @@ -63,14 +85,14 @@ impl ConnectorCommon for Shift4 { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.shift4.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = shift4::Shift4AuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -81,7 +103,7 @@ impl ConnectorCommon for Shift4 { fn build_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { let response: shift4::ErrorResponse = res @@ -97,7 +119,7 @@ impl ConnectorCommon for Shift4 { code: response .error .code - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + .unwrap_or_else(|| NO_ERROR_CODE.to_string()), message: response.error.message, reason: None, attempt_status: None, @@ -116,7 +138,7 @@ impl ConnectorValidation for Shift4 { match capture_method { enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual => Ok(()), enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( - connector_utils::construct_not_supported_error_report(capture_method, self.id()), + construct_not_supported_error_report(capture_method, self.id()), ), } } @@ -135,41 +157,25 @@ impl api::RefundSync for Shift4 {} impl api::PaymentToken for Shift4 {} impl api::PaymentsPreProcessing for Shift4 {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Shift4 +impl ConnectorIntegration + for Shift4 { // Not Implemented (R) } impl api::ConnectorAccessToken for Shift4 {} -impl ConnectorIntegration - for Shift4 -{ +impl ConnectorIntegration for Shift4 { // Not Implemented (R) } impl api::MandateSetup for Shift4 {} -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Shift4 -{ +impl ConnectorIntegration for Shift4 { fn build_request( &self, - _req: &types::RouterData< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - >, - _connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + _req: &RouterData, + _connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Err( errors::ConnectorError::NotImplemented("Setup Mandate flow for Shift4".to_string()) .into(), @@ -178,14 +184,12 @@ impl } #[async_trait::async_trait] -impl ConnectorIntegration - for Shift4 -{ +impl ConnectorIntegration for Shift4 { 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) } @@ -195,16 +199,16 @@ impl ConnectorIntegration CustomResult { Ok(format!("{}charges", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::PaymentsAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = shift4::Shift4PaymentsRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -212,12 +216,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -232,10 +236,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: shift4::Shift4NonThreeDsResponse = res .response .parse_struct("Shift4NonThreeDsResponse") @@ -244,7 +248,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Shift4 -{ -} +impl ConnectorIntegration for Shift4 {} -impl ConnectorIntegration - for Shift4 -{ +impl ConnectorIntegration for Shift4 { 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) } @@ -283,8 +282,8 @@ impl ConnectorIntegration CustomResult { let connector_payment_id = req .request @@ -300,12 +299,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -315,7 +314,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -323,10 +322,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: shift4::Shift4NonThreeDsResponse = res .response .parse_struct("Shift4NonThreeDsResponse") @@ -335,7 +334,7 @@ impl ConnectorIntegration - for Shift4 -{ +impl ConnectorIntegration for Shift4 { 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) } @@ -361,12 +358,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCaptureType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsCaptureType::get_headers( @@ -378,10 +375,10 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: shift4::Shift4NonThreeDsResponse = res .response .parse_struct("Shift4NonThreeDsResponse") @@ -390,7 +387,7 @@ impl ConnectorIntegration CustomResult { let connector_payment_id = req.request.connector_transaction_id.clone(); Ok(format!( @@ -413,38 +410,32 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration - for Shift4 -{ +impl ConnectorIntegration for Shift4 { //TODO: implement sessions flow } -impl - ConnectorIntegration< - api::PreProcessing, - types::PaymentsPreProcessingData, - types::PaymentsResponseData, - > for Shift4 +impl ConnectorIntegration + for Shift4 { fn get_headers( &self, - req: &types::PaymentsPreProcessingRouterData, - _connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsPreProcessingRouterData, + _connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let mut headers = vec![ ( headers::CONTENT_TYPE.to_string(), "application/x-www-form-urlencoded".to_string().into(), ), ( - headers::ACCEPT.to_string(), + ACCEPT.to_string(), self.common_get_content_type().to_string().into(), ), ]; @@ -459,16 +450,16 @@ impl fn get_url( &self, - _req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, + _req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}3d-secure", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::PaymentsPreProcessingRouterData, - _connectors: &settings::Connectors, + req: &PaymentsPreProcessingRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = shift4::Shift4PaymentsRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -476,12 +467,12 @@ impl fn build_request( &self, - req: &types::PaymentsPreProcessingRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsPreProcessingRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsPreProcessingType::get_url( self, req, connectors, )?) @@ -498,10 +489,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: shift4::Shift4ThreeDsResponse = res .response .parse_struct("Shift4ThreeDsResponse") @@ -510,7 +501,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, @@ -520,25 +511,21 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl - ConnectorIntegration< - api::CompleteAuthorize, - types::CompleteAuthorizeData, - types::PaymentsResponseData, - > for Shift4 +impl ConnectorIntegration + for Shift4 { 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) } @@ -548,16 +535,16 @@ impl fn get_url( &self, - _req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, + _req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}charges", self.base_url(connectors))) } fn get_request_body( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - _connectors: &settings::Connectors, + req: &PaymentsCompleteAuthorizeRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = shift4::Shift4PaymentsRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -565,12 +552,12 @@ impl fn build_request( &self, - req: &types::PaymentsCompleteAuthorizeRouterData, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { + req: &PaymentsCompleteAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsCompleteAuthorizeType::get_url( self, req, connectors, )?) @@ -586,10 +573,10 @@ impl fn handle_response( &self, - data: &types::PaymentsCompleteAuthorizeRouterData, + data: &PaymentsCompleteAuthorizeRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: shift4::Shift4NonThreeDsResponse = res .response .parse_struct("Shift4NonThreeDsResponse") @@ -598,7 +585,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, @@ -608,19 +595,19 @@ impl fn get_error_response( &self, - res: types::Response, + res: Response, event_builder: Option<&mut ConnectorEvent>, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration for Shift4 { +impl ConnectorIntegration for Shift4 { 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) } @@ -630,16 +617,16 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + _req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!("{}refunds", self.base_url(connectors),)) } fn get_request_body( &self, - req: &types::RefundsRouterData, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { let connector_req = shift4::Shift4RefundRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -647,11 +634,11 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, - ) -> CustomResult, errors::ConnectorError> { - let request = services::RequestBuilder::new() - .method(services::Method::Post) + req: &RefundsRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { + let request = RequestBuilder::new() + .method(Method::Post) .url(&types::RefundExecuteType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundExecuteType::get_headers( @@ -666,10 +653,10 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, - res: types::Response, - ) -> CustomResult, errors::ConnectorError> { + res: Response, + ) -> CustomResult, errors::ConnectorError> { let response: shift4::RefundResponse = res .response .parse_struct("RefundResponse") @@ -678,7 +665,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) } } -impl ConnectorIntegration for Shift4 { +impl ConnectorIntegration for Shift4 { 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) } @@ -710,8 +697,8 @@ impl ConnectorIntegration CustomResult { let refund_id = req.request.get_connector_refund_id()?; Ok(format!( @@ -723,12 +710,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { Ok(Some( - services::RequestBuilder::new() - .method(services::Method::Get) + RequestBuilder::new() + .method(Method::Get) .url(&types::RefundSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::RefundSyncType::get_headers(self, req, connectors)?) @@ -738,17 +725,17 @@ impl ConnectorIntegration, - res: types::Response, - ) -> CustomResult { + res: Response, + ) -> CustomResult { let response: shift4::RefundResponse = res.response .parse_struct("shift4 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, @@ -758,7 +745,7 @@ impl ConnectorIntegration, ) -> CustomResult { self.build_error_response(res, event_builder) @@ -766,10 +753,10 @@ impl ConnectorIntegration, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult { let details: shift4::Shift4WebhookObjectId = request .body @@ -799,18 +786,18 @@ impl api::IncomingWebhook for Shift4 { fn get_webhook_event_type( &self, - request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { + request: &IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { let details: shift4::Shift4WebhookObjectEventType = request .body .parse_struct("Shift4WebhookObjectEventType") .change_context(errors::ConnectorError::WebhookEventTypeNotFound)?; - Ok(api::IncomingWebhookEvent::from(details.event_type)) + Ok(IncomingWebhookEvent::from(details.event_type)) } fn get_webhook_resource_object( &self, - request: &api::IncomingWebhookRequestDetails<'_>, + request: &IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { let details: shift4::Shift4WebhookObjectResource = request .body diff --git a/crates/router/src/connector/shift4/transformers.rs b/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs similarity index 60% rename from crates/router/src/connector/shift4/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs index 2210ab0a361..8aeb55241d0 100644 --- a/crates/router/src/connector/shift4/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/shift4/transformers.rs @@ -1,19 +1,37 @@ -use api_models::payments; +use api_models::{payments::AddressDetails, webhooks::IncomingWebhookEvent}; use cards::CardNumber; -use common_utils::pii::SecretSerdeValue; +use common_enums::enums; +use common_utils::{ + pii::{self, SecretSerdeValue}, + request::Method, +}; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::{ + BankRedirectData, BankTransferData, Card as CardData, GiftCardData, PaymentMethodData, + VoucherData, WalletData, + }, + router_data::{ConnectorAuthType, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::{ + CompleteAuthorizeData, PaymentsAuthorizeData, PaymentsPreProcessingData, ResponseId, + }, + router_response_types::{PaymentsResponseData, RedirectForm, RefundsResponseData}, + types::{PaymentsPreProcessingRouterData, RefundsRouterData}, +}; +use hyperswitch_interfaces::errors; use masking::Secret; use serde::{Deserialize, Serialize}; use url::Url; use crate::{ - connector::utils::{ + types::{ + PaymentsPreprocessingResponseRouterData, RefundsResponseRouterData, ResponseRouterData, + }, + utils::{ self, to_connector_meta, PaymentsAuthorizeRequestData, - PaymentsCompleteAuthorizeRequestData, PaymentsPreProcessingData, RouterData, + PaymentsCompleteAuthorizeRequestData, PaymentsPreProcessingRequestData, RouterData as _, }, - core::errors, - pii, services, - types::{self, api, domain, storage::enums, transformers::ForeignFrom}, }; type Error = error_stack::Report; @@ -24,11 +42,11 @@ trait Shift4AuthorizePreprocessingCommon { fn get_email_optional(&self) -> Option; fn get_complete_authorize_url(&self) -> Option; fn get_amount_required(&self) -> Result; - fn get_currency_required(&self) -> Result; - fn get_payment_method_data_required(&self) -> Result; + fn get_currency_required(&self) -> Result; + fn get_payment_method_data_required(&self) -> Result; } -impl Shift4AuthorizePreprocessingCommon for types::PaymentsAuthorizeData { +impl Shift4AuthorizePreprocessingCommon for PaymentsAuthorizeData { fn get_email_optional(&self) -> Option { self.email.clone() } @@ -43,12 +61,12 @@ impl Shift4AuthorizePreprocessingCommon for types::PaymentsAuthorizeData { fn get_currency_required( &self, - ) -> Result> { + ) -> Result> { Ok(self.currency) } fn get_payment_method_data_required( &self, - ) -> Result> { + ) -> Result> { Ok(self.payment_method_data.clone()) } @@ -61,7 +79,7 @@ impl Shift4AuthorizePreprocessingCommon for types::PaymentsAuthorizeData { } } -impl Shift4AuthorizePreprocessingCommon for types::PaymentsPreProcessingData { +impl Shift4AuthorizePreprocessingCommon for PaymentsPreProcessingData { fn get_email_optional(&self) -> Option { self.email.clone() } @@ -74,10 +92,10 @@ impl Shift4AuthorizePreprocessingCommon for types::PaymentsPreProcessingData { self.get_amount() } - fn get_currency_required(&self) -> Result { + fn get_currency_required(&self) -> Result { self.get_currency() } - fn get_payment_method_data_required(&self) -> Result { + fn get_payment_method_data_required(&self) -> Result { self.payment_method_data.clone().ok_or( errors::ConnectorError::MissingRequiredField { field_name: "payment_method_data", @@ -195,15 +213,12 @@ pub enum CardPayment { CardToken(Secret), } -impl TryFrom<&types::RouterData> - for Shift4PaymentsRequest +impl TryFrom<&RouterData> for Shift4PaymentsRequest where Req: Shift4AuthorizePreprocessingCommon, { type Error = Error; - fn try_from( - item: &types::RouterData, - ) -> Result { + fn try_from(item: &RouterData) -> Result { let submit_for_settlement = item.request.is_automatic_capture()?; let amount = item.request.get_amount_required()?.to_string(); let currency = item.request.get_currency_required()?; @@ -217,40 +232,35 @@ where } } -impl TryFrom<&types::RouterData> - for Shift4PaymentMethod +impl TryFrom<&RouterData> for Shift4PaymentMethod where Req: Shift4AuthorizePreprocessingCommon, { type Error = Error; - fn try_from( - item: &types::RouterData, - ) -> Result { + fn try_from(item: &RouterData) -> Result { match item.request.get_payment_method_data_required()? { - domain::PaymentMethodData::Card(ref ccard) => Self::try_from((item, ccard)), - domain::PaymentMethodData::BankRedirect(ref redirect) => { - Self::try_from((item, redirect)) - } - domain::PaymentMethodData::Wallet(ref wallet_data) => Self::try_from(wallet_data), - domain::PaymentMethodData::BankTransfer(ref bank_transfer_data) => { + PaymentMethodData::Card(ref ccard) => Self::try_from((item, ccard)), + PaymentMethodData::BankRedirect(ref redirect) => Self::try_from((item, redirect)), + PaymentMethodData::Wallet(ref wallet_data) => Self::try_from(wallet_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::CardRedirect(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) - | domain::PaymentMethodData::NetworkToken(_) - | domain::PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { + PaymentMethodData::CardRedirect(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) + | PaymentMethodData::NetworkToken(_) + | PaymentMethodData::CardDetailsForNetworkTransactionId(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), ) @@ -260,38 +270,38 @@ where } } -impl TryFrom<&domain::WalletData> for Shift4PaymentMethod { +impl TryFrom<&WalletData> for Shift4PaymentMethod { type Error = Error; - fn try_from(wallet_data: &domain::WalletData) -> Result { + fn try_from(wallet_data: &WalletData) -> Result { match wallet_data { - domain::WalletData::AliPayRedirect(_) - | domain::WalletData::ApplePay(_) - | domain::WalletData::WeChatPayRedirect(_) - | domain::WalletData::AliPayQr(_) - | domain::WalletData::AliPayHkRedirect(_) - | domain::WalletData::MomoRedirect(_) - | domain::WalletData::KakaoPayRedirect(_) - | domain::WalletData::GoPayRedirect(_) - | domain::WalletData::GcashRedirect(_) - | domain::WalletData::ApplePayRedirect(_) - | domain::WalletData::ApplePayThirdPartySdk(_) - | domain::WalletData::DanaRedirect {} - | domain::WalletData::GooglePay(_) - | domain::WalletData::GooglePayRedirect(_) - | domain::WalletData::GooglePayThirdPartySdk(_) - | domain::WalletData::MbWayRedirect(_) - | domain::WalletData::MobilePayRedirect(_) - | domain::WalletData::PaypalRedirect(_) - | domain::WalletData::PaypalSdk(_) - | domain::WalletData::Paze(_) - | domain::WalletData::SamsungPay(_) - | domain::WalletData::TwintRedirect {} - | domain::WalletData::VippsRedirect {} - | domain::WalletData::TouchNGoRedirect(_) - | domain::WalletData::WeChatPayQr(_) - | domain::WalletData::CashappQr(_) - | domain::WalletData::SwishQr(_) - | domain::WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( + WalletData::AliPayRedirect(_) + | WalletData::ApplePay(_) + | WalletData::WeChatPayRedirect(_) + | WalletData::AliPayQr(_) + | WalletData::AliPayHkRedirect(_) + | WalletData::MomoRedirect(_) + | WalletData::KakaoPayRedirect(_) + | WalletData::GoPayRedirect(_) + | WalletData::GcashRedirect(_) + | WalletData::ApplePayRedirect(_) + | WalletData::ApplePayThirdPartySdk(_) + | WalletData::DanaRedirect {} + | WalletData::GooglePay(_) + | WalletData::GooglePayRedirect(_) + | WalletData::GooglePayThirdPartySdk(_) + | WalletData::MbWayRedirect(_) + | WalletData::MobilePayRedirect(_) + | WalletData::PaypalRedirect(_) + | WalletData::PaypalSdk(_) + | WalletData::Paze(_) + | WalletData::SamsungPay(_) + | WalletData::TwintRedirect {} + | WalletData::VippsRedirect {} + | WalletData::TouchNGoRedirect(_) + | WalletData::WeChatPayQr(_) + | WalletData::CashappQr(_) + | WalletData::SwishQr(_) + | WalletData::Mifinity(_) => Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), ) .into()), @@ -299,24 +309,24 @@ impl TryFrom<&domain::WalletData> for Shift4PaymentMethod { } } -impl TryFrom<&domain::BankTransferData> for Shift4PaymentMethod { +impl TryFrom<&BankTransferData> for Shift4PaymentMethod { type Error = Error; - fn try_from(bank_transfer_data: &domain::BankTransferData) -> Result { + fn try_from(bank_transfer_data: &BankTransferData) -> Result { match bank_transfer_data { - domain::BankTransferData::MultibancoBankTransfer { .. } - | domain::BankTransferData::AchBankTransfer { .. } - | domain::BankTransferData::SepaBankTransfer { .. } - | domain::BankTransferData::BacsBankTransfer { .. } - | 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 { .. } => { + BankTransferData::MultibancoBankTransfer { .. } + | BankTransferData::AchBankTransfer { .. } + | BankTransferData::SepaBankTransfer { .. } + | BankTransferData::BacsBankTransfer { .. } + | 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("Shift4"), ) @@ -326,24 +336,24 @@ impl TryFrom<&domain::BankTransferData> for Shift4PaymentMethod { } } -impl TryFrom<&domain::VoucherData> for Shift4PaymentMethod { +impl TryFrom<&VoucherData> for Shift4PaymentMethod { type Error = Error; - fn try_from(voucher_data: &domain::VoucherData) -> Result { + fn try_from(voucher_data: &VoucherData) -> Result { match voucher_data { - 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( + 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("Shift4"), ) .into()), @@ -351,11 +361,11 @@ impl TryFrom<&domain::VoucherData> for Shift4PaymentMethod { } } -impl TryFrom<&domain::GiftCardData> for Shift4PaymentMethod { +impl TryFrom<&GiftCardData> for Shift4PaymentMethod { type Error = Error; - fn try_from(gift_card_data: &domain::GiftCardData) -> Result { + fn try_from(gift_card_data: &GiftCardData) -> Result { match gift_card_data { - domain::GiftCardData::Givex(_) | domain::GiftCardData::PaySafeCard {} => { + GiftCardData::Givex(_) | GiftCardData::PaySafeCard {} => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), ) @@ -365,20 +375,13 @@ impl TryFrom<&domain::GiftCardData> for Shift4PaymentMethod { } } -impl - TryFrom<( - &types::RouterData, - &domain::Card, - )> for Shift4PaymentMethod +impl TryFrom<(&RouterData, &CardData)> for Shift4PaymentMethod where Req: Shift4AuthorizePreprocessingCommon, { type Error = Error; fn try_from( - (item, card): ( - &types::RouterData, - &domain::Card, - ), + (item, card): (&RouterData, &CardData), ) -> Result { let card_object = Card { number: card.card_number.clone(), @@ -408,20 +411,14 @@ where } } -impl - TryFrom<( - &types::RouterData, - &domain::BankRedirectData, - )> for Shift4PaymentMethod +impl TryFrom<(&RouterData, &BankRedirectData)> + for Shift4PaymentMethod where Req: Shift4AuthorizePreprocessingCommon, { type Error = Error; fn try_from( - (item, redirect_data): ( - &types::RouterData, - &domain::BankRedirectData, - ), + (item, redirect_data): (&RouterData, &BankRedirectData), ) -> Result { let flow = Flow::try_from(item.request.get_router_return_url())?; let method_type = PaymentMethodType::try_from(redirect_data)?; @@ -437,15 +434,15 @@ where } } -impl TryFrom<&types::RouterData> +impl TryFrom<&RouterData> for Shift4PaymentsRequest { type Error = Error; fn try_from( - item: &types::RouterData, + item: &RouterData, ) -> Result { match &item.request.payment_method_data { - Some(domain::PaymentMethodData::Card(_)) => { + Some(PaymentMethodData::Card(_)) => { let card_token: Shift4CardToken = to_connector_meta(item.request.connector_meta.clone())?; Ok(Self { @@ -460,23 +457,23 @@ impl TryFrom<&types::RouterData Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), ) @@ -485,28 +482,28 @@ impl TryFrom<&types::RouterData for PaymentMethodType { +impl TryFrom<&BankRedirectData> for PaymentMethodType { type Error = Error; - fn try_from(value: &domain::BankRedirectData) -> Result { + fn try_from(value: &BankRedirectData) -> Result { match value { - domain::BankRedirectData::Eps { .. } => Ok(Self::Eps), - domain::BankRedirectData::Giropay { .. } => Ok(Self::Giropay), - domain::BankRedirectData::Ideal { .. } => Ok(Self::Ideal), - domain::BankRedirectData::Sofort { .. } => Ok(Self::Sofort), - domain::BankRedirectData::BancontactCard { .. } - | domain::BankRedirectData::Blik { .. } - | domain::BankRedirectData::Trustly { .. } - | domain::BankRedirectData::Przelewy24 { .. } - | domain::BankRedirectData::Bizum {} - | domain::BankRedirectData::Interac { .. } - | domain::BankRedirectData::OnlineBankingCzechRepublic { .. } - | domain::BankRedirectData::OnlineBankingFinland { .. } - | domain::BankRedirectData::OnlineBankingPoland { .. } - | domain::BankRedirectData::OnlineBankingSlovakia { .. } - | domain::BankRedirectData::OpenBankingUk { .. } - | domain::BankRedirectData::OnlineBankingFpx { .. } - | domain::BankRedirectData::OnlineBankingThailand { .. } - | domain::BankRedirectData::LocalBankRedirect {} => { + BankRedirectData::Eps { .. } => Ok(Self::Eps), + BankRedirectData::Giropay { .. } => Ok(Self::Giropay), + BankRedirectData::Ideal { .. } => Ok(Self::Ideal), + BankRedirectData::Sofort { .. } => Ok(Self::Sofort), + BankRedirectData::BancontactCard { .. } + | BankRedirectData::Blik { .. } + | BankRedirectData::Trustly { .. } + | BankRedirectData::Przelewy24 { .. } + | BankRedirectData::Bizum {} + | BankRedirectData::Interac { .. } + | BankRedirectData::OnlineBankingCzechRepublic { .. } + | BankRedirectData::OnlineBankingFinland { .. } + | BankRedirectData::OnlineBankingPoland { .. } + | BankRedirectData::OnlineBankingSlovakia { .. } + | BankRedirectData::OpenBankingUk { .. } + | BankRedirectData::OnlineBankingFpx { .. } + | BankRedirectData::OnlineBankingThailand { .. } + | BankRedirectData::LocalBankRedirect {} => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("Shift4"), ) @@ -525,14 +522,12 @@ impl TryFrom> for Flow { } } -impl TryFrom<&types::RouterData> for Billing +impl TryFrom<&RouterData> for Billing where Req: Shift4AuthorizePreprocessingCommon, { type Error = Error; - fn try_from( - item: &types::RouterData, - ) -> Result { + fn try_from(item: &RouterData) -> Result { let billing_address = item .get_optional_billing() .as_ref() @@ -548,7 +543,7 @@ where } } -fn get_address_details(address_details: Option<&payments::AddressDetails>) -> Option
{ +fn get_address_details(address_details: Option<&AddressDetails>) -> Option
{ address_details.map(|address| Address { line1: address.line1.clone(), line2: address.line1.clone(), @@ -564,10 +559,10 @@ pub struct Shift4AuthType { pub(super) api_key: Secret, } -impl TryFrom<&types::ConnectorAuthType> for Shift4AuthType { +impl TryFrom<&ConnectorAuthType> for Shift4AuthType { type Error = Error; - fn try_from(item: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::HeaderKey { api_key } = item { + fn try_from(item: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::HeaderKey { api_key } = item { Ok(Self { api_key: api_key.to_owned(), }) @@ -586,23 +581,24 @@ pub enum Shift4PaymentStatus { Pending, } -impl ForeignFrom<(bool, Option<&NextAction>, Shift4PaymentStatus)> for enums::AttemptStatus { - fn foreign_from(item: (bool, Option<&NextAction>, Shift4PaymentStatus)) -> Self { - let (captured, next_action, payment_status) = item; - match payment_status { - Shift4PaymentStatus::Successful => { - if captured { - Self::Charged - } else { - Self::Authorized - } +fn get_status( + captured: bool, + next_action: Option<&NextAction>, + payment_status: Shift4PaymentStatus, +) -> enums::AttemptStatus { + match payment_status { + Shift4PaymentStatus::Successful => { + if captured { + enums::AttemptStatus::Charged + } else { + enums::AttemptStatus::Authorized } - Shift4PaymentStatus::Failed => Self::Failure, - Shift4PaymentStatus::Pending => match next_action { - Some(NextAction::Redirect) => Self::AuthenticationPending, - Some(NextAction::Wait) | Some(NextAction::None) | None => Self::Pending, - }, } + Shift4PaymentStatus::Failed => enums::AttemptStatus::Failure, + Shift4PaymentStatus::Pending => match next_action { + Some(NextAction::Redirect) => enums::AttemptStatus::AuthenticationPending, + Some(NextAction::Wait) | Some(NextAction::None) | None => enums::AttemptStatus::Pending, + }, } } @@ -724,29 +720,29 @@ pub struct Shift4CardToken { pub id: Secret, } -impl TryFrom> - for types::PaymentsPreProcessingRouterData +impl TryFrom> + for PaymentsPreProcessingRouterData { type Error = Error; fn try_from( - item: types::PaymentsPreprocessingResponseRouterData, + item: PaymentsPreprocessingResponseRouterData, ) -> Result { let redirection_data = item .response .redirect_url - .map(|url| services::RedirectForm::from((url, services::Method::Get))); + .map(|url| RedirectForm::from((url, Method::Get))); Ok(Self { status: if redirection_data.is_some() { enums::AttemptStatus::AuthenticationPending } else { enums::AttemptStatus::Pending }, - request: types::PaymentsPreProcessingData { + request: PaymentsPreProcessingData { enrolled_for_3ds: item.response.enrolled, ..item.data.request }, - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::NoResponseId, + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::NoResponseId, redirection_data, mandate_reference: None, connector_metadata: Some( @@ -765,37 +761,31 @@ impl TryFrom - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = Error; fn try_from( - item: types::ResponseRouterData< - F, - Shift4NonThreeDsResponse, - T, - types::PaymentsResponseData, - >, + item: ResponseRouterData, ) -> Result { - let connector_id = types::ResponseId::ConnectorTransactionId(item.response.id.clone()); + let connector_id = ResponseId::ConnectorTransactionId(item.response.id.clone()); Ok(Self { - status: enums::AttemptStatus::foreign_from(( + status: get_status( item.response.captured, item.response .flow .as_ref() .and_then(|flow| flow.next_action.as_ref()), item.response.status, - )), - response: Ok(types::PaymentsResponseData::TransactionResponse { + ), + response: Ok(PaymentsResponseData::TransactionResponse { resource_id: connector_id, redirection_data: item .response .flow .and_then(|flow| flow.redirect) .and_then(|redirect| redirect.redirect_url) - .map(|url| services::RedirectForm::from((url, services::Method::Get))), + .map(|url| RedirectForm::from((url, Method::Get))), mandate_reference: None, connector_metadata: None, network_txn_id: None, @@ -817,9 +807,9 @@ pub struct Shift4RefundRequest { amount: i64, } -impl TryFrom<&types::RefundsRouterData> for Shift4RefundRequest { +impl TryFrom<&RefundsRouterData> for Shift4RefundRequest { type Error = Error; - fn try_from(item: &types::RefundsRouterData) -> Result { + fn try_from(item: &RefundsRouterData) -> Result { Ok(Self { charge_id: item.request.connector_transaction_id.clone(), amount: item.request.refund_amount, @@ -855,16 +845,14 @@ pub enum Shift4RefundStatus { Failed, } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for RefundsRouterData { type Error = Error; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { let refund_status = enums::RefundStatus::from(item.response.status); Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.id, refund_status, }), @@ -873,16 +861,14 @@ impl TryFrom> } } -impl TryFrom> - for types::RefundsRouterData -{ +impl TryFrom> for RefundsRouterData { type Error = Error; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { let refund_status = enums::RefundStatus::from(item.response.status); Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item.response.id, refund_status, }), @@ -916,7 +902,7 @@ pub fn is_refund_event(event: &Shift4WebhookEvent) -> bool { matches!(event, Shift4WebhookEvent::ChargeRefunded) } -impl From for api::IncomingWebhookEvent { +impl From for IncomingWebhookEvent { fn from(event: Shift4WebhookEvent) -> Self { match event { Shift4WebhookEvent::ChargeSucceeded | Shift4WebhookEvent::ChargeUpdated => { diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index af0447c4e02..b46d2f0de9e 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -108,6 +108,8 @@ default_imp_for_authorize_session_token!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Taxjar, connectors::Volt, @@ -142,6 +144,8 @@ default_imp_for_calculate_tax!( connectors::Fiserv, connectors::Fiservemea, connectors::Helcim, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Novalnet, @@ -184,6 +188,8 @@ default_imp_for_session_update!( connectors::Fiserv, connectors::Fiservemea, connectors::Helcim, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -228,6 +234,8 @@ default_imp_for_post_session_tokens!( connectors::Fiserv, connectors::Fiservemea, connectors::Helcim, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Taxjar, connectors::Mollie, @@ -274,6 +282,7 @@ default_imp_for_complete_authorize!( connectors::Helcim, connectors::Multisafepay, connectors::Novalnet, + connectors::Razorpay, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -318,6 +327,8 @@ default_imp_for_incremental_authorization!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -362,6 +373,8 @@ default_imp_for_create_customer!( connectors::Novalnet, connectors::Nexixpay, connectors::Powertranz, + connectors::Razorpay, + connectors::Shift4, connectors::Square, connectors::Taxjar, connectors::Thunes, @@ -403,6 +416,8 @@ default_imp_for_connector_redirect_response!( connectors::Multisafepay, connectors::Nexixpay, connectors::Powertranz, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -445,6 +460,7 @@ default_imp_for_pre_processing_steps!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -489,6 +505,8 @@ default_imp_for_post_processing_steps!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -533,6 +551,8 @@ default_imp_for_approve!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -577,6 +597,8 @@ default_imp_for_reject!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -621,6 +643,8 @@ default_imp_for_webhook_source_verification!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -666,6 +690,8 @@ default_imp_for_accept_dispute!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -710,6 +736,8 @@ default_imp_for_submit_evidence!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -754,6 +782,8 @@ default_imp_for_defend_dispute!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -807,6 +837,8 @@ default_imp_for_file_upload!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -853,6 +885,8 @@ default_imp_for_payouts_create!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -899,6 +933,8 @@ default_imp_for_payouts_retrieve!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -945,6 +981,8 @@ default_imp_for_payouts_eligibility!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -991,6 +1029,8 @@ default_imp_for_payouts_fulfill!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1037,6 +1077,8 @@ default_imp_for_payouts_cancel!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1083,6 +1125,8 @@ default_imp_for_payouts_quote!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1129,6 +1173,8 @@ default_imp_for_payouts_recipient!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1175,6 +1221,8 @@ default_imp_for_payouts_recipient_account!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1221,6 +1269,8 @@ default_imp_for_frm_sale!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1267,6 +1317,8 @@ default_imp_for_frm_checkout!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1313,6 +1365,8 @@ default_imp_for_frm_transaction!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1359,6 +1413,8 @@ default_imp_for_frm_fulfillment!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1405,6 +1461,8 @@ default_imp_for_frm_record_return!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1448,6 +1506,8 @@ default_imp_for_revoking_mandates!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs index 251ba36c354..bdf6acfde54 100644 --- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs +++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs @@ -224,6 +224,8 @@ default_imp_for_new_connector_integration_payment!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -269,6 +271,8 @@ default_imp_for_new_connector_integration_refund!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -309,6 +313,8 @@ default_imp_for_new_connector_integration_connector_access_token!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -355,6 +361,8 @@ default_imp_for_new_connector_integration_accept_dispute!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -400,6 +408,8 @@ default_imp_for_new_connector_integration_submit_evidence!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -445,6 +455,8 @@ default_imp_for_new_connector_integration_defend_dispute!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -500,6 +512,8 @@ default_imp_for_new_connector_integration_file_upload!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -547,6 +561,8 @@ default_imp_for_new_connector_integration_payouts_create!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -594,6 +610,8 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -641,6 +659,8 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -688,6 +708,8 @@ default_imp_for_new_connector_integration_payouts_cancel!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -735,6 +757,8 @@ default_imp_for_new_connector_integration_payouts_quote!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -782,6 +806,8 @@ default_imp_for_new_connector_integration_payouts_recipient!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -829,6 +855,8 @@ default_imp_for_new_connector_integration_payouts_sync!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -876,6 +904,8 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -921,6 +951,8 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -968,6 +1000,8 @@ default_imp_for_new_connector_integration_frm_sale!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1015,6 +1049,8 @@ default_imp_for_new_connector_integration_frm_checkout!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1062,6 +1098,8 @@ default_imp_for_new_connector_integration_frm_transaction!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1109,6 +1147,8 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1156,6 +1196,8 @@ default_imp_for_new_connector_integration_frm_record_return!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, @@ -1200,6 +1242,8 @@ default_imp_for_new_connector_integration_revoking_mandates!( connectors::Powertranz, connectors::Mollie, connectors::Multisafepay, + connectors::Razorpay, + connectors::Shift4, connectors::Stax, connectors::Square, connectors::Taxjar, diff --git a/crates/hyperswitch_connectors/src/lib.rs b/crates/hyperswitch_connectors/src/lib.rs index aa0ff7e975e..5873398d8e4 100644 --- a/crates/hyperswitch_connectors/src/lib.rs +++ b/crates/hyperswitch_connectors/src/lib.rs @@ -4,5 +4,6 @@ pub mod connectors; pub mod constants; pub mod default_implementations; pub mod default_implementations_v2; +pub mod metrics; pub mod types; pub mod utils; diff --git a/crates/hyperswitch_connectors/src/metrics.rs b/crates/hyperswitch_connectors/src/metrics.rs new file mode 100644 index 00000000000..0b0b9e99f86 --- /dev/null +++ b/crates/hyperswitch_connectors/src/metrics.rs @@ -0,0 +1,8 @@ +//! Metrics interface + +use router_env::{counter_metric, global_meter, metrics_context}; + +metrics_context!(CONTEXT); +global_meter!(GLOBAL_METER, "ROUTER_API"); + +counter_metric!(RESPONSE_DESERIALIZATION_FAILURE, GLOBAL_METER); diff --git a/crates/hyperswitch_connectors/src/types.rs b/crates/hyperswitch_connectors/src/types.rs index 05279b53ef8..0d7ecfc3643 100644 --- a/crates/hyperswitch_connectors/src/types.rs +++ b/crates/hyperswitch_connectors/src/types.rs @@ -1,25 +1,27 @@ use hyperswitch_domain_models::{ router_data::{AccessToken, RouterData}, - router_flow_types::{AccessTokenAuth, Capture, PSync, Void}, + router_flow_types::{AccessTokenAuth, Capture, PSync, PreProcessing, Void}, router_request_types::{ - AccessTokenRequestData, PaymentsCancelData, PaymentsCaptureData, PaymentsSyncData, - RefundsData, + AccessTokenRequestData, PaymentsCancelData, PaymentsCaptureData, PaymentsPreProcessingData, + PaymentsSyncData, RefundsData, }, router_response_types::{PaymentsResponseData, RefundsResponseData}, }; -pub type PaymentsSyncResponseRouterData = +pub(crate) type PaymentsSyncResponseRouterData = ResponseRouterData; -pub type PaymentsCaptureResponseRouterData = +pub(crate) type PaymentsCaptureResponseRouterData = ResponseRouterData; pub(crate) type RefundsResponseRouterData = ResponseRouterData; pub(crate) type RefreshTokenRouterData = RouterData; -pub type PaymentsCancelResponseRouterData = +pub(crate) type PaymentsCancelResponseRouterData = ResponseRouterData; +pub(crate) type PaymentsPreprocessingResponseRouterData = + ResponseRouterData; // TODO: Remove `ResponseRouterData` from router crate after all the related type aliases are moved to this crate. pub struct ResponseRouterData { diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs index 8e57f8806e5..65705600d12 100644 --- a/crates/hyperswitch_connectors/src/utils.rs +++ b/crates/hyperswitch_connectors/src/utils.rs @@ -17,7 +17,9 @@ use common_utils::{ use error_stack::{report, ResultExt}; use hyperswitch_domain_models::{ payment_method_data::{Card, PaymentMethodData}, - router_data::{ApplePayPredecryptData, PaymentMethodToken, RecurringMandatePaymentData}, + router_data::{ + ApplePayPredecryptData, ErrorResponse, PaymentMethodToken, RecurringMandatePaymentData, + }, router_request_types::{ AuthenticationData, BrowserInformation, CompleteAuthorizeData, PaymentMethodTokenizationData, PaymentsAuthorizeData, PaymentsCancelData, @@ -25,12 +27,14 @@ use hyperswitch_domain_models::{ SetupMandateRequestData, }, }; -use hyperswitch_interfaces::{api, errors}; +use hyperswitch_interfaces::{api, consts, errors, types::Response}; use image::Luma; use masking::{ExposeInterface, PeekInterface, Secret}; use once_cell::sync::Lazy; use regex::Regex; +use router_env::{logger, metrics::add_attributes}; use serde::Serializer; +use serde_json::Value; use crate::types::RefreshTokenRouterData; @@ -92,7 +96,7 @@ pub(crate) fn to_currency_base_unit_asf64( } pub(crate) fn to_connector_meta_from_secret( - connector_meta: Option>, + connector_meta: Option>, ) -> Result where T: serde::de::DeserializeOwned, @@ -114,6 +118,39 @@ pub(crate) fn missing_field_err( }) } +pub(crate) fn handle_json_response_deserialization_failure( + res: Response, + connector: &'static str, +) -> CustomResult { + crate::metrics::RESPONSE_DESERIALIZATION_FAILURE.add( + &crate::metrics::CONTEXT, + 1, + &add_attributes([("connector", connector)]), + ); + + let response_data = String::from_utf8(res.response.to_vec()) + .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; + + // check for whether the response is in json format + match serde_json::from_str::(&response_data) { + // in case of unexpected response but in json format + Ok(_) => Err(errors::ConnectorError::ResponseDeserializationFailed)?, + // in case of unexpected response but in html or string format + Err(error_msg) => { + logger::error!(deserialization_error=?error_msg); + logger::error!("UNEXPECTED RESPONSE FROM CONNECTOR: {}", response_data); + Ok(ErrorResponse { + status_code: res.status_code, + code: consts::NO_ERROR_CODE.to_string(), + message: consts::UNSUPPORTED_ERROR_MESSAGE.to_string(), + reason: Some(response_data), + attempt_status: None, + connector_transaction_id: None, + }) + } + } +} + pub(crate) fn construct_not_implemented_error_report( capture_method: enums::CaptureMethod, connector_name: &str, @@ -138,7 +175,7 @@ pub(crate) fn get_unimplemented_payment_method_error_message(connector: &str) -> format!("{} through {}", SELECTED_PAYMENT_METHOD, connector) } -pub(crate) fn to_connector_meta(connector_meta: Option) -> Result +pub(crate) fn to_connector_meta(connector_meta: Option) -> Result where T: serde::de::DeserializeOwned, { @@ -1237,12 +1274,12 @@ impl PaymentsAuthorizeRequestData for PaymentsAuthorizeData { fn get_metadata_as_object(&self) -> Option { self.metadata.clone().and_then(|meta_data| match meta_data { - serde_json::Value::Null - | serde_json::Value::Bool(_) - | serde_json::Value::Number(_) - | serde_json::Value::String(_) - | serde_json::Value::Array(_) => None, - serde_json::Value::Object(_) => Some(meta_data.into()), + Value::Null + | Value::Bool(_) + | Value::Number(_) + | Value::String(_) + | Value::Array(_) => None, + Value::Object(_) => Some(meta_data.into()), }) } @@ -1447,6 +1484,8 @@ impl PaymentsCompleteAuthorizeRequestData for CompleteAuthorizeData { } pub trait PaymentsPreProcessingRequestData { + fn get_amount(&self) -> Result; + fn get_currency(&self) -> Result; fn is_auto_capture(&self) -> Result; } @@ -1460,6 +1499,12 @@ impl PaymentsPreProcessingRequestData for PaymentsPreProcessingData { } } } + fn get_amount(&self) -> Result { + self.amount.ok_or_else(missing_field_err("amount")) + } + fn get_currency(&self) -> Result { + self.currency.ok_or_else(missing_field_err("currency")) + } } pub trait BrowserInformationData { diff --git a/crates/hyperswitch_interfaces/src/consts.rs b/crates/hyperswitch_interfaces/src/consts.rs index 2ac6ac3c107..4607f1475b1 100644 --- a/crates/hyperswitch_interfaces/src/consts.rs +++ b/crates/hyperswitch_interfaces/src/consts.rs @@ -11,3 +11,6 @@ pub const ACCEPT_HEADER: &str = "text/html,application/json"; /// User agent for request send from backend server pub const USER_AGENT: &str = "Hyperswitch-Backend-Server"; + +/// Unsupported response type error message +pub const UNSUPPORTED_ERROR_MESSAGE: &str = "Unsupported response type"; diff --git a/crates/router/src/connector.rs b/crates/router/src/connector.rs index 2cbb9cdec56..b6a5002ca72 100644 --- a/crates/router/src/connector.rs +++ b/crates/router/src/connector.rs @@ -39,9 +39,7 @@ pub mod placetopay; pub mod plaid; pub mod prophetpay; pub mod rapyd; -pub mod razorpay; pub mod riskified; -pub mod shift4; pub mod signifyd; pub mod stripe; pub mod threedsecureio; @@ -61,9 +59,9 @@ pub use hyperswitch_connectors::connectors::{ dlocal::Dlocal, fiserv, fiserv::Fiserv, fiservemea, fiservemea::Fiservemea, fiuu, fiuu::Fiuu, globepay, globepay::Globepay, helcim, helcim::Helcim, mollie, mollie::Mollie, multisafepay, multisafepay::Multisafepay, nexixpay, nexixpay::Nexixpay, novalnet, novalnet::Novalnet, - powertranz, powertranz::Powertranz, square, square::Square, stax, stax::Stax, taxjar, - taxjar::Taxjar, thunes, thunes::Thunes, tsys, tsys::Tsys, volt, volt::Volt, worldline, - worldline::Worldline, + powertranz, powertranz::Powertranz, razorpay, razorpay::Razorpay, shift4, shift4::Shift4, + square, square::Square, stax, stax::Stax, taxjar, taxjar::Taxjar, thunes, thunes::Thunes, tsys, + tsys::Tsys, volt, volt::Volt, worldline, worldline::Worldline, }; #[cfg(feature = "dummy_connector")] @@ -77,7 +75,7 @@ pub use self::{ netcetera::Netcetera, nexinets::Nexinets, nmi::Nmi, noon::Noon, nuvei::Nuvei, opayo::Opayo, opennode::Opennode, paybox::Paybox, payeezy::Payeezy, payme::Payme, payone::Payone, paypal::Paypal, payu::Payu, placetopay::Placetopay, plaid::Plaid, prophetpay::Prophetpay, - rapyd::Rapyd, razorpay::Razorpay, riskified::Riskified, shift4::Shift4, signifyd::Signifyd, - stripe::Stripe, threedsecureio::Threedsecureio, trustpay::Trustpay, wellsfargo::Wellsfargo, + rapyd::Rapyd, riskified::Riskified, signifyd::Signifyd, stripe::Stripe, + threedsecureio::Threedsecureio, trustpay::Trustpay, wellsfargo::Wellsfargo, wellsfargopayout::Wellsfargopayout, wise::Wise, worldpay::Worldpay, zen::Zen, zsl::Zsl, }; 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 7fcba430a21..193f772d150 100644 --- a/crates/router/src/core/payments/connector_integration_v2_impls.rs +++ b/crates/router/src/core/payments/connector_integration_v2_impls.rs @@ -728,11 +728,9 @@ default_imp_for_new_connector_integration_payment!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -799,11 +797,9 @@ default_imp_for_new_connector_integration_refund!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -864,11 +860,9 @@ default_imp_for_new_connector_integration_connector_access_token!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -951,11 +945,9 @@ default_imp_for_new_connector_integration_accept_dispute!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1020,11 +1012,9 @@ default_imp_for_new_connector_integration_defend_dispute!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1073,11 +1063,9 @@ default_imp_for_new_connector_integration_submit_evidence!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1153,11 +1141,9 @@ default_imp_for_new_connector_integration_file_upload!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1313,11 +1299,9 @@ default_imp_for_new_connector_integration_payouts_create!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1385,11 +1369,9 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1457,11 +1439,9 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1529,11 +1509,9 @@ default_imp_for_new_connector_integration_payouts_cancel!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1601,11 +1579,9 @@ default_imp_for_new_connector_integration_payouts_quote!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1673,11 +1649,9 @@ default_imp_for_new_connector_integration_payouts_recipient!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1745,11 +1719,9 @@ default_imp_for_new_connector_integration_payouts_sync!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1817,11 +1789,9 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -1887,11 +1857,9 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2047,11 +2015,9 @@ default_imp_for_new_connector_integration_frm_sale!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2119,11 +2085,9 @@ default_imp_for_new_connector_integration_frm_checkout!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2191,11 +2155,9 @@ default_imp_for_new_connector_integration_frm_transaction!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2263,11 +2225,9 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2335,11 +2295,9 @@ default_imp_for_new_connector_integration_frm_record_return!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, @@ -2404,11 +2362,9 @@ default_imp_for_new_connector_integration_revoking_mandates!( connector::Placetopay, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Trustpay, connector::Threedsecureio, connector::Wellsfargo, diff --git a/crates/router/src/core/payments/flows.rs b/crates/router/src/core/payments/flows.rs index 494a44cdd3e..56967c27d4e 100644 --- a/crates/router/src/core/payments/flows.rs +++ b/crates/router/src/core/payments/flows.rs @@ -231,7 +231,6 @@ default_imp_for_complete_authorize!( connector::Placetopay, connector::Plaid, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, @@ -309,9 +308,7 @@ default_imp_for_webhook_source_verification!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Stripe, connector::Threedsecureio, @@ -390,9 +387,7 @@ default_imp_for_create_customer!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Threedsecureio, connector::Trustpay, @@ -462,9 +457,7 @@ default_imp_for_connector_redirect_response!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Threedsecureio, connector::Wellsfargo, @@ -631,9 +624,7 @@ default_imp_for_accept_dispute!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Stripe, connector::Threedsecureio, @@ -732,9 +723,7 @@ default_imp_for_file_upload!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Threedsecureio, connector::Trustpay, @@ -811,9 +800,7 @@ default_imp_for_submit_evidence!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Threedsecureio, connector::Trustpay, @@ -890,9 +877,7 @@ default_imp_for_defend_dispute!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, - connector::Shift4, connector::Signifyd, connector::Stripe, connector::Threedsecureio, @@ -981,7 +966,6 @@ default_imp_for_pre_processing_steps!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Threedsecureio, @@ -1015,7 +999,6 @@ default_imp_for_post_processing_steps!( connector::Nuvei, connector::Payme, connector::Paypal, - connector::Shift4, connector::Stripe, connector::Trustpay, connector::Aci, @@ -1055,8 +1038,7 @@ default_imp_for_post_processing_steps!( connector::Wise, connector::Worldpay, connector::Zen, - connector::Zsl, - connector::Razorpay + connector::Zsl ); macro_rules! default_imp_for_payouts { @@ -1125,10 +1107,10 @@ default_imp_for_payouts!( connector::Rapyd, connector::Razorpay, connector::Riskified, + connector::Shift4, connector::Signifyd, connector::Square, connector::Stax, - connector::Shift4, connector::Taxjar, connector::Threedsecureio, connector::Trustpay, @@ -1207,10 +1189,8 @@ default_imp_for_payouts_create!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1287,11 +1267,9 @@ default_imp_for_payouts_retrieve!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1371,11 +1349,9 @@ default_imp_for_payouts_eligibility!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1447,10 +1423,8 @@ default_imp_for_payouts_fulfill!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1526,10 +1500,8 @@ default_imp_for_payouts_cancel!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1606,11 +1578,9 @@ default_imp_for_payouts_quote!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1687,10 +1657,8 @@ default_imp_for_payouts_recipient!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1771,10 +1739,8 @@ default_imp_for_payouts_recipient_account!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1852,11 +1818,9 @@ default_imp_for_approve!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -1934,11 +1898,9 @@ default_imp_for_reject!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2020,10 +1982,10 @@ default_imp_for_fraud_check!( connector::Prophetpay, connector::Rapyd, connector::Razorpay, + connector::Shift4, connector::Square, connector::Stax, connector::Stripe, - connector::Shift4, connector::Taxjar, connector::Threedsecureio, connector::Trustpay, @@ -2107,9 +2069,7 @@ default_imp_for_frm_sale!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2189,9 +2149,7 @@ default_imp_for_frm_checkout!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2271,9 +2229,7 @@ default_imp_for_frm_transaction!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2353,9 +2309,7 @@ default_imp_for_frm_fulfillment!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2435,9 +2389,7 @@ default_imp_for_frm_record_return!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2514,11 +2466,9 @@ default_imp_for_incremental_authorization!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargopayout, @@ -2591,11 +2541,9 @@ default_imp_for_revoking_mandates!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wise, @@ -2749,11 +2697,11 @@ default_imp_for_connector_authentication!( connector::Rapyd, connector::Razorpay, connector::Riskified, + connector::Shift4, connector::Signifyd, connector::Square, connector::Stax, connector::Stripe, - connector::Shift4, connector::Taxjar, connector::Trustpay, connector::Tsys, @@ -2830,11 +2778,9 @@ default_imp_for_authorize_session_token!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2910,11 +2856,9 @@ default_imp_for_calculate_tax!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -2989,11 +2933,9 @@ default_imp_for_session_update!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo, @@ -3068,11 +3010,9 @@ default_imp_for_post_session_tokens!( connector::Plaid, connector::Prophetpay, connector::Rapyd, - connector::Razorpay, connector::Riskified, connector::Signifyd, connector::Stripe, - connector::Shift4, connector::Threedsecureio, connector::Trustpay, connector::Wellsfargo,