From 74976dab57887a4d7e29b426cdf7422722fa58ee Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Mon, 17 Oct 2022 22:08:09 +0200 Subject: Refactoring of mods --- src/auth/routes.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/auth/routes.rs (limited to 'src/auth/routes.rs') diff --git a/src/auth/routes.rs b/src/auth/routes.rs new file mode 100644 index 0000000..65a5cb5 --- /dev/null +++ b/src/auth/routes.rs @@ -0,0 +1,66 @@ +use crate::{ + errors::AppError, + auth::models::{AuthBody, Claims, LoginCredentials, SignUpForm}, + user::models::User, + routes::JsonCreate, +}; +use axum::{routing::post, Json, Router}; + +/// Create routes for `/v1/auth/` namespace +pub fn create_route() -> Router { + Router::new() + .route("/login", post(make_login)) + .route("/signup", post(signup)) +} + +/// Make login. Check if a user with the email and password passed in request body exists into the +/// database +async fn make_login(Json(payload): Json) -> Result, AppError> { + let user = User::new( + String::new(), + String::new(), + payload.username, + payload.password, + ); + match User::find(user).await { + Ok(user) => { + let claims = Claims::new(user.id); + let token = claims.get_token()?; + Ok(Json(AuthBody::new(token))) + } + Err(_) => Err(AppError::NotFound("User not found".to_string())), + } +} + +/// Create a new user +async fn signup(Json(payload): Json) -> Result, AppError> { + if payload.password1 != payload.password2 { + return Err(AppError::BadRequest( + "The inserted passwords do not match".to_string(), + )); + } + + if User::email_has_taken(&payload.email).await? { + return Err(AppError::BadRequest( + "An user with this email already exists".to_string(), + )); + } + + if User::username_has_taken(&payload.username).await? { + return Err(AppError::BadRequest( + "An user with this username already exists".to_string(), + )); + } + + let user = User::new( + payload.name, + payload.email, + payload.username, + payload.password1, + ); + let user = User::create(user).await?; + + let claims = Claims::new(user.id); + let token = claims.get_token()?; + Ok(JsonCreate(AuthBody::new(token))) +} -- cgit v1.2.3-71-g8e6c