Skip to main content

plexus_comms/activations/email/
types.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4// Re-export from submodules
5pub use super::imap::EmailMessage;
6pub use super::storage::{EmailAccount, SmtpAccountConfig, ImapAccountConfig};
7
8// Request types
9#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
10pub struct SendEmailParams {
11    pub to: Vec<String>,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub cc: Option<Vec<String>>,
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub bcc: Option<Vec<String>>,
16    pub subject: String,
17    pub body: EmailBody,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub attachments: Option<Vec<Attachment>>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub reply_to: Option<String>,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
25#[serde(tag = "type", rename_all = "snake_case")]
26pub enum EmailBody {
27    Text { content: String },
28    Html { content: String },
29    Both { text: String, html: String },
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
33pub struct Attachment {
34    pub filename: String,
35    pub content_type: String,
36    pub data: String, // Base64-encoded
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
40pub struct SendBatchParams {
41    pub emails: Vec<SendEmailParams>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
45pub struct ValidateAddressParams {
46    pub email: String,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
50pub struct GetTemplateParams {
51    pub template_id: String,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
55pub struct RenderTemplateParams {
56    pub template_id: String,
57    pub variables: serde_json::Value,
58}
59
60// Response/Event types
61#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
62#[serde(tag = "type", rename_all = "snake_case")]
63pub enum SendEmailEvent {
64    Queued {
65        message_id: String,
66    },
67    Sent {
68        message_id: String,
69        timestamp: i64,
70    },
71    Error {
72        message: String,
73        code: Option<String>,
74    },
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
78#[serde(tag = "type", rename_all = "snake_case")]
79pub enum BatchSendEvent {
80    Progress {
81        sent: usize,
82        total: usize,
83        percentage: f32,
84    },
85    EmailSent {
86        index: usize,
87        message_id: String,
88    },
89    EmailFailed {
90        index: usize,
91        error: String,
92    },
93    Complete {
94        total_sent: usize,
95        total_failed: usize,
96    },
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
100#[serde(tag = "type", rename_all = "snake_case")]
101pub enum ValidateAddressEvent {
102    Valid { email: String },
103    Invalid { email: String, reason: String },
104    Error { message: String },
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
108#[serde(tag = "type", rename_all = "snake_case")]
109pub enum TemplateEvent {
110    Template { template: EmailTemplate },
111    Error { message: String },
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
115pub struct EmailTemplate {
116    pub id: String,
117    pub name: String,
118    pub subject: String,
119    pub body: String,
120    pub variables: Vec<String>,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
124#[serde(tag = "type", rename_all = "snake_case")]
125pub enum RenderTemplateEvent {
126    Rendered {
127        subject: String,
128        body: String,
129    },
130    Error {
131        message: String,
132    },
133}
134
135// Account management events
136#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
137#[serde(tag = "type", rename_all = "snake_case")]
138pub enum RegisterAccountEvent {
139    Registered {
140        account_name: String,
141        has_smtp: bool,
142        has_imap: bool,
143    },
144    Error {
145        message: String,
146    },
147}
148
149#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
150#[serde(tag = "type", rename_all = "snake_case")]
151pub enum ListAccountsEvent {
152    Account {
153        name: String,
154        has_smtp: bool,
155        has_imap: bool,
156        created_at: i64,
157    },
158    Complete {
159        total: usize,
160    },
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
164#[serde(tag = "type", rename_all = "snake_case")]
165pub enum RemoveAccountEvent {
166    Removed {
167        account_name: String,
168    },
169    NotFound {
170        account_name: String,
171    },
172    Error {
173        message: String,
174    },
175}
176
177// IMAP reading events
178#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
179#[serde(tag = "type", rename_all = "snake_case")]
180pub enum ReadInboxEvent {
181    Message {
182        message: EmailMessage,
183    },
184    Complete {
185        total: usize,
186    },
187    Error {
188        message: String,
189    },
190}
191
192#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
193#[serde(tag = "type", rename_all = "snake_case")]
194pub enum SearchMessagesEvent {
195    Message {
196        message: EmailMessage,
197    },
198    Complete {
199        total: usize,
200    },
201    Error {
202        message: String,
203    },
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
207#[serde(tag = "type", rename_all = "snake_case")]
208pub enum MarkMessageEvent {
209    Marked {
210        uid: u32,
211        status: String,
212    },
213    Error {
214        message: String,
215    },
216}
217
218// Parameters for account registration
219#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
220pub struct RegisterAccountParams {
221    pub name: String,
222    pub smtp: Option<SmtpAccountConfig>,
223    pub imap: Option<ImapAccountConfig>,
224}