From cff64f7a6b827cd40846ab4ba44590b6e40fac96 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Mon, 4 May 2026 14:27:43 +0200 Subject: [PATCH] feat(presentation): add POST /reviews/:id/delete handler and route --- crates/presentation/src/handlers.rs | 29 +++++++++++++++++++++++++---- crates/presentation/src/routes.rs | 1 + 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/crates/presentation/src/handlers.rs b/crates/presentation/src/handlers.rs index 090f957..872649d 100644 --- a/crates/presentation/src/handlers.rs +++ b/crates/presentation/src/handlers.rs @@ -1,17 +1,18 @@ pub mod html { use axum::{ - extract::{Query, State}, - http::{HeaderValue, header::SET_COOKIE}, + extract::{Path, Query, State}, + http::{HeaderValue, StatusCode, header::SET_COOKIE}, response::{Html, IntoResponse, Redirect}, Form, }; use chrono::{NaiveDateTime, Utc}; + use uuid::Uuid; use application::{ - commands::{LoginCommand, LogReviewCommand, RegisterCommand}, + commands::{DeleteReviewCommand, LoginCommand, LogReviewCommand, RegisterCommand}, ports::{HtmlPageContext, LoginPageData, NewReviewPageData, RegisterPageData}, queries::GetDiaryQuery, - use_cases::{get_diary, log_review, login as login_uc, register as register_uc}, + use_cases::{delete_review, get_diary, log_review, login as login_uc, register as register_uc}, }; use domain::{errors::DomainError, models::SortDirection, value_objects::UserId}; @@ -236,6 +237,26 @@ pub mod html { } } } + + pub async fn post_delete_review( + State(state): State, + RequiredCookieUser(user_id): RequiredCookieUser, + Path(review_id): Path, + ) -> impl IntoResponse { + let cmd = DeleteReviewCommand { + review_id, + requesting_user_id: user_id.value(), + }; + match delete_review::execute(&state.app_ctx, cmd).await { + Ok(()) => Redirect::to("/").into_response(), + Err(DomainError::NotFound(_)) => StatusCode::NOT_FOUND.into_response(), + Err(DomainError::Unauthorized(_)) => StatusCode::FORBIDDEN.into_response(), + Err(e) => { + tracing::error!("delete_review html error: {:?}", e); + StatusCode::INTERNAL_SERVER_ERROR.into_response() + } + } + } } pub mod posters { diff --git a/crates/presentation/src/routes.rs b/crates/presentation/src/routes.rs index 5a5206c..2b63c55 100644 --- a/crates/presentation/src/routes.rs +++ b/crates/presentation/src/routes.rs @@ -28,6 +28,7 @@ fn html_routes() -> Router { ) .route("/reviews/new", routing::get(handlers::html::get_new_review_page)) .route("/reviews", routing::post(handlers::html::post_review)) + .route("/reviews/:id/delete", routing::post(handlers::html::post_delete_review)) .route("/posters/{path}", routing::get(handlers::posters::get_poster)) .route("/feed.rss", routing::get(handlers::rss::get_feed)) }