From 3a14419097ed710fb8b062d20078523c03b5b428 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Sun, 25 Sep 2022 15:47:49 +0200 Subject: Edit user --- src/models/user.rs | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'src/models') diff --git a/src/models/user.rs b/src/models/user.rs index d61795b..3f7a172 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -25,14 +25,24 @@ pub struct User { avatar: Option, } +/// Paylod used for user editing +#[derive(Deserialize)] +pub struct UserEdit { + pub name: String, + pub email: String, + pub username: String, +} + /// Response used to print a user (or a users list) #[serde_as] -#[derive(Deserialize, Serialize, sqlx::FromRow)] +#[derive(Deserialize, Serialize, sqlx::FromRow, Validate)] pub struct UserList { pub id: i32, - name: String, - email: String, - username: String, + pub name: String, + #[validate(length(min = 4, message = "Can not be empty"))] + pub email: String, + #[validate(length(min = 2, message = "Can not be empty"))] + pub username: String, pub is_staff: Option, #[serde_as(as = "NoneAsEmptyString")] pub avatar: Option, @@ -178,7 +188,7 @@ impl User { } impl UserList { - /// Edit an user + /// Edit an user avatar pub async fn edit_avatar(&mut self, avatar: Option) -> Result<(), AppError> { let pool = unsafe { get_client() }; sqlx::query( @@ -196,6 +206,34 @@ impl UserList { Ok(()) } + /// Edit an user + pub async fn edit(&mut self, payload: UserEdit) -> Result<(), AppError> { + let pool = unsafe { get_client() }; + + // Make assignments before the `sqlx::query()` so to perform validation. + // If the `AppError::BadRequest` is raised, the query (and then the update) will be skipped + self.name = payload.name.clone(); + self.username = payload.username.clone(); + self.email = payload.email.clone(); + + self.validate() + .map_err(|error| AppError::BadRequest(error.to_string()))?; + + sqlx::query( + r#" + UPDATE users SET name = $1, username = $2, email = $3 WHERE id = $4 + "#, + ) + .bind(&payload.name) + .bind(&payload.username) + .bind(&payload.email) + .bind(self.id) + .execute(pool) + .await?; + + Ok(()) + } + /// Get all models created by an user pub async fn get_models(&self, page: i64) -> Result, AppError> { Model::list_from_author(page, self.id).await -- cgit v1.2.3-71-g8e6c