brass/web/src/endpoints/user/get_reset.rs

54 lines
1.6 KiB
Rust

use actix_identity::Identity;
use actix_web::{get, http::header::LOCATION, web, HttpResponse, Responder};
use askama::Template;
use serde::Deserialize;
use sqlx::PgPool;
use crate::utils::{ApplicationError, Customization, TemplateResponse};
use brass_db::models::PasswordReset;
use super::ResetPasswordTemplate;
#[derive(Template)]
#[template(path = "user/forgot_password.html")]
struct ForgotPasswordTemplate<'a> {
webmaster_email: &'a str,
}
#[derive(Deserialize)]
struct TokenQuery {
token: Option<String>,
}
#[get("/reset-password")]
pub async fn get(
user: Option<Identity>,
pool: web::Data<PgPool>,
query: web::Query<TokenQuery>,
customization: web::Data<Customization>,
) -> Result<impl Responder, ApplicationError> {
if user.is_some() {
return Ok(HttpResponse::Found()
.insert_header((LOCATION, "/"))
.finish());
} else if let Some(token) = &query.token {
if let Some(_) = PasswordReset::does_token_exist(pool.get_ref(), token).await? {
let template = ResetPasswordTemplate {
token,
title: "Brass - Passwort zurücksetzen",
endpoint: "/reset-password",
new_password_label: "neues Passwort:",
retype_label: "neues Passwort wiederholen:",
submit_button_label: "Passwort zurücksetzen",
};
return Ok(template.to_response()?);
}
}
let template = ForgotPasswordTemplate {
webmaster_email: &customization.webmaster_email,
};
Ok(template.to_response()?)
}