files_sdk/messages/
notifications.rs1use crate::{FilesClient, PaginationInfo, Result};
7use serde::{Deserialize, Serialize};
8use serde_json::json;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12#[serde(rename_all = "snake_case")]
13pub enum SendInterval {
14 FiveMinutes,
16 FifteenMinutes,
18 Hourly,
20 Daily,
22}
23
24#[derive(Debug, Clone, Serialize, Deserialize)]
26#[serde(rename_all = "snake_case")]
27pub enum UnsubscribedReason {
28 None,
30 UnsubscribeLinkClicked,
32 MailBounced,
34 MailMarkedAsSpam,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct NotificationEntity {
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub id: Option<i64>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub path: Option<String>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 pub group_id: Option<i64>,
52
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub group_name: Option<String>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub triggering_group_ids: Option<Vec<i64>>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub triggering_user_ids: Option<Vec<i64>>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub trigger_by_share_recipients: Option<bool>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub notify_user_actions: Option<bool>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub notify_on_copy: Option<bool>,
76
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub notify_on_delete: Option<bool>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub notify_on_download: Option<bool>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub notify_on_move: Option<bool>,
88
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub notify_on_upload: Option<bool>,
92
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub recursive: Option<bool>,
96
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub send_interval: Option<String>,
100
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub message: Option<String>,
104
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub triggering_filenames: Option<Vec<String>>,
108
109 #[serde(skip_serializing_if = "Option::is_none")]
111 pub unsubscribed: Option<bool>,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub unsubscribed_reason: Option<String>,
116
117 #[serde(skip_serializing_if = "Option::is_none")]
119 pub user_id: Option<i64>,
120
121 #[serde(skip_serializing_if = "Option::is_none")]
123 pub username: Option<String>,
124
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub suppressed_email: Option<bool>,
128}
129
130pub struct NotificationHandler {
132 client: FilesClient,
133}
134
135impl NotificationHandler {
136 pub fn new(client: FilesClient) -> Self {
138 Self { client }
139 }
140
141 pub async fn list(
164 &self,
165 cursor: Option<&str>,
166 per_page: Option<i64>,
167 path: Option<&str>,
168 group_id: Option<i64>,
169 ) -> Result<(Vec<NotificationEntity>, PaginationInfo)> {
170 let mut params = vec![];
171 if let Some(c) = cursor {
172 params.push(("cursor", c.to_string()));
173 }
174 if let Some(pp) = per_page {
175 params.push(("per_page", pp.to_string()));
176 }
177 if let Some(p) = path {
178 params.push(("path", p.to_string()));
179 }
180 if let Some(gid) = group_id {
181 params.push(("group_id", gid.to_string()));
182 }
183
184 let query = if params.is_empty() {
185 String::new()
186 } else {
187 format!(
188 "?{}",
189 params
190 .iter()
191 .map(|(k, v)| format!("{}={}", k, v))
192 .collect::<Vec<_>>()
193 .join("&")
194 )
195 };
196
197 let response = self
198 .client
199 .get_raw(&format!("/notifications{}", query))
200 .await?;
201 let notifications: Vec<NotificationEntity> = serde_json::from_value(response)?;
202
203 let pagination = PaginationInfo {
204 cursor_next: None,
205 cursor_prev: None,
206 };
207
208 Ok((notifications, pagination))
209 }
210
211 pub async fn get(&self, id: i64) -> Result<NotificationEntity> {
219 let response = self
220 .client
221 .get_raw(&format!("/notifications/{}", id))
222 .await?;
223 Ok(serde_json::from_value(response)?)
224 }
225
226 #[allow(clippy::too_many_arguments)]
240 pub async fn create(
241 &self,
242 path: Option<&str>,
243 group_id: Option<i64>,
244 notify_on_upload: Option<bool>,
245 notify_on_download: Option<bool>,
246 notify_on_delete: Option<bool>,
247 send_interval: Option<&str>,
248 recursive: Option<bool>,
249 message: Option<&str>,
250 ) -> Result<NotificationEntity> {
251 let mut body = json!({});
252
253 if let Some(p) = path {
254 body["path"] = json!(p);
255 }
256 if let Some(gid) = group_id {
257 body["group_id"] = json!(gid);
258 }
259 if let Some(u) = notify_on_upload {
260 body["notify_on_upload"] = json!(u);
261 }
262 if let Some(d) = notify_on_download {
263 body["notify_on_download"] = json!(d);
264 }
265 if let Some(del) = notify_on_delete {
266 body["notify_on_delete"] = json!(del);
267 }
268 if let Some(si) = send_interval {
269 body["send_interval"] = json!(si);
270 }
271 if let Some(r) = recursive {
272 body["recursive"] = json!(r);
273 }
274 if let Some(m) = message {
275 body["message"] = json!(m);
276 }
277
278 let response = self.client.post_raw("/notifications", body).await?;
279 Ok(serde_json::from_value(response)?)
280 }
281
282 pub async fn update(
294 &self,
295 id: i64,
296 notify_on_upload: Option<bool>,
297 notify_on_download: Option<bool>,
298 notify_on_delete: Option<bool>,
299 send_interval: Option<&str>,
300 ) -> Result<NotificationEntity> {
301 let mut body = json!({});
302
303 if let Some(u) = notify_on_upload {
304 body["notify_on_upload"] = json!(u);
305 }
306 if let Some(d) = notify_on_download {
307 body["notify_on_download"] = json!(d);
308 }
309 if let Some(del) = notify_on_delete {
310 body["notify_on_delete"] = json!(del);
311 }
312 if let Some(si) = send_interval {
313 body["send_interval"] = json!(si);
314 }
315
316 let response = self
317 .client
318 .patch_raw(&format!("/notifications/{}", id), body)
319 .await?;
320 Ok(serde_json::from_value(response)?)
321 }
322
323 pub async fn delete(&self, id: i64) -> Result<()> {
328 self.client
329 .delete_raw(&format!("/notifications/{}", id))
330 .await?;
331 Ok(())
332 }
333}
334
335#[cfg(test)]
336mod tests {
337 use super::*;
338
339 #[test]
340 fn test_handler_creation() {
341 let client = FilesClient::builder().api_key("test-key").build().unwrap();
342 let _handler = NotificationHandler::new(client);
343 }
344}