feat(payments): support sort criteria in payments list (#5389)

Co-authored-by: hyperswitch-bot[bot] <148525504+hyperswitch-bot[bot]@users.noreply.github.com>
This commit is contained in:
Apoorv Dixit
2024-07-26 19:19:49 +05:30
committed by GitHub
parent 08334dae82
commit 043ea6d8dc
3 changed files with 55 additions and 2 deletions

View File

@ -4063,6 +4063,9 @@ pub struct PaymentListFilterConstraints {
pub authentication_type: Option<Vec<enums::AuthenticationType>>, pub authentication_type: Option<Vec<enums::AuthenticationType>>,
/// The list of merchant connector ids to filter payments list for selected label /// The list of merchant connector ids to filter payments list for selected label
pub merchant_connector_id: Option<Vec<String>>, pub merchant_connector_id: Option<Vec<String>>,
/// The order in which payments list should be sorted
#[serde(default)]
pub order: Order,
} }
#[derive(Clone, Debug, serde::Serialize)] #[derive(Clone, Debug, serde::Serialize)]
pub struct PaymentListFilters { pub struct PaymentListFilters {
@ -4102,6 +4105,34 @@ pub struct AmountFilter {
pub end_amount: Option<i64>, pub end_amount: Option<i64>,
} }
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
pub struct Order {
/// The field to sort, such as Amount or Created etc.
pub on: SortOn,
/// The order in which to sort the items, either Ascending or Descending
pub by: SortBy,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum SortOn {
/// Sort by the amount field
Amount,
/// Sort by the created_at field
#[default]
Created,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum SortBy {
/// Sort in ascending order
Asc,
/// Sort in descending order
#[default]
Desc,
}
#[derive( #[derive(
Debug, Clone, Copy, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash, ToSchema, Debug, Clone, Copy, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash, ToSchema,
)] )]

View File

@ -737,6 +737,7 @@ pub struct PaymentIntentListParams {
pub starting_after_id: Option<String>, pub starting_after_id: Option<String>,
pub ending_before_id: Option<String>, pub ending_before_id: Option<String>,
pub limit: Option<u32>, pub limit: Option<u32>,
pub order: api_models::payments::Order,
} }
impl From<api_models::payments::PaymentListConstraints> for PaymentIntentFetchConstraints { impl From<api_models::payments::PaymentListConstraints> for PaymentIntentFetchConstraints {
@ -758,6 +759,7 @@ impl From<api_models::payments::PaymentListConstraints> for PaymentIntentFetchCo
starting_after_id: value.starting_after, starting_after_id: value.starting_after,
ending_before_id: value.ending_before, ending_before_id: value.ending_before,
limit: Some(std::cmp::min(value.limit, PAYMENTS_LIST_MAX_LIMIT_V1)), limit: Some(std::cmp::min(value.limit, PAYMENTS_LIST_MAX_LIMIT_V1)),
order: Default::default(),
})) }))
} }
} }
@ -781,6 +783,7 @@ impl From<api_models::payments::TimeRange> for PaymentIntentFetchConstraints {
starting_after_id: None, starting_after_id: None,
ending_before_id: None, ending_before_id: None,
limit: None, limit: None,
order: Default::default(),
})) }))
} }
} }
@ -807,6 +810,7 @@ impl From<api_models::payments::PaymentListFilterConstraints> for PaymentIntentF
starting_after_id: None, starting_after_id: None,
ending_before_id: None, ending_before_id: None,
limit: Some(std::cmp::min(value.limit, PAYMENTS_LIST_MAX_LIMIT_V2)), limit: Some(std::cmp::min(value.limit, PAYMENTS_LIST_MAX_LIMIT_V2)),
order: value.order,
})) }))
} }
} }

View File

@ -1,5 +1,5 @@
#[cfg(feature = "olap")] #[cfg(feature = "olap")]
use api_models::payments::AmountFilter; use api_models::payments::{AmountFilter, Order, SortBy, SortOn};
#[cfg(feature = "olap")] #[cfg(feature = "olap")]
use async_bb8_diesel::{AsyncConnection, AsyncRunQueryDsl}; use async_bb8_diesel::{AsyncConnection, AsyncRunQueryDsl};
#[cfg(feature = "olap")] #[cfg(feature = "olap")]
@ -674,7 +674,6 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
payment_attempt_schema::table.on(pa_dsl::attempt_id.eq(pi_dsl::active_attempt_id)), payment_attempt_schema::table.on(pa_dsl::attempt_id.eq(pi_dsl::active_attempt_id)),
) )
.filter(pi_dsl::merchant_id.eq(merchant_id.to_owned())) .filter(pi_dsl::merchant_id.eq(merchant_id.to_owned()))
.order(pi_dsl::created_at.desc())
.into_boxed(); .into_boxed();
query = match constraints { query = match constraints {
@ -682,6 +681,25 @@ impl<T: DatabaseStore> PaymentIntentInterface for crate::RouterStore<T> {
query.filter(pi_dsl::payment_id.eq(payment_intent_id.to_owned())) query.filter(pi_dsl::payment_id.eq(payment_intent_id.to_owned()))
} }
PaymentIntentFetchConstraints::List(params) => { PaymentIntentFetchConstraints::List(params) => {
query = match params.order {
Order {
on: SortOn::Amount,
by: SortBy::Asc,
} => query.order(pi_dsl::amount.asc()),
Order {
on: SortOn::Amount,
by: SortBy::Desc,
} => query.order(pi_dsl::amount.desc()),
Order {
on: SortOn::Created,
by: SortBy::Asc,
} => query.order(pi_dsl::created_at.asc()),
Order {
on: SortOn::Created,
by: SortBy::Desc,
} => query.order(pi_dsl::created_at.desc()),
};
if let Some(limit) = params.limit { if let Some(limit) = params.limit {
query = query.limit(limit.into()); query = query.limit(limit.into());
} }