cloudreve_api/api/v4/
share.rs

1use crate::api::v4::models::*;
2use crate::api::v4::ApiV4Client;
3use crate::Error;
4use serde_json::Value;
5
6/// Share management methods
7impl ApiV4Client {
8    pub async fn create_share_link(
9        &self,
10        request: &CreateShareLinkRequest,
11    ) -> Result<ShareLink, Error> {
12        let response: ApiResponse<ShareLink> = self.put("/share", request).await?;
13        Ok(response.data.unwrap())
14    }
15
16    pub async fn list_my_share_links_with_params(
17        &self,
18        page_size: u32,
19        order_by: Option<&str>,
20        order_direction: Option<&str>,
21        next_page_token: Option<&str>,
22    ) -> Result<(Vec<ShareLink>, Option<String>), Error> {
23        let mut query_params = vec![("page_size", page_size.to_string())];
24        if let Some(order_by) = order_by {
25            query_params.push(("order_by", order_by.to_string()));
26        }
27        if let Some(order_direction) = order_direction {
28            query_params.push(("order_direction", order_direction.to_string()));
29        }
30        if let Some(next_page_token) = next_page_token {
31            query_params.push(("next_page_token", next_page_token.to_string()));
32        }
33
34        let query_string = query_params
35            .iter()
36            .map(|(k, v)| format!("{}={}", k, v))
37            .collect::<Vec<_>>()
38            .join("&");
39
40        let endpoint = format!("/share?{}", query_string);
41        let response: ApiResponse<Value> = self.get(&endpoint).await?;
42
43        if let Some(data) = response.data {
44            let shares: Vec<ShareLink> =
45                serde_json::from_value(data.get("shares").unwrap_or(&Value::Array(vec![])).clone())
46                    .unwrap_or_default();
47
48            let next_token = data
49                .get("pagination")
50                .and_then(|p| p.get("next_page_token"))
51                .and_then(|t| t.as_str())
52                .map(|s| s.to_string());
53
54            Ok((shares, next_token))
55        } else {
56            Ok((vec![], None))
57        }
58    }
59
60    pub async fn list_my_share_links(&self) -> Result<Vec<ShareLink>, Error> {
61        let (shares, _) = self
62            .list_my_share_links_with_params(50, None, None, None)
63            .await?;
64        Ok(shares)
65    }
66
67    pub async fn edit_share_link(
68        &self,
69        share_id: &str,
70        request: &EditShareLinkRequest,
71    ) -> Result<ShareLink, Error> {
72        let response: ApiResponse<ShareLink> =
73            self.post(&format!("/share/{}", share_id), request).await?;
74        Ok(response.data.unwrap())
75    }
76
77    pub async fn delete_share_link(&self, share_id: &str) -> Result<(), Error> {
78        let _: ApiResponse<Value> = self.delete(&format!("/share/{}", share_id)).await?;
79        Ok(())
80    }
81
82    pub async fn get_share_link_info(
83        &self,
84        share_id: &str,
85        password: Option<&str>,
86        count_views: Option<bool>,
87        owner_extended: Option<bool>,
88    ) -> Result<ShareLink, Error> {
89        let mut query_params = Vec::new();
90        if let Some(password) = password {
91            query_params.push(format!("password={}", password));
92        }
93        if let Some(count_views) = count_views {
94            query_params.push(format!("count_views={}", count_views));
95        }
96        if let Some(owner_extended) = owner_extended {
97            query_params.push(format!("owner_extended={}", owner_extended));
98        }
99
100        let query_string = if !query_params.is_empty() {
101            format!("?{}", query_params.join("&"))
102        } else {
103            String::new()
104        };
105
106        let endpoint = format!("/share/info/{}{}", share_id, query_string);
107        let response: ApiResponse<Value> = self.get(&endpoint).await?;
108
109        if let Some(data) = response.data {
110            let share: ShareLink = serde_json::from_value(data).unwrap();
111            Ok(share)
112        } else {
113            Err(Error::InvalidResponse("No data in response".to_string()))
114        }
115    }
116
117    pub async fn report_abuse(&self, share_id: &str, reason: &str) -> Result<(), Error> {
118        let request = AbuseReportRequest { reason };
119        let _: ApiResponse<()> = self
120            .post(&format!("/share/{}/report", share_id), &request)
121            .await?;
122        Ok(())
123    }
124}