1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4pub use super::imap::EmailMessage;
6pub use super::storage::{EmailAccount, SmtpAccountConfig, ImapAccountConfig};
7
8#[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, }
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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
220pub struct RegisterAccountParams {
221 pub name: String,
222 pub smtp: Option<SmtpAccountConfig>,
223 pub imap: Option<ImapAccountConfig>,
224}