diff --git a/src/ledger/transaction.rs b/src/ledger/transaction.rs index e8fbf25..433c53b 100644 --- a/src/ledger/transaction.rs +++ b/src/ledger/transaction.rs @@ -19,6 +19,7 @@ use crate::util; use crate::util::req::CommonResp; use chrono::prelude::*; use tracing::info; +use crate::model::req::Params; const PAYMENT_STORE_EXPO: i64 = 5; @@ -176,6 +177,7 @@ pub async fn create_transaction( let amount = db_model::AmountForm { uid: uid, + account_id: amount_req.account_id, transaction_id: 0, value: value, expo: expo, @@ -338,5 +340,25 @@ pub async fn get_amounts_by_tid( claims: Claims, Query(params): Query, ) -> Result>, (StatusCode, String)> { - + info!(params.transaction_id); + let tid = match params.transaction_id { + None => 0, + Some(idx) => idx, + }; + let uid: i64 = claims.uid.clone(); + let conn = app_state + .db + .get() + .await + .map_err(util::req::internal_error)?; + let res = conn.interact(move |conn| { + schema::amounts::table + .filter(schema::amounts::uid.eq(uid)) + .filter(schema::amounts::transaction_id.eq(tid)) + .select(db_model::Amount::as_select()) + .load(conn) + }).await + .map_err(util::req::internal_error)? + .map_err(util::req::internal_error)?; + Ok(Json(res)) } \ No newline at end of file diff --git a/src/model/req.rs b/src/model/req.rs index c9b3162..7f184f4 100644 --- a/src/model/req.rs +++ b/src/model/req.rs @@ -1,7 +1,23 @@ +use std::fmt; +use std::str::FromStr; use serde::{de, Deserialize, Deserializer}; #[derive(Debug, Deserialize)] pub struct Params { #[serde(default, deserialize_with="empty_string_as_none")] - transaction_id: Option, -} \ No newline at end of file + pub transaction_id: Option, +} + +// Serde deserialization decorator to map empty Strings to None, +fn empty_string_as_none<'de, D, T>(de: D) -> Result, D::Error> +where + D: Deserializer<'de>, + T: FromStr, + T::Err: fmt::Display, +{ + let opt = Option::::deserialize(de)?; + match opt.as_deref() { + None | Some("") => Ok(None), + Some(s) => FromStr::from_str(s).map_err(de::Error::custom).map(Some), + } +}