diff options
Diffstat (limited to 'src/routes/user.rs')
| -rw-r--r-- | src/routes/user.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/routes/user.rs b/src/routes/user.rs new file mode 100644 index 0000000..42db46f --- /dev/null +++ b/src/routes/user.rs @@ -0,0 +1,49 @@ +use axum::extract::{Json, State}; +use axum::http::StatusCode; +use axum::response::IntoResponse; +use serde::Deserialize; +use serde_json::json; + +use crate::AppState; +use crate::auth::hash_password; +use super::errors::RouteError; + +#[derive(Deserialize)] +pub struct CreateUserRequest { + email: String, + username: String, + password: String, +} + +pub async fn create_user( + State(state): State<AppState>, + Json(request): Json<CreateUserRequest> +) -> Result<impl IntoResponse, RouteError> { + + match state.database.fetch_user_by_email(&request.email) { + Err(_) => return Err(RouteError::Internal("database action failed".into())), + Ok(Some(_)) => return Err(RouteError::UserCreateEmailExists(request.email)), + Ok(None) => {}, + }; + + match state.database.fetch_user_by_username(&request.username) { + Err(_) => return Err(RouteError::Internal("database action failed B".into())), + Ok(Some(_)) => return Err(RouteError::UserCreateUsernameExists(request.username)), + Ok(None) => {}, + }; + + let Ok(password_hash) = hash_password(&request.password) else { + return Err(RouteError::Internal("failed to hash password".into())) + }; + + let Ok(user) = state.database.insert_user(&request.email, &request.username, &password_hash) else { + return Err(RouteError::Internal("failed to create user".into())); + }; + + return Ok((StatusCode::CREATED, Json(json!({ + "id": user.id(), + "email": user.email(), + "username": user.username(), + })))); +} + |
