Skip to content

Commit ab9cd02

Browse files
committed
send mail after account deletion
1 parent 8e7f81d commit ab9cd02

2 files changed

Lines changed: 52 additions & 17 deletions

File tree

src/auth/service.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -370,22 +370,21 @@ pub fn soft_delete_account(
370370

371371
diesel::delete(
372372
evt::email_verification_tokens
373-
.filter(evt::user_id.eq(user_id)),
373+
.filter(evt::user_id.eq(user_id)),
374374
)
375375
.execute(conn)?;
376376

377377
diesel::delete(
378-
password_reset_tokens::table
378+
password_reset_tokens::table
379379
.filter(password_reset_tokens::user_id.eq(user_id)),
380-
)
381-
.execute(conn)?;
380+
)
381+
.execute(conn)?;
382382

383-
// refresh_tokens
384-
diesel::delete(
385-
refresh_tokens::table
383+
diesel::delete(
384+
refresh_tokens::table
386385
.filter(refresh_tokens::user_id.eq(user_id)),
387-
)
388-
.execute(conn)?;
386+
)
387+
.execute(conn)?;
389388

390389
Ok(())
391390
}

src/handlers/auth.rs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
use axum::{Extension, Json, extract::State, http::StatusCode};
22
use serde::{Deserialize, Serialize};
33
use uuid::Uuid;
4-
use tracing::{error, info, info_span};
5-
use utoipa::{ToSchema, openapi::info};
4+
use tracing::{error, info};
5+
use utoipa::{ToSchema};
66

77
use crate::{
8-
AppState, auth::service as auth, error::AppError, models::{NewRefreshToken, User}, schema::email_verification_tokens, utils::{
8+
AppState,
9+
auth::service as auth,
10+
error::AppError,
11+
models::{User},
12+
utils::{
913
enums::Role, response::{ApiResponse, EmptyData}, validation::validate_email
1014
}
1115
};
@@ -88,10 +92,6 @@ impl From<User> for UserResponse {
8892
}
8993
}
9094

91-
#[derive(Deserialize, ToSchema)]
92-
pub struct DeleteAccountRequest {
93-
pub token: String,
94-
}
9595

9696
#[derive(Deserialize, ToSchema)]
9797
pub struct RefreshTokenRequest {
@@ -465,8 +465,44 @@ pub async fn delete_account(
465465
) -> Result<ApiResponse<EmptyData>, AppError> {
466466

467467
let mut conn = state.pool.get()?;
468-
info!("Deleting account for user: {}", &user.id);
468+
info!("Deleting account for user: {}", &user.id);
469469
auth::soft_delete_account(&mut conn, &user.id)?;
470+
471+
let mail_service = state.mail_service.clone();
472+
let user_email = user.email.clone();
473+
let user_name = format!("{} {}", user.first_name, user.last_name);
474+
475+
// Send email asynchronously
476+
tokio::spawn(async move {
477+
let subject = "Your HealthBridge account has been deleted";
478+
let html_body = format!(
479+
r#"
480+
<p>Hi {},</p>
481+
<p>Your HealthBridge account has been successfully deleted.</p>
482+
<p>If this action was not initiated by you, please contact our support team immediately.</p>
483+
<p>— HealthBridge Team</p>
484+
"#,
485+
user_name
486+
);
487+
488+
let text_body = format!(
489+
"Hi {},\n\nYour HealthBridge account has been successfully deleted.\nIf this wasn’t you, please contact support.\n\n— HealthBridge Team",
490+
user_name
491+
);
492+
493+
if let Err(e) = mail_service
494+
.send_notification(
495+
&user_email,
496+
subject,
497+
&html_body,
498+
Some(&text_body),
499+
)
500+
.await
501+
{
502+
error!("Failed to send account deletion email: {:?}", e);
503+
}
504+
});
505+
470506
Ok(ApiResponse::message_only(
471507
StatusCode::OK,
472508
"Account deleted successfully",

0 commit comments

Comments
 (0)