From 2b9cf979e8fc6d54003b08f12d15b2e2c8292393 Mon Sep 17 00:00:00 2001 From: Alphonse Paix Date: Sat, 20 Sep 2025 00:51:46 +0200 Subject: [PATCH] Askama message template --- src/routes/admin.rs | 12 ++++++------ src/routes/admin/change_password.rs | 6 +++--- src/routes/admin/newsletters.rs | 6 +++--- src/routes/admin/posts.rs | 6 +++--- src/routes/login.rs | 6 +++--- src/routes/subscriptions.rs | 8 ++++---- src/templates.rs | 14 +++++--------- templates/error.html | 2 +- templates/success.html | 2 +- 9 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/routes/admin.rs b/src/routes/admin.rs index d56ee22..793f8b0 100644 --- a/src/routes/admin.rs +++ b/src/routes/admin.rs @@ -4,7 +4,7 @@ mod logout; mod newsletters; mod posts; -use crate::{routes::error_chain_fmt, templates::ErrorTemplate}; +use crate::{routes::error_chain_fmt, templates::MessageTemplate}; use askama::Template; use axum::{ Json, @@ -20,7 +20,7 @@ use reqwest::StatusCode; #[derive(thiserror::Error)] pub enum AdminError { - #[error("Something went wrong.")] + #[error("Something went wrong while performing an admin action.")] UnexpectedError(#[from] anyhow::Error), #[error("Trying to access admin dashboard without authentication.")] NotAuthenticated, @@ -62,14 +62,14 @@ impl IntoResponse for AdminError { (StatusCode::SEE_OTHER, headers).into_response() } AdminError::ChangePassword(e) => { - let template = ErrorTemplate { - error_message: e.to_owned(), + let template = MessageTemplate::Error { + message: e.to_owned(), }; Html(template.render().unwrap()).into_response() } AdminError::Publish(e) => { - let template = ErrorTemplate { - error_message: e.to_string(), + let template = MessageTemplate::Error { + message: e.to_string(), }; Html(template.render().unwrap()).into_response() } diff --git a/src/routes/admin/change_password.rs b/src/routes/admin/change_password.rs index 6e73354..d4ff9cd 100644 --- a/src/routes/admin/change_password.rs +++ b/src/routes/admin/change_password.rs @@ -2,7 +2,7 @@ use crate::{ authentication::{self, AuthenticatedUser, Credentials, validate_credentials}, routes::AdminError, startup::AppState, - templates::SuccessTemplate, + templates::MessageTemplate, }; use askama::Template; use axum::{ @@ -47,8 +47,8 @@ pub async fn change_password( authentication::change_password(user_id, form.new_password, &connection_pool) .await .map_err(|e| AdminError::ChangePassword(e.to_string()))?; - let template = SuccessTemplate { - success_message: "Your password has been changed.".to_string(), + let template = MessageTemplate::Success { + message: "Your password has been changed.".to_string(), }; Ok(Html(template.render().unwrap()).into_response()) } diff --git a/src/routes/admin/newsletters.rs b/src/routes/admin/newsletters.rs index a90e02e..62190f7 100644 --- a/src/routes/admin/newsletters.rs +++ b/src/routes/admin/newsletters.rs @@ -3,7 +3,7 @@ use crate::{ idempotency::{IdempotencyKey, save_response, try_processing}, routes::AdminError, startup::AppState, - templates::SuccessTemplate, + templates::MessageTemplate, }; use anyhow::Context; use askama::Template; @@ -98,11 +98,11 @@ pub async fn publish_newsletter( .await .context("Failed to enqueue delivery tasks.")?; - let success_message = format!( + let message = format!( r#"The newsletter issue "{}" has been published!"#, form.title ); - let template = SuccessTemplate { success_message }; + let template = MessageTemplate::Success { message }; let response = Html(template.render().unwrap()).into_response(); save_response(transaction, &idempotency_key, user_id, response) .await diff --git a/src/routes/admin/posts.rs b/src/routes/admin/posts.rs index 2d2d3d0..549376d 100644 --- a/src/routes/admin/posts.rs +++ b/src/routes/admin/posts.rs @@ -3,7 +3,7 @@ use crate::{ idempotency::{IdempotencyKey, save_response, try_processing}, routes::{AdminError, enqueue_delivery_tasks, insert_newsletter_issue}, startup::AppState, - templates::SuccessTemplate, + templates::MessageTemplate, }; use anyhow::Context; use askama::Template; @@ -68,8 +68,8 @@ pub async fn create_post( // Send emails with unique identifiers that contains link to blog post with special param // Get handpoint that returns the post and mark the email as opened - let template = SuccessTemplate { - success_message: "Your new post has been saved. Subscribers will be notified.".into(), + let template = MessageTemplate::Success { + message: "Your new post has been saved. Subscribers will be notified.".into(), }; let response = Html(template.render().unwrap()).into_response(); save_response(transaction, &idempotency_key, user_id, response) diff --git a/src/routes/login.rs b/src/routes/login.rs index 7f8b588..78cb367 100644 --- a/src/routes/login.rs +++ b/src/routes/login.rs @@ -3,7 +3,7 @@ use crate::{ routes::error_chain_fmt, session_state::TypedSession, startup::AppState, - templates::ErrorTemplate, + templates::MessageTemplate, }; use askama::Template; use axum::{ @@ -47,8 +47,8 @@ impl IntoResponse for LoginError { ) .into_response(), LoginError::AuthError(e) => { - let template = ErrorTemplate { - error_message: e.to_string(), + let template = MessageTemplate::Error { + message: e.to_string(), }; Html(template.render().unwrap()).into_response() } diff --git a/src/routes/subscriptions.rs b/src/routes/subscriptions.rs index 4fd5966..e4d60ed 100644 --- a/src/routes/subscriptions.rs +++ b/src/routes/subscriptions.rs @@ -2,7 +2,7 @@ use crate::{ domain::{NewSubscriber, SubscriberEmail}, email_client::EmailClient, startup::AppState, - templates::{ErrorTemplate, SuccessTemplate}, + templates::MessageTemplate, }; use anyhow::Context; use askama::Template; @@ -74,7 +74,7 @@ impl IntoResponse for SubscribeError { ) .into_response(), SubscribeError::ValidationError(e) => { - let template = ErrorTemplate { error_message: e }; + let template = MessageTemplate::Error { message: e }; Html(template.render().unwrap()).into_response() } } @@ -126,8 +126,8 @@ pub async fn subscribe( .commit() .await .context("Failed to commit the database transaction to store a new subscriber.")?; - let template = SuccessTemplate { - success_message: "A confirmation email has been sent.".to_string(), + let template = MessageTemplate::Success { + message: "A confirmation email has been sent.".to_string(), }; Ok(Html(template.render().unwrap()).into_response()) } diff --git a/src/templates.rs b/src/templates.rs index 3112ff8..5c12bc2 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -1,13 +1,9 @@ use askama::Template; #[derive(Template)] -#[template(path = "../templates/success.html")] -pub struct SuccessTemplate { - pub success_message: String, -} - -#[derive(Template)] -#[template(path = "../templates/error.html")] -pub struct ErrorTemplate { - pub error_message: String, +pub enum MessageTemplate { + #[template(path = "../templates/success.html")] + Success { message: String }, + #[template(path = "../templates/error.html")] + Error { message: String }, } diff --git a/templates/error.html b/templates/error.html index fcbcc87..3275f3e 100644 --- a/templates/error.html +++ b/templates/error.html @@ -4,6 +4,6 @@ - {{ error_message }} + {{ message }} diff --git a/templates/success.html b/templates/success.html index 6dd9bbf..895cc87 100644 --- a/templates/success.html +++ b/templates/success.html @@ -4,6 +4,6 @@ - {{ success_message }} + {{ message }}