summaryrefslogtreecommitdiffstats
path: root/src/api/error.rs
diff options
context:
space:
mode:
authorToby Vincent <tobyv@tobyvin.dev>2024-05-07 16:45:13 -0500
committerToby Vincent <tobyv@tobyvin.dev>2024-05-07 16:45:13 -0500
commitb383010105b79fcd4e9d671ce82f5c04d0fc9b13 (patch)
tree2f28e21168d20ba717daa7e94a215c0e694ad500 /src/api/error.rs
parentc55c5b3ccf9f06775fb00a2bcb2912f218691758 (diff)
fix(api): improve user create flow and move ...
...claim based tests from user module into claims module.
Diffstat (limited to 'src/api/error.rs')
-rw-r--r--src/api/error.rs19
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,