From 3fadfb194444e0c22f5bb09c3bcfe22bd7f611d5 Mon Sep 17 00:00:00 2001 From: Valentin Tolmer Date: Mon, 25 Sep 2023 01:18:02 +0200 Subject: [PATCH] server: add support for creating a user with attributes --- server/src/domain/handler.rs | 1 + server/src/domain/sql_user_backend_handler.rs | 30 +++++++++++++++++-- server/src/infra/graphql/mutation.rs | 1 + server/src/infra/ldap_handler.rs | 1 + 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/server/src/domain/handler.rs b/server/src/domain/handler.rs index ab42cb4..4b8ef09 100644 --- a/server/src/domain/handler.rs +++ b/server/src/domain/handler.rs @@ -104,6 +104,7 @@ pub struct CreateUserRequest { pub first_name: Option, pub last_name: Option, pub avatar: Option, + pub attributes: Vec, } #[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone, Default)] diff --git a/server/src/domain/sql_user_backend_handler.rs b/server/src/domain/sql_user_backend_handler.rs index deccec9..8c1468b 100644 --- a/server/src/domain/sql_user_backend_handler.rs +++ b/server/src/domain/sql_user_backend_handler.rs @@ -312,7 +312,7 @@ impl UserBackendHandler for SqlBackendHandler { } if let Some(avatar) = request.avatar { new_user_attributes.push(model::user_attributes::ActiveModel { - user_id: Set(request.user_id), + user_id: Set(request.user_id.clone()), attribute_name: Set("avatar".to_owned()), value: Set(Serialized::from(&avatar)), }); @@ -320,6 +320,26 @@ impl UserBackendHandler for SqlBackendHandler { self.sql_pool .transaction::<_, (), DomainError>(|transaction| { Box::pin(async move { + let schema = Self::get_schema_with_transaction(transaction).await?; + for attribute in request.attributes { + if schema + .user_attributes + .get_attribute_type(&attribute.name) + .is_some() + { + new_user_attributes.push(model::user_attributes::ActiveModel { + user_id: Set(request.user_id.clone()), + attribute_name: Set(attribute.name), + value: Set(attribute.value), + }); + } else { + return Err(DomainError::InternalError(format!( + "Attribute name {} doesn't exist in the schema, + yet was attempted to be inserted in the database", + &attribute.name + ))); + } + } new_user.insert(transaction).await?; if !new_user_attributes.is_empty() { model::UserAttributes::insert_many(new_user_attributes) @@ -982,9 +1002,13 @@ mod tests { user_id: UserId::new("james"), email: "email".to_string(), display_name: Some("display_name".to_string()), - first_name: Some("first_name".to_string()), + first_name: None, last_name: Some("last_name".to_string()), avatar: Some(JpegPhoto::for_tests()), + attributes: vec![AttributeValue { + name: "first_name".to_owned(), + value: Serialized::from("First Name"), + }], }) .await .unwrap(); @@ -1005,7 +1029,7 @@ mod tests { }, AttributeValue { name: "first_name".to_owned(), - value: Serialized::from("first_name") + value: Serialized::from("First Name") }, AttributeValue { name: "last_name".to_owned(), diff --git a/server/src/infra/graphql/mutation.rs b/server/src/infra/graphql/mutation.rs index 5a6e6fe..39d3d09 100644 --- a/server/src/infra/graphql/mutation.rs +++ b/server/src/infra/graphql/mutation.rs @@ -104,6 +104,7 @@ impl Mutation { first_name: user.first_name, last_name: user.last_name, avatar, + ..Default::default() }) .instrument(span.clone()) .await?; diff --git a/server/src/infra/ldap_handler.rs b/server/src/infra/ldap_handler.rs index cadc571..25e3012 100644 --- a/server/src/infra/ldap_handler.rs +++ b/server/src/infra/ldap_handler.rs @@ -711,6 +711,7 @@ impl LdapHandler