refactor(payment_methods): add BankDebit payment method data to new domain type to be used in connector module (#4238)

Co-authored-by: Narayan Bhat <narayan.bhat@juspay.in>
This commit is contained in:
Swangi Kumari
2024-04-10 20:01:24 +05:30
committed by GitHub
parent 44e7456a10
commit 2bf775a97e
14 changed files with 297 additions and 367 deletions

View File

@ -1822,13 +1822,11 @@ fn build_shopper_reference(customer_id: &Option<String>, merchant_id: String) ->
.map(|c_id| format!("{}_{}", merchant_id, c_id))
}
impl<'a> TryFrom<&api_models::payments::BankDebitData> for AdyenPaymentMethod<'a> {
impl<'a> TryFrom<&domain::BankDebitData> for AdyenPaymentMethod<'a> {
type Error = Error;
fn try_from(
bank_debit_data: &api_models::payments::BankDebitData,
) -> Result<Self, Self::Error> {
fn try_from(bank_debit_data: &domain::BankDebitData) -> Result<Self, Self::Error> {
match bank_debit_data {
payments::BankDebitData::AchBankDebit {
domain::BankDebitData::AchBankDebit {
account_number,
routing_number,
card_holder_name,
@ -1845,7 +1843,7 @@ impl<'a> TryFrom<&api_models::payments::BankDebitData> for AdyenPaymentMethod<'a
)?,
},
))),
payments::BankDebitData::SepaBankDebit {
domain::BankDebitData::SepaBankDebit {
iban,
bank_account_holder_name,
..
@ -1859,7 +1857,7 @@ impl<'a> TryFrom<&api_models::payments::BankDebitData> for AdyenPaymentMethod<'a
iban_number: iban.clone(),
},
))),
payments::BankDebitData::BacsBankDebit {
domain::BankDebitData::BacsBankDebit {
account_number,
sort_code,
bank_account_holder_name,
@ -1876,7 +1874,7 @@ impl<'a> TryFrom<&api_models::payments::BankDebitData> for AdyenPaymentMethod<'a
)?,
},
))),
payments::BankDebitData::BecsBankDebit { .. } => {
domain::BankDebitData::BecsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Adyen"),
)
@ -2685,7 +2683,7 @@ impl<'a>
impl<'a>
TryFrom<(
&AdyenRouterData<&types::PaymentsAuthorizeRouterData>,
&api_models::payments::BankDebitData,
&domain::BankDebitData,
)> for AdyenPaymentRequest<'a>
{
type Error = Error;
@ -2693,7 +2691,7 @@ impl<'a>
fn try_from(
value: (
&AdyenRouterData<&types::PaymentsAuthorizeRouterData>,
&api_models::payments::BankDebitData,
&domain::BankDebitData,
),
) -> Result<Self, Self::Error> {
let (item, bank_debit_data) = value;

View File

@ -1,6 +1,6 @@
use api_models::{
enums::{BankType, CountryAlpha2, UsStatesAbbreviation},
payments::{AddressDetails, BankDebitData},
enums::{CountryAlpha2, UsStatesAbbreviation},
payments::AddressDetails,
};
use common_utils::pii::{self, IpAddress};
use masking::{ExposeInterface, Secret};
@ -82,16 +82,16 @@ impl TryFrom<&types::ConnectorCustomerRouterData> for GocardlessCustomerRequest
let billing_details = match &item.request.payment_method_data {
domain::PaymentMethodData::BankDebit(bank_debit_data) => {
match bank_debit_data.clone() {
BankDebitData::AchBankDebit {
domain::BankDebitData::AchBankDebit {
billing_details, ..
} => Ok(billing_details),
BankDebitData::SepaBankDebit {
domain::BankDebitData::SepaBankDebit {
billing_details, ..
} => Ok(billing_details),
BankDebitData::BecsBankDebit {
domain::BankDebitData::BecsBankDebit {
billing_details, ..
} => Ok(billing_details),
BankDebitData::BacsBankDebit { .. } => {
domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Gocardless"),
))
@ -310,11 +310,11 @@ impl TryFrom<&types::TokenizationRouterData> for CustomerBankAccount {
}
}
impl TryFrom<&BankDebitData> for CustomerBankAccount {
impl TryFrom<&domain::BankDebitData> for CustomerBankAccount {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &BankDebitData) -> Result<Self, Self::Error> {
fn try_from(item: &domain::BankDebitData) -> Result<Self, Self::Error> {
match item {
BankDebitData::AchBankDebit {
domain::BankDebitData::AchBankDebit {
billing_details,
account_number,
routing_number,
@ -339,7 +339,7 @@ impl TryFrom<&BankDebitData> for CustomerBankAccount {
};
Ok(Self::USBankAccount(us_bank_account))
}
BankDebitData::BecsBankDebit {
domain::BankDebitData::BecsBankDebit {
billing_details,
account_number,
bsb_number,
@ -360,7 +360,7 @@ impl TryFrom<&BankDebitData> for CustomerBankAccount {
};
Ok(Self::AUBankAccount(au_bank_account))
}
BankDebitData::SepaBankDebit {
domain::BankDebitData::SepaBankDebit {
iban,
bank_account_holder_name,
..
@ -377,19 +377,21 @@ impl TryFrom<&BankDebitData> for CustomerBankAccount {
};
Ok(Self::InternationalBankAccount(international_bank_account))
}
BankDebitData::BacsBankDebit { .. } => Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Gocardless"),
)
.into()),
domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Gocardless"),
)
.into())
}
}
}
}
impl From<BankType> for AccountType {
fn from(item: BankType) -> Self {
impl From<common_enums::BankType> for AccountType {
fn from(item: common_enums::BankType) -> Self {
match item {
BankType::Checking => Self::Checking,
BankType::Savings => Self::Savings,
common_enums::BankType::Checking => Self::Checking,
common_enums::BankType::Savings => Self::Savings,
}
}
}
@ -518,29 +520,31 @@ impl TryFrom<&types::SetupMandateRouterData> for GocardlessMandateRequest {
}
fn get_ip_if_required(
bank_debit_data: &BankDebitData,
bank_debit_data: &domain::BankDebitData,
item: &types::SetupMandateRouterData,
) -> Result<Option<Secret<String, IpAddress>>, error_stack::Report<errors::ConnectorError>> {
let ip_address = item.request.get_browser_info()?.get_ip_address()?;
match bank_debit_data {
BankDebitData::AchBankDebit { .. } => Ok(Some(ip_address)),
BankDebitData::SepaBankDebit { .. }
| BankDebitData::BecsBankDebit { .. }
| BankDebitData::BacsBankDebit { .. } => Ok(None),
domain::BankDebitData::AchBankDebit { .. } => Ok(Some(ip_address)),
domain::BankDebitData::SepaBankDebit { .. }
| domain::BankDebitData::BecsBankDebit { .. }
| domain::BankDebitData::BacsBankDebit { .. } => Ok(None),
}
}
impl TryFrom<&BankDebitData> for GocardlessScheme {
impl TryFrom<&domain::BankDebitData> for GocardlessScheme {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(item: &BankDebitData) -> Result<Self, Self::Error> {
fn try_from(item: &domain::BankDebitData) -> Result<Self, Self::Error> {
match item {
BankDebitData::AchBankDebit { .. } => Ok(Self::Ach),
BankDebitData::SepaBankDebit { .. } => Ok(Self::SepaCore),
BankDebitData::BecsBankDebit { .. } => Ok(Self::Becs),
BankDebitData::BacsBankDebit { .. } => Err(errors::ConnectorError::NotImplemented(
"Setup Mandate flow for selected payment method through Gocardless".to_string(),
)
.into()),
domain::BankDebitData::AchBankDebit { .. } => Ok(Self::Ach),
domain::BankDebitData::SepaBankDebit { .. } => Ok(Self::SepaCore),
domain::BankDebitData::BecsBankDebit { .. } => Ok(Self::Becs),
domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
"Setup Mandate flow for selected payment method through Gocardless".to_string(),
)
.into())
}
}
}
}

View File

@ -254,11 +254,11 @@ impl TryFrom<&domain::BankRedirectData> for PaymentMethodData {
}
}
impl TryFrom<&api_models::payments::BankDebitData> for PaymentMethodData {
impl TryFrom<&domain::BankDebitData> for PaymentMethodData {
type Error = Error;
fn try_from(value: &api_models::payments::BankDebitData) -> Result<Self, Self::Error> {
fn try_from(value: &domain::BankDebitData) -> Result<Self, Self::Error> {
match value {
api_models::payments::BankDebitData::SepaBankDebit {
domain::BankDebitData::SepaBankDebit {
bank_account_holder_name,
iban,
..

View File

@ -657,14 +657,14 @@ impl TryFrom<&domain::PayLaterData> for PaypalPaymentsRequest {
}
}
impl TryFrom<&api_models::payments::BankDebitData> for PaypalPaymentsRequest {
impl TryFrom<&domain::BankDebitData> for PaypalPaymentsRequest {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(value: &api_models::payments::BankDebitData) -> Result<Self, Self::Error> {
fn try_from(value: &domain::BankDebitData) -> Result<Self, Self::Error> {
match value {
api_models::payments::BankDebitData::AchBankDebit { .. }
| api_models::payments::BankDebitData::SepaBankDebit { .. }
| api_models::payments::BankDebitData::BecsBankDebit { .. }
| api_models::payments::BankDebitData::BacsBankDebit { .. } => {
domain::BankDebitData::AchBankDebit { .. }
| domain::BankDebitData::SepaBankDebit { .. }
| domain::BankDebitData::BecsBankDebit { .. }
| domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Paypal"),
)

View File

@ -1,4 +1,3 @@
use api_models::payments::BankDebitData;
use error_stack::ResultExt;
use masking::{ExposeInterface, PeekInterface, Secret};
use serde::{Deserialize, Serialize};
@ -13,19 +12,21 @@ use crate::{
unimplemented_payment_method,
};
impl TryFrom<(&types::TokenizationRouterData, BankDebitData)> for SquareTokenRequest {
impl TryFrom<(&types::TokenizationRouterData, domain::BankDebitData)> for SquareTokenRequest {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(
value: (&types::TokenizationRouterData, BankDebitData),
value: (&types::TokenizationRouterData, domain::BankDebitData),
) -> Result<Self, Self::Error> {
let (_item, bank_debit_data) = value;
match bank_debit_data {
BankDebitData::AchBankDebit { .. }
| BankDebitData::SepaBankDebit { .. }
| BankDebitData::BecsBankDebit { .. }
| BankDebitData::BacsBankDebit { .. } => Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Square"),
))?,
domain::BankDebitData::AchBankDebit { .. }
| domain::BankDebitData::SepaBankDebit { .. }
| domain::BankDebitData::BecsBankDebit { .. }
| domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Square"),
))?
}
}
}
}

View File

@ -88,9 +88,9 @@ impl TryFrom<&StaxRouterData<&types::PaymentsAuthorizeRouterData>> for StaxPayme
idempotency_id: Some(item.router_data.connector_request_reference_id.clone()),
})
}
domain::PaymentMethodData::BankDebit(
api_models::payments::BankDebitData::AchBankDebit { .. },
) => {
domain::PaymentMethodData::BankDebit(domain::BankDebitData::AchBankDebit {
..
}) => {
let pm_token = item.router_data.get_payment_method_token()?;
let pre_auth = !item.router_data.request.is_auto_capture()?;
Ok(Self {
@ -206,9 +206,9 @@ pub struct StaxBankTokenizeData {
person_name: Secret<String>,
bank_account: Secret<String>,
bank_routing: Secret<String>,
bank_name: api_models::enums::BankNames,
bank_type: api_models::enums::BankType,
bank_holder_type: api_models::enums::BankHolderType,
bank_name: common_enums::BankNames,
bank_type: common_enums::BankType,
bank_holder_type: common_enums::BankHolderType,
customer_id: Secret<String>,
}
@ -238,17 +238,15 @@ impl TryFrom<&types::TokenizationRouterData> for StaxTokenRequest {
};
Ok(Self::Card(stax_card_data))
}
domain::PaymentMethodData::BankDebit(
api_models::payments::BankDebitData::AchBankDebit {
billing_details,
account_number,
routing_number,
bank_name,
bank_type,
bank_holder_type,
..
},
) => {
domain::PaymentMethodData::BankDebit(domain::BankDebitData::AchBankDebit {
billing_details,
account_number,
routing_number,
bank_name,
bank_type,
bank_holder_type,
..
}) => {
let stax_bank_data = StaxBankTokenizeData {
person_name: billing_details.name,
bank_account: account_number,

View File

@ -1029,13 +1029,13 @@ impl ForeignTryFrom<&domain::WalletData> for Option<StripePaymentMethodType> {
}
}
impl From<&payments::BankDebitData> for StripePaymentMethodType {
fn from(bank_debit_data: &payments::BankDebitData) -> Self {
impl From<&domain::BankDebitData> for StripePaymentMethodType {
fn from(bank_debit_data: &domain::BankDebitData) -> Self {
match bank_debit_data {
payments::BankDebitData::AchBankDebit { .. } => Self::Ach,
payments::BankDebitData::SepaBankDebit { .. } => Self::Sepa,
payments::BankDebitData::BecsBankDebit { .. } => Self::Becs,
payments::BankDebitData::BacsBankDebit { .. } => Self::Bacs,
domain::BankDebitData::AchBankDebit { .. } => Self::Ach,
domain::BankDebitData::SepaBankDebit { .. } => Self::Sepa,
domain::BankDebitData::BecsBankDebit { .. } => Self::Becs,
domain::BankDebitData::BacsBankDebit { .. } => Self::Bacs,
}
}
}
@ -1078,8 +1078,8 @@ impl TryFrom<(&domain::payments::PayLaterData, StripePaymentMethodType)> for Str
}
}
impl From<&payments::BankDebitBilling> for StripeBillingAddress {
fn from(item: &payments::BankDebitBilling) -> Self {
impl From<&domain::BankDebitBilling> for StripeBillingAddress {
fn from(item: &domain::BankDebitBilling) -> Self {
Self {
email: Some(item.email.to_owned()),
country: item
@ -1212,10 +1212,10 @@ impl TryFrom<(&domain::BankRedirectData, Option<bool>)> for StripeBillingAddress
}
fn get_bank_debit_data(
bank_debit_data: &payments::BankDebitData,
bank_debit_data: &domain::BankDebitData,
) -> (StripePaymentMethodType, BankDebitData, StripeBillingAddress) {
match bank_debit_data {
payments::BankDebitData::AchBankDebit {
domain::BankDebitData::AchBankDebit {
billing_details,
account_number,
routing_number,
@ -1230,7 +1230,7 @@ fn get_bank_debit_data(
let billing_data = StripeBillingAddress::from(billing_details);
(StripePaymentMethodType::Ach, ach_data, billing_data)
}
payments::BankDebitData::SepaBankDebit {
domain::BankDebitData::SepaBankDebit {
billing_details,
iban,
..
@ -1242,7 +1242,7 @@ fn get_bank_debit_data(
let billing_data = StripeBillingAddress::from(billing_details);
(StripePaymentMethodType::Sepa, sepa_data, billing_data)
}
payments::BankDebitData::BecsBankDebit {
domain::BankDebitData::BecsBankDebit {
billing_details,
account_number,
bsb_number,
@ -1256,7 +1256,7 @@ fn get_bank_debit_data(
let billing_data = StripeBillingAddress::from(billing_details);
(StripePaymentMethodType::Becs, becs_data, billing_data)
}
payments::BankDebitData::BacsBankDebit {
domain::BankDebitData::BacsBankDebit {
billing_details,
account_number,
sort_code,

View File

@ -2,7 +2,7 @@ use std::collections::HashMap;
use api_models::{
enums::{CanadaStatesAbbreviation, UsStatesAbbreviation},
payments::{self, BankDebitBilling, OrderDetailsWithAmount},
payments::{self, OrderDetailsWithAmount},
};
use base64::Engine;
use common_utils::{
@ -1255,7 +1255,7 @@ pub trait BankDirectDebitBillingData {
fn get_billing_country(&self) -> Result<api_models::enums::CountryAlpha2, Error>;
}
impl BankDirectDebitBillingData for BankDebitBilling {
impl BankDirectDebitBillingData for domain::BankDebitBilling {
fn get_billing_country(&self) -> Result<api_models::enums::CountryAlpha2, Error> {
self.address
.as_ref()

View File

@ -768,14 +768,14 @@ impl TryFrom<&domain::payments::PayLaterData> for ZenPaymentsRequest {
}
}
impl TryFrom<&api_models::payments::BankDebitData> for ZenPaymentsRequest {
impl TryFrom<&domain::BankDebitData> for ZenPaymentsRequest {
type Error = error_stack::Report<errors::ConnectorError>;
fn try_from(value: &api_models::payments::BankDebitData) -> Result<Self, Self::Error> {
fn try_from(value: &domain::BankDebitData) -> Result<Self, Self::Error> {
match value {
api_models::payments::BankDebitData::AchBankDebit { .. }
| api_models::payments::BankDebitData::SepaBankDebit { .. }
| api_models::payments::BankDebitData::BecsBankDebit { .. }
| api_models::payments::BankDebitData::BacsBankDebit { .. } => {
domain::BankDebitData::AchBankDebit { .. }
| domain::BankDebitData::SepaBankDebit { .. }
| domain::BankDebitData::BecsBankDebit { .. }
| domain::BankDebitData::BacsBankDebit { .. } => {
Err(errors::ConnectorError::NotImplemented(
utils::get_unimplemented_payment_method_error_message("Zen"),
)

View File

@ -702,7 +702,7 @@ pub async fn retrieve_payment_method_from_auth_service(
let mut bank_type = None;
if let Some(account_type) = bank_account.account_type.clone() {
bank_type = api_models::enums::BankType::from_str(account_type.as_str())
bank_type = common_enums::BankType::from_str(account_type.as_str())
.map_err(|error| logger::error!(%error,"unable to parse account_type {account_type:?}"))
.ok();
}

View File

@ -1,7 +1,6 @@
use common_utils::pii::{self, Email};
use masking::Secret;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
// We need to derive Serialize and Deserialize because some parts of payment method data are being
// stored in the database as serde_json::Value
@ -12,7 +11,7 @@ pub enum PaymentMethodData {
Wallet(WalletData),
PayLater(PayLaterData),
BankRedirect(BankRedirectData),
BankDebit(api_models::payments::BankDebitData),
BankDebit(BankDebitData),
BankTransfer(Box<api_models::payments::BankTransferData>),
Crypto(CryptoData),
MandatePayment,
@ -65,7 +64,7 @@ pub enum CardRedirectData {
CardRedirect {},
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub enum PayLaterData {
KlarnaRedirect {
billing_email: Email,
@ -85,7 +84,7 @@ pub enum PayLaterData {
AtomeRedirect {},
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub enum WalletData {
AliPayQr(Box<AliPayQr>),
@ -116,14 +115,14 @@ pub enum WalletData {
SwishQr(SwishQrData),
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct SamsungPayWalletData {
/// The encrypted payment token from Samsung
pub token: Secret<String>,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GooglePayWalletData {
/// The type of payment method
@ -136,67 +135,67 @@ pub struct GooglePayWalletData {
pub tokenization_data: GpayTokenizationData,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ApplePayRedirectData {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GooglePayRedirectData {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GooglePayThirdPartySdkData {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ApplePayThirdPartySdkData {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct WeChatPayRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct WeChatPay {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct WeChatPayQr {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct CashappQr {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct PaypalRedirection {
/// paypal's email address
pub email: Option<Email>,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct AliPayQr {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct AliPayRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct AliPayHkRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct MomoRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct KakaoPayRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GoPayRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GcashRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct MobilePayRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct MbWayRedirection {
/// Telephone number of the shopper. Should be Portuguese phone number.
pub telephone_number: Secret<String>,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GooglePayPaymentMethodInfo {
/// The name of the card network
@ -205,19 +204,19 @@ pub struct GooglePayPaymentMethodInfo {
pub card_details: String,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct PayPalWalletData {
/// Token generated for the Apple pay
pub token: String,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct TouchNGoRedirection {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct SwishQrData {}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct GpayTokenizationData {
/// The type of the token
pub token_type: String,
@ -225,7 +224,7 @@ pub struct GpayTokenizationData {
pub token: String,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ApplePayWalletData {
/// The payment data of Apple pay
pub payment_data: String,
@ -235,14 +234,14 @@ pub struct ApplePayWalletData {
pub transaction_identifier: String,
}
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Eq, PartialEq, Clone, Debug, serde::Deserialize, serde::Serialize)]
pub struct ApplepayPaymentMethod {
pub display_name: String,
pub network: String,
pub pm_type: String,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub enum BankRedirectData {
BancontactCard {
@ -312,26 +311,25 @@ pub enum BankRedirectData {
},
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct BankRedirectBilling {
pub billing_name: Option<Secret<String>>,
pub email: Option<Email>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CryptoData {
pub pay_currency: Option<String>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "snake_case")]
pub struct UpiData {
#[schema(value_type = Option<String>, example = "successtest@iata")]
pub vpa_id: Option<Secret<String, pii::UpiVpaMaskingStrategy>>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VoucherData {
Boleto(Box<BoletoVoucherData>),
@ -350,85 +348,109 @@ pub enum VoucherData {
PayEasy(Box<JCSVoucherData>),
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct BoletoVoucherData {
/// The shopper's social security number
#[schema(value_type = Option<String>)]
pub social_security_number: Option<Secret<String>>,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct AlfamartVoucherData {
/// The billing first name for Alfamart
#[schema(value_type = String, example = "Jane")]
pub first_name: Secret<String>,
/// The billing second name for Alfamart
#[schema(value_type = String, example = "Doe")]
pub last_name: Option<Secret<String>>,
/// The Email ID for Alfamart
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct IndomaretVoucherData {
/// The billing first name for Alfamart
#[schema(value_type = String, example = "Jane")]
pub first_name: Secret<String>,
/// The billing second name for Alfamart
#[schema(value_type = String, example = "Doe")]
pub last_name: Option<Secret<String>>,
/// The Email ID for Alfamart
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
}
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize, ToSchema)]
#[derive(Debug, Clone, Eq, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct JCSVoucherData {
/// The billing first name for Japanese convenience stores
#[schema(value_type = String, example = "Jane")]
pub first_name: Secret<String>,
/// The billing second name Japanese convenience stores
#[schema(value_type = String, example = "Doe")]
pub last_name: Option<Secret<String>>,
/// The Email ID for Japanese convenience stores
#[schema(value_type = String, example = "example@me.com")]
pub email: Email,
/// The telephone number for Japanese convenience stores
#[schema(value_type = String, example = "9999999999")]
pub phone_number: String,
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, ToSchema, Eq, PartialEq)]
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum GiftCardData {
Givex(GiftCardDetails),
PaySafeCard {},
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, ToSchema, Eq, PartialEq)]
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct GiftCardDetails {
/// The gift card number
#[schema(value_type = String)]
pub number: Secret<String>,
/// The card verification code.
#[schema(value_type = String)]
pub cvc: Secret<String>,
}
#[derive(Eq, PartialEq, Debug, serde::Deserialize, serde::Serialize, Clone, ToSchema, Default)]
#[derive(Eq, PartialEq, Debug, serde::Deserialize, serde::Serialize, Clone, Default)]
#[serde(rename_all = "snake_case")]
pub struct CardToken {
/// The card holder's name
#[schema(value_type = String, example = "John Test")]
pub card_holder_name: Option<Secret<String>>,
/// The CVC number for the card
#[schema(value_type = Option<String>)]
pub card_cvc: Option<Secret<String>>,
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum BankDebitData {
AchBankDebit {
billing_details: BankDebitBilling,
account_number: Secret<String>,
routing_number: Secret<String>,
card_holder_name: Option<Secret<String>>,
bank_account_holder_name: Option<Secret<String>>,
bank_name: Option<common_enums::BankNames>,
bank_type: Option<common_enums::BankType>,
bank_holder_type: Option<common_enums::BankHolderType>,
},
SepaBankDebit {
billing_details: BankDebitBilling,
iban: Secret<String>,
bank_account_holder_name: Option<Secret<String>>,
},
BecsBankDebit {
billing_details: BankDebitBilling,
account_number: Secret<String>,
bsb_number: Secret<String>,
bank_account_holder_name: Option<Secret<String>>,
},
BacsBankDebit {
billing_details: BankDebitBilling,
account_number: Secret<String>,
sort_code: Secret<String>,
bank_account_holder_name: Option<Secret<String>>,
},
}
#[derive(serde::Deserialize, serde::Serialize, Debug, Clone, Eq, PartialEq)]
pub struct BankDebitBilling {
pub name: Secret<String>,
pub email: Email,
pub address: Option<api_models::payments::AddressDetails>,
}
impl From<api_models::payments::PaymentMethodData> for PaymentMethodData {
fn from(api_model_payment_method_data: api_models::payments::PaymentMethodData) -> Self {
match api_model_payment_method_data {
@ -448,7 +470,7 @@ impl From<api_models::payments::PaymentMethodData> for PaymentMethodData {
Self::BankRedirect(From::from(bank_redirect_data))
}
api_models::payments::PaymentMethodData::BankDebit(bank_debit_data) => {
Self::BankDebit(bank_debit_data)
Self::BankDebit(From::from(bank_debit_data))
}
api_models::payments::PaymentMethodData::BankTransfer(bank_transfer_data) => {
Self::BankTransfer(bank_transfer_data)
@ -845,3 +867,76 @@ impl From<api_models::payments::CardToken> for CardToken {
}
}
}
impl From<api_models::payments::BankDebitData> for BankDebitData {
fn from(value: api_models::payments::BankDebitData) -> Self {
match value {
api_models::payments::BankDebitData::AchBankDebit {
billing_details,
account_number,
routing_number,
card_holder_name,
bank_account_holder_name,
bank_name,
bank_type,
bank_holder_type,
} => Self::AchBankDebit {
billing_details: BankDebitBilling {
name: billing_details.name,
email: billing_details.email,
address: billing_details.address,
},
account_number,
routing_number,
card_holder_name,
bank_account_holder_name,
bank_name,
bank_type,
bank_holder_type,
},
api_models::payments::BankDebitData::SepaBankDebit {
billing_details,
iban,
bank_account_holder_name,
} => Self::SepaBankDebit {
billing_details: BankDebitBilling {
name: billing_details.name,
email: billing_details.email,
address: billing_details.address,
},
iban,
bank_account_holder_name,
},
api_models::payments::BankDebitData::BecsBankDebit {
billing_details,
account_number,
bsb_number,
bank_account_holder_name,
} => Self::BecsBankDebit {
billing_details: BankDebitBilling {
name: billing_details.name,
email: billing_details.email,
address: billing_details.address,
},
account_number,
bsb_number,
bank_account_holder_name,
},
api_models::payments::BankDebitData::BacsBankDebit {
billing_details,
account_number,
sort_code,
bank_account_holder_name,
} => Self::BacsBankDebit {
billing_details: BankDebitBilling {
name: billing_details.name,
email: billing_details.email,
address: billing_details.address,
},
account_number,
sort_code,
bank_account_holder_name,
},
}
}
}