From ca023645c474238f74a60a8fd1b02aeebd1a4e8a Mon Sep 17 00:00:00 2001 From: Franklin Date: Thu, 21 Sep 2023 09:23:43 -0400 Subject: [PATCH] Register user --- src/resources/error_messages.rs | 5 ++ src/service/user.rs | 91 ++++++++++++++++++++++++--------- src/utils/mod.rs | 2 +- 3 files changed, 73 insertions(+), 25 deletions(-) diff --git a/src/resources/error_messages.rs b/src/resources/error_messages.rs index da260a8..4a38e13 100644 --- a/src/resources/error_messages.rs +++ b/src/resources/error_messages.rs @@ -65,3 +65,8 @@ pub const ERROR_TOO_MANY_CREDENTIALS: (&str, &str) = ( "ERROR.TOO_MANY_CREDENTIALS", "Only up to 3 credentials are allowed. One of each type.", ); + +pub const ERROR_TOKEN_NOT_CREATED: (&str, &str) = ( + "ERROR.TOKEN_NOT_CREATED", + "Token futures were joined but not created correctly.", +); diff --git a/src/service/user.rs b/src/service/user.rs index a7d8dd3..4ee8a85 100644 --- a/src/service/user.rs +++ b/src/service/user.rs @@ -1,19 +1,25 @@ use std::error::Error; +use chrono::Utc; use log::{error, log}; +use tokio::task::JoinError; use crate::dao::credential::get_credential; +use crate::dao::token::insert_token; +use crate::dao::user::insert_user; use crate::domain::credential::Credential; +use crate::domain::token::Token; +use crate::domain::user::User; use crate::dto::users::UserRegisterPayload; -use crate::resources::error_messages::{ERROR_TOO_MANY_CREDENTIALS, ERROR_USER_ALREADY_EXISTS, ErrorResource}; +use crate::resources::error_messages::{ERROR_TOKEN_NOT_CREATED, ERROR_TOO_MANY_CREDENTIALS, ERROR_USER_ALREADY_EXISTS, ErrorResource}; +use crate::utils::hasher::{generate_multiple_random_token_with_rng, hash_password}; use crate::validation::user_validator::validate_user_for_creation; -pub async fn register_user(db_conn: &sqlx::PgPool, user: UserRegisterPayload) -> Result<(), Vec> { +pub async fn register_user(db_conn: &sqlx::PgPool, user: UserRegisterPayload) -> Result> { let mut error_resources: Vec = Vec::new(); // Validate user validate_user_for_creation(&user, &mut error_resources); // Find if user exists if user.credentials.len() > 3 { error_resources.push(ERROR_TOO_MANY_CREDENTIALS); - } for credential_dto in user.credentials.iter() { match get_credential( @@ -41,36 +47,73 @@ pub async fn register_user(db_conn: &sqlx::PgPool, user: UserRegisterPayload) -> if error_resources.len() > 0 { return Err(error_resources); } - - /* TODO: // Get salt and hashed password from hashing function then give the results to the user - let hash_result = hasher::hash_password(&user_to_insert.password); - user_to_insert.password = hash_result.hash; - user_to_insert.salt = hash_result.salt; + let hash_result = hash_password(&user.password); + let now = Utc::now(); + let mut user_to_insert = User { + id: 0, + name: user.name, + password: hash_result.hash, + salt: hash_result.salt, + time_created: now, + last_updated: now, + }; + + let persisted_user; // Insert user in DB - match insert_user(&db_conn, &user_to_insert).await{ - Ok(resultrs) => { - user_to_insert.id = resultrs.last_insert_id() as u32; + match insert_user(&db_conn, user_to_insert).await{ + Ok(user) => { + persisted_user = user; }, - Err(error) => { - println!("Error while inserting user in database from create_user method. Log: {}", error); - return HttpResponse::InternalServerError().finish(); + Err(e) => { + error!("{}", e); + error_resources.push(("ERROR.DATABASE_ERROR", "")); + return Err(error_resources); }}; // Create token and send it back. - let tokens: Vec = hasher::generate_multiple_random_token_with_rng(2).await.expect("Error creating multiple random tokens."); + let mut tokens: Vec = match generate_multiple_random_token_with_rng(2).await { + Ok(tokens) => tokens, + Err(e) => { + error!("{}", e); + error_resources.push(("ERROR.JOIN_ERROR", "")); + return Err(error_resources); + } + }; let mut token_to_insert = - Token::new(user_to_insert.id, - tokens.get(0).expect("Error. Token doesn't exist in list.").to_string(), - tokens.get(1).expect("Error. Token doesn't exist in list.").to_string() - ); + Token { + id: 0, + user_id: persisted_user.id, + auth_token: match tokens.get(0) { + None => { + error!("Tokens were not created.", ); + error_resources.push(ERROR_TOKEN_NOT_CREATED); + return Err(error_resources); + } + Some(token) => token.clone() + }, + refresh_token: match tokens.get(1) { + None => { + error!("Tokens were not created.", ); + error_resources.push(ERROR_TOKEN_NOT_CREATED); + return Err(error_resources); + } + Some(token) => token.clone() + }, + time_created: now, + last_updated: now, + }; // Insert token in DB - match insert_token(&db_conn, &token_to_insert).await{ - Ok(resultrs) => {token_to_insert.id = resultrs.last_insert_id() as u32}, - Err(_e) => {return HttpResponse::InternalServerError().finish()} + match insert_token(&db_conn, token_to_insert).await { + Ok(persisted_token) => { + Ok(persisted_token) + }, + Err(e) => { + error!("{}", e); + error_resources.push(("ERROR.DATABASE_ERROR", "")); + Err(error_resources) + } } -*/ - Ok(()) } diff --git a/src/utils/mod.rs b/src/utils/mod.rs index b3a8e00..f437e48 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1 +1 @@ -mod hasher; +pub mod hasher;