use actix_web::{post, web, HttpResponse, Responder}; use maud::html; use serde::Deserialize; use sqlx::PgPool; use crate::utils::{password_change::PasswordChangeBuilder, ApplicationError}; use brass_db::models::Registration; #[derive(Deserialize)] struct RegisterForm { token: String, password: String, passwordretyped: String, dry: Option, } #[post("/register")] async fn post( form: web::Form, pool: web::Data, ) -> Result { // TODO: refactor into check if HX-TARGET = #password-strength exists let is_dry = form.dry.unwrap_or(false); let token = if let Some(token) = Registration::does_token_exist(pool.get_ref(), &form.token).await? { token } else { return Ok(HttpResponse::NoContent().finish()); }; let mut builder = PasswordChangeBuilder::::new( pool.get_ref(), token.userid, &form.password, &form.passwordretyped, ) .with_token(token); let change = builder.build(); let response = if is_dry { change.validate_for_input().await? } else { change.validate().await?; change.commit().await?; HttpResponse::Ok().body( html! { div class="block mb-3" { "Registrierung abgeschlossen." } a class="block button is-primary" hx-boost="true" href="/login"{ "Zum Login" } } .into_string(), ) }; Ok(response) }