From 8919c36ef6109a397a3e8a4b54188bed8347069e Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 8 May 2026 13:15:47 +0200 Subject: [PATCH] feat: preserve pagination offset after review delete --- .../template-askama/templates/activity_feed.html | 1 + crates/adapters/template-askama/templates/profile.html | 1 + crates/presentation/src/dtos.rs | 6 ++++++ crates/presentation/src/handlers.rs | 9 ++++++++- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/crates/adapters/template-askama/templates/activity_feed.html b/crates/adapters/template-askama/templates/activity_feed.html index 1032e32..6f7afca 100644 --- a/crates/adapters/template-askama/templates/activity_feed.html +++ b/crates/adapters/template-askama/templates/activity_feed.html @@ -30,6 +30,7 @@ {% if ctx.is_current_user(entry.review().user_id().value()) %}
+
{% endif %} diff --git a/crates/adapters/template-askama/templates/profile.html b/crates/adapters/template-askama/templates/profile.html index c7a5aab..a8bc53b 100644 --- a/crates/adapters/template-askama/templates/profile.html +++ b/crates/adapters/template-askama/templates/profile.html @@ -141,6 +141,7 @@
{{ entry.review().watched_at().format("%Y-%m-%d") }}
{% if ctx.is_current_user(entry.review().user_id().value()) %}
+
{% endif %} diff --git a/crates/presentation/src/dtos.rs b/crates/presentation/src/dtos.rs index 94b1d7b..e4dc47c 100644 --- a/crates/presentation/src/dtos.rs +++ b/crates/presentation/src/dtos.rs @@ -59,6 +59,12 @@ pub struct ErrorQuery { pub error: Option, } +#[derive(Deserialize, Default)] +pub struct DeleteRedirectForm { + #[serde(default)] + pub redirect_after: Option, +} + #[derive(Deserialize)] pub struct LogReviewRequest { pub external_metadata_id: Option, diff --git a/crates/presentation/src/handlers.rs b/crates/presentation/src/handlers.rs index 30462d7..fc42fce 100644 --- a/crates/presentation/src/handlers.rs +++ b/crates/presentation/src/handlers.rs @@ -219,13 +219,20 @@ pub mod html { State(state): State, RequiredCookieUser(user_id): RequiredCookieUser, Path(review_id): Path, + Form(form): Form, ) -> 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(), + Ok(()) => { + let redirect_url = form + .redirect_after + .filter(|url| url.starts_with('/') || url.starts_with('?')) + .unwrap_or_else(|| "/".to_string()); + Redirect::to(&redirect_url).into_response() + } Err(DomainError::NotFound(_)) => StatusCode::NOT_FOUND.into_response(), Err(DomainError::Unauthorized(_)) => StatusCode::FORBIDDEN.into_response(), Err(e) => {