feat: transaction time

This commit is contained in:
acx
2024-08-15 00:52:40 +08:00
parent 2b2b895b7d
commit ceb3edba39

View File

@@ -9,6 +9,7 @@ use axum_macros::debug_handler;
use diesel::dsl::exists; use diesel::dsl::exists;
use diesel::prelude::*; use diesel::prelude::*;
use std::fmt; use std::fmt;
use chrono::ParseResult;
// use diesel::update; // use diesel::update;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
// use serde_json::to_string; // use serde_json::to_string;
@@ -29,7 +30,7 @@ pub struct SubmitTransactionRequest {
book_id: i64, book_id: i64,
category_id: i64, category_id: i64,
tag_ids: Vec<i64>, tag_ids: Vec<i64>,
time: String, time: String, // RFC 3339 "2020-04-12T22:10:57+02:00"
amounts: Vec<SubmitTransactionAmountRequest>, amounts: Vec<SubmitTransactionAmountRequest>,
} }
@@ -192,6 +193,14 @@ pub async fn create_transaction(
} }
// 2. build and insert into db // 2. build and insert into db
let datetime_tz = chrono::DateTime::parse_from_rfc3339(payload.time.as_str());
let datetime = match datetime_tz {
Ok(dt) => dt,
Err(_) => {
return Err((StatusCode::BAD_REQUEST, "invalid datetime, must be RFC 3339".to_string()))
}
};
let datetime_utc = datetime.with_timezone(&Utc);
let mut transaction_resp: CreateTransactionResponse; let mut transaction_resp: CreateTransactionResponse;
let mut amount_ids: Vec<i64> = Vec::new(); let mut amount_ids: Vec<i64> = Vec::new();
@@ -206,7 +215,7 @@ pub async fn create_transaction(
description: payload.description, description: payload.description,
category_id: payload.category_id, category_id: payload.category_id,
// time: payload // time: payload
time: Utc::now(), time: datetime_utc,
}; };
let inserted_transactions = diesel::insert_into(schema::transactions::table) let inserted_transactions = diesel::insert_into(schema::transactions::table)
.values(&new_transaction) .values(&new_transaction)
@@ -268,13 +277,23 @@ pub async fn update_transaction(
.await .await
.map_err(util::req::internal_error)?; .map_err(util::req::internal_error)?;
let now = Utc::now().naive_utc(); let now = Utc::now().naive_utc();
let datetime_tz = chrono::DateTime::parse_from_rfc3339(payload.time.as_str());
let datetime = match datetime_tz {
Ok(dt) => dt,
Err(_) => {
return Err((StatusCode::BAD_REQUEST, "invalid datetime, must be RFC 3339".to_string()))
}
};
let datetime_utc = datetime.with_timezone(&Utc);
let res = conn let res = conn
.interact(move |conn| { .interact(move |conn| {
diesel::update(schema::transactions::table) diesel::update(schema::transactions::table)
.filter(schema::transactions::id.eq(id)) .filter(schema::transactions::id.eq(id))
.filter(schema::transactions::uid.eq(uid)) .filter(schema::transactions::uid.eq(uid))
.set(( .set((
schema::transactions::category_id.eq(payload.category_id),
schema::transactions::description.eq(payload.description), schema::transactions::description.eq(payload.description),
schema::transactions::time.eq(datetime_utc),
schema::transactions::update_at.eq(now), schema::transactions::update_at.eq(now),
)) ))
.execute(conn) .execute(conn)