diff options
Diffstat (limited to 'src/api/error.rs')
-rw-r--r-- | src/api/error.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/api/error.rs b/src/api/error.rs index 2af7228..10b5468 100644 --- a/src/api/error.rs +++ b/src/api/error.rs @@ -1,7 +1,7 @@ #[derive(thiserror::Error, Debug)] pub enum Error { #[error("Database error: {0}")] - Sqlx(#[from] sqlx::Error), + Sqlx(#[source] sqlx::Error), #[error("Route not found: {0}")] RouteNotFound(axum::http::Uri), @@ -22,7 +22,7 @@ pub enum Error { InvalidToken, #[error("User with that email already exists")] - EmailExists, + UserExists, #[error("Invalid email: {0}")] EmailInvalid(#[from] email_address::Error), @@ -34,6 +34,19 @@ pub enum Error { Auth(#[from] crate::auth::error::Error), } +impl From<sqlx::Error> for Error { + fn from(value: sqlx::Error) -> Self { + match value { + sqlx::Error::Database(db_err) + if db_err.is_unique_violation() && db_err.table().is_some_and(|s| s == "user_") => + { + Error::UserExists + } + err => Error::Sqlx(err), + } + } +} + impl From<axum_extra::typed_header::TypedHeaderRejection> for Error { fn from(value: axum_extra::typed_header::TypedHeaderRejection) -> Self { if value.is_missing() { @@ -53,7 +66,7 @@ impl axum::response::IntoResponse for Error { Self::RouteNotFound(_) | Self::UserNotFound | Self::TaskNotFound => { StatusCode::NOT_FOUND } - Self::EmailExists => StatusCode::CONFLICT, + Self::UserExists => StatusCode::CONFLICT, Self::InvalidToken => StatusCode::UNAUTHORIZED, Self::HeaderNotFound(ref h) if h == AUTHORIZATION => StatusCode::UNAUTHORIZED, Self::HeaderNotFound(_) => StatusCode::BAD_REQUEST, |