contact-form/src/routes.rs

85 lines
2.1 KiB
Rust
Raw Normal View History

2022-10-26 00:23:55 +00:00
use rocket::form::{Form, FromForm, Strict};
use rocket::response::status::BadRequest;
2022-10-27 16:44:40 +00:00
use rocket::response::Redirect;
use rocket::{get, post, uri, State};
2022-10-26 00:23:55 +00:00
use rocket_dyn_templates::Template;
use serde::Serialize;
2022-10-27 16:44:40 +00:00
use std::mem;
2022-10-26 00:23:55 +00:00
use crate::states;
#[derive(Serialize)]
struct FormContext {
id: u16,
2022-10-27 16:44:40 +00:00
name: Option<String>,
email: Option<String>,
telefon: Option<String>,
message: Option<String>,
2022-10-26 00:23:55 +00:00
captcha: String,
}
2022-10-27 16:44:40 +00:00
#[get("/?<name>&<email>&<telefon>&<message>")]
2022-10-26 00:23:55 +00:00
pub fn index(
2022-10-27 16:44:40 +00:00
name: Option<String>,
email: Option<String>,
telefon: Option<String>,
message: Option<String>,
2022-10-26 00:23:55 +00:00
captcha_solutions: &State<states::SharedCaptchaSolutions>,
) -> Result<Template, BadRequest<()>> {
let captcha = captcha::by_name(captcha::Difficulty::Easy, captcha::CaptchaName::Lucy);
let captcha_base64 = match captcha.as_base64() {
Some(s) => s,
None => return Err(BadRequest(None)),
};
let id = captcha_solutions.store_solution(&captcha.chars_as_string());
let form_context = FormContext {
id,
2022-10-27 16:44:40 +00:00
name,
email,
telefon,
message,
2022-10-26 00:23:55 +00:00
captcha: captcha_base64,
};
Ok(Template::render("form", &form_context))
}
#[derive(FromForm)]
pub struct ContactForm {
id: u16,
name: String,
email: String,
telefon: String,
message: String,
captcha_answer: String,
}
#[post("/submit", data = "<form>")]
pub fn submit(
2022-10-27 16:44:40 +00:00
mut form: Form<Strict<ContactForm>>,
2022-10-26 00:23:55 +00:00
captcha_solutions: &State<states::SharedCaptchaSolutions>,
2022-10-27 16:44:40 +00:00
) -> Redirect {
let path_prefix = uri!("/contact-form");
2022-10-26 00:23:55 +00:00
2022-10-27 16:44:40 +00:00
if !captcha_solutions.check_answer(form.id, &form.captcha_answer) {
return Redirect::to(uri!(
path_prefix,
index(
Some(mem::take(&mut form.name)),
Some(mem::take(&mut form.email)),
Some(mem::take(&mut form.telefon)),
Some(mem::take(&mut form.message)),
)
));
}
Redirect::to(uri!(path_prefix, success()))
}
#[get("/success")]
pub fn success() -> &'static str {
"Ihre Anfrage wurde übermittelt! Wir melden uns bald bei Ihnen zurück."
2022-10-26 00:23:55 +00:00
}