From 1f6d8a406b2e072bd7da529a7bb66d6cd69eca14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gabor=20K=C3=B6rber?= Date: Sat, 11 May 2024 13:31:37 +0200 Subject: [PATCH] feat: update, replace, delete on user object, first draft --- rear/src/admin/views.rs | 4 +-- src/admin_examples/user_repository.rs | 46 +++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/rear/src/admin/views.rs b/rear/src/admin/views.rs index bd70f99..2357653 100644 --- a/rear/src/admin/views.rs +++ b/rear/src/admin/views.rs @@ -41,7 +41,7 @@ pub struct AdminContext { impl Default for AdminContext { fn default() -> Self { AdminContext { - base: None, + base: None, // TODO: what is this used for? language_code: Some("en-us".to_string()), // Default language code language_bidi: Some(false), // Default language bidi user: None, //UserType::default(), // Assuming UserType has a Default impl @@ -117,7 +117,7 @@ pub async fn list_item_collection let repo = repo.lock().await; let admin_model = registry .get_model(&app_key, &model_key) - .expect("Admin Model not found?"); + .expect("Admin Model not found?"); // we will need a proper error route; so something that implements IntoResponse and can be substituted in the unwraps and expects. AdminContext { base: base_template(&headers), available_apps: registry.get_apps(), diff --git a/src/admin_examples/user_repository.rs b/src/admin_examples/user_repository.rs index 0f98578..16a483c 100644 --- a/src/admin_examples/user_repository.rs +++ b/src/admin_examples/user_repository.rs @@ -1,11 +1,9 @@ -use crate::admin::domain::AdminRepository; use crate::admin::domain::*; use crate::admin::state::AdminRegistry; use async_trait::async_trait; -use entity; -use log::{debug, warn}; -use sea_orm::{ActiveModelTrait, Database, DatabaseConnection, EntityTrait, Set}; -use serde_json::{json, Value}; +use log::debug; +use sea_orm::{ActiveModelTrait, DatabaseConnection, EntityTrait, ModelTrait, Set}; +use serde_json::Value; struct UserRepository { connection: DatabaseConnection, @@ -99,6 +97,31 @@ impl AdminRepository for UserRepository { id: LookupKey, data: Value, ) -> Option { + if let LookupKey::Integer(id) = id { + let id: i32 = id as i32; // use try_into() instead. + let user: Option = entity::User::find_by_id(id) + .one(&self.connection) + .await + .unwrap(); + let mut user: entity::user::ActiveModel = user.unwrap().into(); + + // change values + if let Some(value) = data.get("username") { + if let Some(value) = value.as_str() { + user.username = Set(value.to_owned()); + } + } + + if let Some(value) = data.get("description") { + user.description = Set(value.as_str().map(|s| s.to_owned())); + } + + // update + if let Ok(user) = user.update(&self.connection).await { + let id = user.id.to_string(); + return Some(model.build_item(&*id, serde_json::to_value(&user).unwrap())); + } + } None } @@ -108,10 +131,21 @@ impl AdminRepository for UserRepository { id: LookupKey, data: Value, ) -> Option { - None + self.update(model, id, data).await } async fn delete(&mut self, _: &RepositoryContext, id: LookupKey) -> Option { + if let LookupKey::Integer(id) = id { + let id: i32 = id as i32; // use try_into() instead. + let user: Option = entity::User::find_by_id(id) + .one(&self.connection) + .await + .unwrap(); + if let Some(user) = user { + let delete_result = user.delete(&self.connection).await.unwrap(); + debug!("deleted rows: {}", delete_result.rows_affected); + } + } None } }