diff --git a/src/forms.rs b/src/forms.rs index 52e3b21..2db51a4 100644 --- a/src/forms.rs +++ b/src/forms.rs @@ -1,13 +1,21 @@ use serde::Deserialize; +/// Fields of the contact form that persist after a redirection +/// (example after failed server side validation). +#[derive(Deserialize, Default)] +pub struct PersistantContactFormFields { + pub name: String, + pub email: String, + pub telefon: String, + pub message: String, +} + /// The contact form. #[derive(Deserialize)] pub struct ContactForm { /// The id for the captcha. pub id: u16, - pub name: String, - pub email: String, - pub telefon: String, - pub message: String, + #[serde(flatten)] + pub persistant_fields: PersistantContactFormFields, pub captcha_answer: String, } diff --git a/src/routes.rs b/src/routes.rs index df077cc..f2aa484 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -8,18 +8,19 @@ use std::sync::{Arc, Mutex}; use tracing::{error, info}; use crate::{ - captcha_solutions::CaptchaSolutions, config::Config, errors::AppError, forms::ContactForm, - mailer::Mailer, templates, + captcha_solutions::CaptchaSolutions, + config::Config, + errors::AppError, + forms::{ContactForm, PersistantContactFormFields}, + mailer::Mailer, + templates, }; -pub struct IndexParams<'a> { +pub struct ContactFormParams<'a> { config: Arc, captcha_solutions: Arc>, was_validated: bool, - name: Option, - email: Option, - telefon: Option, - message: Option, + persistant_fields: Option, error_message: Option<&'a str>, } @@ -29,20 +30,17 @@ pub async fn index( ) -> Result { info!("Visited get(index)"); - render_contact_form(IndexParams { + render_contact_form(ContactFormParams { config, captcha_solutions, was_validated: false, - name: None, - email: None, - telefon: None, - message: None, + persistant_fields: None, error_message: None, }) .await } -pub async fn render_contact_form(params: IndexParams<'_>) -> Result { +pub async fn render_contact_form(params: ContactFormParams<'_>) -> Result { let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy); let captcha_base64 = captcha.as_base64().context("Failed to create a captcha!")?; @@ -57,10 +55,7 @@ pub async fn render_contact_form(params: IndexParams<'_>) -> Result Result { - let params = IndexParams { + let params = ContactFormParams { config, captcha_solutions, was_validated: true, - name: Some(form.name), - email: Some(form.email), - telefon: Some(form.telefon), - message: Some(form.message), + persistant_fields: Some(form.persistant_fields), error_message: Some(error_message), }; @@ -113,7 +105,12 @@ pub async fn submit( } match mailer - .send(&form.name, &form.email, &form.telefon, &form.message) + .send( + &form.persistant_fields.name, + &form.persistant_fields.email, + &form.persistant_fields.telefon, + &form.persistant_fields.message, + ) .await { Ok(_) => (), diff --git a/src/templates.rs b/src/templates.rs index ca82924..b56dbf8 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -1,6 +1,6 @@ use askama::Template; -use crate::config; +use crate::{config, forms::PersistantContactFormFields}; pub struct Base<'a> { pub lang: &'a str, @@ -13,10 +13,7 @@ pub struct ContactForm<'a> { pub base: Base<'a>, pub was_validated: bool, pub id: u16, - pub name: String, - pub email: String, - pub telefon: String, - pub message: String, + pub persistant_fields: PersistantContactFormFields, pub captcha: String, pub error_message: &'a str, pub strings: &'a config::Strings, diff --git a/templates/contact_form.askama.html b/templates/contact_form.askama.html index cf51617..4de3b49 100644 --- a/templates/contact_form.askama.html +++ b/templates/contact_form.askama.html @@ -16,7 +16,7 @@ @@ -26,7 +26,7 @@ @@ -36,7 +36,7 @@ @@ -47,7 +47,7 @@ class="form-control" id="message" style="resize: none" - required>{{ message }} + required>{{ persistant_fields.message }}
{{ strings.message_field.invalid_feedback }}