From 91e905730e79b02c70d227977c4d7dea6bcde56d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tristan=20Dani=C3=ABl=20Maat?= Date: Fri, 9 Sep 2022 18:41:04 +0100 Subject: [PATCH] Handle post to mail page --- Cargo.lock | 19 +++++++++++++++++-- Cargo.toml | 1 + src/main.rs | 30 +++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e01309f..1a5cb11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1040,9 +1040,23 @@ checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" [[package]] name = "serde" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "serde_json" @@ -1219,6 +1233,7 @@ dependencies = [ "env_logger", "handlebars", "log", + "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index b2304a0..1ad1857 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,5 @@ derive_more = "0.99.17" env_logger = "0.9.0" handlebars = { version = "4.3.3", features = ["dir_source"] } log = "0.4.17" +serde = {version = "1.0.144", features = ["derive"]} serde_json = "1.0.83" diff --git a/src/main.rs b/src/main.rs index 137ea57..44bfca1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,11 +3,13 @@ use std::net::SocketAddr; use std::path::PathBuf; use actix_files::NamedFile; -use actix_web::{get, web, App, HttpRequest, HttpResponse, HttpServer, Responder}; use actix_web::http::{Method, StatusCode}; use actix_web::middleware::{self, ErrorHandlers}; +use actix_web::{get, post, web, App, HttpRequest, HttpResponse, HttpServer, Responder}; use clap::Parser; use handlebars::Handlebars; +use log::info; +use serde::Deserialize; mod errors; @@ -97,6 +99,31 @@ async fn static_file( } } +#[derive(Clone, Debug, Deserialize)] +struct Mail { + mail: String, + subject: String, + message: String, +} + +#[post("/mail.html")] +async fn mail_post( + shared: web::Data>, + form: web::Form, +) -> actix_web::Result { + info!("{:?}", form); + + if shared.handlebars.has_template("mail") { + let body = shared + .handlebars + .render("mail", &()) + .map_err(|_| UserError::InternalError)?; + Ok(HttpResponse::Ok().body(body)) + } else { + Err(UserError::InternalError)? + } +} + #[actix_web::main] async fn main() -> Result<(), std::io::Error> { let mut config = Config::parse(); @@ -127,6 +154,7 @@ async fn main() -> Result<(), std::io::Error> { .service(template) .service(static_file) .service(template_index) + .service(mail_post) .default_service(web::route().method(Method::GET)) }) .bind(config.address)?