feat(router): add straight-through routing connector selection in payments (#153)

This commit is contained in:
ItsMeShashank
2022-12-19 18:43:04 +05:30
committed by GitHub
parent a5f0c98eb7
commit d6a3e508e2
26 changed files with 192 additions and 100 deletions

View File

@ -620,43 +620,52 @@ pub async fn get_customer_from_details(
pub async fn get_connector_default(
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
let connectors = &state.conf.connectors;
let vec_val: Vec<serde_json::Value> = merchant_account
.custom_routing_rules
.clone()
.parse_value("CustomRoutingRulesVec")
.change_context(errors::ConnectorError::RoutingRulesParsingError)
.change_context(errors::ApiErrorResponse::InternalServerError)?;
let custom_routing_rules: api::CustomRoutingRules = vec_val[0]
.clone()
.parse_value("CustomRoutingRules")
.change_context(errors::ConnectorError::RoutingRulesParsingError)
.change_context(errors::ApiErrorResponse::InternalServerError)?;
let connector_names = custom_routing_rules
.connectors_pecking_order
.unwrap_or_else(|| vec!["stripe".to_string()]);
if let Some(connector) = request_connector {
let connector_data = api::ConnectorData::get_connector_by_name(
connectors,
&connector.to_string(),
api::GetToken::Connector,
)?;
Ok(api::ConnectorCallType::Single(connector_data))
} else {
let vec_val: Vec<serde_json::Value> = merchant_account
.custom_routing_rules
.clone()
.parse_value("CustomRoutingRulesVec")
.change_context(errors::ConnectorError::RoutingRulesParsingError)
.change_context(errors::ApiErrorResponse::InternalServerError)?;
let custom_routing_rules: api::CustomRoutingRules = vec_val[0]
.clone()
.parse_value("CustomRoutingRules")
.change_context(errors::ConnectorError::RoutingRulesParsingError)
.change_context(errors::ApiErrorResponse::InternalServerError)?;
let connector_names = custom_routing_rules
.connectors_pecking_order
.unwrap_or_else(|| vec!["stripe".to_string()]);
//use routing rules if configured by merchant else query MCA as per PM
let connector_list: types::ConnectorsList = types::ConnectorsList {
connectors: connector_names,
};
//use routing rules if configured by merchant else query MCA as per PM
let connector_list: types::ConnectorsList = types::ConnectorsList {
connectors: connector_names,
};
let connector_name = connector_list
.connectors
.first()
.get_required_value("connectors")
.change_context(errors::ConnectorError::FailedToObtainPreferredConnector)
.change_context(errors::ApiErrorResponse::InternalServerError)?
.as_str();
let connector_name = connector_list
.connectors
.first()
.get_required_value("connectors")
.change_context(errors::ConnectorError::FailedToObtainPreferredConnector)
.change_context(errors::ApiErrorResponse::InternalServerError)?
.as_str();
let connector_data = api::ConnectorData::get_connector_by_name(
connectors,
connector_name,
api::GetToken::Connector,
)?;
Ok(api::ConnectorCallType::Single(connector_data))
let connector_data = api::ConnectorData::get_connector_by_name(
connectors,
connector_name,
api::GetToken::Connector,
)?;
Ok(api::ConnectorCallType::Single(connector_data))
}
}
#[instrument(skip_all)]

View File

@ -30,7 +30,8 @@ use crate::{
pii::Secret,
routes::AppState,
types::{
self, api,
self,
api::{self, enums as api_enums},
storage::{self, enums},
PaymentsResponseData,
},
@ -138,6 +139,7 @@ pub trait Domain<F: Clone, R>: Send + Sync {
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse>;
}
@ -204,8 +206,9 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
#[instrument(skip_all)]
@ -291,8 +294,9 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}
@ -350,7 +354,8 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -17,7 +17,7 @@ use crate::{
routes::AppState,
types::{
self,
api::{self, PaymentIdTypeExt},
api::{self, enums as api_enums, PaymentIdTypeExt},
storage::{self, enums},
transformers::ForeignInto,
},
@ -243,8 +243,9 @@ impl<F: Clone + Send> Domain<F, api::PaymentsRequest> for PaymentConfirm {
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -19,7 +19,7 @@ use crate::{
routes::AppState,
types::{
self,
api::{self, PaymentIdTypeExt},
api::{self, enums as api_enums, PaymentIdTypeExt},
storage::{
self,
enums::{self, IntentStatus},
@ -290,8 +290,9 @@ impl<F: Clone + Send> Domain<F, api::PaymentsRequest> for PaymentCreate {
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -265,8 +265,9 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -16,7 +16,7 @@ use crate::{
pii::Secret,
routes::AppState,
types::{
api::{self, PaymentIdTypeExt},
api::{self, enums as api_enums, PaymentIdTypeExt},
storage::{self, enums},
transformers::ForeignInto,
},
@ -257,6 +257,7 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
_request_connector: Option<api_enums::Connector>,
) -> RouterResult<api::ConnectorCallType> {
let connectors = &state.conf.connectors;
let db = &state.store;

View File

@ -15,7 +15,7 @@ use crate::{
pii::Secret,
routes::AppState,
types::{
api::{self, PaymentIdTypeExt},
api::{self, enums as api_enums, PaymentIdTypeExt},
storage::{self, enums, Customer},
transformers::ForeignInto,
},
@ -265,7 +265,8 @@ where
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -15,7 +15,7 @@ use crate::{
db::StorageInterface,
routes::AppState,
types::{
api,
api::{self, enums as api_enums},
storage::{self, enums},
transformers::ForeignInto,
},
@ -117,8 +117,9 @@ impl<F: Clone + Send> Domain<F, api::PaymentsRequest> for PaymentStatus {
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}

View File

@ -16,7 +16,7 @@ use crate::{
db::StorageInterface,
routes::AppState,
types::{
api::{self, PaymentIdTypeExt},
api::{self, enums as api_enums, PaymentIdTypeExt},
storage::{self, enums},
transformers::ForeignInto,
},
@ -237,8 +237,9 @@ impl<F: Clone + Send> Domain<F, api::PaymentsRequest> for PaymentUpdate {
&'a self,
merchant_account: &storage::MerchantAccount,
state: &AppState,
request_connector: Option<api_enums::Connector>,
) -> CustomResult<api::ConnectorCallType, errors::ApiErrorResponse> {
helpers::get_connector_default(merchant_account, state).await
helpers::get_connector_default(merchant_account, state, request_connector).await
}
}