Use persistant_fields
This commit is contained in:
parent
2143da1766
commit
45f664bf9c
4 changed files with 38 additions and 36 deletions
16
src/forms.rs
16
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,
|
||||
}
|
||||
|
|
|
@ -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<Config>,
|
||||
captcha_solutions: Arc<Mutex<CaptchaSolutions>>,
|
||||
was_validated: bool,
|
||||
name: Option<String>,
|
||||
email: Option<String>,
|
||||
telefon: Option<String>,
|
||||
message: Option<String>,
|
||||
persistant_fields: Option<PersistantContactFormFields>,
|
||||
error_message: Option<&'a str>,
|
||||
}
|
||||
|
||||
|
@ -29,20 +30,17 @@ pub async fn index(
|
|||
) -> Result<Response, AppError> {
|
||||
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<Response, AppError> {
|
||||
pub async fn render_contact_form(params: ContactFormParams<'_>) -> Result<Response, AppError> {
|
||||
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<Response, Ap
|
|||
},
|
||||
was_validated: params.was_validated,
|
||||
id,
|
||||
name: params.name.unwrap_or_default(),
|
||||
email: params.email.unwrap_or_default(),
|
||||
telefon: params.telefon.unwrap_or_default(),
|
||||
message: params.message.unwrap_or_default(),
|
||||
persistant_fields: params.persistant_fields.unwrap_or_default(),
|
||||
captcha: captcha_base64,
|
||||
error_message: params.error_message.unwrap_or_default(),
|
||||
strings: ¶ms.config.strings,
|
||||
|
@ -75,14 +70,11 @@ async fn failed_submission(
|
|||
error_message: &str,
|
||||
form: ContactForm,
|
||||
) -> Result<Response, AppError> {
|
||||
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(_) => (),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<label for="name" class="form-label">{{ strings.name_field.label }}</label>
|
||||
<input type="text"
|
||||
name="name"
|
||||
value="{{ name }}"
|
||||
value="{{ persistant_fields.name }}"
|
||||
class="form-control"
|
||||
id="exampleInputEmail1"
|
||||
required>
|
||||
|
@ -26,7 +26,7 @@
|
|||
<label for="email" class="form-label">{{ strings.email_field.label }}</label>
|
||||
<input type="email"
|
||||
name="email"
|
||||
value="{{ email }}"
|
||||
value="{{ persistant_fields.email }}"
|
||||
class="form-control"
|
||||
id="email"
|
||||
required>
|
||||
|
@ -36,7 +36,7 @@
|
|||
<label for="telefon" class="form-label">{{ strings.telefon_field_label }}</label>
|
||||
<input type="text"
|
||||
name="telefon"
|
||||
value="{{ telefon }}"
|
||||
value="{{ persistant_fields.telefon }}"
|
||||
class="form-control"
|
||||
id="telefon">
|
||||
</div>
|
||||
|
@ -47,7 +47,7 @@
|
|||
class="form-control"
|
||||
id="message"
|
||||
style="resize: none"
|
||||
required>{{ message }}</textarea>
|
||||
required>{{ persistant_fields.message }}</textarea>
|
||||
<div class="invalid-feedback">{{ strings.message_field.invalid_feedback }}</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in a new issue