mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 04:04:43 +08:00
feat(router): add straight-through routing connector selection in payments (#153)
This commit is contained in:
@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user