From 5a58625265d60b37bb8a7c4d48cd28e704ee5715 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Mon, 4 May 2026 02:11:33 +0200 Subject: [PATCH] feat(presentation): add initial structure with dtos, errors, extractors, handlers, and routes modules --- crates/presentation/src/dtos.rs | 0 crates/presentation/src/errors.rs | 32 +++++++++++++++++++++++++++ crates/presentation/src/extractors.rs | 0 crates/presentation/src/handlers.rs | 0 crates/presentation/src/lib.rs | 5 +++++ crates/presentation/src/main.rs | 5 +++-- crates/presentation/src/routes.rs | 1 + 7 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 crates/presentation/src/dtos.rs create mode 100644 crates/presentation/src/errors.rs create mode 100644 crates/presentation/src/extractors.rs create mode 100644 crates/presentation/src/handlers.rs create mode 100644 crates/presentation/src/routes.rs diff --git a/crates/presentation/src/dtos.rs b/crates/presentation/src/dtos.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/presentation/src/errors.rs b/crates/presentation/src/errors.rs new file mode 100644 index 0000000..bd67dc2 --- /dev/null +++ b/crates/presentation/src/errors.rs @@ -0,0 +1,32 @@ +use axum::{ + http::StatusCode, + response::{IntoResponse, Response}, +}; +use domain::errors::DomainError; + +pub struct ApiError(DomainError); + +impl From for ApiError { + fn from(err: DomainError) -> Self { + Self(err) + } +} + +impl IntoResponse for ApiError { + fn into_response(self) -> Response { + let (status, error_message) = match self.0 { + DomainError::InvalidRating { .. } => (StatusCode::BAD_REQUEST, self.0.to_string()), + DomainError::ValidationError(msg) => (StatusCode::BAD_REQUEST, msg), + DomainError::NotFound(msg) => (StatusCode::NOT_FOUND, msg), + DomainError::InfrastructureError(_) => { + tracing::error!("Internal Infrastructure Error: {:?}", self.0); + ( + StatusCode::INTERNAL_SERVER_ERROR, + "Internal server error".to_string(), + ) + } + }; + + (status, error_message).into_response() + } +} diff --git a/crates/presentation/src/extractors.rs b/crates/presentation/src/extractors.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/presentation/src/handlers.rs b/crates/presentation/src/handlers.rs new file mode 100644 index 0000000..e69de29 diff --git a/crates/presentation/src/lib.rs b/crates/presentation/src/lib.rs index 40006fc..857540b 100644 --- a/crates/presentation/src/lib.rs +++ b/crates/presentation/src/lib.rs @@ -1 +1,6 @@ +pub mod dtos; +pub mod errors; +pub mod extractors; +pub mod handlers; pub mod ports; +pub mod routes; diff --git a/crates/presentation/src/main.rs b/crates/presentation/src/main.rs index e7a11a9..3239eee 100644 --- a/crates/presentation/src/main.rs +++ b/crates/presentation/src/main.rs @@ -1,3 +1,4 @@ -fn main() { - println!("Hello, world!"); +#[tokio::main] +async fn main() -> anyhow::Result<()> { + Ok(()) } diff --git a/crates/presentation/src/routes.rs b/crates/presentation/src/routes.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/crates/presentation/src/routes.rs @@ -0,0 +1 @@ +