use std::collections::HashMap; use serde::{Deserialize, Serialize}; use uuid::Uuid; #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct EmailAddress { pub address: String, pub name: Option, } impl EmailAddress { pub fn new(address: impl Into) -> Self { Self { address: address.into(), name: None, } } pub fn with_name(address: impl Into, name: impl Into) -> Self { Self { address: address.into(), name: Some(name.into()), } } } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct Attachment { pub filename: String, pub content_type: String, pub data_b64: String, pub content_id: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct SendEmailRequest { pub request_id: Uuid, pub to: Vec, pub cc: Vec, pub bcc: Vec, pub subject: String, pub text: Option, pub html: Option, pub reply_to: Option, pub attachments: Vec, pub metadata: HashMap, pub queued_at_ms: i64, pub trace: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct BatchRecipient { pub request_id: Uuid, pub to: EmailAddress, pub subject: String, pub text: Option, pub html: Option, pub metadata: HashMap, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct SendBatchEmailRequest { pub request_id: Uuid, pub default_subject: String, pub default_text: Option, pub default_html: Option, pub recipients: Vec, pub metadata: HashMap, pub queued_at_ms: i64, pub trace: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct RenderAndSendEmailRequest { pub request_id: Uuid, pub template: String, pub vars: serde_json::Value, pub to: Vec, pub cc: Vec, pub bcc: Vec, pub subject: String, pub text: Option, pub locale: Option, pub metadata: HashMap, pub queued_at_ms: i64, pub trace: Option, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct EmailSent { pub request_id: Uuid, pub recipient_count: usize, pub smtp_message_id: String, pub sent_at_ms: i64, pub metadata: HashMap, } #[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)] #[serde(default)] pub struct EmailFailed { pub request_id: Uuid, pub error: String, pub recipient_count: usize, pub failed_at_ms: i64, pub metadata: HashMap, } pub fn now_ms() -> i64 { use std::time::{SystemTime, UNIX_EPOCH}; let dur = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap_or_default(); dur.as_millis() as i64 }