refactor(payout): Handle saving wallet in temp locker (#4230)

This commit is contained in:
Sakil Mostak
2024-04-03 14:55:14 +05:30
committed by GitHub
parent ea706f81de
commit ae37b059e0

View File

@ -2,6 +2,7 @@ use common_utils::{
crypto::{DecodeMessage, EncodeMessage, GcmAes256}, crypto::{DecodeMessage, EncodeMessage, GcmAes256},
ext_traits::{BytesExt, Encode}, ext_traits::{BytesExt, Encode},
generate_id_with_default_len, generate_id_with_default_len,
pii::Email,
}; };
use error_stack::{report, ResultExt}; use error_stack::{report, ResultExt};
use masking::PeekInterface; use masking::PeekInterface;
@ -415,55 +416,57 @@ impl Vaultable for api::CardPayout {
} }
} }
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct TokenizedWalletSensitiveValues {
pub email: Option<Email>,
}
#[derive(Debug, serde::Serialize, serde::Deserialize)]
pub struct TokenizedWalletInsensitiveValues {
pub customer_id: Option<String>,
}
#[cfg(feature = "payouts")] #[cfg(feature = "payouts")]
impl Vaultable for api::WalletPayout { impl Vaultable for api::WalletPayout {
fn get_value1(&self, _customer_id: Option<String>) -> CustomResult<String, errors::VaultError> { fn get_value1(&self, _customer_id: Option<String>) -> CustomResult<String, errors::VaultError> {
let value1 = match self { let value1 = match self {
Self::Paypal(paypal_data) => api::TokenizedWalletValue1 { Self::Paypal(paypal_data) => TokenizedWalletSensitiveValues {
data: api::WalletData::PaypalRedirect(api_models::payments::PaypalRedirection { email: paypal_data.email.clone(),
email: paypal_data.email.clone(),
}),
}, },
}; };
value1 value1
.encode_to_string_of_json() .encode_to_string_of_json()
.change_context(errors::VaultError::RequestEncodingFailed) .change_context(errors::VaultError::RequestEncodingFailed)
.attach_printable("Failed to encode wallet value1") .attach_printable("Failed to encode wallet data - TokenizedWalletSensitiveValues")
} }
fn get_value2(&self, customer_id: Option<String>) -> CustomResult<String, errors::VaultError> { fn get_value2(&self, customer_id: Option<String>) -> CustomResult<String, errors::VaultError> {
let value2 = api::TokenizedWalletValue2 { customer_id }; let value2 = TokenizedWalletInsensitiveValues { customer_id };
value2 value2
.encode_to_string_of_json() .encode_to_string_of_json()
.change_context(errors::VaultError::RequestEncodingFailed) .change_context(errors::VaultError::RequestEncodingFailed)
.attach_printable("Failed to encode wallet value2") .attach_printable("Failed to encode data - TokenizedWalletInsensitiveValues")
} }
fn from_values( fn from_values(
value1: String, value1: String,
value2: String, value2: String,
) -> CustomResult<(Self, SupplementaryVaultData), errors::VaultError> { ) -> CustomResult<(Self, SupplementaryVaultData), errors::VaultError> {
let value1: api::TokenizedWalletValue1 = value1 let value1: TokenizedWalletSensitiveValues = value1
.parse_struct("TokenizedWalletValue1") .parse_struct("TokenizedWalletSensitiveValues")
.change_context(errors::VaultError::ResponseDeserializationFailed) .change_context(errors::VaultError::ResponseDeserializationFailed)
.attach_printable("Could not deserialize into wallet value1")?; .attach_printable("Could not deserialize into wallet data wallet_sensitive_data")?;
let value2: api::TokenizedWalletValue2 = value2 let value2: TokenizedWalletInsensitiveValues = value2
.parse_struct("TokenizedWalletValue2") .parse_struct("TokenizedWalletInsensitiveValues")
.change_context(errors::VaultError::ResponseDeserializationFailed) .change_context(errors::VaultError::ResponseDeserializationFailed)
.attach_printable("Could not deserialize into wallet value2")?; .attach_printable("Could not deserialize into wallet data wallet_insensitive_data")?;
let wallet = match value1.data {
api::WalletData::PaypalRedirect(paypal_data) => {
Self::Paypal(api_models::payouts::Paypal {
email: paypal_data.email,
})
}
_ => Err(errors::VaultError::ResponseDeserializationFailed)?,
};
let wallet = Self::Paypal(api_models::payouts::Paypal {
email: value1.email,
});
let supp_data = SupplementaryVaultData { let supp_data = SupplementaryVaultData {
customer_id: value2.customer_id, customer_id: value2.customer_id,
payment_method_id: None, payment_method_id: None,