From 210c470ebda0feb7e71b9bd2676fd9e4e359e057 Mon Sep 17 00:00:00 2001
From: Nutomic <me@nutomic.com>
Date: Thu, 28 Sep 2023 16:06:45 +0200
Subject: [PATCH] Notify admin about registration application after email
 verification (fixes #3024) (#3995)

---
 crates/api/src/local_user/verify_email.rs | 16 +++++++++++++++-
 crates/api_crud/src/user/create.rs        |  4 ++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/crates/api/src/local_user/verify_email.rs b/crates/api/src/local_user/verify_email.rs
index 6226e50411..d3b549ccba 100644
--- a/crates/api/src/local_user/verify_email.rs
+++ b/crates/api/src/local_user/verify_email.rs
@@ -2,20 +2,25 @@ use actix_web::web::{Data, Json};
 use lemmy_api_common::{
   context::LemmyContext,
   person::{VerifyEmail, VerifyEmailResponse},
+  utils::send_new_applicant_email_to_admins,
 };
 use lemmy_db_schema::{
   source::{
     email_verification::EmailVerification,
     local_user::{LocalUser, LocalUserUpdateForm},
+    person::Person,
   },
   traits::Crud,
+  RegistrationMode,
 };
+use lemmy_db_views::structs::SiteView;
 use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType};
 
 pub async fn verify_email(
   data: Json<VerifyEmail>,
   context: Data<LemmyContext>,
 ) -> Result<Json<VerifyEmailResponse>, LemmyError> {
+  let site_view = SiteView::read_local(&mut context.pool()).await?;
   let token = data.token.clone();
   let verification = EmailVerification::read_for_token(&mut context.pool(), &token)
     .await
@@ -30,9 +35,18 @@ pub async fn verify_email(
   };
   let local_user_id = verification.local_user_id;
 
-  LocalUser::update(&mut context.pool(), local_user_id, &form).await?;
+  let local_user = LocalUser::update(&mut context.pool(), local_user_id, &form).await?;
 
   EmailVerification::delete_old_tokens_for_local_user(&mut context.pool(), local_user_id).await?;
 
+  // send out notification about registration application to admins if enabled
+  if site_view.local_site.registration_mode == RegistrationMode::RequireApplication
+    && site_view.local_site.application_email_admins
+  {
+    let person = Person::read(&mut context.pool(), local_user.person_id).await?;
+    send_new_applicant_email_to_admins(&person.name, &mut context.pool(), context.settings())
+      .await?;
+  }
+
   Ok(Json(VerifyEmailResponse {}))
 }
diff --git a/crates/api_crud/src/user/create.rs b/crates/api_crud/src/user/create.rs
index e1efcbed2c..f153f147c0 100644
--- a/crates/api_crud/src/user/create.rs
+++ b/crates/api_crud/src/user/create.rs
@@ -158,8 +158,8 @@ pub async fn register(
     RegistrationApplication::create(&mut context.pool(), &form).await?;
   }
 
-  // Email the admins
-  if local_site.application_email_admins {
+  // Email the admins, only if email verification is not required
+  if local_site.application_email_admins && !local_site.require_email_verification {
     send_new_applicant_email_to_admins(&data.username, &mut context.pool(), context.settings())
       .await?;
   }