AppFlowy-Cloud/libs/authentication/src/error.rs

104 lines
2.7 KiB
Rust

use actix_web::http::StatusCode;
use actix_web::HttpResponse;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum AuthError {
#[error("Credentials is invalid")]
InvalidCredentials(#[source] anyhow::Error),
#[error("User is not exist")]
UserNotExist(#[source] anyhow::Error),
#[error("{} is already used", email)]
UserAlreadyExist { email: String },
#[error("Invalid password")]
InvalidPassword,
#[error("User is unauthorized")]
Unauthorized,
#[error("User internal error")]
InternalError(#[from] anyhow::Error),
#[error("Parser uuid failed: {}", err)]
InvalidUuid { err: String },
}
pub fn internal_error(error: anyhow::Error) -> AuthError {
AuthError::InternalError(error)
}
impl actix_web::error::ResponseError for AuthError {
fn status_code(&self) -> StatusCode {
match *self {
AuthError::InvalidCredentials(_) => StatusCode::UNAUTHORIZED,
AuthError::UserNotExist(_) => StatusCode::UNAUTHORIZED,
AuthError::UserAlreadyExist { .. } => StatusCode::BAD_REQUEST,
AuthError::InvalidPassword => StatusCode::UNAUTHORIZED,
AuthError::Unauthorized => StatusCode::UNAUTHORIZED,
AuthError::InternalError(_) => StatusCode::INTERNAL_SERVER_ERROR,
AuthError::InvalidUuid { .. } => StatusCode::UNAUTHORIZED,
}
}
fn error_response(&self) -> HttpResponse {
HttpResponse::build(self.status_code()).body(self.to_string())
}
}
#[derive(Debug, Error)]
pub enum InputParamsError {
#[error("Invalid name")]
InvalidName(String),
#[error("Invalid email format")]
InvalidEmail(String),
#[error("Invalid password")]
InvalidPassword(String),
#[error("You entered two different new passwords")]
PasswordNotMatch,
}
impl actix_web::error::ResponseError for InputParamsError {
fn status_code(&self) -> StatusCode {
match *self {
InputParamsError::InvalidName(_) => StatusCode::BAD_REQUEST,
InputParamsError::InvalidEmail(_) => StatusCode::BAD_REQUEST,
InputParamsError::InvalidPassword(_) => StatusCode::BAD_REQUEST,
InputParamsError::PasswordNotMatch => StatusCode::BAD_REQUEST,
}
}
fn error_response(&self) -> HttpResponse {
HttpResponse::build(self.status_code()).body(self.to_string())
}
}
#[derive(Debug, Error)]
#[error("Internal server error")]
pub struct InternalServerError {
error: anyhow::Error,
}
impl InternalServerError {
pub fn new(error: anyhow::Error) -> Self {
Self { error }
}
}
impl actix_web::error::ResponseError for InternalServerError {
fn status_code(&self) -> StatusCode {
StatusCode::INTERNAL_SERVER_ERROR
}
fn error_response(&self) -> HttpResponse {
tracing::error!("Internal server error: {}", self.error);
HttpResponse::build(self.status_code()).body(self.to_string())
}
}