From 00f8b0693fff2deadc62a069e9752b6b9033f9c0 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 2 Feb 2025 19:05:52 +0100 Subject: [PATCH] feat: resend registration email --- ...47d12ad03cda345ba6d1120e38081fdb1fa06.json | 14 +++++++ web/src/endpoints/mod.rs | 1 + web/src/endpoints/user/mod.rs | 1 + .../user/post_resend_registration.rs | 42 +++++++++++++++++++ web/src/models/registration.rs | 8 ++++ web/templates/user/overview.html | 10 ++++- 6 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 .sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json create mode 100644 web/src/endpoints/user/post_resend_registration.rs diff --git a/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json b/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json new file mode 100644 index 00000000..31dd2af1 --- /dev/null +++ b/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM registration WHERE userId = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06" +} diff --git a/web/src/endpoints/mod.rs b/web/src/endpoints/mod.rs index 25899586..afe8c33a 100644 --- a/web/src/endpoints/mod.rs +++ b/web/src/endpoints/mod.rs @@ -48,6 +48,7 @@ pub fn init(cfg: &mut ServiceConfig) { cfg.service(user::post_changepassword::post); cfg.service(user::get_register::get); cfg.service(user::post_register::post); + cfg.service(user::post_resend_registration::post); cfg.service(availability::delete::delete); cfg.service(availability::get_new::get); diff --git a/web/src/endpoints/user/mod.rs b/web/src/endpoints/user/mod.rs index cd21573b..2a13f996 100644 --- a/web/src/endpoints/user/mod.rs +++ b/web/src/endpoints/user/mod.rs @@ -28,6 +28,7 @@ pub mod post_new; pub mod post_register; pub mod post_reset; pub mod post_toggle; +pub mod post_resend_registration; #[derive(Template)] #[template(path = "user/new_or_edit.html")] diff --git a/web/src/endpoints/user/post_resend_registration.rs b/web/src/endpoints/user/post_resend_registration.rs new file mode 100644 index 00000000..f4b2dccd --- /dev/null +++ b/web/src/endpoints/user/post_resend_registration.rs @@ -0,0 +1,42 @@ +use actix_web::{web, HttpResponse, Responder}; +use sqlx::PgPool; + +use crate::{ + endpoints::IdPath, + mail::Mailer, + models::{Registration, Role, User}, + utils::ApplicationError, +}; + +#[actix_web::post("/users/{id}/resend-registration")] +pub async fn post( + user: web::ReqData, + pool: web::Data, + path: web::Path, + mailer: web::Data, +) -> Result { + if user.role != Role::AreaManager && user.role != Role::Admin { + return Err(ApplicationError::Unauthorized); + } + + let Some(user_in_db) = User::read_by_id(pool.get_ref(), path.id).await? else { + return Ok(HttpResponse::NotFound().finish()); + }; + + if user.role == Role::AreaManager && user.area_id != user_in_db.area_id { + return Err(ApplicationError::Unauthorized); + } + + if user_in_db.password.is_some() || user_in_db.salt.is_some() || user_in_db.last_login.is_some() + { + return Ok(HttpResponse::BadRequest().finish()); + } + + Registration::delete_all_for_user(pool.get_ref(), user_in_db.id).await?; + let registration = Registration::insert_new_for_user(pool.get_ref(), user_in_db.id).await?; + mailer + .send_registration_mail(&user_in_db, ®istration.token) + .await?; + + Ok(HttpResponse::NoContent().finish()) +} diff --git a/web/src/models/registration.rs b/web/src/models/registration.rs index 51be8b54..7def0255 100644 --- a/web/src/models/registration.rs +++ b/web/src/models/registration.rs @@ -45,6 +45,14 @@ impl Registration { Ok(()) } + + pub async fn delete_all_for_user(pool: &PgPool, user_id: i32) -> Result<()> { + sqlx::query!("DELETE FROM registration WHERE userId = $1;", user_id) + .execute(pool) + .await?; + + Ok(()) + } } impl Token for Registration { diff --git a/web/templates/user/overview.html b/web/templates/user/overview.html index 1be014b4..f01c16fd 100644 --- a/web/templates/user/overview.html +++ b/web/templates/user/overview.html @@ -2,7 +2,7 @@ {% block content %}
-
+

@@ -110,6 +110,14 @@ Löschen + {% if u.password.is_none() && u.salt.is_none() && u.last_login.is_none() %} + + {% endif %}

{% endif %}