From 39e656ef9103b51d8bfad5340ea3e10c28c4d0d3 Mon Sep 17 00:00:00 2001 From: brian Date: Fri, 23 May 2025 23:50:20 +0800 Subject: [PATCH] feat: axum + diesel --- .env.template | 1 + Cargo.lock | 195 +++++++++++++++----------------------- Cargo.toml | 4 +- src/ledger/account.rs | 2 +- src/ledger/book.rs | 2 +- src/ledger/category.rs | 103 ++++++++++++++++---- src/ledger/operation.rs | 30 ------ src/ledger/tag.rs | 2 +- src/ledger/transaction.rs | 2 +- src/middleware/auth.rs | 10 +- 10 files changed, 172 insertions(+), 179 deletions(-) create mode 100644 .env.template diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..5d6d8e5 --- /dev/null +++ b/.env.template @@ -0,0 +1 @@ +DATABASE_URL=postgres://username:password@localhost/diesel_demo \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 22f5251..f23c27d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -60,14 +60,14 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" -version = "0.7.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ - "async-trait", "axum-core", - "axum-macros", + "axum-macros 0.5.0", "bytes", + "form_urlencoded", "futures-util", "http", "http-body", @@ -85,9 +85,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", "tracing", @@ -95,20 +95,19 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -116,9 +115,9 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.9.3" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be6ea09c9b96cb5076af0de2e383bd2bc0c18f827cf1967bdd353e0b910d733" +checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" dependencies = [ "axum", "axum-core", @@ -130,11 +129,11 @@ dependencies = [ "http-body-util", "mime", "pin-project-lite", + "rustversion", "serde", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -149,6 +148,17 @@ dependencies = [ "syn", ] +[[package]] +name = "axum-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "backtrace" version = "0.3.73" @@ -239,7 +249,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -544,7 +554,7 @@ dependencies = [ "async-trait", "axum", "axum-extra", - "axum-macros", + "axum-macros 0.4.1", "chrono", "deadpool-diesel", "diesel", @@ -557,7 +567,7 @@ dependencies = [ "serde", "serde_json", "tokio", - "tower", + "tower 0.4.13", "tower-http", "tracing", "tracing-subscriber", @@ -656,6 +666,8 @@ dependencies = [ "hyper", "pin-project-lite", "tokio", + "tower 0.4.13", + "tower-service", ] [[package]] @@ -725,9 +737,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "lock_api" @@ -756,9 +768,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" @@ -783,13 +795,13 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] @@ -887,7 +899,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1068,7 +1080,7 @@ dependencies = [ "libc", "spin", "untrusted", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1213,7 +1225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1245,12 +1257,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.1" @@ -1320,28 +1326,27 @@ dependencies = [ [[package]] name = "tokio" -version = "1.38.0" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -1364,6 +1369,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-http" version = "0.5.2" @@ -1383,15 +1404,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1579,16 +1600,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -1597,22 +1609,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -1621,46 +1618,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -1673,48 +1652,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" diff --git a/Cargo.toml b/Cargo.toml index 5a4360a..15c9ef9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,8 @@ edition = "2021" [dependencies] async-trait = "0.1.81" -axum = {version = "0.7.5", features = ["macros"]} -axum-extra = { version = "0.9.3", features = ["typed-header"] } +axum = {version = "0.8", features = ["macros"]} +axum-extra = { version = "0.10", features = ["typed-header"] } chrono = {version = "0.4", features = ["serde"]} deadpool-diesel = {version ="0.6.1", features = ["postgres"]} diesel = { version = "2", features = ["postgres", "chrono"] } diff --git a/src/ledger/account.rs b/src/ledger/account.rs index a595d91..ab7c9c6 100644 --- a/src/ledger/account.rs +++ b/src/ledger/account.rs @@ -35,7 +35,7 @@ pub struct CreateAccountResponse { pub fn get_nest_handlers() -> Router { Router::new() .route("/", post(create_account).get(get_all_accounts)) - .route("/:id", post(update_account).get(get_account)) + .route("/{id}", post(update_account).get(get_account)) } #[debug_handler] diff --git a/src/ledger/book.rs b/src/ledger/book.rs index 17e7548..8898b33 100644 --- a/src/ledger/book.rs +++ b/src/ledger/book.rs @@ -32,7 +32,7 @@ pub struct CreateBookResponse { pub fn get_nest_handlers() -> Router { Router::new() .route("/", post(create_book).get(get_all_books)) - .route("/:id", post(update_book).get(get_book)) + .route("/{id}", post(update_book).get(get_book)) } #[debug_handler] diff --git a/src/ledger/category.rs b/src/ledger/category.rs index bea0bc2..6637a2f 100644 --- a/src/ledger/category.rs +++ b/src/ledger/category.rs @@ -15,6 +15,7 @@ use serde::{Deserialize, Serialize}; // use serde_json::to_string; use crate::model::db_model; use crate::model::schema; +use crate::model::schema::categories::parent_category_id; use crate::util; // use crate::model::schema::categories::dsl::categories; use crate::util::req::CommonResp; @@ -28,20 +29,18 @@ use crate::util::operation::{ ActionType, ACTION_CREATE, ACTION_UPDATE, ACTION_DELETE, }; - - pub fn get_nest_handlers() -> Router { Router::new() .route("/", post(create_category).get(get_all_categories)) - .route("/:id", post(update_category).get(get_category)) + .route("/{id}", post(update_category).get(get_category)) } #[derive(Deserialize)] pub struct CreateCategoryRequest { name: String, - level: i32, - parent_category_id: i64, - book_id: i64, + level: String, + parent_category_id: String, + book_id: String, } #[derive(Serialize)] @@ -55,8 +54,34 @@ pub async fn create_category( claims: Claims, Json(payload): Json, ) -> Result, (StatusCode, String)> { - let uid: i64 = claims.uid.clone(); // TODO replace with actual user id. - // let ret = CreateCategoryResponse{id: 134132413541, name: "24532452".to_string()}; + let uid: i64 = claims.uid.clone(); + let level: i32 = match payload.level.parse() { + Ok(level) => level, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid level".to_string(), + )) + } + }; + let parent_cid: i64 = match payload.parent_category_id.parse(){ + Ok(id) => id, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid parent_category_id".to_string(), + )) + } + }; + let book_id: i64 = match payload.book_id.parse() { + Ok(id) => id, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid book_id".to_string(), + )) + } + }; let conn = app_state .db .get() @@ -65,9 +90,9 @@ pub async fn create_category( let new_category = db_model::CategoryForm { name: payload.name, uid: uid, - level: payload.level, - parent_category_id: payload.parent_category_id, - book_id: payload.book_id, + level: level, + parent_category_id: parent_cid, + book_id: book_id, }; let new_operation = db_model::CreateOperation{ uid: uid, @@ -78,8 +103,24 @@ pub async fn create_category( let mut create_response = CreateCategoryResponse{ id: 0, }; + // Check if book exists under current user + let book_exists = conn + .interact(move |conn| { + schema::books::table + .select(diesel::dsl::exists(db_model::Category.as_select().filter(schema::books::id.eq(book_id)))) + // .filter(schema::books::uid.eq(uid))(schema::books::id.eq(book_id)))) + .get_result::(conn) + }) + .await + .map_err(util::req::internal_error)? + .map_err(util::req::internal_error)?; + + if !book_exists { + return Err((StatusCode::NOT_FOUND, "Book not found for the user".to_string())); + } + let cuid = uid; - conn + let create_result = conn .interact(move |conn| { conn.transaction(|conn| { let category = diesel::insert_into(schema::categories::table) @@ -100,7 +141,7 @@ pub async fn create_category( .filter(schema::operations::uid.eq(cuid)) .set((schema::operations::entity_id.eq(category.id))) .execute(conn)?; - diesel::result::QueryResult::Ok(()) + diesel::result::QueryResult::Ok((category.id)) }) // diesel::insert_into(schema::categories::table) // .values(&new_category) @@ -110,6 +151,7 @@ pub async fn create_category( .await .map_err(util::req::internal_error)? .map_err(util::req::internal_error)?; + create_response.id = create_result; Ok(Json(create_response)) } @@ -119,8 +161,35 @@ pub async fn update_category( claims: Claims, Json(payload): Json, ) -> Result, (StatusCode, String)> { - let uid: i64 = claims.uid.clone(); // TODO replace with actual user id. - // let ret = CreateCategoryResponse{id: 134132413541, name: "24532452".to_string()}; + let uid: i64 = claims.uid.clone(); + let level: i32 = match payload.level.parse() { + Ok(level) => level, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid level".to_string(), + )) + } + }; + let parent_cid: i64 = match payload.parent_category_id.parse(){ + Ok(id) => id, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid parent_category_id".to_string(), + )) + } + }; + let book_id: i64 = match payload.book_id.parse() { + Ok(id) => id, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + "Invalid book_id".to_string(), + )) + } + }; + let conn = app_state .db .get() @@ -134,8 +203,8 @@ pub async fn update_category( .filter(schema::categories::uid.eq(uid)) .set(( schema::categories::name.eq(payload.name), - schema::categories::level.eq(payload.level), - schema::categories::parent_category_id.eq(payload.parent_category_id), + schema::categories::level.eq(level), + schema::categories::parent_category_id.eq(parent_cid), schema::categories::update_at.eq(now), )) .execute(conn) diff --git a/src/ledger/operation.rs b/src/ledger/operation.rs index 90f9e0e..3f8b08d 100644 --- a/src/ledger/operation.rs +++ b/src/ledger/operation.rs @@ -6,7 +6,6 @@ use diesel::dsl::max; use crate::model::{db_model, schema}; use crate::middleware::auth::Claims; use crate::model::db_model::Operation; -use crate::model::schema::operation_snapshots::max_op_id; use crate::util; #[derive(Serialize)] @@ -80,32 +79,3 @@ pub async fn get_operations( Ok(Json(resp)) // Ok(Json(res)) } - -struct GetOperationSnapshotResponse { - max_op_id: i64, -} -pub async fn get_operation_snapshot( - State(app_state): State, - claims: Claims, -) -> Result, (StatusCode, String)> { - 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::operation_snapshots::table - .filter(schema::operation_snapshots::uid.eq(uid)) - .select(max(schema::operation_snapshots::max_op_id)) - .limit(1) - .get_result(conn) - .map(|x| x as i64) - }).await - .map_err(util::req::internal_error)? - .map_err(util::req::internal_error)?; - let resp = GetOperationSnapshotResponse{ - max_op_id: res, - }; - Ok(Json(resp)) -} diff --git a/src/ledger/tag.rs b/src/ledger/tag.rs index 7e9ac13..f978b19 100644 --- a/src/ledger/tag.rs +++ b/src/ledger/tag.rs @@ -39,7 +39,7 @@ pub struct CreateTagResponse { pub fn get_nest_handlers() -> Router { Router::new() .route("/", post(create_tag).get(get_all_tags)) - .route("/:id", post(update_tag).get(get_tag)) + .route("/{id}", post(update_tag).get(get_tag)) } #[debug_handler] diff --git a/src/ledger/transaction.rs b/src/ledger/transaction.rs index 1c4baf6..dd82668 100644 --- a/src/ledger/transaction.rs +++ b/src/ledger/transaction.rs @@ -72,7 +72,7 @@ pub fn get_nest_handlers() -> Router { post(create_transaction) // create new transaction entry with amount .get(get_all_transactions),// get all transactions with entry ) - .route("/entry/:id", get(get_transaction)) // get transaction entry + .route("/entry/{id}", get(get_transaction)) // get transaction entry .route("/amount/by_transaction_id", get(get_amounts_by_tid)) .route("/amount/batch_get_by_transaction_id", post(batch_get_amounts_by_tid)) .route("/amount", get(get_all_amounts_by_tid_range)) diff --git a/src/middleware/auth.rs b/src/middleware/auth.rs index 0340594..4e6eb43 100644 --- a/src/middleware/auth.rs +++ b/src/middleware/auth.rs @@ -1,5 +1,4 @@ use axum::{ - async_trait, extract::FromRequestParts, http::{ request::Parts, @@ -8,6 +7,7 @@ use axum::{ Json, RequestPartsExt, response::{IntoResponse, Response}, }; +use async_trait::async_trait; use axum_extra::{ headers::{authorization::Bearer, Authorization}, TypedHeader, @@ -81,27 +81,25 @@ impl AuthBody { } } -#[async_trait] impl FromRequestParts for Claims where S: Send + Sync, { - type Rejection = (StatusCode, String); + type Rejection = AuthError; async fn from_request_parts(parts: &mut Parts, _state: &S) -> Result { // Extract the token from the authorization header let TypedHeader(Authorization(bearer)) = parts .extract::>>() .await - .map_err(util::req::internal_error)?; + .map_err(|_| AuthError::InvalidToken)?; // Decode the user data let token_data = decode::(bearer.token(), &KEYS.decoding, &Validation::default()) - .map_err(util::req::internal_error)?; + .map_err(|_| AuthError::InvalidToken)?; Ok(token_data.claims) } } - impl IntoResponse for AuthError { fn into_response(self) -> Response { let (status, error_message) = match self {