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())