mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-31 01:57:45 +08:00
refactor(pm): create new crate for payment methods (#7355)
Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
@ -1,10 +1,13 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use common_utils::{errors::CustomResult, types::keymanager::KeyManagerState};
|
||||
use diesel_models as store;
|
||||
use error_stack::ResultExt;
|
||||
use futures::lock::Mutex;
|
||||
use futures::lock::{Mutex, MutexGuard};
|
||||
use hyperswitch_domain_models::{
|
||||
behaviour::{Conversion, ReverseConversion},
|
||||
errors::StorageError,
|
||||
merchant_key_store::MerchantKeyStore,
|
||||
payments::{payment_attempt::PaymentAttempt, PaymentIntent},
|
||||
};
|
||||
use redis_interface::RedisSettings;
|
||||
@ -109,6 +112,96 @@ impl MockDb {
|
||||
themes: Default::default(),
|
||||
})
|
||||
}
|
||||
|
||||
pub async fn find_resource<D, R>(
|
||||
&self,
|
||||
state: &KeyManagerState,
|
||||
key_store: &MerchantKeyStore,
|
||||
resources: MutexGuard<'_, Vec<D>>,
|
||||
filter_fn: impl Fn(&&D) -> bool,
|
||||
error_message: String,
|
||||
) -> CustomResult<R, StorageError>
|
||||
where
|
||||
D: Sync + ReverseConversion<R> + Clone,
|
||||
R: Conversion,
|
||||
{
|
||||
let resource = resources.iter().find(filter_fn).cloned();
|
||||
match resource {
|
||||
Some(res) => Ok(res
|
||||
.convert(
|
||||
state,
|
||||
key_store.key.get_inner(),
|
||||
key_store.merchant_id.clone().into(),
|
||||
)
|
||||
.await
|
||||
.change_context(StorageError::DecryptionError)?),
|
||||
None => Err(StorageError::ValueNotFound(error_message).into()),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn find_resources<D, R>(
|
||||
&self,
|
||||
state: &KeyManagerState,
|
||||
key_store: &MerchantKeyStore,
|
||||
resources: MutexGuard<'_, Vec<D>>,
|
||||
filter_fn: impl Fn(&&D) -> bool,
|
||||
error_message: String,
|
||||
) -> CustomResult<Vec<R>, StorageError>
|
||||
where
|
||||
D: Sync + ReverseConversion<R> + Clone,
|
||||
R: Conversion,
|
||||
{
|
||||
let resources: Vec<_> = resources.iter().filter(filter_fn).cloned().collect();
|
||||
if resources.is_empty() {
|
||||
Err(StorageError::ValueNotFound(error_message).into())
|
||||
} else {
|
||||
let pm_futures = resources
|
||||
.into_iter()
|
||||
.map(|pm| async {
|
||||
pm.convert(
|
||||
state,
|
||||
key_store.key.get_inner(),
|
||||
key_store.merchant_id.clone().into(),
|
||||
)
|
||||
.await
|
||||
.change_context(StorageError::DecryptionError)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let domain_resources = futures::future::try_join_all(pm_futures).await?;
|
||||
|
||||
Ok(domain_resources)
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn update_resource<D, R>(
|
||||
&self,
|
||||
state: &KeyManagerState,
|
||||
key_store: &MerchantKeyStore,
|
||||
mut resources: MutexGuard<'_, Vec<D>>,
|
||||
resource_updated: D,
|
||||
filter_fn: impl Fn(&&mut D) -> bool,
|
||||
error_message: String,
|
||||
) -> CustomResult<R, StorageError>
|
||||
where
|
||||
D: Sync + ReverseConversion<R> + Clone,
|
||||
R: Conversion,
|
||||
{
|
||||
if let Some(pm) = resources.iter_mut().find(filter_fn) {
|
||||
*pm = resource_updated.clone();
|
||||
let result = resource_updated
|
||||
.convert(
|
||||
state,
|
||||
key_store.key.get_inner(),
|
||||
key_store.merchant_id.clone().into(),
|
||||
)
|
||||
.await
|
||||
.change_context(StorageError::DecryptionError)?;
|
||||
Ok(result)
|
||||
} else {
|
||||
Err(StorageError::ValueNotFound(error_message).into())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "payouts"))]
|
||||
|
||||
Reference in New Issue
Block a user