From 2da103d5b518fc0417c261699fa5f2deceb18690 Mon Sep 17 00:00:00 2001 From: Nicolai Van der Storm Date: Tue, 18 Feb 2025 13:01:57 +0100 Subject: [PATCH] Fixes --- Cargo.lock | 9 +++++---- Cargo.toml | 2 +- src/base/controller.rs | 4 ++-- src/base/entity.rs | 1 - src/main.rs | 3 +-- src/routes/user/controller.rs | 22 ++++++++++++++++++---- src/routes/user/model.rs | 10 +++++++++- src/routes/user/schema.rs | 6 ++++-- 8 files changed, 40 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e5afb73..811847a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -180,6 +180,7 @@ dependencies = [ "itoa", "pq-sys", "r2d2", + "serde_json", ] [[package]] @@ -425,9 +426,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] @@ -662,9 +663,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" [[package]] name = "socket2" diff --git a/Cargo.toml b/Cargo.toml index 12a0ce2..0cea49e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" anyhow = "1.0.95" async-trait = "0.1.86" axum = { version = "0.8.1", features = ["json"] } -diesel = { version = "2.2.7", features = ["postgres", "r2d2"] } +diesel = { version = "2.2.7", features = ["postgres", "r2d2", "serde_json"] } dotenvy = "0.15.7" r2d2 = "0.8.10" serde = { version = "1.0.217", features = ["derive"] } diff --git a/src/base/controller.rs b/src/base/controller.rs index d635ebf..2de0f9c 100644 --- a/src/base/controller.rs +++ b/src/base/controller.rs @@ -26,8 +26,8 @@ where } } - pub async fn get_all(&self) -> Result { - let entities = self.service.get_all().await?; + pub async fn get_all(&self) -> Result { + let entities = self.service.get_all().await.map_err(|err| err.to_string())?; Ok((StatusCode::OK, Json(entities))) } } diff --git a/src/base/entity.rs b/src/base/entity.rs index 37eaf79..c52d72e 100644 --- a/src/base/entity.rs +++ b/src/base/entity.rs @@ -1,4 +1,3 @@ -use diesel::prelude::*; use serde::{Deserialize, Serialize}; pub trait BaseEntity { diff --git a/src/main.rs b/src/main.rs index cc8c19c..b19ec94 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,8 +18,7 @@ async fn main() { let user_controller = Arc::new(UserController::new(user_service)); let app = Router::new() - .merge(UserController::routes()) - .with_state(user_controller); + .merge(UserController::routes(user_controller.clone())); let listener = TcpListener::bind("0.0.0.0:3000").await.unwrap(); serve(listener, app).await.unwrap(); diff --git a/src/routes/user/controller.rs b/src/routes/user/controller.rs index 7dc8591..e29df61 100644 --- a/src/routes/user/controller.rs +++ b/src/routes/user/controller.rs @@ -1,4 +1,8 @@ -use axum::Router; +use std::sync::Arc; + +use axum::extract::State; +use axum::http::StatusCode; +use axum::{Json, Router}; use axum::routing::get; use crate::base::controller::BaseController; @@ -16,14 +20,24 @@ impl UserController { } } - pub fn routes() -> Router { + pub fn routes(state: Arc) -> Router { Router::new() .route("/users", get(Self::get_users)) + .with_state(state) } async fn get_users( State(controller): State>, - ) -> impl IntoResponse { - controller.base_controller.get_all().await + ) -> Result>, (StatusCode, Json)> { + match controller.base_controller.get_all().await { + Ok(users) => { + // Wrap the users in Json, which implements IntoResponse + Ok(Json(users)) + } + Err(err) => { + // In case of error, return StatusCode with Json error message + Err((StatusCode::INTERNAL_SERVER_ERROR, Json(err.to_string()))) + } + } } } diff --git a/src/routes/user/model.rs b/src/routes/user/model.rs index 074454f..92b9c87 100644 --- a/src/routes/user/model.rs +++ b/src/routes/user/model.rs @@ -4,7 +4,7 @@ use crate::base::entity::BaseEntity; use super::schema::users; #[derive(Debug, Clone, Serialize, Deserialize, Queryable, Identifiable)] -#[diesel(table_name = users)] +#[diesel(table_name = users, primary_key(id))] pub struct User { pub id: i32, pub name: String, @@ -15,4 +15,12 @@ impl BaseEntity for User { fn id(&self) -> i32 { self.id } +} + +impl Identifiable for User { + type Id = i32; + + fn id(self) -> Self::Id { + self.id + } } \ No newline at end of file diff --git a/src/routes/user/schema.rs b/src/routes/user/schema.rs index f3af328..3fb4ae2 100644 --- a/src/routes/user/schema.rs +++ b/src/routes/user/schema.rs @@ -1,6 +1,8 @@ -diesel::table! { +use diesel::table; + +table! { users (id) { - id -> Int4, + id -> Integer, name -> Varchar, email -> Varchar, }