myc_core/domain/dtos/
message.rs1use 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 pub from: FromEmail,
24 pub to: Email,
25 pub cc: Option<Email>,
26
27 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}