mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-02 12:06:56 +08:00
refactor(connector): [CyberSource] Enhance currency Mapping with ConnectorCurrencyCommon Trait (#2626)
This commit is contained in:
@ -93,6 +93,10 @@ impl ConnectorCommon for Cybersource {
|
|||||||
connectors.cybersource.base_url.as_ref()
|
connectors.cybersource.base_url.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_currency_unit(&self) -> api::CurrencyUnit {
|
||||||
|
api::CurrencyUnit::Minor
|
||||||
|
}
|
||||||
|
|
||||||
fn build_error_response(
|
fn build_error_response(
|
||||||
&self,
|
&self,
|
||||||
res: types::Response,
|
res: types::Response,
|
||||||
@ -468,7 +472,14 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
|
|||||||
&self,
|
&self,
|
||||||
req: &types::PaymentsAuthorizeRouterData,
|
req: &types::PaymentsAuthorizeRouterData,
|
||||||
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
|
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
|
||||||
let connector_request = cybersource::CybersourcePaymentsRequest::try_from(req)?;
|
let connector_router_data = cybersource::CybersourceRouterData::try_from((
|
||||||
|
&self.get_currency_unit(),
|
||||||
|
req.request.currency,
|
||||||
|
req.request.amount,
|
||||||
|
req,
|
||||||
|
))?;
|
||||||
|
let connector_request =
|
||||||
|
cybersource::CybersourcePaymentsRequest::try_from(&connector_router_data)?;
|
||||||
let cybersource_payments_request = types::RequestBody::log_and_get_request_body(
|
let cybersource_payments_request = types::RequestBody::log_and_get_request_body(
|
||||||
&connector_request,
|
&connector_request,
|
||||||
utils::Encode::<cybersource::CybersourcePaymentsRequest>::encode_to_string_of_json,
|
utils::Encode::<cybersource::CybersourcePaymentsRequest>::encode_to_string_of_json,
|
||||||
|
|||||||
@ -15,6 +15,37 @@ use crate::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize)]
|
||||||
|
pub struct CybersourceRouterData<T> {
|
||||||
|
pub amount: String,
|
||||||
|
pub router_data: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T>
|
||||||
|
TryFrom<(
|
||||||
|
&types::api::CurrencyUnit,
|
||||||
|
types::storage::enums::Currency,
|
||||||
|
i64,
|
||||||
|
T,
|
||||||
|
)> for CybersourceRouterData<T>
|
||||||
|
{
|
||||||
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
|
fn try_from(
|
||||||
|
(currency_unit, currency, amount, item): (
|
||||||
|
&types::api::CurrencyUnit,
|
||||||
|
types::storage::enums::Currency,
|
||||||
|
i64,
|
||||||
|
T,
|
||||||
|
),
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
let amount = utils::get_amount_as_string(currency_unit, amount, currency)?;
|
||||||
|
Ok(Self {
|
||||||
|
amount,
|
||||||
|
router_data: item,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default, Debug, Serialize, Eq, PartialEq)]
|
#[derive(Default, Debug, Serialize, Eq, PartialEq)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct CybersourcePaymentsRequest {
|
pub struct CybersourcePaymentsRequest {
|
||||||
@ -109,27 +140,33 @@ fn build_bill_to(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<&types::PaymentsAuthorizeRouterData> for CybersourcePaymentsRequest {
|
impl TryFrom<&CybersourceRouterData<&types::PaymentsAuthorizeRouterData>>
|
||||||
|
for CybersourcePaymentsRequest
|
||||||
|
{
|
||||||
type Error = error_stack::Report<errors::ConnectorError>;
|
type Error = error_stack::Report<errors::ConnectorError>;
|
||||||
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
|
fn try_from(
|
||||||
match item.request.payment_method_data.clone() {
|
item: &CybersourceRouterData<&types::PaymentsAuthorizeRouterData>,
|
||||||
|
) -> Result<Self, Self::Error> {
|
||||||
|
match item.router_data.request.payment_method_data.clone() {
|
||||||
api::PaymentMethodData::Card(ccard) => {
|
api::PaymentMethodData::Card(ccard) => {
|
||||||
let phone = item.get_billing_phone()?;
|
let phone = item.router_data.get_billing_phone()?;
|
||||||
let phone_number = phone.get_number()?;
|
let phone_number = phone.get_number()?;
|
||||||
let country_code = phone.get_country_code()?;
|
let country_code = phone.get_country_code()?;
|
||||||
let number_with_code =
|
let number_with_code =
|
||||||
Secret::new(format!("{}{}", country_code, phone_number.peek()));
|
Secret::new(format!("{}{}", country_code, phone_number.peek()));
|
||||||
let email = item
|
let email = item
|
||||||
|
.router_data
|
||||||
.request
|
.request
|
||||||
.email
|
.email
|
||||||
.clone()
|
.clone()
|
||||||
.ok_or_else(utils::missing_field_err("email"))?;
|
.ok_or_else(utils::missing_field_err("email"))?;
|
||||||
let bill_to = build_bill_to(item.get_billing()?, email, number_with_code)?;
|
let bill_to =
|
||||||
|
build_bill_to(item.router_data.get_billing()?, email, number_with_code)?;
|
||||||
|
|
||||||
let order_information = OrderInformationWithBill {
|
let order_information = OrderInformationWithBill {
|
||||||
amount_details: Amount {
|
amount_details: Amount {
|
||||||
total_amount: item.request.amount.to_string(),
|
total_amount: item.amount.to_owned(),
|
||||||
currency: item.request.currency.to_string().to_uppercase(),
|
currency: item.router_data.request.currency.to_string().to_uppercase(),
|
||||||
},
|
},
|
||||||
bill_to,
|
bill_to,
|
||||||
};
|
};
|
||||||
@ -145,14 +182,14 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for CybersourcePaymentsRequest
|
|||||||
|
|
||||||
let processing_information = ProcessingInformation {
|
let processing_information = ProcessingInformation {
|
||||||
capture: matches!(
|
capture: matches!(
|
||||||
item.request.capture_method,
|
item.router_data.request.capture_method,
|
||||||
Some(enums::CaptureMethod::Automatic) | None
|
Some(enums::CaptureMethod::Automatic) | None
|
||||||
),
|
),
|
||||||
capture_options: None,
|
capture_options: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let client_reference_information = ClientReferenceInformation {
|
let client_reference_information = ClientReferenceInformation {
|
||||||
code: Some(item.connector_request_reference_id.clone()),
|
code: Some(item.router_data.connector_request_reference_id.clone()),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
|
|||||||
@ -1077,7 +1077,7 @@ pub fn get_amount_as_string(
|
|||||||
currency: diesel_models::enums::Currency,
|
currency: diesel_models::enums::Currency,
|
||||||
) -> Result<String, error_stack::Report<errors::ConnectorError>> {
|
) -> Result<String, error_stack::Report<errors::ConnectorError>> {
|
||||||
let amount = match currency_unit {
|
let amount = match currency_unit {
|
||||||
types::api::CurrencyUnit::Minor => amount.to_string(),
|
types::api::CurrencyUnit::Minor => to_currency_lower_unit(amount.to_string(), currency)?,
|
||||||
types::api::CurrencyUnit::Base => to_currency_base_unit(amount, currency)?,
|
types::api::CurrencyUnit::Base => to_currency_base_unit(amount, currency)?,
|
||||||
};
|
};
|
||||||
Ok(amount)
|
Ok(amount)
|
||||||
|
|||||||
Reference in New Issue
Block a user