mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-09 19:41:32 +00:00
create account with better error responses
This commit is contained in:
1 parent
d336ff7985
commit
dbd979f126
22 files changed
+114
-163
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<String, String>,
|
||||
}
|
||||
|
||||
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<CreateAccountRequest>,
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, CreateAccountError>
|
||||
server_state: web::Data<Arc<ServerState>>) -> Result<HttpResponse, CreateAccountErrorResponse>
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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};
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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<T>(
|
||||
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)
|
||||
}
|
||||
Reference in new issue
Block a user