feat(presentation): add POST /reviews/:id/delete handler and route

This commit is contained in:
2026-05-04 14:27:43 +02:00
parent 5baff54cb9
commit cff64f7a6b
2 changed files with 26 additions and 4 deletions

View File

@@ -1,17 +1,18 @@
pub mod html { pub mod html {
use axum::{ use axum::{
extract::{Query, State}, extract::{Path, Query, State},
http::{HeaderValue, header::SET_COOKIE}, http::{HeaderValue, StatusCode, header::SET_COOKIE},
response::{Html, IntoResponse, Redirect}, response::{Html, IntoResponse, Redirect},
Form, Form,
}; };
use chrono::{NaiveDateTime, Utc}; use chrono::{NaiveDateTime, Utc};
use uuid::Uuid;
use application::{ use application::{
commands::{LoginCommand, LogReviewCommand, RegisterCommand}, commands::{DeleteReviewCommand, LoginCommand, LogReviewCommand, RegisterCommand},
ports::{HtmlPageContext, LoginPageData, NewReviewPageData, RegisterPageData}, ports::{HtmlPageContext, LoginPageData, NewReviewPageData, RegisterPageData},
queries::GetDiaryQuery, 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}; 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<AppState>,
RequiredCookieUser(user_id): RequiredCookieUser,
Path(review_id): Path<Uuid>,
) -> 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 { pub mod posters {

View File

@@ -28,6 +28,7 @@ fn html_routes() -> Router<AppState> {
) )
.route("/reviews/new", routing::get(handlers::html::get_new_review_page)) .route("/reviews/new", routing::get(handlers::html::get_new_review_page))
.route("/reviews", routing::post(handlers::html::post_review)) .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("/posters/{path}", routing::get(handlers::posters::get_poster))
.route("/feed.rss", routing::get(handlers::rss::get_feed)) .route("/feed.rss", routing::get(handlers::rss::get_feed))
} }