mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-04 14:07:18 +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)]
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user