use crate::{FilesClient, PaginationInfo, Result};
use serde::{Deserialize, Serialize};
use serde_json::json;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SendInterval {
FiveMinutes,
FifteenMinutes,
Hourly,
Daily,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UnsubscribedReason {
None,
UnsubscribeLinkClicked,
MailBounced,
MailMarkedAsSpam,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationEntity {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub group_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub group_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub triggering_group_ids: Option<Vec<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub triggering_user_ids: Option<Vec<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trigger_by_share_recipients: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_user_actions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_on_copy: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_on_delete: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_on_download: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_on_move: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_on_upload: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub recursive: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub send_interval: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub triggering_filenames: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unsubscribed: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unsubscribed_reason: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suppressed_email: Option<bool>,
}
pub struct NotificationHandler {
client: FilesClient,
}
impl NotificationHandler {
pub fn new(client: FilesClient) -> Self {
Self { client }
}
pub async fn list(
&self,
cursor: Option<&str>,
per_page: Option<i64>,
path: Option<&str>,
group_id: Option<i64>,
) -> Result<(Vec<NotificationEntity>, PaginationInfo)> {
let mut params = vec![];
if let Some(c) = cursor {
params.push(("cursor", c.to_string()));
}
if let Some(pp) = per_page {
params.push(("per_page", pp.to_string()));
}
if let Some(p) = path {
params.push(("path", p.to_string()));
}
if let Some(gid) = group_id {
params.push(("group_id", gid.to_string()));
}
let query = if params.is_empty() {
String::new()
} else {
format!(
"?{}",
params
.iter()
.map(|(k, v)| format!("{}={}", k, v))
.collect::<Vec<_>>()
.join("&")
)
};
let response = self
.client
.get_raw(&format!("/notifications{}", query))
.await?;
let notifications: Vec<NotificationEntity> = serde_json::from_value(response)?;
let pagination = PaginationInfo {
cursor_next: None,
cursor_prev: None,
};
Ok((notifications, pagination))
}
pub async fn get(&self, id: i64) -> Result<NotificationEntity> {
let response = self
.client
.get_raw(&format!("/notifications/{}", id))
.await?;
Ok(serde_json::from_value(response)?)
}
#[allow(clippy::too_many_arguments)]
pub async fn create(
&self,
path: Option<&str>,
group_id: Option<i64>,
notify_on_upload: Option<bool>,
notify_on_download: Option<bool>,
notify_on_delete: Option<bool>,
send_interval: Option<&str>,
recursive: Option<bool>,
message: Option<&str>,
) -> Result<NotificationEntity> {
let mut body = json!({});
if let Some(p) = path {
body["path"] = json!(p);
}
if let Some(gid) = group_id {
body["group_id"] = json!(gid);
}
if let Some(u) = notify_on_upload {
body["notify_on_upload"] = json!(u);
}
if let Some(d) = notify_on_download {
body["notify_on_download"] = json!(d);
}
if let Some(del) = notify_on_delete {
body["notify_on_delete"] = json!(del);
}
if let Some(si) = send_interval {
body["send_interval"] = json!(si);
}
if let Some(r) = recursive {
body["recursive"] = json!(r);
}
if let Some(m) = message {
body["message"] = json!(m);
}
let response = self.client.post_raw("/notifications", body).await?;
Ok(serde_json::from_value(response)?)
}
pub async fn update(
&self,
id: i64,
notify_on_upload: Option<bool>,
notify_on_download: Option<bool>,
notify_on_delete: Option<bool>,
send_interval: Option<&str>,
) -> Result<NotificationEntity> {
let mut body = json!({});
if let Some(u) = notify_on_upload {
body["notify_on_upload"] = json!(u);
}
if let Some(d) = notify_on_download {
body["notify_on_download"] = json!(d);
}
if let Some(del) = notify_on_delete {
body["notify_on_delete"] = json!(del);
}
if let Some(si) = send_interval {
body["send_interval"] = json!(si);
}
let response = self
.client
.patch_raw(&format!("/notifications/{}", id), body)
.await?;
Ok(serde_json::from_value(response)?)
}
pub async fn delete(&self, id: i64) -> Result<()> {
self.client
.delete_raw(&format!("/notifications/{}", id))
.await?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_handler_creation() {
let client = FilesClient::builder().api_key("test-key").build().unwrap();
let _handler = NotificationHandler::new(client);
}
}