diff --git a/Cargo.lock b/Cargo.lock index c5eac1ef86..45556ef401 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3836,6 +3836,7 @@ version = "0.1.0" dependencies = [ "api_models", "async-trait", + "base64 0.22.0", "cards", "common_enums", "common_utils", @@ -3843,10 +3844,13 @@ dependencies = [ "hyperswitch_domain_models", "hyperswitch_interfaces", "masking", + "ring 0.17.8", "router_env", "serde", "serde_json", "strum 0.26.2", + "time", + "uuid", ] [[package]] diff --git a/crates/hyperswitch_connectors/Cargo.toml b/crates/hyperswitch_connectors/Cargo.toml index 0e620c6b9f..30671d43bd 100644 --- a/crates/hyperswitch_connectors/Cargo.toml +++ b/crates/hyperswitch_connectors/Cargo.toml @@ -11,10 +11,14 @@ payouts = ["hyperswitch_domain_models/payouts", "api_models/payouts", "hyperswit [dependencies] async-trait = "0.1.79" +base64 = "0.22.0" error-stack = "0.4.1" +ring = "0.17.8" serde = { version = "1.0.197", features = ["derive"] } serde_json = "1.0.115" strum = { version = "0.26", features = ["derive"] } +time = "0.3.35" +uuid = { version = "1.8.0", features = ["v4"] } # First party crates api_models = { version = "0.1.0", path = "../api_models", features = ["errors"] , default-features = false} diff --git a/crates/hyperswitch_connectors/src/connectors.rs b/crates/hyperswitch_connectors/src/connectors.rs index a2d78ede2b..0481939feb 100644 --- a/crates/hyperswitch_connectors/src/connectors.rs +++ b/crates/hyperswitch_connectors/src/connectors.rs @@ -1,2 +1,4 @@ +pub mod fiserv; pub mod helcim; -pub use self::helcim::Helcim; + +pub use self::{fiserv::Fiserv, helcim::Helcim}; diff --git a/crates/router/src/connector/fiserv.rs b/crates/hyperswitch_connectors/src/connectors/fiserv.rs similarity index 67% rename from crates/router/src/connector/fiserv.rs rename to crates/hyperswitch_connectors/src/connectors/fiserv.rs index 75147fe780..fc67cd2fde 100644 --- a/crates/router/src/connector/fiserv.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiserv.rs @@ -3,34 +3,45 @@ pub mod transformers; use std::fmt::Debug; use base64::Engine; -use common_utils::request::RequestContent; -use diesel_models::enums; +use common_enums::enums; +use common_utils::{ + errors::CustomResult, + ext_traits::BytesExt, + request::{Method, Request, RequestBuilder, RequestContent}, +}; use error_stack::{report, ResultExt}; -use masking::{ExposeInterface, PeekInterface}; +use hyperswitch_domain_models::{ + router_data::{AccessToken, ConnectorAuthType, ErrorResponse, RouterData}, + router_flow_types::{ + access_token_auth::AccessTokenAuth, + payments::{Authorize, Capture, PSync, PaymentMethodToken, Session, SetupMandate, Void}, + refunds::{Execute, RSync}, + }, + router_request_types::{ + AccessTokenRequestData, PaymentMethodTokenizationData, PaymentsAuthorizeData, + PaymentsCancelData, PaymentsCaptureData, PaymentsSessionData, PaymentsSyncData, + RefundsData, SetupMandateRequestData, + }, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types::{ + PaymentsAuthorizeRouterData, PaymentsCancelRouterData, PaymentsCaptureRouterData, + PaymentsSyncRouterData, RefundSyncRouterData, RefundsRouterData, + }, +}; +use hyperswitch_interfaces::{ + api::{self, ConnectorCommon, ConnectorCommonExt, ConnectorIntegration, ConnectorValidation}, + configs::Connectors, + consts, errors, + events::connector_api_logs::ConnectorEvent, + types, webhooks, +}; +use masking::{ExposeInterface, Mask, PeekInterface}; use ring::hmac; use time::OffsetDateTime; use transformers as fiserv; use uuid::Uuid; -use crate::{ - configs::settings, - connector::utils as connector_utils, - consts, - core::errors::{self, CustomResult}, - events::connector_api_logs::ConnectorEvent, - headers, logger, - services::{ - self, - api::ConnectorIntegration, - request::{self, Mask}, - ConnectorValidation, - }, - types::{ - self, - api::{self, ConnectorCommon, ConnectorCommonExt}, - }, - utils::BytesExt, -}; +use crate::{constants::headers, types::ResponseRouterData, utils}; #[derive(Debug, Clone)] pub struct Fiserv; @@ -51,8 +62,8 @@ impl Fiserv { let raw_signature = format!("{}{request_id}{timestamp}{payload}", api_key.peek()); let key = hmac::Key::new(hmac::HMAC_SHA256, api_secret.expose().as_bytes()); - let signature_value = - consts::BASE64_ENGINE.encode(hmac::sign(&key, raw_signature.as_bytes()).as_ref()); + let signature_value = common_utils::consts::BASE64_ENGINE + .encode(hmac::sign(&key, raw_signature.as_bytes()).as_ref()); Ok(signature_value) } } @@ -63,9 +74,9 @@ where { fn build_headers( &self, - req: &types::RouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &RouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { let timestamp = OffsetDateTime::now_utc().unix_timestamp_nanos() / 1_000_000; let auth: fiserv::FiservAuthType = fiserv::FiservAuthType::try_from(&req.connector_auth_type)?; @@ -112,13 +123,13 @@ impl ConnectorCommon for Fiserv { "application/json" } - fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str { + fn base_url<'a>(&self, connectors: &'a Connectors) -> &'a str { connectors.fiserv.base_url.as_ref() } fn get_auth_header( &self, - auth_type: &types::ConnectorAuthType, - ) -> CustomResult)>, errors::ConnectorError> { + auth_type: &ConnectorAuthType, + ) -> CustomResult)>, errors::ConnectorError> { let auth = fiserv::FiservAuthType::try_from(auth_type) .change_context(errors::ConnectorError::FailedToObtainAuthType)?; Ok(vec![( @@ -130,7 +141,7 @@ impl ConnectorCommon for Fiserv { &self, res: types::Response, event_builder: Option<&mut ConnectorEvent>, - ) -> CustomResult { + ) -> CustomResult { let response: fiserv::ErrorResponse = res .response .parse_struct("Fiserv ErrorResponse") @@ -144,21 +155,19 @@ impl ConnectorCommon for Fiserv { Ok(error .or(details) .and_then(|error_details| { - error_details - .first() - .map(|first_error| types::ErrorResponse { - code: first_error - .code - .to_owned() - .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), - message: first_error.message.to_owned(), - reason: first_error.field.to_owned(), - status_code: res.status_code, - attempt_status: None, - connector_transaction_id: None, - }) + error_details.first().map(|first_error| ErrorResponse { + code: first_error + .code + .to_owned() + .unwrap_or_else(|| consts::NO_ERROR_CODE.to_string()), + message: first_error.message.to_owned(), + reason: first_error.field.to_owned(), + status_code: res.status_code, + attempt_status: None, + connector_transaction_id: None, + }) }) - .unwrap_or(types::ErrorResponse { + .unwrap_or(ErrorResponse { code: consts::NO_ERROR_CODE.to_string(), message: consts::NO_ERROR_MESSAGE.to_string(), reason: None, @@ -179,7 +188,7 @@ impl ConnectorValidation for Fiserv { match capture_method { enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual => Ok(()), enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( - connector_utils::construct_not_implemented_error_report(capture_method, self.id()), + utils::construct_not_implemented_error_report(capture_method, self.id()), ), } } @@ -187,9 +196,7 @@ impl ConnectorValidation for Fiserv { impl api::ConnectorAccessToken for Fiserv {} -impl ConnectorIntegration - for Fiserv -{ +impl ConnectorIntegration for Fiserv { // Not Implemented (R) } @@ -197,12 +204,8 @@ impl api::Payment for Fiserv {} impl api::PaymentToken for Fiserv {} -impl - ConnectorIntegration< - api::PaymentMethodToken, - types::PaymentMethodTokenizationData, - types::PaymentsResponseData, - > for Fiserv +impl ConnectorIntegration + for Fiserv { // Not Implemented (R) } @@ -210,22 +213,12 @@ impl impl api::MandateSetup for Fiserv {} #[allow(dead_code)] -impl - ConnectorIntegration< - api::SetupMandate, - types::SetupMandateRequestData, - types::PaymentsResponseData, - > for Fiserv -{ +impl ConnectorIntegration for Fiserv { 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 Fiserv".to_string()) .into(), @@ -236,14 +229,12 @@ impl impl api::PaymentVoid for Fiserv {} #[allow(dead_code)] -impl ConnectorIntegration - for Fiserv -{ +impl ConnectorIntegration for Fiserv { fn get_headers( &self, - req: &types::PaymentsCancelRouterData, - connectors: &settings::Connectors, - ) -> CustomResult)>, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult)>, errors::ConnectorError> { self.build_headers(req, connectors) } @@ -253,8 +244,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( //The docs has this url wrong, cancels is the working endpoint @@ -265,8 +256,8 @@ impl ConnectorIntegration CustomResult { let connector_req = fiserv::FiservCancelRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -274,12 +265,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCancelRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let request = Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsVoidType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsVoidType::get_headers(self, req, connectors)?) @@ -294,17 +285,17 @@ impl ConnectorIntegration, res: types::Response, - ) -> CustomResult { + ) -> CustomResult { let response: fiserv::FiservPaymentsResponse = res .response .parse_struct("Fiserv PaymentResponse") .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, @@ -316,7 +307,7 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -324,14 +315,12 @@ impl ConnectorIntegration - for Fiserv -{ +impl ConnectorIntegration for Fiserv { 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) } @@ -341,8 +330,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ch/payments/v1/transaction-inquiry", @@ -352,8 +341,8 @@ impl ConnectorIntegration CustomResult { let connector_req = fiserv::FiservSyncRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -361,12 +350,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let request = Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsSyncType::get_url(self, req, connectors)?) .attach_default_headers() .headers(types::PaymentsSyncType::get_headers(self, req, connectors)?) @@ -380,17 +369,17 @@ impl ConnectorIntegration, res: types::Response, - ) -> CustomResult { + ) -> CustomResult { let response: fiserv::FiservSyncResponse = res .response .parse_struct("Fiserv PaymentSyncResponse") .change_context(errors::ConnectorError::ResponseDeserializationFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -402,20 +391,18 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } impl api::PaymentCapture for Fiserv {} -impl ConnectorIntegration - for Fiserv -{ +impl ConnectorIntegration for Fiserv { 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) } @@ -425,8 +412,8 @@ impl ConnectorIntegration CustomResult { let router_obj = fiserv::FiservRouterData::try_from(( &self.get_currency_unit(), @@ -440,12 +427,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsCaptureRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let request = 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( @@ -461,10 +448,10 @@ impl ConnectorIntegration, res: types::Response, - ) -> CustomResult { + ) -> CustomResult { let response: fiserv::FiservPaymentsResponse = res .response .parse_struct("Fiserv Payment Response") @@ -473,7 +460,7 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ch/payments/v1/charges", @@ -496,7 +483,7 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -504,21 +491,16 @@ impl ConnectorIntegration - for Fiserv -{ -} +impl ConnectorIntegration for Fiserv {} impl api::PaymentAuthorize for Fiserv {} -impl ConnectorIntegration - for Fiserv -{ +impl ConnectorIntegration for Fiserv { 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) } @@ -528,8 +510,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ch/payments/v1/charges", @@ -539,8 +521,8 @@ impl ConnectorIntegration CustomResult { let router_obj = fiserv::FiservRouterData::try_from(( &self.get_currency_unit(), @@ -554,12 +536,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &PaymentsAuthorizeRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let request = Some( - services::RequestBuilder::new() - .method(services::Method::Post) + RequestBuilder::new() + .method(Method::Post) .url(&types::PaymentsAuthorizeType::get_url( self, req, connectors, )?) @@ -578,17 +560,17 @@ impl ConnectorIntegration, res: types::Response, - ) -> CustomResult { + ) -> CustomResult { let response: fiserv::FiservPaymentsResponse = res .response .parse_struct("Fiserv PaymentResponse") .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, @@ -600,7 +582,7 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } @@ -610,12 +592,12 @@ impl api::RefundExecute for Fiserv {} impl api::RefundSync for Fiserv {} #[allow(dead_code)] -impl ConnectorIntegration for Fiserv { +impl ConnectorIntegration for Fiserv { 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) } fn get_content_type(&self) -> &'static str { @@ -623,8 +605,8 @@ impl ConnectorIntegration, - connectors: &settings::Connectors, + _req: &RefundsRouterData, + connectors: &Connectors, ) -> CustomResult { Ok(format!( "{}ch/payments/v1/refunds", @@ -633,8 +615,8 @@ impl ConnectorIntegration, - _connectors: &settings::Connectors, + req: &RefundsRouterData, + _connectors: &Connectors, ) -> CustomResult { let router_obj = fiserv::FiservRouterData::try_from(( &self.get_currency_unit(), @@ -647,11 +629,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,18 +648,18 @@ impl ConnectorIntegration, + data: &RefundsRouterData, event_builder: Option<&mut ConnectorEvent>, res: types::Response, - ) -> CustomResult, errors::ConnectorError> { - logger::debug!(target: "router::connector::fiserv", response=?res); + ) -> CustomResult, errors::ConnectorError> { + router_env::logger::debug!(target: "router::connector::fiserv", response=?res); let response: fiserv::RefundResponse = res.response .parse_struct("fiserv RefundResponse") .change_context(errors::ConnectorError::RequestEncodingFailed)?; event_builder.map(|i| i.set_response_body(&response)); router_env::logger::info!(connector_response=?response); - types::RouterData::try_from(types::ResponseRouterData { + RouterData::try_from(ResponseRouterData { response, data: data.clone(), http_code: res.status_code, @@ -688,18 +670,18 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } #[allow(dead_code)] -impl ConnectorIntegration for Fiserv { +impl ConnectorIntegration for Fiserv { 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) } @@ -709,8 +691,8 @@ impl ConnectorIntegration CustomResult { Ok(format!( "{}ch/payments/v1/transaction-inquiry", @@ -720,8 +702,8 @@ impl ConnectorIntegration CustomResult { let connector_req = fiserv::FiservSyncRequest::try_from(req)?; Ok(RequestContent::Json(Box::new(connector_req))) @@ -729,12 +711,12 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + req: &RefundSyncRouterData, + connectors: &Connectors, + ) -> CustomResult, errors::ConnectorError> { let request = 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)?) @@ -748,11 +730,11 @@ impl ConnectorIntegration, res: types::Response, - ) -> CustomResult { - logger::debug!(target: "router::connector::fiserv", response=?res); + ) -> CustomResult { + router_env::logger::debug!(target: "router::connector::fiserv", response=?res); let response: fiserv::FiservSyncResponse = res .response @@ -760,7 +742,7 @@ impl ConnectorIntegration, - ) -> CustomResult { + ) -> CustomResult { self.build_error_response(res, event_builder) } } #[async_trait::async_trait] -impl api::IncomingWebhook for Fiserv { +impl webhooks::IncomingWebhook for Fiserv { fn get_webhook_object_reference_id( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &webhooks::IncomingWebhookRequestDetails<'_>, ) -> CustomResult { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } fn get_webhook_event_type( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, - ) -> CustomResult { - Ok(api::IncomingWebhookEvent::EventNotSupported) + _request: &webhooks::IncomingWebhookRequestDetails<'_>, + ) -> CustomResult { + Ok(api_models::webhooks::IncomingWebhookEvent::EventNotSupported) } fn get_webhook_resource_object( &self, - _request: &api::IncomingWebhookRequestDetails<'_>, + _request: &webhooks::IncomingWebhookRequestDetails<'_>, ) -> CustomResult, errors::ConnectorError> { Err(report!(errors::ConnectorError::WebhooksNotImplemented)) } diff --git a/crates/router/src/connector/fiserv/transformers.rs b/crates/hyperswitch_connectors/src/connectors/fiserv/transformers.rs similarity index 88% rename from crates/router/src/connector/fiserv/transformers.rs rename to crates/hyperswitch_connectors/src/connectors/fiserv/transformers.rs index 1a149c6af7..0ae59d4526 100644 --- a/crates/router/src/connector/fiserv/transformers.rs +++ b/crates/hyperswitch_connectors/src/connectors/fiserv/transformers.rs @@ -1,15 +1,24 @@ +use common_enums::enums; use common_utils::{ext_traits::ValueExt, pii}; use error_stack::ResultExt; +use hyperswitch_domain_models::{ + payment_method_data::PaymentMethodData, + router_data::{ConnectorAuthType, RouterData}, + router_flow_types::refunds::{Execute, RSync}, + router_request_types::ResponseId, + router_response_types::{PaymentsResponseData, RefundsResponseData}, + types, +}; +use hyperswitch_interfaces::{api, errors}; +use masking::Secret; use serde::{Deserialize, Serialize}; use crate::{ - connector::utils::{ + types::{RefundsResponseRouterData, ResponseRouterData}, + utils::{ self, CardData as CardDataUtil, PaymentsCancelRequestData, PaymentsSyncRequestData, - RouterData, + RouterData as _, }, - core::errors, - pii::Secret, - types::{self, api, domain, storage::enums}, }; #[derive(Debug, Serialize)] @@ -166,7 +175,7 @@ impl TryFrom<&FiservRouterData<&types::PaymentsAuthorizeRouterData>> for FiservP pos_condition_code: TransactionInteractionPosConditionCode::CardNotPresentEcom, }; let source = match item.router_data.request.payment_method_data.clone() { - domain::PaymentMethodData::Card(ref ccard) => { + PaymentMethodData::Card(ref ccard) => { let card = CardData { card_data: ccard.card_number.clone(), expiration_month: ccard.card_exp_month.clone(), @@ -175,21 +184,21 @@ impl TryFrom<&FiservRouterData<&types::PaymentsAuthorizeRouterData>> for FiservP }; Source::PaymentCard { card } } - domain::PaymentMethodData::Wallet(_) - | domain::PaymentMethodData::PayLater(_) - | domain::PaymentMethodData::BankRedirect(_) - | domain::PaymentMethodData::BankDebit(_) - | domain::PaymentMethodData::CardRedirect(_) - | domain::PaymentMethodData::BankTransfer(_) - | domain::PaymentMethodData::Crypto(_) - | domain::PaymentMethodData::MandatePayment - | domain::PaymentMethodData::Reward - | domain::PaymentMethodData::RealTimePayment(_) - | domain::PaymentMethodData::Upi(_) - | domain::PaymentMethodData::Voucher(_) - | domain::PaymentMethodData::GiftCard(_) - | domain::PaymentMethodData::OpenBanking(_) - | domain::PaymentMethodData::CardToken(_) => { + PaymentMethodData::Wallet(_) + | PaymentMethodData::PayLater(_) + | PaymentMethodData::BankRedirect(_) + | PaymentMethodData::BankDebit(_) + | PaymentMethodData::CardRedirect(_) + | PaymentMethodData::BankTransfer(_) + | PaymentMethodData::Crypto(_) + | PaymentMethodData::MandatePayment + | PaymentMethodData::Reward + | PaymentMethodData::RealTimePayment(_) + | PaymentMethodData::Upi(_) + | PaymentMethodData::Voucher(_) + | PaymentMethodData::GiftCard(_) + | PaymentMethodData::OpenBanking(_) + | PaymentMethodData::CardToken(_) => { Err(errors::ConnectorError::NotImplemented( utils::get_unimplemented_payment_method_error_message("fiserv"), )) @@ -211,10 +220,10 @@ pub struct FiservAuthType { pub(super) api_secret: Secret, } -impl TryFrom<&types::ConnectorAuthType> for FiservAuthType { +impl TryFrom<&ConnectorAuthType> for FiservAuthType { type Error = error_stack::Report; - fn try_from(auth_type: &types::ConnectorAuthType) -> Result { - if let types::ConnectorAuthType::SignatureKey { + fn try_from(auth_type: &ConnectorAuthType) -> Result { + if let ConnectorAuthType::SignatureKey { api_key, key1, api_secret, @@ -348,20 +357,19 @@ pub struct TransactionProcessingDetails { transaction_id: String, } -impl - TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let gateway_resp = item.response.gateway_response; Ok(Self { status: enums::AttemptStatus::from(gateway_resp.transaction_state), - response: Ok(types::PaymentsResponseData::TransactionResponse { - resource_id: types::ResponseId::ConnectorTransactionId( + response: Ok(PaymentsResponseData::TransactionResponse { + resource_id: ResponseId::ConnectorTransactionId( gateway_resp.transaction_processing_details.transaction_id, ), redirection_data: None, @@ -379,12 +387,12 @@ impl } } -impl TryFrom> - for types::RouterData +impl TryFrom> + for RouterData { type Error = error_stack::Report; fn try_from( - item: types::ResponseRouterData, + item: ResponseRouterData, ) -> Result { let gateway_resp = match item.response.sync_responses.first() { Some(gateway_response) => gateway_response, @@ -395,8 +403,8 @@ impl TryFrom> - for types::RefundsRouterData +impl TryFrom> + for types::RefundsRouterData { type Error = error_stack::Report; fn try_from( - item: types::RefundsResponseRouterData, + item: RefundsResponseRouterData, ) -> Result { Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: item .response .gateway_response @@ -613,12 +621,12 @@ 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 { let gateway_resp = item .response @@ -626,7 +634,7 @@ impl TryFrom> .first() .ok_or(errors::ConnectorError::ResponseHandlingFailed)?; Ok(Self { - response: Ok(types::RefundsResponseData { + response: Ok(RefundsResponseData { connector_refund_id: gateway_resp .gateway_response .transaction_processing_details diff --git a/crates/hyperswitch_connectors/src/constants.rs b/crates/hyperswitch_connectors/src/constants.rs index 9f5285bd2e..8a5a2ff543 100644 --- a/crates/hyperswitch_connectors/src/constants.rs +++ b/crates/hyperswitch_connectors/src/constants.rs @@ -1,6 +1,9 @@ /// Header Constants pub(crate) mod headers { + pub(crate) const API_KEY: &str = "API-KEY"; pub(crate) const API_TOKEN: &str = "Api-Token"; + pub(crate) const AUTHORIZATION: &str = "Authorization"; pub(crate) const CONTENT_TYPE: &str = "Content-Type"; pub(crate) const IDEMPOTENCY_KEY: &str = "Idempotency-Key"; + pub(crate) const TIMESTAMP: &str = "Timestamp"; } diff --git a/crates/hyperswitch_connectors/src/default_implementations.rs b/crates/hyperswitch_connectors/src/default_implementations.rs index 2273b8c31d..d8e2e12131 100644 --- a/crates/hyperswitch_connectors/src/default_implementations.rs +++ b/crates/hyperswitch_connectors/src/default_implementations.rs @@ -81,7 +81,7 @@ macro_rules! default_imp_for_authorize_session_token { }; } -default_imp_for_authorize_session_token!(connectors::Helcim); +default_imp_for_authorize_session_token!(connectors::Fiserv, connectors::Helcim); use crate::connectors; macro_rules! default_imp_for_complete_authorize { @@ -99,7 +99,7 @@ macro_rules! default_imp_for_complete_authorize { }; } -default_imp_for_complete_authorize!(connectors::Helcim); +default_imp_for_complete_authorize!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_incremental_authorization { ($($path:ident::$connector:ident),*) => { @@ -116,7 +116,7 @@ macro_rules! default_imp_for_incremental_authorization { }; } -default_imp_for_incremental_authorization!(connectors::Helcim); +default_imp_for_incremental_authorization!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_create_customer { ($($path:ident::$connector:ident),*) => { @@ -133,7 +133,7 @@ macro_rules! default_imp_for_create_customer { }; } -default_imp_for_create_customer!(connectors::Helcim); +default_imp_for_create_customer!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_pre_processing_steps{ ($($path:ident::$connector:ident),*)=> { @@ -150,7 +150,7 @@ macro_rules! default_imp_for_pre_processing_steps{ }; } -default_imp_for_pre_processing_steps!(connectors::Helcim); +default_imp_for_pre_processing_steps!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_post_processing_steps{ ($($path:ident::$connector:ident),*)=> { @@ -167,7 +167,7 @@ macro_rules! default_imp_for_post_processing_steps{ }; } -default_imp_for_post_processing_steps!(connectors::Helcim); +default_imp_for_post_processing_steps!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_approve { ($($path:ident::$connector:ident),*) => { @@ -184,7 +184,7 @@ macro_rules! default_imp_for_approve { }; } -default_imp_for_approve!(connectors::Helcim); +default_imp_for_approve!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_reject { ($($path:ident::$connector:ident),*) => { @@ -201,7 +201,7 @@ macro_rules! default_imp_for_reject { }; } -default_imp_for_reject!(connectors::Helcim); +default_imp_for_reject!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_webhook_source_verification { ($($path:ident::$connector:ident),*) => { @@ -218,7 +218,7 @@ macro_rules! default_imp_for_webhook_source_verification { }; } -default_imp_for_webhook_source_verification!(connectors::Helcim); +default_imp_for_webhook_source_verification!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_accept_dispute { ($($path:ident::$connector:ident),*) => { @@ -236,7 +236,7 @@ macro_rules! default_imp_for_accept_dispute { }; } -default_imp_for_accept_dispute!(connectors::Helcim); +default_imp_for_accept_dispute!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_submit_evidence { ($($path:ident::$connector:ident),*) => { @@ -253,7 +253,7 @@ macro_rules! default_imp_for_submit_evidence { }; } -default_imp_for_submit_evidence!(connectors::Helcim); +default_imp_for_submit_evidence!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_defend_dispute { ($($path:ident::$connector:ident),*) => { @@ -270,7 +270,7 @@ macro_rules! default_imp_for_defend_dispute { }; } -default_imp_for_defend_dispute!(connectors::Helcim); +default_imp_for_defend_dispute!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_file_upload { ($($path:ident::$connector:ident),*) => { @@ -296,7 +296,7 @@ macro_rules! default_imp_for_file_upload { }; } -default_imp_for_file_upload!(connectors::Helcim); +default_imp_for_file_upload!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_create { @@ -315,7 +315,7 @@ macro_rules! default_imp_for_payouts_create { } #[cfg(feature = "payouts")] -default_imp_for_payouts_create!(connectors::Helcim); +default_imp_for_payouts_create!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_retrieve { @@ -334,7 +334,7 @@ macro_rules! default_imp_for_payouts_retrieve { } #[cfg(feature = "payouts")] -default_imp_for_payouts_retrieve!(connectors::Helcim); +default_imp_for_payouts_retrieve!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_eligibility { @@ -353,7 +353,7 @@ macro_rules! default_imp_for_payouts_eligibility { } #[cfg(feature = "payouts")] -default_imp_for_payouts_eligibility!(connectors::Helcim); +default_imp_for_payouts_eligibility!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_fulfill { @@ -372,7 +372,7 @@ macro_rules! default_imp_for_payouts_fulfill { } #[cfg(feature = "payouts")] -default_imp_for_payouts_fulfill!(connectors::Helcim); +default_imp_for_payouts_fulfill!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_cancel { @@ -391,7 +391,7 @@ macro_rules! default_imp_for_payouts_cancel { } #[cfg(feature = "payouts")] -default_imp_for_payouts_cancel!(connectors::Helcim); +default_imp_for_payouts_cancel!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_quote { @@ -410,7 +410,7 @@ macro_rules! default_imp_for_payouts_quote { } #[cfg(feature = "payouts")] -default_imp_for_payouts_quote!(connectors::Helcim); +default_imp_for_payouts_quote!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_recipient { @@ -429,7 +429,7 @@ macro_rules! default_imp_for_payouts_recipient { } #[cfg(feature = "payouts")] -default_imp_for_payouts_recipient!(connectors::Helcim); +default_imp_for_payouts_recipient!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_payouts_recipient_account { @@ -448,7 +448,7 @@ macro_rules! default_imp_for_payouts_recipient_account { } #[cfg(feature = "payouts")] -default_imp_for_payouts_recipient_account!(connectors::Helcim); +default_imp_for_payouts_recipient_account!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_frm_sale { @@ -467,7 +467,7 @@ macro_rules! default_imp_for_frm_sale { } #[cfg(feature = "frm")] -default_imp_for_frm_sale!(connectors::Helcim); +default_imp_for_frm_sale!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_frm_checkout { @@ -486,7 +486,7 @@ macro_rules! default_imp_for_frm_checkout { } #[cfg(feature = "frm")] -default_imp_for_frm_checkout!(connectors::Helcim); +default_imp_for_frm_checkout!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_frm_transaction { @@ -505,7 +505,7 @@ macro_rules! default_imp_for_frm_transaction { } #[cfg(feature = "frm")] -default_imp_for_frm_transaction!(connectors::Helcim); +default_imp_for_frm_transaction!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_frm_fulfillment { @@ -524,7 +524,7 @@ macro_rules! default_imp_for_frm_fulfillment { } #[cfg(feature = "frm")] -default_imp_for_frm_fulfillment!(connectors::Helcim); +default_imp_for_frm_fulfillment!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_frm_record_return { @@ -543,7 +543,7 @@ macro_rules! default_imp_for_frm_record_return { } #[cfg(feature = "frm")] -default_imp_for_frm_record_return!(connectors::Helcim); +default_imp_for_frm_record_return!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_revoking_mandates { ($($path:ident::$connector:ident),*) => { @@ -559,4 +559,4 @@ macro_rules! default_imp_for_revoking_mandates { }; } -default_imp_for_revoking_mandates!(connectors::Helcim); +default_imp_for_revoking_mandates!(connectors::Fiserv, connectors::Helcim); diff --git a/crates/hyperswitch_connectors/src/default_implementations_v2.rs b/crates/hyperswitch_connectors/src/default_implementations_v2.rs index df72d3d9c4..f420447fd7 100644 --- a/crates/hyperswitch_connectors/src/default_implementations_v2.rs +++ b/crates/hyperswitch_connectors/src/default_implementations_v2.rs @@ -180,7 +180,7 @@ macro_rules! default_imp_for_new_connector_integration_payment { }; } -default_imp_for_new_connector_integration_payment!(connectors::Helcim); +default_imp_for_new_connector_integration_payment!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_new_connector_integration_refund { ($($path:ident::$connector:ident),*) => { @@ -198,7 +198,7 @@ macro_rules! default_imp_for_new_connector_integration_refund { }; } -default_imp_for_new_connector_integration_refund!(connectors::Helcim); +default_imp_for_new_connector_integration_refund!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_new_connector_integration_connector_access_token { ($($path:ident::$connector:ident),*) => { @@ -211,7 +211,10 @@ macro_rules! default_imp_for_new_connector_integration_connector_access_token { }; } -default_imp_for_new_connector_integration_connector_access_token!(connectors::Helcim); +default_imp_for_new_connector_integration_connector_access_token!( + connectors::Fiserv, + connectors::Helcim +); macro_rules! default_imp_for_new_connector_integration_accept_dispute { ($($path:ident::$connector:ident),*) => { @@ -230,7 +233,7 @@ macro_rules! default_imp_for_new_connector_integration_accept_dispute { }; } -default_imp_for_new_connector_integration_accept_dispute!(connectors::Helcim); +default_imp_for_new_connector_integration_accept_dispute!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_new_connector_integration_submit_evidence { ($($path:ident::$connector:ident),*) => { @@ -248,7 +251,7 @@ macro_rules! default_imp_for_new_connector_integration_submit_evidence { }; } -default_imp_for_new_connector_integration_submit_evidence!(connectors::Helcim); +default_imp_for_new_connector_integration_submit_evidence!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_new_connector_integration_defend_dispute { ($($path:ident::$connector:ident),*) => { @@ -266,7 +269,7 @@ macro_rules! default_imp_for_new_connector_integration_defend_dispute { }; } -default_imp_for_new_connector_integration_defend_dispute!(connectors::Helcim); +default_imp_for_new_connector_integration_defend_dispute!(connectors::Fiserv, connectors::Helcim); macro_rules! default_imp_for_new_connector_integration_file_upload { ($($path:ident::$connector:ident),*) => { @@ -294,7 +297,7 @@ macro_rules! default_imp_for_new_connector_integration_file_upload { }; } -default_imp_for_new_connector_integration_file_upload!(connectors::Helcim); +default_imp_for_new_connector_integration_file_upload!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_create { @@ -314,7 +317,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_create { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_create!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_create!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_eligibility { @@ -334,7 +337,10 @@ macro_rules! default_imp_for_new_connector_integration_payouts_eligibility { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_eligibility!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_eligibility!( + connectors::Fiserv, + connectors::Helcim +); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_fulfill { @@ -354,7 +360,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_fulfill { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_fulfill!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_fulfill!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_cancel { @@ -374,7 +380,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_cancel { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_cancel!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_cancel!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_quote { @@ -394,7 +400,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_quote { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_quote!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_quote!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_recipient { @@ -414,7 +420,10 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_recipient!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_recipient!( + connectors::Fiserv, + connectors::Helcim +); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_sync { @@ -434,7 +443,7 @@ macro_rules! default_imp_for_new_connector_integration_payouts_sync { } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_sync!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_sync!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "payouts")] macro_rules! default_imp_for_new_connector_integration_payouts_recipient_account { @@ -454,7 +463,10 @@ macro_rules! default_imp_for_new_connector_integration_payouts_recipient_account } #[cfg(feature = "payouts")] -default_imp_for_new_connector_integration_payouts_recipient_account!(connectors::Helcim); +default_imp_for_new_connector_integration_payouts_recipient_account!( + connectors::Fiserv, + connectors::Helcim +); macro_rules! default_imp_for_new_connector_integration_webhook_source_verification { ($($path:ident::$connector:ident),*) => { @@ -472,7 +484,10 @@ macro_rules! default_imp_for_new_connector_integration_webhook_source_verificati }; } -default_imp_for_new_connector_integration_webhook_source_verification!(connectors::Helcim); +default_imp_for_new_connector_integration_webhook_source_verification!( + connectors::Fiserv, + connectors::Helcim +); #[cfg(feature = "frm")] macro_rules! default_imp_for_new_connector_integration_frm_sale { @@ -492,7 +507,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_sale { } #[cfg(feature = "frm")] -default_imp_for_new_connector_integration_frm_sale!(connectors::Helcim); +default_imp_for_new_connector_integration_frm_sale!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_new_connector_integration_frm_checkout { @@ -512,7 +527,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_checkout { } #[cfg(feature = "frm")] -default_imp_for_new_connector_integration_frm_checkout!(connectors::Helcim); +default_imp_for_new_connector_integration_frm_checkout!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_new_connector_integration_frm_transaction { @@ -532,7 +547,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_transaction { } #[cfg(feature = "frm")] -default_imp_for_new_connector_integration_frm_transaction!(connectors::Helcim); +default_imp_for_new_connector_integration_frm_transaction!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_new_connector_integration_frm_fulfillment { @@ -552,7 +567,7 @@ macro_rules! default_imp_for_new_connector_integration_frm_fulfillment { } #[cfg(feature = "frm")] -default_imp_for_new_connector_integration_frm_fulfillment!(connectors::Helcim); +default_imp_for_new_connector_integration_frm_fulfillment!(connectors::Fiserv, connectors::Helcim); #[cfg(feature = "frm")] macro_rules! default_imp_for_new_connector_integration_frm_record_return { @@ -572,7 +587,10 @@ macro_rules! default_imp_for_new_connector_integration_frm_record_return { } #[cfg(feature = "frm")] -default_imp_for_new_connector_integration_frm_record_return!(connectors::Helcim); +default_imp_for_new_connector_integration_frm_record_return!( + connectors::Fiserv, + connectors::Helcim +); macro_rules! default_imp_for_new_connector_integration_revoking_mandates { ($($path:ident::$connector:ident),*) => { @@ -589,4 +607,7 @@ macro_rules! default_imp_for_new_connector_integration_revoking_mandates { }; } -default_imp_for_new_connector_integration_revoking_mandates!(connectors::Helcim); +default_imp_for_new_connector_integration_revoking_mandates!( + connectors::Fiserv, + connectors::Helcim +); diff --git a/crates/hyperswitch_connectors/src/utils.rs b/crates/hyperswitch_connectors/src/utils.rs index 0b8ecac9b0..40f98b6efd 100644 --- a/crates/hyperswitch_connectors/src/utils.rs +++ b/crates/hyperswitch_connectors/src/utils.rs @@ -1,7 +1,7 @@ use api_models::payments::{self, Address, AddressDetails, OrderDetailsWithAmount, PhoneDetails}; use common_enums::{enums, enums::FutureUsage}; use common_utils::{ - errors::ReportSwitchExt, + errors::{CustomResult, ReportSwitchExt}, ext_traits::{OptionExt, ValueExt}, id_type, pii::{self, Email, IpAddress}, @@ -12,11 +12,12 @@ use hyperswitch_domain_models::{ router_data::{PaymentMethodToken, RecurringMandatePaymentData}, router_request_types::{ AuthenticationData, BrowserInformation, PaymentsAuthorizeData, PaymentsCancelData, - PaymentsCaptureData, RefundsData, SetupMandateRequestData, + PaymentsCaptureData, PaymentsSyncData, RefundsData, ResponseId, SetupMandateRequestData, }, }; use hyperswitch_interfaces::{api, errors}; use masking::{ExposeInterface, PeekInterface, Secret}; +use serde::Serializer; type Error = error_stack::Report; @@ -31,6 +32,27 @@ pub(crate) fn construct_not_supported_error_report( .into() } +pub(crate) fn get_amount_as_string( + currency_unit: &api::CurrencyUnit, + amount: i64, + currency: enums::Currency, +) -> Result> { + let amount = match currency_unit { + api::CurrencyUnit::Minor => amount.to_string(), + api::CurrencyUnit::Base => to_currency_base_unit(amount, currency)?, + }; + Ok(amount) +} + +pub(crate) fn to_currency_base_unit( + amount: i64, + currency: enums::Currency, +) -> Result> { + currency + .to_currency_base_unit(amount) + .change_context(errors::ConnectorError::ParsingFailed) +} + pub(crate) fn get_amount_as_f64( currency_unit: &api::CurrencyUnit, amount: i64, @@ -54,6 +76,18 @@ pub(crate) fn to_currency_base_unit_asf64( .change_context(errors::ConnectorError::ParsingFailed) } +pub(crate) fn to_connector_meta_from_secret( + connector_meta: Option>, +) -> Result +where + T: serde::de::DeserializeOwned, +{ + let connector_meta_secret = + connector_meta.ok_or_else(missing_field_err("connector_meta_data"))?; + let json = connector_meta_secret.expose(); + json.parse_value(std::any::type_name::()).switch() +} + pub(crate) fn missing_field_err( message: &'static str, ) -> Box error_stack::Report + '_> { @@ -65,6 +99,24 @@ pub(crate) fn missing_field_err( }) } +pub(crate) fn construct_not_implemented_error_report( + capture_method: enums::CaptureMethod, + connector_name: &str, +) -> error_stack::Report { + errors::ConnectorError::NotImplemented(format!("{} for {}", capture_method, connector_name)) + .into() +} + +pub(crate) fn str_to_f32(value: &str, serializer: S) -> Result +where + S: Serializer, +{ + let float_value = value.parse::().map_err(|_| { + serde::ser::Error::custom("Invalid string, cannot be converted to float value") + })?; + serializer.serialize_f64(float_value) +} + pub(crate) const SELECTED_PAYMENT_METHOD: &str = "Selected payment method"; pub(crate) fn get_unimplemented_payment_method_error_message(connector: &str) -> String { @@ -943,6 +995,33 @@ impl PaymentsCaptureRequestData for PaymentsCaptureData { } } +pub trait PaymentsSyncRequestData { + fn is_auto_capture(&self) -> Result; + fn get_connector_transaction_id(&self) -> CustomResult; +} + +impl PaymentsSyncRequestData for PaymentsSyncData { + fn is_auto_capture(&self) -> Result { + match self.capture_method { + Some(enums::CaptureMethod::Automatic) | None => Ok(true), + Some(enums::CaptureMethod::Manual) => Ok(false), + Some(_) => Err(errors::ConnectorError::CaptureMethodNotSupported.into()), + } + } + fn get_connector_transaction_id(&self) -> CustomResult { + match self.connector_transaction_id.clone() { + ResponseId::ConnectorTransactionId(txn_id) => Ok(txn_id), + _ => Err( + common_utils::errors::ValidationError::IncorrectValueProvided { + field_name: "connector_transaction_id", + }, + ) + .attach_printable("Expected connector transaction ID not found") + .change_context(errors::ConnectorError::MissingConnectorTransactionID)?, + } + } +} + pub trait PaymentsCancelRequestData { fn get_amount(&self) -> Result; fn get_currency(&self) -> Result; diff --git a/crates/router/src/connector.rs b/crates/router/src/connector.rs index 365b0ca87a..a421c93120 100644 --- a/crates/router/src/connector.rs +++ b/crates/router/src/connector.rs @@ -21,7 +21,6 @@ pub mod dlocal; #[cfg(feature = "dummy_connector")] pub mod dummyconnector; pub mod ebanx; -pub mod fiserv; pub mod forte; pub mod globalpay; pub mod globepay; @@ -69,7 +68,7 @@ pub mod worldpay; pub mod zen; pub mod zsl; -pub use hyperswitch_connectors::connectors::{helcim, helcim::Helcim}; +pub use hyperswitch_connectors::connectors::{fiserv, fiserv::Fiserv, helcim, helcim::Helcim}; #[cfg(feature = "dummy_connector")] pub use self::dummyconnector::DummyConnector; @@ -79,14 +78,14 @@ pub use self::{ bankofamerica::Bankofamerica, billwerk::Billwerk, bitpay::Bitpay, bluesnap::Bluesnap, boku::Boku, braintree::Braintree, cashtocode::Cashtocode, checkout::Checkout, coinbase::Coinbase, cryptopay::Cryptopay, cybersource::Cybersource, datatrans::Datatrans, - dlocal::Dlocal, ebanx::Ebanx, fiserv::Fiserv, forte::Forte, globalpay::Globalpay, - globepay::Globepay, gocardless::Gocardless, gpayments::Gpayments, iatapay::Iatapay, - itaubank::Itaubank, klarna::Klarna, mifinity::Mifinity, mollie::Mollie, - multisafepay::Multisafepay, netcetera::Netcetera, nexinets::Nexinets, nmi::Nmi, noon::Noon, - nuvei::Nuvei, opayo::Opayo, opennode::Opennode, payeezy::Payeezy, payme::Payme, payone::Payone, - paypal::Paypal, payu::Payu, placetopay::Placetopay, plaid::Plaid, powertranz::Powertranz, - prophetpay::Prophetpay, rapyd::Rapyd, razorpay::Razorpay, riskified::Riskified, shift4::Shift4, - signifyd::Signifyd, square::Square, stax::Stax, stripe::Stripe, threedsecureio::Threedsecureio, - trustpay::Trustpay, tsys::Tsys, volt::Volt, wellsfargo::Wellsfargo, wise::Wise, - worldline::Worldline, worldpay::Worldpay, zen::Zen, zsl::Zsl, + dlocal::Dlocal, ebanx::Ebanx, forte::Forte, globalpay::Globalpay, globepay::Globepay, + gocardless::Gocardless, gpayments::Gpayments, iatapay::Iatapay, itaubank::Itaubank, + klarna::Klarna, mifinity::Mifinity, mollie::Mollie, multisafepay::Multisafepay, + netcetera::Netcetera, nexinets::Nexinets, nmi::Nmi, noon::Noon, nuvei::Nuvei, opayo::Opayo, + opennode::Opennode, payeezy::Payeezy, payme::Payme, payone::Payone, paypal::Paypal, payu::Payu, + placetopay::Placetopay, plaid::Plaid, powertranz::Powertranz, prophetpay::Prophetpay, + rapyd::Rapyd, razorpay::Razorpay, riskified::Riskified, shift4::Shift4, signifyd::Signifyd, + square::Square, stax::Stax, stripe::Stripe, threedsecureio::Threedsecureio, trustpay::Trustpay, + tsys::Tsys, volt::Volt, wellsfargo::Wellsfargo, wise::Wise, worldline::Worldline, + 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 dbb50b1803..019020b0b5 100644 --- a/crates/router/src/core/payments/connector_integration_v2_impls.rs +++ b/crates/router/src/core/payments/connector_integration_v2_impls.rs @@ -655,7 +655,6 @@ default_imp_for_new_connector_integration_payment!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -741,7 +740,6 @@ default_imp_for_new_connector_integration_refund!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -822,7 +820,6 @@ default_imp_for_new_connector_integration_connector_access_token!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -925,7 +922,6 @@ default_imp_for_new_connector_integration_accept_dispute!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1010,7 +1006,6 @@ default_imp_for_new_connector_integration_defend_dispute!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1079,7 +1074,6 @@ default_imp_for_new_connector_integration_submit_evidence!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1175,7 +1169,6 @@ default_imp_for_new_connector_integration_file_upload!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1342,7 +1335,6 @@ default_imp_for_new_connector_integration_payouts_create!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1430,7 +1422,6 @@ default_imp_for_new_connector_integration_payouts_eligibility!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1518,7 +1509,6 @@ default_imp_for_new_connector_integration_payouts_fulfill!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1606,7 +1596,6 @@ default_imp_for_new_connector_integration_payouts_cancel!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1694,7 +1683,6 @@ default_imp_for_new_connector_integration_payouts_quote!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1782,7 +1770,6 @@ default_imp_for_new_connector_integration_payouts_recipient!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1870,7 +1857,6 @@ default_imp_for_new_connector_integration_payouts_sync!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1958,7 +1944,6 @@ default_imp_for_new_connector_integration_payouts_recipient_account!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2044,7 +2029,6 @@ default_imp_for_new_connector_integration_webhook_source_verification!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2211,7 +2195,6 @@ default_imp_for_new_connector_integration_frm_sale!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2299,7 +2282,6 @@ default_imp_for_new_connector_integration_frm_checkout!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2387,7 +2369,6 @@ default_imp_for_new_connector_integration_frm_transaction!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2475,7 +2456,6 @@ default_imp_for_new_connector_integration_frm_fulfillment!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2563,7 +2543,6 @@ default_imp_for_new_connector_integration_frm_record_return!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2648,7 +2627,6 @@ default_imp_for_new_connector_integration_revoking_mandates!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, diff --git a/crates/router/src/core/payments/flows.rs b/crates/router/src/core/payments/flows.rs index 32d739bcf9..6756b9ff5d 100644 --- a/crates/router/src/core/payments/flows.rs +++ b/crates/router/src/core/payments/flows.rs @@ -201,7 +201,6 @@ default_imp_for_complete_authorize!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globepay, connector::Gocardless, @@ -287,7 +286,6 @@ default_imp_for_webhook_source_verification!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -383,7 +381,6 @@ default_imp_for_create_customer!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -643,7 +640,6 @@ default_imp_for_accept_dispute!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -761,7 +757,6 @@ default_imp_for_file_upload!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -856,7 +851,6 @@ default_imp_for_submit_evidence!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -951,7 +945,6 @@ default_imp_for_defend_dispute!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Globepay, connector::Forte, connector::Globalpay, @@ -1062,7 +1055,6 @@ default_imp_for_pre_processing_steps!( connector::Ebanx, connector::Iatapay, connector::Itaubank, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1144,7 +1136,6 @@ default_imp_for_post_processing_steps!( connector::Ebanx, connector::Iatapay, connector::Itaubank, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1303,7 +1294,6 @@ default_imp_for_payouts_create!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1398,7 +1388,6 @@ default_imp_for_payouts_retrieve!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1496,7 +1485,6 @@ default_imp_for_payouts_eligibility!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1589,7 +1577,6 @@ default_imp_for_payouts_fulfill!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1681,7 +1668,6 @@ default_imp_for_payouts_cancel!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1776,7 +1762,6 @@ default_imp_for_payouts_quote!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1872,7 +1857,6 @@ default_imp_for_payouts_recipient!( connector::Coinbase, connector::Datatrans, connector::Dlocal, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -1971,7 +1955,6 @@ default_imp_for_payouts_recipient_account!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2067,7 +2050,6 @@ default_imp_for_approve!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2164,7 +2146,6 @@ default_imp_for_reject!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2343,7 +2324,6 @@ default_imp_for_frm_sale!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2440,7 +2420,6 @@ default_imp_for_frm_checkout!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2537,7 +2516,6 @@ default_imp_for_frm_transaction!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2634,7 +2612,6 @@ default_imp_for_frm_fulfillment!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2731,7 +2708,6 @@ default_imp_for_frm_record_return!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2825,7 +2801,6 @@ default_imp_for_incremental_authorization!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -2919,7 +2894,6 @@ default_imp_for_revoking_mandates!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay, @@ -3166,7 +3140,6 @@ default_imp_for_authorize_session_token!( connector::Datatrans, connector::Dlocal, connector::Ebanx, - connector::Fiserv, connector::Forte, connector::Globalpay, connector::Globepay,