diff options
| author | Santo Cariotti <santo@dcariotti.me> | 2022-09-13 14:02:35 +0000 |
|---|---|---|
| committer | Santo Cariotti <santo@dcariotti.me> | 2022-09-13 14:02:35 +0000 |
| commit | f3aa3792255652371ceea6ec032c8962061eb3dc (patch) | |
| tree | b6c5e377e5801473462520f77a7137f1bcc74f6d /src | |
| parent | d7ad64ab7b779886af75d2500365372921c9181e (diff) | |
Add endpoint to delete avatar
Diffstat (limited to 'src')
| -rw-r--r-- | src/models/user.rs | 4 | ||||
| -rw-r--r-- | src/routes/user.rs | 23 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/models/user.rs b/src/models/user.rs index 7d336f9..fee6522 100644 --- a/src/models/user.rs +++ b/src/models/user.rs @@ -171,7 +171,7 @@ impl User { impl UserList { // Edit an user - pub async fn edit_avatar(&mut self, avatar: String) -> Result<(), AppError> { + pub async fn edit_avatar(&mut self, avatar: Option<String>) -> Result<(), AppError> { let pool = unsafe { get_client() }; sqlx::query!( r#" @@ -183,7 +183,7 @@ impl UserList { .execute(pool) .await?; - self.avatar = Some(avatar); + self.avatar = avatar; Ok(()) } diff --git a/src/routes/user.rs b/src/routes/user.rs index 407f7b4..94db791 100644 --- a/src/routes/user.rs +++ b/src/routes/user.rs @@ -17,7 +17,7 @@ pub fn create_route() -> Router { Router::new() .route("/", get(list_users)) .route("/me", get(get_me)) - .route("/me/avatar", put(edit_my_avatar)) + .route("/me/avatar", put(edit_my_avatar).delete(delete_my_avatar)) .route("/:id", get(get_user)) } @@ -72,7 +72,7 @@ async fn edit_my_avatar( .await { Ok(saved_file) => { - user.edit_avatar(saved_file).await?; + user.edit_avatar(Some(saved_file)).await?; Ok(Json(user)) } @@ -80,6 +80,25 @@ async fn edit_my_avatar( } } +/// Delete the avatar of the user linked to the claims +async fn delete_my_avatar(claims: Claims) -> Result<Json<UserList>, AppError> { + let mut user = match User::find_by_id(claims.user_id).await { + Ok(user) => user, + Err(_) => { + return Err(AppError::NotFound("User not found".to_string())); + } + }; + + if user.avatar.is_some() { + let avatar_url = user.avatar.as_ref().unwrap(); + delete_upload(&avatar_url)?; + } + + user.edit_avatar(None).await?; + + Ok(Json(user)) +} + /// Get an user with id = `user_id`. Checks Authorization token async fn get_user(Path(user_id): Path<i32>, _: Claims) -> Result<Json<UserList>, AppError> { match User::find_by_id(user_id).await { |
