use actix::Addr; use actix_web::{HttpResponse, Responder, web}; use askama::Template; use crate::actors::users_actor::{LoginResult, UsersActor}; use crate::actors::users_actor; use crate::constants::APP_NAME; #[derive(Template)] #[template(path = "base_login_page.html")] struct BaseLoginPage { danger: String, success: String, page_title: &'static str, app_name: &'static str, } #[derive(Template)] #[template(path = "login.html")] struct LoginTemplate { _parent: BaseLoginPage, login: String, } #[derive(serde::Deserialize)] pub struct LoginRequest { login: String, password: String, } /// Authenticate user pub async fn login_route(users: web::Data>, req: Option>) -> impl Responder { let mut danger = String::new(); let mut login = String::new(); // Try to authenticate user if let Some(req) = &req { login = req.login.clone(); let response: LoginResult = users.send(users_actor::LoginRequest { login: login.clone(), password: req.password.clone(), }).await.unwrap(); danger = format!("{:?}", response) } HttpResponse::Ok() .content_type("text/html") .body(LoginTemplate { _parent: BaseLoginPage { page_title: "Login", danger, success: "".to_string(), app_name: APP_NAME, }, login, }.render().unwrap()) }