Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 18 additions & 2 deletions crates/router/src/connector/iatapay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ impl ConnectorCommon for Iatapay {
"application/json"
}

fn get_currency_unit(&self) -> api::CurrencyUnit {
api::CurrencyUnit::Base
}

fn base_url<'a>(&self, connectors: &'a settings::Connectors) -> &'a str {
connectors.iatapay.base_url.as_ref()
}
Expand Down Expand Up @@ -271,7 +275,13 @@ impl ConnectorIntegration<api::Authorize, types::PaymentsAuthorizeData, types::P
&self,
req: &types::PaymentsAuthorizeRouterData,
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
let req_obj = iatapay::IatapayPaymentsRequest::try_from(req)?;
let connector_router_data = iatapay::IatapayRouterData::try_from((
&self.get_currency_unit(),
req.request.currency,
req.request.amount,
req,
))?;
let req_obj = iatapay::IatapayPaymentsRequest::try_from(&connector_router_data)?;
let iatapay_req = types::RequestBody::log_and_get_request_body(
&req_obj,
Encode::<iatapay::IatapayPaymentsRequest>::encode_to_string_of_json,
Expand Down Expand Up @@ -451,7 +461,13 @@ impl ConnectorIntegration<api::Execute, types::RefundsData, types::RefundsRespon
&self,
req: &types::RefundsRouterData<api::Execute>,
) -> CustomResult<Option<types::RequestBody>, errors::ConnectorError> {
let req_obj = iatapay::IatapayRefundRequest::try_from(req)?;
let connector_router_data = iatapay::IatapayRouterData::try_from((
&self.get_currency_unit(),
req.request.currency,
req.request.payment_amount,
req,
))?;
let req_obj = iatapay::IatapayRefundRequest::try_from(&connector_router_data)?;
let iatapay_req = types::RequestBody::log_and_get_request_body(
&req_obj,
Encode::<iatapay::IatapayRefundRequest>::encode_to_string_of_json,
Expand Down
96 changes: 71 additions & 25 deletions crates/router/src/connector/iatapay/transformers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::{
connector::utils::{self, PaymentsAuthorizeRequestData, RefundsRequestData, RouterData},
core::errors,
services,
types::{self, api, storage::enums},
types::{self, api, storage::enums, PaymentsAuthorizeData},
};

// Every access token will be valid for 5 minutes. It contains grant_type and scope for different type of access, but for our usecases it should be only 'client_credentials' and 'payment' resp(as per doc) for all type of api call.
Expand All @@ -26,7 +26,34 @@ impl TryFrom<&types::RefreshTokenRouterData> for IatapayAuthUpdateRequest {
})
}
}

#[derive(Debug, Serialize)]
pub struct IatapayRouterData<T> {
amount: f64,
router_data: T,
}
impl<T>
TryFrom<(
&types::api::CurrencyUnit,
types::storage::enums::Currency,
i64,
T,
)> for IatapayRouterData<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> {
Ok(Self {
amount: utils::to_currency_base_unit_asf64(_amount, _currency)?,
router_data: item,
})
}
}
#[derive(Debug, Deserialize)]
pub struct IatapayAuthUpdateResponse {
pub access_token: Secret<String>,
Expand Down Expand Up @@ -80,10 +107,29 @@ pub struct IatapayPaymentsRequest {
payer_info: Option<PayerInfo>,
}

impl TryFrom<&types::PaymentsAuthorizeRouterData> for IatapayPaymentsRequest {
impl
TryFrom<
&IatapayRouterData<
&types::RouterData<
types::api::payments::Authorize,
PaymentsAuthorizeData,
types::PaymentsResponseData,
>,
>,
> for IatapayPaymentsRequest
{
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &types::PaymentsAuthorizeRouterData) -> Result<Self, Self::Error> {
let payment_method = item.payment_method;

fn try_from(
item: &IatapayRouterData<
&types::RouterData<
types::api::payments::Authorize,
PaymentsAuthorizeData,
types::PaymentsResponseData,
>,
>,
) -> Result<Self, Self::Error> {
let payment_method = item.router_data.payment_method;
let country = match payment_method {
PaymentMethod::Upi => "IN".to_string(),

Expand All @@ -97,27 +143,26 @@ impl TryFrom<&types::PaymentsAuthorizeRouterData> for IatapayPaymentsRequest {
| PaymentMethod::BankDebit
| PaymentMethod::Reward
| PaymentMethod::Voucher
| PaymentMethod::GiftCard => item.get_billing_country()?.to_string(),
| PaymentMethod::GiftCard => item.router_data.get_billing_country()?.to_string(),
};
let return_url = item.get_return_url()?;
let payer_info = match item.request.payment_method_data.clone() {
let return_url = item.router_data.get_return_url()?;
let payer_info = match item.router_data.request.payment_method_data.clone() {
api::PaymentMethodData::Upi(upi_data) => upi_data.vpa_id.map(|id| PayerInfo {
token_id: id.switch_strategy(),
}),
_ => None,
};
let amount =
utils::to_currency_base_unit_asf64(item.request.amount, item.request.currency)?;
let payload = Self {
merchant_id: IatapayAuthType::try_from(&item.connector_auth_type)?.merchant_id,
merchant_payment_id: Some(item.connector_request_reference_id.clone()),
amount,
currency: item.request.currency.to_string(),
merchant_id: IatapayAuthType::try_from(&item.router_data.connector_auth_type)?
.merchant_id,
merchant_payment_id: Some(item.router_data.connector_request_reference_id.clone()),
amount: item.amount,
currency: item.router_data.request.currency.to_string(),
country: country.clone(),
locale: format!("en-{}", country),
redirect_urls: get_redirect_url(return_url),
payer_info,
notification_url: item.request.get_webhook_url()?,
notification_url: item.router_data.request.get_webhook_url()?,
};
Ok(payload)
}
Expand Down Expand Up @@ -275,18 +320,19 @@ pub struct IatapayRefundRequest {
pub notification_url: String,
}

impl<F> TryFrom<&types::RefundsRouterData<F>> for IatapayRefundRequest {
impl<F> TryFrom<&IatapayRouterData<&types::RefundsRouterData<F>>> for IatapayRefundRequest {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &types::RefundsRouterData<F>) -> Result<Self, Self::Error> {
let amount =
utils::to_currency_base_unit_asf64(item.request.refund_amount, item.request.currency)?;
fn try_from(
item: &IatapayRouterData<&types::RefundsRouterData<F>>,
) -> Result<Self, Self::Error> {
Ok(Self {
amount,
merchant_id: IatapayAuthType::try_from(&item.connector_auth_type)?.merchant_id,
merchant_refund_id: Some(item.request.refund_id.clone()),
currency: item.request.currency.to_string(),
bank_transfer_description: item.request.reason.clone(),
notification_url: item.request.get_webhook_url()?,
amount: item.amount,
merchant_id: IatapayAuthType::try_from(&item.router_data.connector_auth_type)?
.merchant_id,
merchant_refund_id: Some(item.router_data.request.refund_id.clone()),
currency: item.router_data.request.currency.to_string(),
bank_transfer_description: item.router_data.request.reason.clone(),
notification_url: item.router_data.request.get_webhook_url()?,
})
}
}
Expand Down