diff --git a/src/http_server/endpoints/events/list_events.rs b/src/http_server/endpoints/events/list_events.rs index 847b1fff8b..9274684e99 100644 --- a/src/http_server/endpoints/events/list_events.rs +++ b/src/http_server/endpoints/events/list_events.rs @@ -7,16 +7,8 @@ use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::database::queries::list_w2l_templates::{list_w2l_templates, W2lTemplateRecordForList}; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/tts/get_tts_inference_job_status.rs b/src/http_server/endpoints/tts/get_tts_inference_job_status.rs index 86b639efb1..25005e28b9 100644 --- a/src/http_server/endpoints/tts/get_tts_inference_job_status.rs +++ b/src/http_server/endpoints/tts/get_tts_inference_job_status.rs @@ -8,16 +8,9 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; use crate::util::redis::redis_keys::RedisKeys; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use r2d2_redis::RedisConnectionManager; diff --git a/src/http_server/endpoints/tts/get_tts_model.rs b/src/http_server/endpoints/tts/get_tts_model.rs index f20effb37e..5ae5ca0a5d 100644 --- a/src/http_server/endpoints/tts/get_tts_model.rs +++ b/src/http_server/endpoints/tts/get_tts_model.rs @@ -10,15 +10,8 @@ use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::query_tts_model::TtsModelRecordForResponse; use crate::database::queries::query_tts_model::select_tts_model_by_token; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/tts/get_tts_model_use_count.rs b/src/http_server/endpoints/tts/get_tts_model_use_count.rs index a8052b6722..bd6069d498 100644 --- a/src/http_server/endpoints/tts/get_tts_model_use_count.rs +++ b/src/http_server/endpoints/tts/get_tts_model_use_count.rs @@ -8,11 +8,7 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; use crate::util::redis::redis_keys::RedisKeys; use derive_more::{Display, Error}; diff --git a/src/http_server/endpoints/tts/get_tts_upload_model_job_status.rs b/src/http_server/endpoints/tts/get_tts_upload_model_job_status.rs index 956fe3da5b..ff0ce3e99d 100644 --- a/src/http_server/endpoints/tts/get_tts_upload_model_job_status.rs +++ b/src/http_server/endpoints/tts/get_tts_upload_model_job_status.rs @@ -8,16 +8,9 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; use crate::util::redis::redis_keys::RedisKeys; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use r2d2_redis::redis::Commands; diff --git a/src/http_server/endpoints/tts/list_tts_models.rs b/src/http_server/endpoints/tts/list_tts_models.rs index 993c4b552d..455518c75b 100644 --- a/src/http_server/endpoints/tts/list_tts_models.rs +++ b/src/http_server/endpoints/tts/list_tts_models.rs @@ -7,15 +7,9 @@ use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/create_account.rs b/src/http_server/endpoints/users/create_account.rs index 6729cfe7d0..17cabc9dfe 100644 --- a/src/http_server/endpoints/users/create_account.rs +++ b/src/http_server/endpoints/users/create_account.rs @@ -7,9 +7,10 @@ use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest}; use crate::database::helpers::tokens::Tokens; use crate::database::queries::create_session::create_session_for_user; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; +use crate::http_server::endpoints::users::create_account::CreateAccountErrorType::{BadInput, ServerError, UsernameTaken, EmailTaken}; use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; +use crate::http_server::web_utils::serialize_as_json_error::serialize_as_json_error; use crate::server_state::ServerState; use crate::util::email_to_gravatar::email_to_gravatar; use crate::util::random_crockford_token::random_crockford_token; @@ -24,6 +25,9 @@ use regex::Regex; use sqlx::error::DatabaseError; use sqlx::error::Error::Database; use sqlx::mysql::MySqlDatabaseError; +use std::collections::HashMap; +use std::fmt::Formatter; +use std::fmt; use std::sync::Arc; const NEW_USER_ROLE: &'static str = "user"; @@ -41,75 +45,107 @@ pub struct CreateAccountSuccessResponse { pub success: bool, } -#[derive(Debug, Display)] -pub enum CreateAccountError { - BadInput(String), - UsernameTaken, - ReservedUsername, - EmailTaken, - ServerError, +#[derive(Serialize, Debug)] +pub struct CreateAccountErrorResponse { + pub success: bool, + pub error_type: CreateAccountErrorType, + pub error_fields: HashMap, } -impl ResponseError for CreateAccountError { +#[derive(Copy, Clone, Debug, Serialize)] +pub enum CreateAccountErrorType { + BadInput, + EmailTaken, + ServerError, + UsernameReserved, + UsernameTaken, +} + +impl CreateAccountErrorResponse { + fn server_error() -> Self { + Self { + success: false, + error_type: CreateAccountErrorType::ServerError, + error_fields: HashMap::new(), + } + } +} + +// NB: Not using DeriveMore since Clion doesn't understand it. +impl fmt::Display for CreateAccountErrorResponse { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self.error_type) + } +} + +impl ResponseError for CreateAccountErrorResponse { fn status_code(&self) -> StatusCode { - match *self { - CreateAccountError::BadInput(_) => StatusCode::BAD_REQUEST, - CreateAccountError::UsernameTaken => StatusCode::BAD_REQUEST, - CreateAccountError::ReservedUsername => StatusCode::BAD_REQUEST, - CreateAccountError::EmailTaken => StatusCode::BAD_REQUEST, - CreateAccountError::ServerError => StatusCode::INTERNAL_SERVER_ERROR, + match self.error_type { + CreateAccountErrorType::BadInput => StatusCode::BAD_REQUEST, + CreateAccountErrorType::EmailTaken => StatusCode::BAD_REQUEST, + CreateAccountErrorType::ServerError => StatusCode::INTERNAL_SERVER_ERROR, + CreateAccountErrorType::UsernameReserved => StatusCode::BAD_REQUEST, + CreateAccountErrorType::UsernameTaken => StatusCode::BAD_REQUEST, } } fn error_response(&self) -> HttpResponse { - let error_reason = match self { - BadInput(reason) => reason.to_string(), - CreateAccountError::UsernameTaken => "username already taken".to_string(), - CreateAccountError::ReservedUsername => "username is reserved".to_string(), - CreateAccountError::EmailTaken => "email already taken".to_string(), - CreateAccountError::ServerError => "server error".to_string(), - }; - - to_simple_json_error(&error_reason, self.status_code()) + serialize_as_json_error(self) } } pub async fn create_account_handler( http_request: HttpRequest, request: web::Json, - server_state: web::Data>) -> Result + server_state: web::Data>) -> Result { + let mut error_fields = HashMap::new(); + if let Err(reason) = validate_username(&request.username) { - return Err(CreateAccountError::BadInput(reason)); + error_fields.insert("username".to_string(), reason); } if let Err(reason) = validate_passwords(&request.password, &request.password_confirmation) { - return Err(CreateAccountError::BadInput(reason)); - } - - if is_reserved_username(&request.username) { - return Err(CreateAccountError::ReservedUsername); + error_fields.insert("password".to_string(), reason); } if contains_slurs(&request.username) { - return Err(CreateAccountError::BadInput("username contains slurs".to_string())); + error_fields.insert("username".to_string(), "username contains slurs".to_string()); } if !request.email_address.contains("@") { - return Err(CreateAccountError::BadInput("invalid email address".to_string())); + error_fields.insert("email_address".to_string(), "invalid email address".to_string()); + } + + if is_reserved_username(&request.username) { + error_fields.insert("username".to_string(), "username is reserved".to_string()); + + return Err(CreateAccountErrorResponse { + success: false, + error_type: CreateAccountErrorType::UsernameReserved, + error_fields + }); + } + + if !error_fields.is_empty() { + return Err(CreateAccountErrorResponse { + success: false, + error_type: CreateAccountErrorType::BadInput, + error_fields + }); } let user_token = Tokens::new_user() .map_err(|e| { warn!("Bad crockford token: {:?}", e); - CreateAccountError::ServerError + CreateAccountErrorResponse::server_error() })?; let password_hash = match bcrypt::hash(&request.password, bcrypt::DEFAULT_COST) { Ok(hash) => hash, Err(err) => { warn!("Bcrypt error: {:?}", err); - return Err(ServerError); + return Err(CreateAccountErrorResponse::server_error()); } }; @@ -171,20 +207,33 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) match err { Database(err) => { let maybe_code = err.code().map(|c| c.into_owned()); + let mut error_fields = HashMap::new(); + let mut maybe_error_type = None; + match maybe_code.as_deref() { Some("23000") => { if err.message().contains("username") { - return Err(UsernameTaken); + maybe_error_type = Some(CreateAccountErrorType::UsernameTaken); + error_fields.insert("username".to_string(), "username is taken".to_string()); } else if err.message().contains("email_address") { - return Err(EmailTaken); + maybe_error_type = Some(CreateAccountErrorType::EmailTaken); + error_fields.insert("email_address".to_string(), "email is taken".to_string()); } } _ => {}, } + + if let Some(error_type) = maybe_error_type { + return Err(CreateAccountErrorResponse { + success: false, + error_type, + error_fields + }) + } }, _ => {}, } - return Err(ServerError); + return Err(CreateAccountErrorResponse::server_error()); } }; @@ -196,7 +245,7 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) .await .map_err(|e| { warn!("error creating badge: {:?}", e); - CreateAccountError::ServerError + CreateAccountErrorResponse::server_error() })?; let create_session_result = @@ -206,7 +255,7 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) Ok(token) => token, Err(e) => { warn!("create account session creation error : {:?}", e); - return Err(CreateAccountError::ServerError); + return Err(CreateAccountErrorResponse::server_error()); } }; @@ -216,12 +265,12 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) .await .map_err(|e| { warn!("error publishing event: {:?}", e); - CreateAccountError::ServerError + CreateAccountErrorResponse::server_error() })?; let session_cookie = match server_state.cookie_manager.create_cookie(&session_token) { Ok(cookie) => cookie, - Err(_) => return Err(ServerError), + Err(_) => return Err(CreateAccountErrorResponse::server_error()), }; let response = CreateAccountSuccessResponse { @@ -229,7 +278,7 @@ VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) }; let body = serde_json::to_string(&response) - .map_err(|e| BadInput("".to_string()))?; + .map_err(|e| CreateAccountErrorResponse::server_error())?; Ok(HttpResponse::Ok() .cookie(session_cookie) diff --git a/src/http_server/endpoints/users/get_profile.rs b/src/http_server/endpoints/users/get_profile.rs index ac5bc31dbe..060152f2b2 100644 --- a/src/http_server/endpoints/users/get_profile.rs +++ b/src/http_server/endpoints/users/get_profile.rs @@ -13,15 +13,8 @@ use crate::database::enums::record_visibility::RecordVisibility; use crate::database::helpers::boolean_converters::i8_to_bool; use crate::database::queries::list_user_badges::UserBadgeForList; use crate::database::queries::list_user_badges::list_user_badges; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use md5::{Md5, Digest}; diff --git a/src/http_server/endpoints/users/list_user_tts_inference_results.rs b/src/http_server/endpoints/users/list_user_tts_inference_results.rs index fe05114958..9cb351e076 100644 --- a/src/http_server/endpoints/users/list_user_tts_inference_results.rs +++ b/src/http_server/endpoints/users/list_user_tts_inference_results.rs @@ -11,15 +11,9 @@ use crate::AnyhowResult; use crate::database::queries::create_session::create_session_for_user; use crate::database::queries::list_tts_inference_results::ListTtsResultsQueryBuilder; use crate::database::queries::list_tts_inference_results::TtsInferenceRecordForList; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/list_user_tts_models.rs b/src/http_server/endpoints/users/list_user_tts_models.rs index 17cf9544e0..95ea806ad6 100644 --- a/src/http_server/endpoints/users/list_user_tts_models.rs +++ b/src/http_server/endpoints/users/list_user_tts_models.rs @@ -9,15 +9,9 @@ use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::list_tts_models::{TtsModelRecordForList, list_tts_models}; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/list_user_w2l_inference_results.rs b/src/http_server/endpoints/users/list_user_w2l_inference_results.rs index 38dc924606..146676cd1b 100644 --- a/src/http_server/endpoints/users/list_user_w2l_inference_results.rs +++ b/src/http_server/endpoints/users/list_user_w2l_inference_results.rs @@ -10,15 +10,8 @@ use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::list_w2l_inference_results::ListW2lResultsQueryBuilder; use crate::database::queries::list_w2l_inference_results::W2lInferenceRecordForList; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/list_user_w2l_templates.rs b/src/http_server/endpoints/users/list_user_w2l_templates.rs index f4f0e78931..76300e85ca 100644 --- a/src/http_server/endpoints/users/list_user_w2l_templates.rs +++ b/src/http_server/endpoints/users/list_user_w2l_templates.rs @@ -9,15 +9,8 @@ use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::list_w2l_templates::{W2lTemplateRecordForList, list_w2l_templates}; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/login.rs b/src/http_server/endpoints/users/login.rs index 848e551dbb..48097d6a0a 100644 --- a/src/http_server/endpoints/users/login.rs +++ b/src/http_server/endpoints/users/login.rs @@ -7,12 +7,9 @@ use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest}; use crate::AnyhowResult; use crate::database::queries::create_session::create_session_for_user; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::server_state::ServerState; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/logout.rs b/src/http_server/endpoints/users/logout.rs index 18fb79d47f..c7f289301d 100644 --- a/src/http_server/endpoints/users/logout.rs +++ b/src/http_server/endpoints/users/logout.rs @@ -6,14 +6,8 @@ use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/users/session_info.rs b/src/http_server/endpoints/users/session_info.rs index 712cf9a46b..0a3324afff 100644 --- a/src/http_server/endpoints/users/session_info.rs +++ b/src/http_server/endpoints/users/session_info.rs @@ -6,15 +6,8 @@ use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/w2l/get_w2l_inference_job_status.rs b/src/http_server/endpoints/w2l/get_w2l_inference_job_status.rs index fc527af400..afde7fa1cb 100644 --- a/src/http_server/endpoints/w2l/get_w2l_inference_job_status.rs +++ b/src/http_server/endpoints/w2l/get_w2l_inference_job_status.rs @@ -8,16 +8,9 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; use crate::util::redis::redis_keys::RedisKeys; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use r2d2_redis::redis::Commands; diff --git a/src/http_server/endpoints/w2l/get_w2l_result.rs b/src/http_server/endpoints/w2l/get_w2l_result.rs index 07d4532219..bb22eb5942 100644 --- a/src/http_server/endpoints/w2l/get_w2l_result.rs +++ b/src/http_server/endpoints/w2l/get_w2l_result.rs @@ -10,15 +10,8 @@ use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::query_w2l_result::W2lResultRecordForResponse; use crate::database::queries::query_w2l_result::select_w2l_result_by_token; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/endpoints/w2l/get_w2l_template_use_count.rs b/src/http_server/endpoints/w2l/get_w2l_template_use_count.rs index 69454492ac..79583c67fa 100644 --- a/src/http_server/endpoints/w2l/get_w2l_template_use_count.rs +++ b/src/http_server/endpoints/w2l/get_w2l_template_use_count.rs @@ -8,11 +8,7 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; use crate::util::redis::redis_keys::RedisKeys; use derive_more::{Display, Error}; diff --git a/src/http_server/endpoints/w2l/get_w2l_upload_template_job_status.rs b/src/http_server/endpoints/w2l/get_w2l_upload_template_job_status.rs index e7eebdd0b4..e1fc4dfaf4 100644 --- a/src/http_server/endpoints/w2l/get_w2l_upload_template_job_status.rs +++ b/src/http_server/endpoints/w2l/get_w2l_upload_template_job_status.rs @@ -8,16 +8,9 @@ use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; use crate::util::redis::redis_keys::RedisKeys; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use r2d2_redis::redis::Commands; diff --git a/src/http_server/endpoints/w2l/list_w2l_templates.rs b/src/http_server/endpoints/w2l/list_w2l_templates.rs index f7621f464a..c4d8ccbfdf 100644 --- a/src/http_server/endpoints/w2l/list_w2l_templates.rs +++ b/src/http_server/endpoints/w2l/list_w2l_templates.rs @@ -8,15 +8,8 @@ use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::queries::list_w2l_templates::{list_w2l_templates, W2lTemplateRecordForList}; -use crate::http_server::endpoints::users::create_account::CreateAccountError::{BadInput, ServerError, UsernameTaken, EmailTaken}; -use crate::http_server::endpoints::users::login::LoginSuccessResponse; -use crate::http_server::web_utils::ip_address::get_request_ip; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::session_checker::SessionRecord; use crate::server_state::ServerState; -use crate::util::random_crockford_token::random_crockford_token; -use crate::validations::passwords::validate_passwords; -use crate::validations::username::validate_username; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; diff --git a/src/http_server/web_utils/mod.rs b/src/http_server/web_utils/mod.rs index 701d2bbdb3..9e58e92491 100644 --- a/src/http_server/web_utils/mod.rs +++ b/src/http_server/web_utils/mod.rs @@ -3,4 +3,5 @@ pub mod ip_address; pub mod read_multipart_field_bytes; pub mod response_error_helpers; pub mod response_success_helpers; +pub mod serialize_as_json_error; pub mod session_checker; \ No newline at end of file diff --git a/src/http_server/web_utils/serialize_as_json_error.rs b/src/http_server/web_utils/serialize_as_json_error.rs new file mode 100644 index 0000000000..7a36a6d595 --- /dev/null +++ b/src/http_server/web_utils/serialize_as_json_error.rs @@ -0,0 +1,21 @@ +use actix_http::http::{StatusCode, header}; +use actix_web::HttpResponse; +use serde::Serialize; +use actix_http::ResponseError; +use actix_web::dev::HttpResponseBuilder; + +/// Turn error responses into JSON HTTP responses +pub fn serialize_as_json_error( + error_payload: &T, +) -> HttpResponse + where T: ?Sized + Serialize + ResponseError, +{ + let body = match serde_json::to_string(error_payload) { + Ok(json) => json, + Err(_) => "{}".to_string(), + }; + + HttpResponseBuilder::new(error_payload.status_code()) + .set_header(header::CONTENT_TYPE, "application/json") + .body(body) +}