From d08c9f5e2a6e7327dfc0be60a315c4eab9f8458d Mon Sep 17 00:00:00 2001 From: mrw1593 Date: Sat, 13 May 2023 08:51:12 -0400 Subject: Allow PUTs to individual fields --- src/api/users.rs | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) (limited to 'src/api/users.rs') diff --git a/src/api/users.rs b/src/api/users.rs index edade22..d9859e7 100644 --- a/src/api/users.rs +++ b/src/api/users.rs @@ -1,5 +1,6 @@ use actix_web::http::{header, StatusCode}; use actix_web::{post, put, web, HttpResponse, ResponseError, Scope}; +use exun::RawUnexpected; use raise::yeet; use serde::Deserialize; use sqlx::MySqlPool; @@ -69,11 +70,7 @@ async fn update_user( let username = body.username.clone(); let password = PasswordHash::new(&body.password).unwrap(); - let old_username = db::get_username(conn, user_id) - .await - .unwrap() - .unwrap() - .into_boxed_str(); + let old_username = db::get_username(conn, user_id).await.unwrap().unwrap(); if username != old_username && db::username_is_used(conn, &body.username).await.unwrap() { yeet!(UsernameTakenError { username }) } @@ -84,7 +81,7 @@ async fn update_user( password, }; - db::update_username(conn, &user).await.unwrap(); + db::update_user(conn, &user).await.unwrap(); let response = HttpResponse::NoContent() .insert_header((header::LOCATION, format!("users/{user_id}"))) @@ -93,6 +90,51 @@ async fn update_user( Ok(response) } +#[put("/{user_id}/username")] +async fn update_username( + user_id: web::Path, + body: web::Json>, + conn: web::Data, +) -> Result { + let conn = conn.get_ref(); + + let user_id = user_id.to_owned(); + let username = body.clone(); + + let old_username = db::get_username(conn, user_id).await.unwrap().unwrap(); + if username != old_username && db::username_is_used(conn, &body).await.unwrap() { + yeet!(UsernameTakenError { username }) + } + + db::update_username(conn, user_id, &body).await.unwrap(); + + let response = HttpResponse::NoContent() + .insert_header((header::LOCATION, format!("users/{user_id}/username"))) + .finish(); + + Ok(response) +} + +#[put("/{user_id}/password")] +async fn update_password( + user_id: web::Path, + body: web::Json>, + conn: web::Data, +) -> HttpResponse { + let conn = conn.get_ref(); + + let user_id = user_id.to_owned(); + let password = PasswordHash::new(&body).unwrap(); + + db::update_password(conn, user_id, &password).await.unwrap(); + + let response = HttpResponse::NoContent() + .insert_header((header::LOCATION, format!("users/{user_id}/password"))) + .finish(); + + response +} + pub fn service() -> Scope { web::scope("/users") .service(create_user) -- cgit v1.2.3