feat: update, replace, delete on user object, first draft

This commit is contained in:
Gabor Körber 2024-05-11 13:31:37 +02:00
parent 3d559f8ae5
commit 1f6d8a406b
2 changed files with 42 additions and 8 deletions

View File

@ -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<S: AdminState + Clone + Send + Sync + 'static>
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(),

View File

@ -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<RepositoryItem> {
if let LookupKey::Integer(id) = id {
let id: i32 = id as i32; // use try_into() instead.
let user: Option<entity::user::Model> = 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<RepositoryItem> {
None
self.update(model, id, data).await
}
async fn delete(&mut self, _: &RepositoryContext, id: LookupKey) -> Option<Value> {
if let LookupKey::Integer(id) = id {
let id: i32 = id as i32; // use try_into() instead.
let user: Option<entity::user::Model> = 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
}
}