headless_lms_server/domain/credit_registration/
mail_status.rs1use headless_lms_models::credit_registrations::CreditRegistrationState;
4use headless_lms_models::email_deliveries::EmailSendStatus;
5use headless_lms_models::library::credit_registration::student_notifications::{
6 CreditRegistrationNotificationKind, RegistrationNotificationEmail,
7};
8use utoipa::ToSchema;
9
10use crate::prelude::*;
11
12#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, ToSchema)]
15pub struct NotificationEmailStatus {
16 pub kind: CreditRegistrationNotificationKind,
17 pub email_send_status: EmailSendStatus,
18 pub sent_at: Option<DateTime<Utc>>,
19}
20
21impl NotificationEmailStatus {
22 pub fn for_state(
26 state: CreditRegistrationState,
27 credit_registration_id: Uuid,
28 mails: &[RegistrationNotificationEmail],
29 ) -> Option<Self> {
30 let wanted = CreditRegistrationNotificationKind::for_state(state)?;
31 let mail = mails.iter().find(|mail| {
32 mail.credit_registration_id == credit_registration_id && mail.kind == wanted
33 })?;
34 Some(Self {
35 kind: mail.kind,
36 email_send_status: mail.send_status.email_send_status,
37 sent_at: mail.send_status.sent_at,
38 })
39 }
40}
41
42pub fn mask_email(email: &str) -> String {
45 match email.split_once('@') {
46 Some((_, domain)) => format!("...@{domain}"),
47 None => "...".to_string(),
48 }
49}