From 42f7001b78e453f17fc7d36bcfb8b1a738a8f273 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 5 Feb 2025 21:27:05 +0100 Subject: [PATCH] =?UTF-8?q?Datenbankabfrage=20f=C3=BCr=20Benutzer=20aktual?= =?UTF-8?q?isieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + database/Cargo.toml | 1 + database/src/model/benutzer.rs | 4 +- database/src/repository/benutzer.rs | 87 +++++++++++++---------------- main/src/main.rs | 5 +- 5 files changed, 44 insertions(+), 54 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4b72118..eb08064 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,3 +16,4 @@ uuid = { version = "1.12.1", features = ["v4", "serde"] } tokio = { version = "1.43.0", features = ["full"] } thiserror = { version = "2.0.11" } dotenvy = "0.15.7" +anyhow = "1.0.95" diff --git a/database/Cargo.toml b/database/Cargo.toml index be0ba53..44f4fd6 100644 --- a/database/Cargo.toml +++ b/database/Cargo.toml @@ -11,4 +11,5 @@ serde = { workspace = true } uuid = { workspace = true } axum = { workspace = true } thiserror = { workspace = true } +anyhow = { workspace = true } validator = { version = "0.20.0", features = ["derive"] } diff --git a/database/src/model/benutzer.rs b/database/src/model/benutzer.rs index bb2f9d4..fadfba8 100644 --- a/database/src/model/benutzer.rs +++ b/database/src/model/benutzer.rs @@ -22,7 +22,7 @@ pub struct AktualisiereBenutzer { pub id: Uuid, #[validate(length(min = 10, max = 255))] - pub email: Option, + pub e_mail: Option, #[validate(length(min = 8, max = 8))] pub kennung: Option, @@ -33,7 +33,7 @@ pub struct AktualisiereBenutzer { #[validate(length(max = 100))] pub vorname: Option, - pub ist_akiv: Option, + pub ist_aktiv: Option, } #[derive(Debug, Deserialize)] diff --git a/database/src/repository/benutzer.rs b/database/src/repository/benutzer.rs index d2628c5..65895d4 100644 --- a/database/src/repository/benutzer.rs +++ b/database/src/repository/benutzer.rs @@ -1,6 +1,7 @@ use crate::entity::benutzer::{self}; use crate::error::AppError; -use crate::model::benutzer::ErstelleBenutzer; +use crate::model::benutzer::{AktualisiereBenutzer, ErstelleBenutzer}; +use anyhow::{Error, Result}; use axum::Json; use sea_orm::{prelude::*, ActiveValue, DatabaseConnection, DbErr}; use validator::Validate; @@ -9,6 +10,14 @@ pub struct BenutzerRepository { db: DatabaseConnection, } +macro_rules! update_if_some { + ($active_model:ident, $source:ident, $field:ident) => { + if let Some(value) = $source.$field { + $active_model.$field = sea_orm::ActiveValue::Set(value); + } + }; +} + impl BenutzerRepository { pub fn new(db: DatabaseConnection) -> Self { Self { db } @@ -19,6 +28,7 @@ impl BenutzerRepository { benutzer::Entity::find_by_id(id).one(&self.db).await } + // Benutzer erstellen pub async fn create_user( &self, Json(response): Json, @@ -39,52 +49,33 @@ impl BenutzerRepository { Ok(Json(ersteller_benutzer)) } - // // Benutzer erstellen - // pub async fn create_user( - // &self, - // kennung: String, - // nachname: String, - // vorname: String, - // email: String, - // ) -> Result { - // benutzer::ActiveModel { - // id: ActiveValue::Set(uuid::Uuid::new_v4()), - // kennung: ActiveValue::Set(kennung), - // vorname: ActiveValue::Set(vorname), - // nachname: ActiveValue::Set(nachname), - // e_mail: ActiveValue::Set(email), - // ..Default::default() - // } - // .insert(&self.db) - // .await - // } + // Benutzer aktualisieren + pub async fn update_user( + &self, + id: uuid::Uuid, + response: AktualisiereBenutzer, + ) -> anyhow::Result { + response.validate()?; - // // Benutzer aktualisieren - // pub async fn update_user( - // &self, - // id: i32, - // name: Option, - // email: Option, - // ) -> Result { - // let user = user::Entity::find_by_id(id) - // .one(&self.db) - // .await? - // .ok_or(DbErr::Custom("User not found.".to_owned()))?; - // - // let mut user: user::ActiveModel = user.into(); - // if let Some(name) = name { - // user.name = ActiveValue::Set(name); - // } - // if let Some(email) = email { - // user.email = ActiveValue::Set(email); - // } - // - // user.update(&self.db).await - // } - // - // // Benutzer löschen - // pub async fn delete_user(&self, id: i32) -> Result<(), DbErr> { - // user::Entity::delete_by_id(id).exec(&self.db).await?; - // Ok(()) - // } + let benutzer = benutzer::Entity::find_by_id(id) + .one(&self.db) + .await? + .ok_or(DbErr::Custom("User not found.".to_owned()))?; + + let mut active_model: benutzer::ActiveModel = benutzer.into(); + + update_if_some!(active_model, response, e_mail); + update_if_some!(active_model, response, kennung); + update_if_some!(active_model, response, vorname); + update_if_some!(active_model, response, nachname); + update_if_some!(active_model, response, ist_aktiv); + + Ok(active_model.update(&self.db).await?) + } + + // Benutzer löschen + pub async fn delete_user(&self, id: uuid::Uuid) -> Result<(), Error> { + benutzer::Entity::delete_by_id(id).exec(&self.db).await?; + Ok(()) + } } diff --git a/main/src/main.rs b/main/src/main.rs index f8e4afe..5811748 100644 --- a/main/src/main.rs +++ b/main/src/main.rs @@ -8,10 +8,7 @@ use sea_orm::Database; #[tokio::main] async fn main() -> Result<(), AppError> { dotenvy::dotenv().unwrap(); - // Datenbankverbindung herstellen - // let root = Path::new("/"); - // env::set_current_dir(root); - // + let db = Database::connect(env::var("DATABASE_URL").unwrap()).await?; // Service initialisieren