cloudreve_api/api/v4/
workflow.rs

1//! Workflow-related API endpoints for Cloudreve v4 API
2
3use crate::Error;
4use crate::api::v4::ApiV4Client;
5use crate::api::v4::models::*;
6
7impl ApiV4Client {
8    pub async fn create_download(
9        &self,
10        request: &CreateDownloadRequest<'_>,
11    ) -> Result<Vec<Task>, Error> {
12        let response: ApiResponse<Vec<Task>> = self.post("/workflow/download", request).await?;
13        if response.code != 0 {
14            return Err(Error::Api {
15                code: response.code,
16                message: response.msg,
17            });
18        }
19        response
20            .data
21            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
22    }
23
24    pub async fn select_download_files(
25        &self,
26        task_id: &str,
27        request: &SelectDownloadFilesRequest<'_>,
28    ) -> Result<Vec<Task>, Error> {
29        let response: ApiResponse<Vec<Task>> = self
30            .patch(&format!("/workflow/download/{}", task_id), request)
31            .await?;
32        if response.code != 0 {
33            return Err(Error::Api {
34                code: response.code,
35                message: response.msg,
36            });
37        }
38        response
39            .data
40            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
41    }
42
43    pub async fn cancel_download_task(&self, task_id: &str) -> Result<(), Error> {
44        // API returns only code and msg, no data field
45        #[derive(Debug, serde::Deserialize)]
46        struct EmptyResponse;
47        let response: ApiResponse<EmptyResponse> = self
48            .delete(&format!("/workflow/download/{}", task_id))
49            .await?;
50        if response.code != 0 {
51            return Err(Error::Api {
52                code: response.code,
53                message: response.msg,
54            });
55        }
56        Ok(())
57    }
58
59    pub async fn list_workflow_tasks(
60        &self,
61        page_size: i32,
62        category: &str,
63    ) -> Result<TaskListResponse, Error> {
64        let url = format!("/workflow?page_size={}&category={}", page_size, category);
65        let response: ApiResponse<TaskListResponse> = self.get(&url).await?;
66        if response.code != 0 {
67            return Err(Error::Api {
68                code: response.code,
69                message: response.msg,
70            });
71        }
72        response
73            .data
74            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
75    }
76
77    pub async fn get_task_progress(&self, task_id: &str) -> Result<Progress, Error> {
78        let response: ApiResponse<Progress> =
79            self.get(&format!("/workflow/progress/{}", task_id)).await?;
80        if response.code != 0 {
81            return Err(Error::Api {
82                code: response.code,
83                message: response.msg,
84            });
85        }
86        response
87            .data
88            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
89    }
90
91    pub async fn create_archive(
92        &self,
93        request: &CreateArchiveRequest<'_>,
94    ) -> Result<TaskResponse, Error> {
95        let response: ApiResponse<TaskResponse> = self.post("/workflow/archive", request).await?;
96        if response.code != 0 {
97            return Err(Error::Api {
98                code: response.code,
99                message: response.msg,
100            });
101        }
102        response
103            .data
104            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
105    }
106
107    pub async fn extract_archive(
108        &self,
109        request: &ExtractArchiveRequest<'_>,
110    ) -> Result<TaskResponse, Error> {
111        let response: ApiResponse<TaskResponse> = self.post("/workflow/extract", request).await?;
112        if response.code != 0 {
113            return Err(Error::Api {
114                code: response.code,
115                message: response.msg,
116            });
117        }
118        response
119            .data
120            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
121    }
122
123    pub async fn relocate(&self, request: &RelocateRequest<'_>) -> Result<TaskResponse, Error> {
124        let response: ApiResponse<TaskResponse> = self.post("/workflow/relocate", request).await?;
125        if response.code != 0 {
126            return Err(Error::Api {
127                code: response.code,
128                message: response.msg,
129            });
130        }
131        response
132            .data
133            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
134    }
135
136    pub async fn import(&self, request: &ImportRequest<'_>) -> Result<TaskResponse, Error> {
137        let response: ApiResponse<TaskResponse> = self.post("/workflow/import", request).await?;
138        if response.code != 0 {
139            return Err(Error::Api {
140                code: response.code,
141                message: response.msg,
142            });
143        }
144        response
145            .data
146            .ok_or_else(|| Error::InvalidResponse("Missing data in API response".to_string()))
147    }
148}