feat: implement list_merchant_connector_accounts_by_merchant_id_connector_name function (#2742)

This commit is contained in:
Hrithikesh
2023-10-31 17:08:46 +05:30
committed by GitHub
parent 0f5406c620
commit 15a6b5a855
2 changed files with 33 additions and 76 deletions

View File

@ -130,17 +130,12 @@ impl MerchantConnectorAccount {
get_disabled: bool, get_disabled: bool,
) -> StorageResult<Vec<Self>> { ) -> StorageResult<Vec<Self>> {
if get_disabled { if get_disabled {
generics::generic_filter::< generics::generic_filter::<<Self as HasTable>::Table, _, _, _>(
<Self as HasTable>::Table,
_,
<<Self as HasTable>::Table as Table>::PrimaryKey,
_,
>(
conn, conn,
dsl::merchant_id.eq(merchant_id.to_owned()), dsl::merchant_id.eq(merchant_id.to_owned()),
None, None,
None, None,
None, Some(dsl::created_at.asc()),
) )
.await .await
} else { } else {

View File

@ -1,7 +1,4 @@
use std::cmp::Ordering;
use common_utils::ext_traits::{AsyncExt, ByteSliceExt, Encode}; use common_utils::ext_traits::{AsyncExt, ByteSliceExt, Encode};
use diesel_models::errors as storage_errors;
use error_stack::{IntoReport, ResultExt}; use error_stack::{IntoReport, ResultExt};
#[cfg(feature = "accounts_cache")] #[cfg(feature = "accounts_cache")]
use storage_impl::redis::cache; use storage_impl::redis::cache;
@ -130,7 +127,7 @@ where
merchant_id: &str, merchant_id: &str,
connector_name: &str, connector_name: &str,
key_store: &domain::MerchantKeyStore, key_store: &domain::MerchantKeyStore,
) -> CustomResult<domain::MerchantConnectorAccount, errors::StorageError>; ) -> CustomResult<Vec<domain::MerchantConnectorAccount>, errors::StorageError>;
async fn insert_merchant_connector_account( async fn insert_merchant_connector_account(
&self, &self,
@ -263,46 +260,28 @@ impl MerchantConnectorAccountInterface for Store {
merchant_id: &str, merchant_id: &str,
connector_name: &str, connector_name: &str,
key_store: &domain::MerchantKeyStore, key_store: &domain::MerchantKeyStore,
) -> CustomResult<domain::MerchantConnectorAccount, errors::StorageError> { ) -> CustomResult<Vec<domain::MerchantConnectorAccount>, errors::StorageError> {
let find_call = || async { let conn = connection::pg_connection_read(self).await?;
let conn = connection::pg_connection_read(self).await?; storage::MerchantConnectorAccount::find_by_merchant_id_connector_name(
storage::MerchantConnectorAccount::find_by_merchant_id_connector_name( &conn,
&conn, merchant_id,
merchant_id, connector_name,
connector_name, )
) .await
.await .map_err(Into::into)
.map_err(Into::into) .into_report()
.into_report() .async_and_then(|items| async {
}; let mut output = Vec::with_capacity(items.len());
let mca_list = find_call().await?; for item in items.into_iter() {
match mca_list.len().cmp(&1) { output.push(
Ordering::Less => { item.convert(key_store.key.get_inner())
Err(errors::StorageError::ValueNotFound("MerchantConnectorAccount".into()).into()) .await
.attach_printable(format!( .change_context(errors::StorageError::DecryptionError)?,
"No records found for {} and {}", )
merchant_id, connector_name
))
} }
Ordering::Greater => Err(errors::StorageError::DatabaseError( Ok(output)
storage_errors::DatabaseError::Others.into(), })
)) .await
.into_report()
.attach_printable(format!(
"Found multiple records for {} and {}",
merchant_id, connector_name
)),
Ordering::Equal => match mca_list.first() {
Some(mca) => mca
.to_owned()
.convert(key_store.key.get_inner())
.await
.change_context(errors::StorageError::DeserializationFailed),
None => Err(
errors::StorageError::ValueNotFound("MerchantConnectorAccount".into()).into(),
),
},
}
} }
async fn find_by_merchant_connector_account_merchant_id_merchant_connector_id( async fn find_by_merchant_connector_account_merchant_id_merchant_connector_id(
@ -514,8 +493,8 @@ impl MerchantConnectorAccountInterface for MockDb {
merchant_id: &str, merchant_id: &str,
connector_name: &str, connector_name: &str,
key_store: &domain::MerchantKeyStore, key_store: &domain::MerchantKeyStore,
) -> CustomResult<domain::MerchantConnectorAccount, errors::StorageError> { ) -> CustomResult<Vec<domain::MerchantConnectorAccount>, errors::StorageError> {
let mca_list = self let accounts = self
.merchant_connector_accounts .merchant_connector_accounts
.lock() .lock()
.await .await
@ -525,33 +504,16 @@ impl MerchantConnectorAccountInterface for MockDb {
}) })
.cloned() .cloned()
.collect::<Vec<_>>(); .collect::<Vec<_>>();
match mca_list.len().cmp(&1) { let mut output = Vec::with_capacity(accounts.len());
Ordering::Less => { for account in accounts.into_iter() {
Err(errors::StorageError::ValueNotFound("MerchantConnectorAccount".into()).into()) output.push(
.attach_printable(format!( account
"No records found for {} and {}",
merchant_id, connector_name
))
}
Ordering::Greater => Err(errors::StorageError::DatabaseError(
storage_errors::DatabaseError::Others.into(),
))
.into_report()
.attach_printable(format!(
"Found multiple records for {} and {}",
merchant_id, connector_name
)),
Ordering::Equal => match mca_list.first() {
Some(mca) => mca
.to_owned()
.convert(key_store.key.get_inner()) .convert(key_store.key.get_inner())
.await .await
.change_context(errors::StorageError::DeserializationFailed), .change_context(errors::StorageError::DecryptionError)?,
None => Err( )
errors::StorageError::ValueNotFound("MerchantConnectorAccount".into()).into(),
),
},
} }
Ok(output)
} }
async fn find_merchant_connector_account_by_profile_id_connector_name( async fn find_merchant_connector_account_by_profile_id_connector_name(