summaryrefslogtreecommitdiff
path: root/src/api/users.rs
diff options
context:
space:
mode:
authormrw1593 <botahamec@outlook.com>2023-05-13 08:51:12 -0400
committermrw1593 <botahamec@outlook.com>2023-05-29 10:45:49 -0400
commitd08c9f5e2a6e7327dfc0be60a315c4eab9f8458d (patch)
tree114266074df93e2e2fdca7cdf400e9561dad405c /src/api/users.rs
parent3aff5f0123778aa453ab5396cb880a83267ae4ee (diff)
Allow PUTs to individual fields
Diffstat (limited to 'src/api/users.rs')
-rw-r--r--src/api/users.rs54
1 files changed, 48 insertions, 6 deletions
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<Uuid>,
+ body: web::Json<Box<str>>,
+ conn: web::Data<MySqlPool>,
+) -> Result<HttpResponse, UsernameTakenError> {
+ 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<Uuid>,
+ body: web::Json<Box<str>>,
+ conn: web::Data<MySqlPool>,
+) -> 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)