mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-28 04:04:55 +08:00
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:
@ -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,
|
||||||
)]
|
)]
|
||||||
|
|||||||
@ -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,
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user