From ca35e8e7744d0b1ad2bf09fd8fb3cee17b749d8f Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 16 May 2026 10:55:58 +0200 Subject: [PATCH] feat(domain): add DomainError::UniqueViolation {field} --- crates/domain/src/errors.rs | 2 ++ crates/presentation/src/errors.rs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/crates/domain/src/errors.rs b/crates/domain/src/errors.rs index fb8ac55..e3d6a29 100644 --- a/crates/domain/src/errors.rs +++ b/crates/domain/src/errors.rs @@ -10,6 +10,8 @@ pub enum DomainError { Forbidden, #[error("conflict: {0}")] Conflict(String), + #[error("unique violation on field: {field}")] + UniqueViolation { field: &'static str }, #[error("invalid input: {0}")] InvalidInput(String), #[error("external service error: {0}")] diff --git a/crates/presentation/src/errors.rs b/crates/presentation/src/errors.rs index db1ec41..f0c1e38 100644 --- a/crates/presentation/src/errors.rs +++ b/crates/presentation/src/errors.rs @@ -27,6 +27,9 @@ impl IntoResponse for ApiError { } Self::Domain(DomainError::Forbidden) => (StatusCode::FORBIDDEN, "forbidden".into()), Self::Domain(DomainError::Conflict(m)) => (StatusCode::CONFLICT, m), + Self::Domain(DomainError::UniqueViolation { field }) => { + (StatusCode::CONFLICT, format!("{field} already taken")) + } Self::Domain(DomainError::InvalidInput(m)) => (StatusCode::UNPROCESSABLE_ENTITY, m), Self::Domain(DomainError::ExternalService(_)) => { (StatusCode::BAD_GATEWAY, "external service error".into())