cloudreve_api/api/v4/
share.rs1use crate::api::v4::models::*;
2use crate::api::v4::ApiV4Client;
3use crate::Error;
4use serde_json::Value;
5
6impl 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}