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) => {