use crate::models::User; use rocket::http::{Cookie, Cookies}; use rocket::request::{FlashMessage, Form}; use rocket::response::{Flash, Redirect}; use rocket_contrib::templates::Template; use std::collections::HashMap; pub(crate) fn routes() -> Vec { routes![login, logout, login_user, login_page] } #[derive(FromForm)] struct Login { username: String, password: String, } #[post("/login", data = "")] fn login(mut cookies: Cookies, login: Form) -> Result> { if login.username == "Sergio" && login.password == "password" { cookies.add_private(Cookie::new("user_id", 1.to_string())); Ok(Redirect::to(uri!(super::root::index))) } else { Err(Flash::error( Redirect::to(uri!(login_page)), "Invalid username/password.", )) } } #[post("/logout")] fn logout(mut cookies: Cookies) -> Flash { cookies.remove_private(Cookie::named("user_id")); Flash::success(Redirect::to(uri!(login_page)), "Successfully logged out.") } #[get("/login")] fn login_user(_user: User) -> Redirect { Redirect::to(uri!(super::root::index)) } #[get("/login", rank = 2)] fn login_page(flash: Option) -> Template { let mut context = HashMap::new(); if let Some(ref msg) = flash { context.insert("flash", msg.msg()); } Template::render("login", &context) }