61 lines
1.6 KiB
Rust
61 lines
1.6 KiB
Rust
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<bool>,
|
|
}
|
|
|
|
#[post("/register")]
|
|
async fn post(
|
|
form: web::Form<RegisterForm>,
|
|
pool: web::Data<PgPool>,
|
|
) -> Result<impl Responder, ApplicationError> {
|
|
// 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::<Registration>::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)
|
|
}
|