diff --git a/Cargo.lock b/Cargo.lock index e8a55d61a9..ce46b6c6e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -516,18 +516,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1340,7 +1340,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1606,7 +1606,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1628,7 +1628,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core 0.20.1", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1644,22 +1644,6 @@ dependencies = [ "parking_lot_core", ] -[[package]] -name = "data_models" -version = "0.1.0" -dependencies = [ - "api_models", - "async-trait", - "common_enums", - "common_utils", - "error-stack", - "serde", - "serde_json", - "strum 0.25.0", - "thiserror", - "time 0.3.22", -] - [[package]] name = "deadpool" version = "0.9.5" @@ -1738,7 +1722,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1768,7 +1752,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -1840,9 +1824,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.13" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" [[package]] name = "either" @@ -2201,7 +2185,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -3014,9 +2998,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6e72583bf6830c956235bff0d5afec8cf2952f579ebad18ae7821a917d950f" +checksum = "206bf83f415b0579fd885fe0804eb828e727636657dc1bf73d80d2f1218e14a1" dependencies = [ "async-io", "async-lock", @@ -3182,7 +3166,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -3396,7 +3380,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -3447,7 +3431,7 @@ checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -3658,9 +3642,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -3984,7 +3968,7 @@ dependencies = [ "clap", "common_utils", "config", - "data_models", + "crc32fast", "derive_deref", "diesel", "diesel_models", @@ -4004,6 +3988,7 @@ dependencies = [ "maud", "mimalloc", "mime", + "moka", "nanoid", "num_cpus", "once_cell", @@ -4111,7 +4096,7 @@ dependencies = [ "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.29", + "syn 2.0.28", "walkdir", ] @@ -4319,7 +4304,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4382,7 +4367,7 @@ checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4431,7 +4416,7 @@ dependencies = [ "darling 0.20.1", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4456,7 +4441,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4603,24 +4588,11 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" name = "storage_impl" version = "0.1.0" dependencies = [ - "api_models", "async-bb8-diesel", "async-trait", "bb8", - "common_utils", - "crc32fast", - "data_models", "diesel", - "diesel_models", - "dyn-clone", - "error-stack", - "futures", "masking", - "moka", - "once_cell", - "redis_interface", - "router_env", - "tokio", ] [[package]] @@ -4679,7 +4651,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4701,9 +4673,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -4862,7 +4834,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -4976,7 +4948,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -5380,7 +5352,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", ] [[package]] @@ -5519,7 +5491,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -5553,7 +5525,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/connector-template/mod.rs b/connector-template/mod.rs index af58abbf92..3a66db6682 100644 --- a/connector-template/mod.rs +++ b/connector-template/mod.rs @@ -10,7 +10,7 @@ use crate::{ core::{ errors::{self, CustomResult}, }, - headers, services::{self, ConnectorIntegration, request::{self, Mask}}, + headers, services::{self, ConnectorIntegration, ConnectorValidation, request::{self, Mask}}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, @@ -102,6 +102,11 @@ impl ConnectorCommon for {{project-name | downcase | pascal_case}} { } } +impl ConnectorValidation for {{project-name | downcase | pascal_case}} +{ + //TODO: implement functions when support enabled +} + impl ConnectorIntegration< api::Session, @@ -156,6 +161,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/aci.rs b/crates/router/src/connector/aci.rs index ab6a6a4fb4..5e13bf31a9 100644 --- a/crates/router/src/connector/aci.rs +++ b/crates/router/src/connector/aci.rs @@ -14,6 +14,7 @@ use crate::{ services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -79,6 +80,8 @@ impl ConnectorCommon for Aci { } } +impl ConnectorValidation for Aci {} + impl api::Payment for Aci {} impl api::PaymentAuthorize for Aci {} @@ -295,6 +298,7 @@ impl >, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/adyen.rs b/crates/router/src/connector/adyen.rs index df47395f21..bb95792039 100644 --- a/crates/router/src/connector/adyen.rs +++ b/crates/router/src/connector/adyen.rs @@ -4,7 +4,7 @@ use std::fmt::Debug; use api_models::webhooks::IncomingWebhookEvent; use base64::Engine; -use diesel_models::enums as storage_enums; +use diesel_models::{enums as storage_enums, enums}; use error_stack::{IntoReport, ResultExt}; use ring::hmac; use router_env::{instrument, tracing}; @@ -12,6 +12,7 @@ use router_env::{instrument, tracing}; use self::transformers as adyen; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::{ self, @@ -22,6 +23,7 @@ use crate::{ services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -72,6 +74,21 @@ impl ConnectorCommon for Adyen { } } +impl ConnectorValidation for Adyen { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Adyen {} impl api::PaymentAuthorize for Adyen {} impl api::PaymentSync for Adyen {} @@ -582,6 +599,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; check_for_payment_method_balance(req)?; Ok(Some( services::RequestBuilder::new() diff --git a/crates/router/src/connector/airwallex.rs b/crates/router/src/connector/airwallex.rs index 2fb171eb9f..8f3cf8efeb 100644 --- a/crates/router/src/connector/airwallex.rs +++ b/crates/router/src/connector/airwallex.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use common_utils::ext_traits::{ByteSliceExt, ValueExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as airwallex; @@ -10,6 +11,7 @@ use transformers as airwallex; use super::utils::{AccessTokenRequestInfo, RefundsRequestData}; use crate::{ configs::settings, + connector::utils as connector_utils, core::{ errors::{self, CustomResult}, payments, @@ -18,7 +20,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -91,6 +93,21 @@ impl ConnectorCommon for Airwallex { } } +impl ConnectorValidation for Airwallex { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Airwallex {} impl api::PaymentsCompleteAuthorize for Airwallex {} impl api::PreVerify for Airwallex {} @@ -242,6 +259,7 @@ impl req: &types::PaymentsInitRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/authorizedotnet.rs b/crates/router/src/connector/authorizedotnet.rs index 5669c7843d..44eee1e181 100644 --- a/crates/router/src/connector/authorizedotnet.rs +++ b/crates/router/src/connector/authorizedotnet.rs @@ -3,18 +3,20 @@ pub mod transformers; use std::fmt::Debug; use common_utils::{crypto, ext_traits::ByteSliceExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as authorizedotnet; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::{ errors::{self, CustomResult}, payments, }, headers, - services::{self, request, ConnectorIntegration}, + services::{self, request, ConnectorIntegration, ConnectorValidation}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt, PaymentsCompleteAuthorize}, @@ -56,6 +58,21 @@ impl ConnectorCommon for Authorizedotnet { } } +impl ConnectorValidation for Authorizedotnet { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Authorizedotnet {} impl api::PaymentAuthorize for Authorizedotnet {} impl api::PaymentSync for Authorizedotnet {} @@ -313,6 +330,7 @@ impl ConnectorIntegration, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/bambora.rs b/crates/router/src/connector/bambora.rs index 19c3acaf42..a8f660bb73 100644 --- a/crates/router/src/connector/bambora.rs +++ b/crates/router/src/connector/bambora.rs @@ -2,13 +2,17 @@ pub mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as bambora; use super::utils::RefundsRequestData; use crate::{ configs::settings, - connector::utils::{to_connector_meta, PaymentsAuthorizeRequestData, PaymentsSyncRequestData}, + connector::{ + utils as connector_utils, + utils::{to_connector_meta, PaymentsAuthorizeRequestData, PaymentsSyncRequestData}, + }, core::{ errors::{self, CustomResult}, payments, @@ -17,7 +21,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -95,6 +99,21 @@ impl ConnectorCommon for Bambora { } } +impl ConnectorValidation for Bambora { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Bambora {} impl api::PaymentToken for Bambora {} @@ -430,6 +449,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/bitpay.rs b/crates/router/src/connector/bitpay.rs index 50873f8811..52fd574b38 100644 --- a/crates/router/src/connector/bitpay.rs +++ b/crates/router/src/connector/bitpay.rs @@ -16,7 +16,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -120,6 +120,8 @@ impl ConnectorCommon for Bitpay { } } +impl ConnectorValidation for Bitpay {} + impl ConnectorIntegration for Bitpay { @@ -178,6 +180,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/bluesnap.rs b/crates/router/src/connector/bluesnap.rs index 1dddead0f5..6ffc2a6dc4 100644 --- a/crates/router/src/connector/bluesnap.rs +++ b/crates/router/src/connector/bluesnap.rs @@ -7,6 +7,7 @@ use common_utils::{ crypto, ext_traits::{StringExt, ValueExt}, }; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as bluesnap; @@ -27,14 +28,12 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, - domain, - storage::enums, - ErrorResponse, Response, + domain, ErrorResponse, Response, }, utils::{self, BytesExt}, }; @@ -141,6 +140,21 @@ impl ConnectorCommon for Bluesnap { } } +impl ConnectorValidation for Bluesnap { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Bluesnap {} impl api::PaymentToken for Bluesnap {} @@ -645,6 +659,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/boku.rs b/crates/router/src/connector/boku.rs index f9dec8a7e2..70c296c434 100644 --- a/crates/router/src/connector/boku.rs +++ b/crates/router/src/connector/boku.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use common_utils::ext_traits::XmlExt; +use diesel_models::enums; use error_stack::{IntoReport, Report, ResultExt}; use masking::{ExposeInterface, PeekInterface, Secret, WithType}; use ring::hmac; @@ -12,6 +13,7 @@ use transformers as boku; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::errors::{self, CustomResult}, headers, logger, @@ -19,7 +21,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -134,6 +136,21 @@ impl ConnectorCommon for Boku { } } +impl ConnectorValidation for Boku { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Boku { @@ -200,6 +217,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/braintree.rs b/crates/router/src/connector/braintree.rs index 2b2dd3814e..ad73244273 100644 --- a/crates/router/src/connector/braintree.rs +++ b/crates/router/src/connector/braintree.rs @@ -2,18 +2,21 @@ pub mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, Report, ResultExt}; use masking::PeekInterface; use self::transformers as braintree; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::errors::{self, CustomResult}, headers, logger, services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -95,6 +98,21 @@ impl ConnectorCommon for Braintree { } } +impl ConnectorValidation for Braintree { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Braintree {} impl api::PaymentAuthorize for Braintree {} @@ -406,6 +424,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/cashtocode.rs b/crates/router/src/connector/cashtocode.rs index 21f9b5267f..cdba0ca6c4 100644 --- a/crates/router/src/connector/cashtocode.rs +++ b/crates/router/src/connector/cashtocode.rs @@ -2,20 +2,21 @@ pub mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as cashtocode; use crate::{ configs::settings, - connector::utils as conn_utils, + connector::{utils as connector_utils, utils as conn_utils}, core::errors::{self, CustomResult}, db::StorageInterface, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -127,6 +128,21 @@ impl ConnectorCommon for Cashtocode { } } +impl ConnectorValidation for Cashtocode { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Cashtocode { @@ -201,6 +217,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/checkout.rs b/crates/router/src/connector/checkout.rs index b6d15c26c9..3515533baa 100644 --- a/crates/router/src/connector/checkout.rs +++ b/crates/router/src/connector/checkout.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use common_utils::{crypto, ext_traits::ByteSliceExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; @@ -12,6 +13,7 @@ use super::utils::{ }; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::{ errors::{self, CustomResult}, @@ -21,7 +23,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -129,6 +131,21 @@ impl ConnectorCommon for Checkout { } } +impl ConnectorValidation for Checkout { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Checkout {} impl api::PaymentAuthorize for Checkout {} @@ -454,6 +471,7 @@ impl ConnectorIntegration, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/coinbase.rs b/crates/router/src/connector/coinbase.rs index 2d6411ccfd..f1abe79ee0 100644 --- a/crates/router/src/connector/coinbase.rs +++ b/crates/router/src/connector/coinbase.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use common_utils::{crypto, ext_traits::ByteSliceExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as coinbase; @@ -10,12 +11,13 @@ use self::coinbase::CoinbaseWebhookDetails; use super::utils; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -110,6 +112,21 @@ impl ConnectorCommon for Coinbase { } } +impl ConnectorValidation for Coinbase { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration< api::PaymentMethodToken, @@ -177,6 +194,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/cryptopay.rs b/crates/router/src/connector/cryptopay.rs index cbc33d7cee..deaa79711a 100644 --- a/crates/router/src/connector/cryptopay.rs +++ b/crates/router/src/connector/cryptopay.rs @@ -23,7 +23,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -167,6 +167,8 @@ impl ConnectorCommon for Cryptopay { } } +impl ConnectorValidation for Cryptopay {} + impl ConnectorIntegration for Cryptopay { @@ -223,6 +225,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/cybersource.rs b/crates/router/src/connector/cybersource.rs index ac19553fdf..1efda3fc14 100644 --- a/crates/router/src/connector/cybersource.rs +++ b/crates/router/src/connector/cybersource.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use base64::Engine; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::{ExposeInterface, PeekInterface}; use ring::{digest, hmac}; @@ -12,14 +13,14 @@ use url::Url; use crate::{ configs::settings, - connector::utils::RefundsRequestData, + connector::{utils as connector_utils, utils::RefundsRequestData}, consts, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -135,6 +136,21 @@ impl ConnectorCommon for Cybersource { } } +impl ConnectorValidation for Cybersource { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorCommonExt for Cybersource where Self: ConnectorIntegration, @@ -462,6 +478,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; let request = services::RequestBuilder::new() .method(services::Method::Post) .url(&types::PaymentsAuthorizeType::get_url( diff --git a/crates/router/src/connector/dlocal.rs b/crates/router/src/connector/dlocal.rs index c773316179..1799079205 100644 --- a/crates/router/src/connector/dlocal.rs +++ b/crates/router/src/connector/dlocal.rs @@ -6,6 +6,7 @@ use common_utils::{ crypto::{self, SignMessage}, date_time, }; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use hex::encode; use masking::PeekInterface; @@ -13,12 +14,13 @@ use transformers as dlocal; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, logger, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -133,6 +135,21 @@ impl ConnectorCommon for Dlocal { } } +impl ConnectorValidation for Dlocal { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration< api::PaymentMethodToken, @@ -200,6 +217,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/dummyconnector.rs b/crates/router/src/connector/dummyconnector.rs index 6e7f47249f..8f3f318101 100644 --- a/crates/router/src/connector/dummyconnector.rs +++ b/crates/router/src/connector/dummyconnector.rs @@ -8,12 +8,13 @@ use error_stack::{IntoReport, ResultExt}; use super::utils::RefundsRequestData; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -114,6 +115,21 @@ impl ConnectorCommon for DummyConnector { } } +impl ConnectorValidation for DummyConnector { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for DummyConnector @@ -183,6 +199,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/fiserv.rs b/crates/router/src/connector/fiserv.rs index 95e3238dd9..2a4093a24a 100644 --- a/crates/router/src/connector/fiserv.rs +++ b/crates/router/src/connector/fiserv.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use base64::Engine; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::{ExposeInterface, PeekInterface}; use ring::hmac; @@ -12,6 +13,7 @@ use uuid::Uuid; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::errors::{self, CustomResult}, headers, logger, @@ -19,6 +21,7 @@ use crate::{ self, api::ConnectorIntegration, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -155,6 +158,21 @@ impl ConnectorCommon for Fiserv { } } +impl ConnectorValidation for Fiserv { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::ConnectorAccessToken for Fiserv {} impl ConnectorIntegration @@ -497,6 +515,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; let request = Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/forte.rs b/crates/router/src/connector/forte.rs index 2984dce72a..f94b2c4945 100644 --- a/crates/router/src/connector/forte.rs +++ b/crates/router/src/connector/forte.rs @@ -3,20 +3,24 @@ pub mod transformers; use std::fmt::Debug; use base64::Engine; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as forte; use crate::{ configs::settings, - connector::utils::{PaymentsSyncRequestData, RefundsRequestData}, + connector::{ + utils as connector_utils, + utils::{PaymentsSyncRequestData, RefundsRequestData}, + }, consts, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -130,6 +134,21 @@ impl ConnectorCommon for Forte { } } +impl ConnectorValidation for Forte { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Forte { @@ -192,6 +211,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/globalpay.rs b/crates/router/src/connector/globalpay.rs index e045c4b373..ba4afa73e4 100644 --- a/crates/router/src/connector/globalpay.rs +++ b/crates/router/src/connector/globalpay.rs @@ -5,6 +5,7 @@ pub mod transformers; use std::fmt::Debug; use ::common_utils::{errors::ReportSwitchExt, ext_traits::ByteSliceExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use serde_json::Value; @@ -19,7 +20,7 @@ use self::{ use super::utils::RefundsRequestData; use crate::{ configs::settings, - connector::utils as conn_utils, + connector::{utils as connector_utils, utils as conn_utils}, core::{ errors::{self, CustomResult}, payments, @@ -28,7 +29,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -107,6 +108,21 @@ impl ConnectorCommon for Globalpay { } } +impl ConnectorValidation for Globalpay { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl PaymentsCompleteAuthorize for Globalpay {} impl @@ -609,6 +625,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/globepay.rs b/crates/router/src/connector/globepay.rs index 002d06fa0c..68b8e8b67e 100644 --- a/crates/router/src/connector/globepay.rs +++ b/crates/router/src/connector/globepay.rs @@ -3,6 +3,7 @@ pub mod transformers; use std::fmt::Debug; use common_utils::crypto::{self, GenerateDigest}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use hex::encode; use masking::ExposeInterface; @@ -15,11 +16,10 @@ use crate::{ consts, core::errors::{self, CustomResult}, headers, - services::{self, request, ConnectorIntegration}, + services::{self, request, ConnectorIntegration, ConnectorValidation}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, - storage::enums, ErrorResponse, Response, }, utils::{self, BytesExt}, @@ -126,6 +126,8 @@ impl ConnectorCommon for Globepay { } } +impl ConnectorValidation for Globepay {} + impl ConnectorIntegration for Globepay { @@ -196,6 +198,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Put) diff --git a/crates/router/src/connector/iatapay.rs b/crates/router/src/connector/iatapay.rs index b3025363dc..298f9967cc 100644 --- a/crates/router/src/connector/iatapay.rs +++ b/crates/router/src/connector/iatapay.rs @@ -18,7 +18,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -124,6 +124,8 @@ impl ConnectorCommon for Iatapay { } } +impl ConnectorValidation for Iatapay {} + impl ConnectorIntegration for Iatapay { @@ -279,6 +281,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/klarna.rs b/crates/router/src/connector/klarna.rs index f6cb701e5c..9724a00edf 100644 --- a/crates/router/src/connector/klarna.rs +++ b/crates/router/src/connector/klarna.rs @@ -14,6 +14,7 @@ use crate::{ services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -74,6 +75,8 @@ impl ConnectorCommon for Klarna { } } +impl ConnectorValidation for Klarna {} + impl api::Payment for Klarna {} impl api::PaymentAuthorize for Klarna {} @@ -314,6 +317,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/mollie.rs b/crates/router/src/connector/mollie.rs index e49b6deeda..a9a82c4d45 100644 --- a/crates/router/src/connector/mollie.rs +++ b/crates/router/src/connector/mollie.rs @@ -17,7 +17,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -98,6 +98,8 @@ impl ConnectorCommon for Mollie { } } +impl ConnectorValidation for Mollie {} + impl ConnectorIntegration for Mollie { @@ -237,6 +239,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/multisafepay.rs b/crates/router/src/connector/multisafepay.rs index cf3e83d590..21bbb3745a 100644 --- a/crates/router/src/connector/multisafepay.rs +++ b/crates/router/src/connector/multisafepay.rs @@ -13,11 +13,12 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, + storage::enums, ErrorResponse, Response, }, utils::{self, BytesExt}, @@ -82,6 +83,24 @@ impl ConnectorCommon for Multisafepay { } } +impl ConnectorValidation for Multisafepay { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + match capture_method { + enums::CaptureMethod::Automatic => Ok(()), + enums::CaptureMethod::Manual + | enums::CaptureMethod::ManualMultiple + | enums::CaptureMethod::Scheduled => Err(errors::ConnectorError::NotImplemented( + format!("{} for {}", capture_method, self.id()), + ) + .into()), + } + } +} + impl api::Payment for Multisafepay {} impl api::PaymentToken for Multisafepay {} @@ -248,6 +267,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/nexinets.rs b/crates/router/src/connector/nexinets.rs index c62a8dae44..2ff4e0648b 100644 --- a/crates/router/src/connector/nexinets.rs +++ b/crates/router/src/connector/nexinets.rs @@ -7,13 +7,16 @@ use transformers as nexinets; use crate::{ configs::settings, - connector::utils::{to_connector_meta, PaymentsSyncRequestData}, + connector::{ + utils as connector_utils, + utils::{to_connector_meta, PaymentsSyncRequestData}, + }, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -131,6 +134,21 @@ impl ConnectorCommon for Nexinets { } } +impl ConnectorValidation for Nexinets { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Nexinets { @@ -192,6 +210,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/nmi.rs b/crates/router/src/connector/nmi.rs index c7b34d9ff2..85b7b1da05 100644 --- a/crates/router/src/connector/nmi.rs +++ b/crates/router/src/connector/nmi.rs @@ -3,14 +3,16 @@ pub mod transformers; use std::fmt::Debug; use common_utils::ext_traits::ByteSliceExt; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as nmi; use self::transformers::NmiCaptureRequest; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, - services::{self, request, ConnectorIntegration}, + services::{self, request, ConnectorIntegration, ConnectorValidation}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, @@ -77,6 +79,21 @@ impl ConnectorCommon for Nmi { } } +impl ConnectorValidation for Nmi { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration< api::PaymentMethodToken, @@ -205,6 +222,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/noon.rs b/crates/router/src/connector/noon.rs index 2fe526a6bd..ce8aa36fb0 100644 --- a/crates/router/src/connector/noon.rs +++ b/crates/router/src/connector/noon.rs @@ -4,6 +4,7 @@ use std::fmt::Debug; use base64::Engine; use common_utils::{crypto, ext_traits::ByteSliceExt}; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as noon; @@ -11,6 +12,7 @@ use transformers as noon; use super::utils::PaymentsSyncRequestData; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::{ errors::{self, CustomResult}, @@ -20,7 +22,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -130,6 +132,21 @@ impl ConnectorCommon for Noon { } } +impl ConnectorValidation for Noon { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Noon { @@ -187,6 +204,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/nuvei.rs b/crates/router/src/connector/nuvei.rs index 2c90077f09..8286d148f1 100644 --- a/crates/router/src/connector/nuvei.rs +++ b/crates/router/src/connector/nuvei.rs @@ -18,7 +18,7 @@ use crate::{ payments, }, headers, - services::{self, request, ConnectorIntegration}, + services::{self, request, ConnectorIntegration, ConnectorValidation}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt, InitPayment}, @@ -69,6 +69,21 @@ impl ConnectorCommon for Nuvei { } } +impl ConnectorValidation for Nuvei { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + match capture_method { + enums::CaptureMethod::Automatic | enums::CaptureMethod::Manual => Ok(()), + enums::CaptureMethod::ManualMultiple | enums::CaptureMethod::Scheduled => Err( + utils::construct_not_supported_error_report(capture_method, self.id()), + ), + } + } +} + impl api::Payment for Nuvei {} impl api::PaymentToken for Nuvei {} @@ -552,6 +567,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/opayo.rs b/crates/router/src/connector/opayo.rs index fd28cebf67..47a0c33170 100644 --- a/crates/router/src/connector/opayo.rs +++ b/crates/router/src/connector/opayo.rs @@ -2,18 +2,20 @@ mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::ExposeInterface; use transformers as opayo; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -109,6 +111,21 @@ impl ConnectorCommon for Opayo { } } +impl ConnectorValidation for Opayo { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Opayo { @@ -166,6 +183,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/opennode.rs b/crates/router/src/connector/opennode.rs index 96e1b8654b..af6b6d7e03 100644 --- a/crates/router/src/connector/opennode.rs +++ b/crates/router/src/connector/opennode.rs @@ -15,7 +15,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -110,6 +110,8 @@ impl ConnectorCommon for Opennode { } } +impl ConnectorValidation for Opennode {} + impl ConnectorIntegration< api::PaymentMethodToken, @@ -177,6 +179,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/payeezy.rs b/crates/router/src/connector/payeezy.rs index 823bd60c15..c02b1dc284 100644 --- a/crates/router/src/connector/payeezy.rs +++ b/crates/router/src/connector/payeezy.rs @@ -3,6 +3,7 @@ mod transformers; use std::fmt::Debug; use base64::Engine; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::ExposeInterface; use rand::distributions::DistString; @@ -11,13 +12,14 @@ use transformers as payeezy; use crate::{ configs::settings, + connector::utils as connector_utils, consts, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -121,6 +123,21 @@ impl ConnectorCommon for Payeezy { } } +impl ConnectorValidation for Payeezy { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Payeezy {} impl api::PreVerify for Payeezy {} @@ -373,6 +390,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/payme.rs b/crates/router/src/connector/payme.rs index fe0e05c6f4..6e78269de2 100644 --- a/crates/router/src/connector/payme.rs +++ b/crates/router/src/connector/payme.rs @@ -3,15 +3,17 @@ pub mod transformers; use std::fmt::Debug; use common_utils::crypto; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::ExposeInterface; use transformers as payme; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, - services::{self, request, ConnectorIntegration}, + services::{self, request, ConnectorIntegration, ConnectorValidation}, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, @@ -99,6 +101,21 @@ impl ConnectorCommon for Payme { } } +impl ConnectorValidation for Payme { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Payme { @@ -258,6 +275,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/paypal.rs b/crates/router/src/connector/paypal.rs index fa92b233f4..32e6fb08c3 100644 --- a/crates/router/src/connector/paypal.rs +++ b/crates/router/src/connector/paypal.rs @@ -2,6 +2,7 @@ pub mod transformers; use std::fmt::Debug; use base64::Engine; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as paypal; @@ -9,7 +10,10 @@ use transformers as paypal; use self::transformers::PaypalMeta; use crate::{ configs::settings, - connector::utils::{to_connector_meta, RefundsRequestData}, + connector::{ + utils as connector_utils, + utils::{to_connector_meta, RefundsRequestData}, + }, consts, core::{ errors::{self, CustomResult}, @@ -19,7 +23,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, PaymentAction, + ConnectorIntegration, ConnectorValidation, PaymentAction, }, types::{ self, @@ -192,6 +196,21 @@ impl ConnectorCommon for Paypal { } } +impl ConnectorValidation for Paypal { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration< api::PaymentMethodToken, @@ -356,6 +375,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/payu.rs b/crates/router/src/connector/payu.rs index dd04262eb3..5f2d440905 100644 --- a/crates/router/src/connector/payu.rs +++ b/crates/router/src/connector/payu.rs @@ -2,18 +2,20 @@ pub mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as payu; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -98,6 +100,21 @@ impl ConnectorCommon for Payu { } } +impl ConnectorValidation for Payu { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Payu {} impl api::PreVerify for Payu {} @@ -508,6 +525,7 @@ impl ConnectorIntegration, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/powertranz.rs b/crates/router/src/connector/powertranz.rs index 91392a27c3..4cd8f61059 100644 --- a/crates/router/src/connector/powertranz.rs +++ b/crates/router/src/connector/powertranz.rs @@ -4,11 +4,14 @@ use std::fmt::Debug; use api_models::enums::AuthenticationType; use common_utils::ext_traits::ValueExt; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::ExposeInterface; use transformers as powertranz; -use super::utils::{PaymentsAuthorizeRequestData, PaymentsCompleteAuthorizeRequestData}; +use super::utils::{ + self as connector_utils, PaymentsAuthorizeRequestData, PaymentsCompleteAuthorizeRequestData, +}; use crate::{ configs::settings, consts, @@ -17,7 +20,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -121,6 +124,21 @@ impl ConnectorCommon for Powertranz { } } +impl ConnectorValidation for Powertranz { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Powertranz { @@ -186,6 +204,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/rapyd.rs b/crates/router/src/connector/rapyd.rs index 29993a015e..926a90bca8 100644 --- a/crates/router/src/connector/rapyd.rs +++ b/crates/router/src/connector/rapyd.rs @@ -3,6 +3,7 @@ use std::fmt::Debug; use base64::Engine; use common_utils::{date_time, ext_traits::StringExt}; +use diesel_models::enums; use error_stack::{IntoReport, Report, ResultExt}; use masking::{ExposeInterface, PeekInterface}; use rand::distributions::{Alphanumeric, DistString}; @@ -11,7 +12,7 @@ use transformers as rapyd; use crate::{ configs::settings, - connector::utils as conn_utils, + connector::{utils as connector_utils, utils as conn_utils}, consts, core::errors::{self, CustomResult}, db::StorageInterface, @@ -19,6 +20,7 @@ use crate::{ services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -102,6 +104,21 @@ impl ConnectorCommon for Rapyd { } } +impl ConnectorValidation for Rapyd { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::ConnectorAccessToken for Rapyd {} impl api::PaymentToken for Rapyd {} @@ -181,6 +198,7 @@ impl >, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; let timestamp = date_time::now_unix_timestamp(); let salt = Alphanumeric.sample_string(&mut rand::thread_rng(), 12); diff --git a/crates/router/src/connector/shift4.rs b/crates/router/src/connector/shift4.rs index 8d6e8d0fd0..8694f4b78b 100644 --- a/crates/router/src/connector/shift4.rs +++ b/crates/router/src/connector/shift4.rs @@ -3,10 +3,11 @@ pub mod transformers; use std::fmt::Debug; use common_utils::ext_traits::ByteSliceExt; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as shift4; -use super::utils::RefundsRequestData; +use super::utils::{self as connector_utils, RefundsRequestData}; use crate::{ configs::settings, consts, @@ -18,7 +19,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -102,6 +103,21 @@ impl ConnectorCommon for Shift4 { } } +impl ConnectorValidation for Shift4 { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Shift4 {} impl api::PaymentVoid for Shift4 {} impl api::PaymentSync for Shift4 {} @@ -219,6 +235,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/square.rs b/crates/router/src/connector/square.rs index 1cb4a2aee6..ce3d9fbfad 100644 --- a/crates/router/src/connector/square.rs +++ b/crates/router/src/connector/square.rs @@ -13,7 +13,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -113,6 +113,8 @@ impl ConnectorCommon for Square { } } +impl ConnectorValidation for Square {} + impl ConnectorIntegration for Square { @@ -170,6 +172,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/stax.rs b/crates/router/src/connector/stax.rs index a024923be6..12a4494bbf 100644 --- a/crates/router/src/connector/stax.rs +++ b/crates/router/src/connector/stax.rs @@ -3,12 +3,13 @@ pub mod transformers; use std::fmt::Debug; use common_utils::ext_traits::ByteSliceExt; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use masking::PeekInterface; use transformers as stax; use self::stax::StaxWebhookEventType; -use super::utils::{to_connector_meta, RefundsRequestData}; +use super::utils::{self as connector_utils, to_connector_meta, RefundsRequestData}; use crate::{ configs::settings, consts, @@ -18,7 +19,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -109,6 +110,21 @@ impl ConnectorCommon for Stax { } } +impl ConnectorValidation for Stax { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::ConnectorCustomer for Stax {} impl @@ -343,6 +359,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/stripe.rs b/crates/router/src/connector/stripe.rs index eb96e166f1..f7dcebe10f 100644 --- a/crates/router/src/connector/stripe.rs +++ b/crates/router/src/connector/stripe.rs @@ -8,7 +8,7 @@ use masking::PeekInterface; use router_env::{instrument, tracing}; use self::transformers as stripe; -use super::utils::RefundsRequestData; +use super::utils::{self as connector_utils, RefundsRequestData}; use crate::{ configs::settings, consts, @@ -20,6 +20,7 @@ use crate::{ services::{ self, request::{self, Mask}, + ConnectorValidation, }, types::{ self, @@ -59,6 +60,21 @@ impl ConnectorCommon for Stripe { } } +impl ConnectorValidation for Stripe { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Stripe {} impl api::PaymentAuthorize for Stripe {} @@ -771,6 +787,7 @@ impl req: &types::PaymentsAuthorizeRouterData, connectors: &settings::Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/trustpay.rs b/crates/router/src/connector/trustpay.rs index 14dbe14f4d..cb708336a6 100644 --- a/crates/router/src/connector/trustpay.rs +++ b/crates/router/src/connector/trustpay.rs @@ -23,7 +23,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -144,6 +144,8 @@ impl ConnectorCommon for Trustpay { } } +impl ConnectorValidation for Trustpay {} + impl api::Payment for Trustpay {} impl api::PaymentToken for Trustpay {} @@ -546,6 +548,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/tsys.rs b/crates/router/src/connector/tsys.rs index f7cab44071..32bce79b50 100644 --- a/crates/router/src/connector/tsys.rs +++ b/crates/router/src/connector/tsys.rs @@ -2,14 +2,20 @@ pub mod transformers; use std::fmt::Debug; +use diesel_models::enums; use error_stack::{IntoReport, ResultExt}; use transformers as tsys; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, - services::{self, request, ConnectorIntegration}, + services::{ + self, + request::{self}, + ConnectorIntegration, ConnectorValidation, + }, types::{ self, api::{self, ConnectorCommon, ConnectorCommonExt}, @@ -74,6 +80,21 @@ impl ConnectorCommon for Tsys { } } +impl ConnectorValidation for Tsys { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl ConnectorIntegration for Tsys { @@ -133,6 +154,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/utils.rs b/crates/router/src/connector/utils.rs index b64f18bc05..cb9d196850 100644 --- a/crates/router/src/connector/utils.rs +++ b/crates/router/src/connector/utils.rs @@ -10,6 +10,7 @@ use common_utils::{ errors::ReportSwitchExt, pii::{self, Email, IpAddress}, }; +use diesel_models::enums; use error_stack::{report, IntoReport, ResultExt}; use masking::{ExposeInterface, Secret}; use once_cell::sync::Lazy; @@ -972,6 +973,25 @@ pub fn to_currency_base_unit( .change_context(errors::ConnectorError::RequestEncodingFailed) } +pub 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 fn construct_not_supported_error_report( + capture_method: enums::CaptureMethod, + connector_name: &'static str, +) -> error_stack::Report { + errors::ConnectorError::NotSupported { + message: capture_method.to_string(), + connector: connector_name, + } + .into() +} + pub fn to_currency_base_unit_with_zero_decimal_check( amount: i64, currency: diesel_models::enums::Currency, diff --git a/crates/router/src/connector/worldline.rs b/crates/router/src/connector/worldline.rs index b258cd98d6..72479d14c6 100644 --- a/crates/router/src/connector/worldline.rs +++ b/crates/router/src/connector/worldline.rs @@ -14,14 +14,14 @@ use transformers as worldline; use super::utils::RefundsRequestData; use crate::{ configs::settings::Connectors, - connector::utils as conn_utils, + connector::{utils as connector_utils, utils as conn_utils}, consts, core::errors::{self, CustomResult}, headers, logger, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -138,6 +138,21 @@ impl ConnectorCommon for Worldline { } } +impl ConnectorValidation for Worldline { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::ConnectorAccessToken for Worldline {} impl ConnectorIntegration @@ -485,6 +500,7 @@ impl ConnectorIntegration, connectors: &Connectors, ) -> CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(types::PaymentsAuthorizeType::get_http_method(self)) diff --git a/crates/router/src/connector/worldpay.rs b/crates/router/src/connector/worldpay.rs index a1943c7805..857be77566 100644 --- a/crates/router/src/connector/worldpay.rs +++ b/crates/router/src/connector/worldpay.rs @@ -13,12 +13,13 @@ use self::{requests::*, response::*}; use super::utils::{self, RefundsRequestData}; use crate::{ configs::settings, + connector::utils as connector_utils, core::errors::{self, CustomResult}, headers, services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -93,6 +94,21 @@ impl ConnectorCommon for Worldpay { } } +impl ConnectorValidation for Worldpay { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + 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()), + ), + } + } +} + impl api::Payment for Worldpay {} impl api::PreVerify for Worldpay {} @@ -422,6 +438,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/connector/zen.rs b/crates/router/src/connector/zen.rs index 679d2eff8c..7e64b00b5d 100644 --- a/crates/router/src/connector/zen.rs +++ b/crates/router/src/connector/zen.rs @@ -22,7 +22,7 @@ use crate::{ services::{ self, request::{self, Mask}, - ConnectorIntegration, + ConnectorIntegration, ConnectorValidation, }, types::{ self, @@ -128,6 +128,8 @@ impl ConnectorCommon for Zen { } } +impl ConnectorValidation for Zen {} + impl ConnectorIntegration for Zen { @@ -214,6 +216,7 @@ impl ConnectorIntegration CustomResult, errors::ConnectorError> { + self.validate_capture_method(req.request.capture_method)?; Ok(Some( services::RequestBuilder::new() .method(services::Method::Post) diff --git a/crates/router/src/services/api.rs b/crates/router/src/services/api.rs index 1f5b43e351..66114ad786 100644 --- a/crates/router/src/services/api.rs +++ b/crates/router/src/services/api.rs @@ -10,6 +10,7 @@ use std::{ }; use actix_web::{body, HttpRequest, HttpResponse, Responder, ResponseError}; +use api_models::enums::CaptureMethod; use common_utils::errors::ReportSwitchExt; use error_stack::{report, IntoReport, Report, ResultExt}; use masking::{ExposeOptionInterface, PeekInterface}; @@ -29,7 +30,11 @@ use crate::{ logger, routes::{app::AppStateInfo, metrics, AppState}, services::authentication as auth, - types::{self, api, ErrorResponse}, + types::{ + self, + api::{self, ConnectorCommon}, + ErrorResponse, + }, }; pub type BoxedConnectorIntegration<'a, T, Req, Resp> = @@ -48,6 +53,25 @@ where } } +pub trait ConnectorValidation: ConnectorCommon { + fn validate_capture_method( + &self, + capture_method: Option, + ) -> CustomResult<(), errors::ConnectorError> { + let capture_method = capture_method.unwrap_or_default(); + match capture_method { + CaptureMethod::Automatic => Ok(()), + CaptureMethod::Manual | CaptureMethod::ManualMultiple | CaptureMethod::Scheduled => { + Err(errors::ConnectorError::NotSupported { + message: capture_method.to_string(), + connector: self.id(), + } + .into()) + } + } + } +} + #[async_trait::async_trait] pub trait ConnectorIntegration: ConnectorIntegrationAny + Sync { fn get_headers(