myc_core/domain/dtos/
message.rs

1use super::email::Email;
2
3use chrono::{DateTime, Local};
4use serde::{Deserialize, Serialize};
5use std::{
6    fmt::{self, Display},
7    str::FromStr,
8};
9use utoipa::ToSchema;
10use uuid::Uuid;
11
12#[derive(Clone, Debug, Deserialize, Serialize, ToSchema)]
13#[serde(rename_all = "camelCase")]
14pub enum FromEmail {
15    Email(Email),
16    NamedEmail(String),
17}
18
19#[derive(Clone, Debug, Deserialize, Serialize, ToSchema)]
20#[serde(rename_all = "camelCase")]
21pub struct Message {
22    // Addresses
23    pub from: FromEmail,
24    pub to: Email,
25    pub cc: Option<Email>,
26
27    // Message
28    pub subject: String,
29    pub body: String,
30}
31
32#[derive(Clone, Debug, Deserialize, Serialize, ToSchema)]
33#[serde(rename_all = "camelCase")]
34pub enum MessageStatus {
35    Queued,
36    Sent,
37    Failed,
38}
39
40impl Display for MessageStatus {
41    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42        write!(f, "{:?}", self)
43    }
44}
45
46impl FromStr for MessageStatus {
47    type Err = String;
48
49    fn from_str(s: &str) -> Result<Self, Self::Err> {
50        match s {
51            "queued" => Ok(MessageStatus::Queued),
52            "sent" => Ok(MessageStatus::Sent),
53            "failed" => Ok(MessageStatus::Failed),
54            _ => Err(format!("Invalid message status: {}", s)),
55        }
56    }
57}
58
59impl Default for MessageStatus {
60    fn default() -> Self {
61        MessageStatus::Queued
62    }
63}
64
65#[derive(Clone, Debug, Deserialize, Serialize, ToSchema)]
66#[serde(rename_all = "camelCase")]
67pub struct MessageSendingEvent {
68    pub id: Uuid,
69    pub message: Message,
70    pub created: DateTime<Local>,
71    pub attempted: Option<DateTime<Local>>,
72    pub status: MessageStatus,
73    pub attempts: i32,
74    pub error: Option<String>,
75}
76
77impl MessageSendingEvent {
78    pub fn new(message: Message) -> Self {
79        Self {
80            id: Uuid::new_v4(),
81            message,
82            created: Local::now(),
83            attempted: None,
84            status: MessageStatus::Queued,
85            attempts: 0,
86            error: None,
87        }
88    }
89}