|
|
@ -721,52 +721,51 @@ pub async fn emergency_request_timeout_job(pool: DbPool) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if let Ok(conn) = pool.get().await { |
|
|
let Ok(conn) = pool.get().await else { |
|
|
let emergency_access_list = EmergencyAccess::find_all_recoveries_initiated(&conn).await; |
|
|
error!("Failed to get DB connection while searching emergency request timed out"); |
|
|
|
|
|
return; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
if emergency_access_list.is_empty() { |
|
|
let emergency_access_list = EmergencyAccess::find_all_recoveries_initiated(&conn).await; |
|
|
debug!("No emergency request timeout to approve"); |
|
|
|
|
|
} |
|
|
if emergency_access_list.is_empty() { |
|
|
|
|
|
debug!("No emergency request timeout to approve"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
let now = Utc::now().naive_utc(); |
|
|
let now = Utc::now().naive_utc(); |
|
|
for mut emer in emergency_access_list { |
|
|
for mut emer in emergency_access_list { |
|
|
// The find_all_recoveries_initiated already checks if the recovery_initiated_at is not null (None)
|
|
|
// The find_all_recoveries_initiated already checks if the recovery_initiated_at is not null (None)
|
|
|
let recovery_allowed_at = |
|
|
let recovery_allowed_at = |
|
|
emer.recovery_initiated_at.unwrap() + TimeDelta::try_days(i64::from(emer.wait_time_days)).unwrap(); |
|
|
emer.recovery_initiated_at.unwrap() + TimeDelta::try_days(i64::from(emer.wait_time_days)).unwrap(); |
|
|
if recovery_allowed_at.le(&now) { |
|
|
if recovery_allowed_at.le(&now) { |
|
|
// Only update the access status
|
|
|
// Only update the access status
|
|
|
// Updating the whole record could cause issues when the emergency_notification_reminder_job is also active
|
|
|
// Updating the whole record could cause issues when the emergency_notification_reminder_job is also active
|
|
|
emer.update_access_status_and_save(EmergencyAccessStatus::RecoveryApproved as i32, &now, &conn) |
|
|
emer.update_access_status_and_save(EmergencyAccessStatus::RecoveryApproved as i32, &now, &conn) |
|
|
|
|
|
.await |
|
|
|
|
|
.expect("Unable to update emergency access status"); |
|
|
|
|
|
|
|
|
|
|
|
if CONFIG.mail_enabled() { |
|
|
|
|
|
// get grantor user to send Accepted email
|
|
|
|
|
|
let grantor_user = User::find_by_uuid(&emer.grantor_uuid, &conn).await.expect("Grantor user not found"); |
|
|
|
|
|
|
|
|
|
|
|
// get grantee user to send Accepted email
|
|
|
|
|
|
let grantee_user = User::find_by_uuid(&emer.grantee_uuid.clone().expect("Grantee user invalid"), &conn) |
|
|
.await |
|
|
.await |
|
|
.expect("Unable to update emergency access status"); |
|
|
.expect("Grantee user not found"); |
|
|
|
|
|
|
|
|
if CONFIG.mail_enabled() { |
|
|
mail::send_emergency_access_recovery_timed_out( |
|
|
// get grantor user to send Accepted email
|
|
|
&grantor_user.email, |
|
|
let grantor_user = |
|
|
&grantee_user.name, |
|
|
User::find_by_uuid(&emer.grantor_uuid, &conn).await.expect("Grantor user not found"); |
|
|
emer.get_type_as_str(), |
|
|
|
|
|
) |
|
|
// get grantee user to send Accepted email
|
|
|
.await |
|
|
let grantee_user = |
|
|
.expect("Error on sending email"); |
|
|
User::find_by_uuid(&emer.grantee_uuid.clone().expect("Grantee user invalid"), &conn) |
|
|
|
|
|
.await |
|
|
mail::send_emergency_access_recovery_approved(&grantee_user.email, &grantor_user.name) |
|
|
.expect("Grantee user not found"); |
|
|
|
|
|
|
|
|
|
|
|
mail::send_emergency_access_recovery_timed_out( |
|
|
|
|
|
&grantor_user.email, |
|
|
|
|
|
&grantee_user.name, |
|
|
|
|
|
emer.get_type_as_str(), |
|
|
|
|
|
) |
|
|
|
|
|
.await |
|
|
.await |
|
|
.expect("Error on sending email"); |
|
|
.expect("Error on sending email"); |
|
|
|
|
|
|
|
|
mail::send_emergency_access_recovery_approved(&grantee_user.email, &grantor_user.name) |
|
|
|
|
|
.await |
|
|
|
|
|
.expect("Error on sending email"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} else { |
|
|
|
|
|
error!("Failed to get DB connection while searching emergency request timed out") |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -776,55 +775,54 @@ pub async fn emergency_notification_reminder_job(pool: DbPool) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if let Ok(conn) = pool.get().await { |
|
|
let Ok(conn) = pool.get().await else { |
|
|
let emergency_access_list = EmergencyAccess::find_all_recoveries_initiated(&conn).await; |
|
|
error!("Failed to get DB connection while searching emergency request timed out"); |
|
|
|
|
|
return; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
if emergency_access_list.is_empty() { |
|
|
let emergency_access_list = EmergencyAccess::find_all_recoveries_initiated(&conn).await; |
|
|
debug!("No emergency request reminder notification to send"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let now = Utc::now().naive_utc(); |
|
|
if emergency_access_list.is_empty() { |
|
|
for mut emer in emergency_access_list { |
|
|
debug!("No emergency request reminder notification to send"); |
|
|
// The find_all_recoveries_initiated already checks if the recovery_initiated_at is not null (None)
|
|
|
} |
|
|
// Calculate the day before the recovery will become active
|
|
|
|
|
|
let final_recovery_reminder_at = |
|
|
let now = Utc::now().naive_utc(); |
|
|
emer.recovery_initiated_at.unwrap() + TimeDelta::try_days(i64::from(emer.wait_time_days - 1)).unwrap(); |
|
|
for mut emer in emergency_access_list { |
|
|
// Calculate if a day has passed since the previous notification, else no notification has been sent before
|
|
|
// The find_all_recoveries_initiated already checks if the recovery_initiated_at is not null (None)
|
|
|
let next_recovery_reminder_at = if let Some(last_notification_at) = emer.last_notification_at { |
|
|
// Calculate the day before the recovery will become active
|
|
|
last_notification_at + TimeDelta::try_days(1).unwrap() |
|
|
let final_recovery_reminder_at = |
|
|
} else { |
|
|
emer.recovery_initiated_at.unwrap() + TimeDelta::try_days(i64::from(emer.wait_time_days - 1)).unwrap(); |
|
|
now |
|
|
// Calculate if a day has passed since the previous notification, else no notification has been sent before
|
|
|
}; |
|
|
let next_recovery_reminder_at = if let Some(last_notification_at) = emer.last_notification_at { |
|
|
if final_recovery_reminder_at.le(&now) && next_recovery_reminder_at.le(&now) { |
|
|
last_notification_at + TimeDelta::try_days(1).unwrap() |
|
|
// Only update the last notification date
|
|
|
} else { |
|
|
// Updating the whole record could cause issues when the emergency_request_timeout_job is also active
|
|
|
now |
|
|
emer.update_last_notification_date_and_save(&now, &conn) |
|
|
}; |
|
|
.await |
|
|
if final_recovery_reminder_at.le(&now) && next_recovery_reminder_at.le(&now) { |
|
|
.expect("Unable to update emergency access notification date"); |
|
|
// Only update the last notification date
|
|
|
|
|
|
// Updating the whole record could cause issues when the emergency_request_timeout_job is also active
|
|
|
if CONFIG.mail_enabled() { |
|
|
emer.update_last_notification_date_and_save(&now, &conn) |
|
|
// get grantor user to send Accepted email
|
|
|
.await |
|
|
let grantor_user = |
|
|
.expect("Unable to update emergency access notification date"); |
|
|
User::find_by_uuid(&emer.grantor_uuid, &conn).await.expect("Grantor user not found"); |
|
|
|
|
|
|
|
|
if CONFIG.mail_enabled() { |
|
|
// get grantee user to send Accepted email
|
|
|
// get grantor user to send Accepted email
|
|
|
let grantee_user = |
|
|
let grantor_user = User::find_by_uuid(&emer.grantor_uuid, &conn).await.expect("Grantor user not found"); |
|
|
User::find_by_uuid(&emer.grantee_uuid.clone().expect("Grantee user invalid"), &conn) |
|
|
|
|
|
.await |
|
|
// get grantee user to send Accepted email
|
|
|
.expect("Grantee user not found"); |
|
|
let grantee_user = User::find_by_uuid(&emer.grantee_uuid.clone().expect("Grantee user invalid"), &conn) |
|
|
|
|
|
|
|
|
mail::send_emergency_access_recovery_reminder( |
|
|
|
|
|
&grantor_user.email, |
|
|
|
|
|
&grantee_user.name, |
|
|
|
|
|
emer.get_type_as_str(), |
|
|
|
|
|
"1", // This notification is only triggered one day before the activation
|
|
|
|
|
|
) |
|
|
|
|
|
.await |
|
|
.await |
|
|
.expect("Error on sending email"); |
|
|
.expect("Grantee user not found"); |
|
|
} |
|
|
|
|
|
|
|
|
mail::send_emergency_access_recovery_reminder( |
|
|
|
|
|
&grantor_user.email, |
|
|
|
|
|
&grantee_user.name, |
|
|
|
|
|
emer.get_type_as_str(), |
|
|
|
|
|
"1", // This notification is only triggered one day before the activation
|
|
|
|
|
|
) |
|
|
|
|
|
.await |
|
|
|
|
|
.expect("Error on sending email"); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} else { |
|
|
|
|
|
error!("Failed to get DB connection while searching emergency notification reminder") |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|