mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-03 13:30:39 +08:00
feat(router): add filters for refunds (#1501)
Co-authored-by: Sampras Lopes <lsampras@protonmail.com>
This commit is contained in:
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user