Document routers

This commit is contained in:
Mo 2023-02-24 01:13:02 +01:00
parent 24b8594325
commit 90bce828ff

View file

@ -24,6 +24,35 @@ pub struct ContactFormParams<'a> {
error_message: Option<&'a str>, error_message: Option<&'a str>,
} }
/// Renders the contact form.
pub fn render_contact_form(params: ContactFormParams<'_>) -> Result<Response, AppError> {
// Generate a captcha.
let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy);
let captcha_base64 = captcha.as_base64().context("Failed to create a captcha!")?;
// Get captcha solution.
let solution = captcha.chars_as_string();
// Store the captcha solution and get the captcha id.
let id = params.captcha_solutions.lock().unwrap().push(solution);
// Initialize the template.
let template = templates::ContactForm {
base: templates::Base {
lang: &params.config.lang,
path_prefix: &params.config.path_prefix,
},
was_validated: params.persistant_fields.is_some(),
id,
// Default is empty fields.
persistant_fields: params.persistant_fields.unwrap_or_default(),
captcha: captcha_base64,
error_message: params.error_message.unwrap_or_default(),
strings: &params.config.strings,
};
Ok(template.into_response())
}
/// Index handler.
pub async fn index( pub async fn index(
State(config): State<Arc<Config>>, State(config): State<Arc<Config>>,
State(captcha_solutions): State<Arc<Mutex<CaptchaSolutions>>>, State(captcha_solutions): State<Arc<Mutex<CaptchaSolutions>>>,
@ -38,30 +67,7 @@ pub async fn index(
}) })
} }
pub fn render_contact_form(params: ContactFormParams<'_>) -> Result<Response, AppError> { /// Submit handler.
let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy);
let captcha_base64 = captcha.as_base64().context("Failed to create a captcha!")?;
let solution = captcha.chars_as_string();
let id = params.captcha_solutions.lock().unwrap().push(solution);
let template = templates::ContactForm {
base: templates::Base {
lang: &params.config.lang,
path_prefix: &params.config.path_prefix,
},
was_validated: params.persistant_fields.is_some(),
id,
persistant_fields: params.persistant_fields.unwrap_or_default(),
captcha: captcha_base64,
error_message: params.error_message.unwrap_or_default(),
strings: &params.config.strings,
};
Ok(template.into_response())
}
pub async fn submit( pub async fn submit(
State(config): State<Arc<Config>>, State(config): State<Arc<Config>>,
State(captcha_solutions): State<Arc<Mutex<CaptchaSolutions>>>, State(captcha_solutions): State<Arc<Mutex<CaptchaSolutions>>>,
@ -84,7 +90,7 @@ pub async fn submit(
}); });
} }
match mailer if let Err(e) = mailer
.send( .send(
&form.persistant_fields.name, &form.persistant_fields.name,
&form.persistant_fields.email, &form.persistant_fields.email,
@ -93,25 +99,24 @@ pub async fn submit(
) )
.await .await
{ {
Ok(_) => (), error!("{e:?}");
Err(e) => {
error!("{e:?}");
return render_contact_form(ContactFormParams { return render_contact_form(ContactFormParams {
config: Arc::clone(&config), config: Arc::clone(&config),
captcha_solutions, captcha_solutions,
persistant_fields: Some(form.persistant_fields), persistant_fields: Some(form.persistant_fields),
error_message: Some(&config.error_messages.email_error), error_message: Some(&config.error_messages.email_error),
}); });
}
} }
success(config) success(config)
} }
/// Called on successful contact form submission.
pub fn success(config: Arc<Config>) -> Result<Response, AppError> { pub fn success(config: Arc<Config>) -> Result<Response, AppError> {
info!("Successful contact form submission"); info!("Successful contact form submission");
// Initialize template.
let template = templates::Success { let template = templates::Success {
base: templates::Base { base: templates::Base {
lang: &config.lang, lang: &config.lang,
@ -120,5 +125,6 @@ pub fn success(config: Arc<Config>) -> Result<Response, AppError> {
message: &config.strings.success, message: &config.strings.success,
}; };
// Render template.
Ok(template.into_response()) Ok(template.into_response())
} }