From b383010105b79fcd4e9d671ce82f5c04d0fc9b13 Mon Sep 17 00:00:00 2001 From: Toby Vincent Date: Tue, 7 May 2024 16:45:13 -0500 Subject: fix(api): improve user create flow and move ... ...claim based tests from user module into claims module. --- src/api/error.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'src/api/error.rs') 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 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 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, -- cgit v1.2.3-70-g09d2