feat(router): add filters for refunds (#1501)

Co-authored-by: Sampras Lopes <lsampras@protonmail.com>
This commit is contained in:
Apoorv Dixit
2023-06-30 18:24:41 +05:30
committed by GitHub
parent 7bb0aa5ceb
commit 88860b9c0b
10 changed files with 342 additions and 60 deletions

View File

@ -1,11 +1,19 @@
#[cfg(feature = "olap")]
use std::collections::HashSet;
use storage_models::{errors::DatabaseError, refund::RefundUpdateInternal};
use super::MockDb;
#[cfg(feature = "olap")]
use crate::types::transformers::ForeignInto;
use crate::{
core::errors::{self, CustomResult},
types::storage::{self as storage_types, enums},
};
#[cfg(feature = "olap")]
const MAX_LIMIT: usize = 100;
#[async_trait::async_trait]
pub trait RefundInterface {
async fn find_refund_by_internal_reference_id_merchant_id(
@ -64,7 +72,16 @@ pub trait RefundInterface {
refund_details: &api_models::refunds::RefundListRequest,
storage_scheme: enums::MerchantStorageScheme,
limit: i64,
offset: i64,
) -> CustomResult<Vec<storage_models::refund::Refund>, errors::StorageError>;
#[cfg(feature = "olap")]
async fn filter_refund_by_meta_constraints(
&self,
merchant_id: &str,
refund_details: &api_models::refunds::TimeRange,
storage_scheme: enums::MerchantStorageScheme,
) -> CustomResult<api_models::refunds::RefundListMetaData, errors::StorageError>;
}
#[cfg(not(feature = "kv_store"))]
@ -189,6 +206,7 @@ mod storage {
refund_details: &api_models::refunds::RefundListRequest,
_storage_scheme: enums::MerchantStorageScheme,
limit: i64,
offset: i64,
) -> CustomResult<Vec<storage_models::refund::Refund>, errors::StorageError> {
let conn = connection::pg_connection_read(self).await?;
<storage_models::refund::Refund as storage_types::RefundDbExt>::filter_by_constraints(
@ -196,6 +214,25 @@ mod storage {
merchant_id,
refund_details,
limit,
offset,
)
.await
.map_err(Into::into)
.into_report()
}
#[cfg(feature = "olap")]
async fn filter_refund_by_meta_constraints(
&self,
merchant_id: &str,
refund_details: &api_models::refunds::TimeRange,
_storage_scheme: enums::MerchantStorageScheme,
) -> CustomResult<api_models::refunds::RefundListMetaData, errors::StorageError> {
let conn = connection::pg_connection_read(self).await?;
<storage_models::refund::Refund as storage_types::RefundDbExt>::filter_by_meta_constraints(
&conn,
merchant_id,
refund_details,
)
.await
.map_err(Into::into)
@ -584,11 +621,32 @@ mod storage {
refund_details: &api_models::refunds::RefundListRequest,
storage_scheme: enums::MerchantStorageScheme,
limit: i64,
offset: i64,
) -> CustomResult<Vec<storage_models::refund::Refund>, errors::StorageError> {
match storage_scheme {
enums::MerchantStorageScheme::PostgresOnly => {
let conn = connection::pg_connection_read(self).await?;
<storage_models::refund::Refund as storage_types::RefundDbExt>::filter_by_constraints(&conn, merchant_id, refund_details, limit)
<storage_models::refund::Refund as storage_types::RefundDbExt>::filter_by_constraints(&conn, merchant_id, refund_details, limit, offset)
.await
.map_err(Into::into)
.into_report()
}
enums::MerchantStorageScheme::RedisKv => Err(errors::StorageError::KVError.into()),
}
}
#[cfg(feature = "olap")]
async fn filter_refund_by_meta_constraints(
&self,
merchant_id: &str,
refund_details: &api_models::refunds::TimeRange,
storage_scheme: enums::MerchantStorageScheme,
) -> CustomResult<api_models::refunds::RefundListMetaData, errors::StorageError> {
match storage_scheme {
enums::MerchantStorageScheme::PostgresOnly => {
let conn = connection::pg_connection_read(self).await?;
<storage_models::refund::Refund as storage_types::RefundDbExt>::filter_by_meta_constraints(&conn, merchant_id, refund_details)
.await
.map_err(Into::into)
.into_report()
@ -760,14 +818,64 @@ impl RefundInterface for MockDb {
_refund_details: &api_models::refunds::RefundListRequest,
_storage_scheme: enums::MerchantStorageScheme,
limit: i64,
offset: i64,
) -> CustomResult<Vec<storage_models::refund::Refund>, errors::StorageError> {
let refunds = self.refunds.lock().await;
Ok(refunds
Ok(self
.refunds
.lock()
.await
.iter()
.filter(|refund| refund.merchant_id == merchant_id)
.take(usize::try_from(limit).unwrap_or(usize::MAX))
.skip(usize::try_from(offset).unwrap_or_default())
.take(usize::try_from(limit).unwrap_or(MAX_LIMIT))
.cloned()
.collect::<Vec<_>>())
}
#[cfg(feature = "olap")]
async fn filter_refund_by_meta_constraints(
&self,
_merchant_id: &str,
refund_details: &api_models::refunds::TimeRange,
_storage_scheme: enums::MerchantStorageScheme,
) -> CustomResult<api_models::refunds::RefundListMetaData, errors::StorageError> {
let refunds = self.refunds.lock().await;
let start_time = refund_details.start_time;
let end_time = refund_details
.end_time
.unwrap_or_else(common_utils::date_time::now);
let filtered_refunds = refunds
.iter()
.filter(|refund| refund.created_at >= start_time && refund.created_at <= end_time)
.cloned()
.collect::<Vec<storage_models::refund::Refund>>();
let mut refund_meta_data = api_models::refunds::RefundListMetaData {
connector: vec![],
currency: vec![],
status: vec![],
};
let mut unique_connectors = HashSet::new();
let mut unique_currencies = HashSet::new();
let mut unique_statuses = HashSet::new();
for refund in filtered_refunds.into_iter() {
unique_connectors.insert(refund.connector);
let currency: api_models::enums::Currency = refund.currency.foreign_into();
unique_currencies.insert(currency);
let status: api_models::enums::RefundStatus = refund.refund_status.foreign_into();
unique_statuses.insert(status);
}
refund_meta_data.connector = unique_connectors.into_iter().collect();
refund_meta_data.currency = unique_currencies.into_iter().collect();
refund_meta_data.status = unique_statuses.into_iter().collect();
Ok(refund_meta_data)
}
}