diff --git a/src/ledger/transaction.rs b/src/ledger/transaction.rs index 433c53b..4aad6ea 100644 --- a/src/ledger/transaction.rs +++ b/src/ledger/transaction.rs @@ -19,7 +19,7 @@ use crate::util; use crate::util::req::CommonResp; use chrono::prelude::*; use tracing::info; -use crate::model::req::Params; +use crate::model::req::GetAmountParams; const PAYMENT_STORE_EXPO: i64 = 5; @@ -315,6 +315,7 @@ pub async fn get_transaction( pub async fn get_all_transactions( State(app_state): State, claims: Claims, + Query(queryParams): Query, ) -> Result>, (StatusCode, String)> { let uid: i64 = claims.uid.clone(); let conn = app_state @@ -322,10 +323,27 @@ pub async fn get_all_transactions( .get() .await .map_err(util::req::internal_error)?; + let offset = match queryParams.start { + None => {0} + Some(start) => if start > 0 {start-1} else {0} + }; + let limit = match queryParams.limit { + None => {1 as i32} + Some(limit_num) => { + if(limit_num > req::MAX_QUERY_LIMIT) { + req::MAX_QUERY_LIMIT + } else if(limit_num < 1) { + 1 as i32 + } else { + limit_num + } + } + }; let res = conn .interact(move |conn| { - schema::transactions::table - .filter(schema::transactions::uid.eq(uid)) + schema::transactions::table.filter(schema::transactions::uid.eq(uid)) + .offset(offset) + .limit(limit as i64) .select(db_model::Transaction::as_select()) .load(conn) }) @@ -338,7 +356,7 @@ pub async fn get_all_transactions( pub async fn get_amounts_by_tid( State(app_state): State, claims: Claims, - Query(params): Query, + Query(params): Query, ) -> Result>, (StatusCode, String)> { info!(params.transaction_id); let tid = match params.transaction_id { diff --git a/src/model/req.rs b/src/model/req.rs index 7f184f4..b20137f 100644 --- a/src/model/req.rs +++ b/src/model/req.rs @@ -2,8 +2,14 @@ use std::fmt; use std::str::FromStr; use serde::{de, Deserialize, Deserializer}; +pub const QUERY_ORDER_INCREASE:i32 = 0; +pub const QUERY_ORDER_INVERT:i32 = 1; + +pub const MAX_QUERY_LIMIT:i32 =1000; + + #[derive(Debug, Deserialize)] -pub struct Params { +pub struct GetAmountParams { #[serde(default, deserialize_with="empty_string_as_none")] pub transaction_id: Option, } @@ -21,3 +27,9 @@ where Some(s) => FromStr::from_str(s).map_err(de::Error::custom).map(Some), } } + +#[derive(Deserialize)] +pub struct GetTransactionsQueryParams { + pub start: Option, + pub limit: Option, +}