1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 core::{
6 api_req::ApiRequest,
7 api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8 config::Config,
9 constants::AccessTokenType,
10 http::Transport,
11 req_option::RequestOption,
12 SDKResult,
13 },
14 impl_executable_builder_owned,
15};
16
17pub struct FolderService {
19 config: Config,
20}
21
22impl FolderService {
23 pub fn new(config: Config) -> Self {
24 Self { config }
25 }
26
27 pub async fn get_root_folder_meta(
33 &self,
34 option: Option<RequestOption>,
35 ) -> SDKResult<BaseResponse<GetRootFolderMetaRespData>> {
36 let api_req = ApiRequest {
37 http_method: Method::GET,
38 api_path: "/open-apis/drive/v1/folders/root_folder_meta".to_string(),
39 supported_access_token_types: vec![AccessTokenType::User],
40 ..Default::default()
41 };
42
43 let api_resp = Transport::request(api_req, &self.config, option).await?;
44 Ok(api_resp)
45 }
46
47 pub async fn list_files(
53 &self,
54 request: ListFilesRequest,
55 option: Option<RequestOption>,
56 ) -> SDKResult<BaseResponse<ListFilesRespData>> {
57 let mut api_req = ApiRequest {
58 http_method: Method::GET,
59 api_path: format!(
60 "/open-apis/drive/v1/folders/{}/children",
61 request.folder_token
62 ),
63 ..Default::default()
64 };
65 api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
66
67 if let Some(page_token) = request.page_token {
69 api_req
70 .query_params
71 .insert("page_token".to_string(), page_token);
72 }
73 if let Some(page_size) = request.page_size {
74 api_req
75 .query_params
76 .insert("page_size".to_string(), page_size.to_string());
77 }
78 if let Some(order_by) = request.order_by {
79 api_req
80 .query_params
81 .insert("order_by".to_string(), order_by);
82 }
83 if let Some(direction) = request.direction {
84 api_req
85 .query_params
86 .insert("direction".to_string(), direction);
87 }
88
89 let api_resp = Transport::request(api_req, &self.config, option).await?;
90 Ok(api_resp)
91 }
92
93 pub async fn get_folder_meta(
99 &self,
100 request: GetFolderMetaRequest,
101 option: Option<RequestOption>,
102 ) -> SDKResult<BaseResponse<GetFolderMetaRespData>> {
103 let api_req = ApiRequest {
104 http_method: Method::GET,
105 api_path: format!("/open-apis/drive/v1/folders/{}", request.folder_token),
106 supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
107 ..Default::default()
108 };
109
110 let api_resp = Transport::request(api_req, &self.config, option).await?;
111 Ok(api_resp)
112 }
113
114 pub async fn create_folder(
120 &self,
121 request: CreateFolderRequest,
122 option: Option<RequestOption>,
123 ) -> SDKResult<BaseResponse<CreateFolderRespData>> {
124 let api_req = ApiRequest {
125 http_method: Method::POST,
126 api_path: "/open-apis/drive/v1/folders".to_string(),
127 supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
128 body: serde_json::to_vec(&request)?,
129 ..Default::default()
130 };
131
132 let api_resp = Transport::request(api_req, &self.config, option).await?;
133 Ok(api_resp)
134 }
135
136 pub async fn move_or_delete_folder(
142 &self,
143 request: MoveOrDeleteFolderRequest,
144 option: Option<RequestOption>,
145 ) -> SDKResult<BaseResponse<MoveOrDeleteFolderRespData>> {
146 let mut api_req = ApiRequest {
147 http_method: Method::POST,
148 api_path: format!("/open-apis/drive/v1/folders/{}/move", request.folder_token),
149 supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
150 ..Default::default()
151 };
152
153 let body = serde_json::json!({
155 "type": request.operation_type,
156 "parent_token": request.parent_token
157 });
158 api_req.body = serde_json::to_vec(&body)?;
159
160 let api_resp = Transport::request(api_req, &self.config, option).await?;
161 Ok(api_resp)
162 }
163
164 pub async fn check_async_task(
170 &self,
171 request: CheckAsyncTaskRequest,
172 option: Option<RequestOption>,
173 ) -> SDKResult<BaseResponse<CheckAsyncTaskRespData>> {
174 let api_req = ApiRequest {
175 http_method: Method::GET,
176 api_path: format!("/open-apis/drive/v1/tasks/{}", request.task_id),
177 supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
178 ..Default::default()
179 };
180
181 let api_resp = Transport::request(api_req, &self.config, option).await?;
182 Ok(api_resp)
183 }
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct GetRootFolderMetaRespData {
189 pub token: String,
191 pub user_id: String,
193}
194
195impl ApiResponseTrait for GetRootFolderMetaRespData {
196 fn data_format() -> ResponseFormat {
197 ResponseFormat::Data
198 }
199}
200
201#[derive(Debug, Clone, Default, Serialize, Deserialize)]
203pub struct ListFilesRequest {
204 pub folder_token: String,
206 pub page_token: Option<String>,
208 pub page_size: Option<i32>,
210 pub order_by: Option<String>,
212 pub direction: Option<String>,
214}
215
216impl ListFilesRequest {
217 pub fn new(folder_token: impl Into<String>) -> Self {
218 Self {
219 folder_token: folder_token.into(),
220 ..Default::default()
221 }
222 }
223
224 pub fn builder() -> ListFilesRequestBuilder {
225 ListFilesRequestBuilder::default()
226 }
227}
228
229#[derive(Debug, Clone, Default)]
231pub struct ListFilesRequestBuilder {
232 request: ListFilesRequest,
233}
234
235impl ListFilesRequestBuilder {
236 pub fn folder_token(mut self, folder_token: impl Into<String>) -> Self {
237 self.request.folder_token = folder_token.into();
238 self
239 }
240
241 pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
242 self.request.page_token = Some(page_token.into());
243 self
244 }
245
246 pub fn page_size(mut self, page_size: i32) -> Self {
247 self.request.page_size = Some(page_size);
248 self
249 }
250
251 pub fn order_by(mut self, order_by: impl Into<String>) -> Self {
252 self.request.order_by = Some(order_by.into());
253 self
254 }
255
256 pub fn direction(mut self, direction: impl Into<String>) -> Self {
257 self.request.direction = Some(direction.into());
258 self
259 }
260
261 pub fn build(self) -> ListFilesRequest {
262 self.request
263 }
264}
265
266#[derive(Debug, Clone, Serialize, Deserialize)]
268pub struct ListFilesRespData {
269 pub has_more: bool,
271 pub page_token: Option<String>,
273 pub files: Vec<DriveFile>,
275}
276
277impl ApiResponseTrait for ListFilesRespData {
278 fn data_format() -> ResponseFormat {
279 ResponseFormat::Data
280 }
281}
282
283#[derive(Debug, Clone, Serialize, Deserialize)]
285pub struct DriveFile {
286 pub token: String,
288 pub name: String,
290 #[serde(rename = "type")]
292 pub file_type: String,
293 pub parent_token: Option<String>,
295 pub url: Option<String>,
297 pub short_url: Option<String>,
299 pub size: Option<i64>,
301 pub mime_type: Option<String>,
303 pub created_time: Option<String>,
305 pub modified_time: Option<String>,
307 pub owner_id: Option<String>,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
313pub struct GetFolderMetaRequest {
314 pub folder_token: String,
316}
317
318impl GetFolderMetaRequest {
319 pub fn new(folder_token: impl Into<String>) -> Self {
320 Self {
321 folder_token: folder_token.into(),
322 }
323 }
324}
325
326#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct GetFolderMetaRespData {
329 pub token: String,
331 pub id: String,
333 pub name: String,
335 pub parent_token: Option<String>,
337 pub owner_id: String,
339 pub creator_id: Option<String>,
341 pub create_time: String,
343 pub edit_time: String,
345 pub description: Option<String>,
347 pub url: String,
349}
350
351impl ApiResponseTrait for GetFolderMetaRespData {
352 fn data_format() -> ResponseFormat {
353 ResponseFormat::Data
354 }
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize)]
359pub struct CreateFolderRequest {
360 pub name: String,
362 pub parent_token: String,
364}
365
366impl CreateFolderRequest {
367 pub fn new(name: impl Into<String>, parent_token: impl Into<String>) -> Self {
368 Self {
369 name: name.into(),
370 parent_token: parent_token.into(),
371 }
372 }
373}
374
375#[derive(Debug, Clone, Serialize, Deserialize)]
377pub struct CreateFolderRespData {
378 pub token: String,
380 pub url: String,
382}
383
384impl ApiResponseTrait for CreateFolderRespData {
385 fn data_format() -> ResponseFormat {
386 ResponseFormat::Data
387 }
388}
389
390#[derive(Debug, Clone, Serialize, Deserialize)]
392pub struct MoveOrDeleteFolderRequest {
393 pub folder_token: String,
395 #[serde(rename = "type")]
397 pub operation_type: String,
398 pub parent_token: Option<String>,
400}
401
402impl MoveOrDeleteFolderRequest {
403 pub fn move_folder(folder_token: impl Into<String>, parent_token: impl Into<String>) -> Self {
405 Self {
406 folder_token: folder_token.into(),
407 operation_type: "move".to_string(),
408 parent_token: Some(parent_token.into()),
409 }
410 }
411
412 pub fn delete_folder(folder_token: impl Into<String>) -> Self {
414 Self {
415 folder_token: folder_token.into(),
416 operation_type: "delete".to_string(),
417 parent_token: None,
418 }
419 }
420}
421
422#[derive(Debug, Clone, Serialize, Deserialize)]
424pub struct MoveOrDeleteFolderRespData {
425 pub task_id: Option<String>,
427}
428
429impl ApiResponseTrait for MoveOrDeleteFolderRespData {
430 fn data_format() -> ResponseFormat {
431 ResponseFormat::Data
432 }
433}
434
435#[derive(Debug, Clone, Serialize, Deserialize)]
437pub struct CheckAsyncTaskRequest {
438 pub task_id: String,
440}
441
442impl CheckAsyncTaskRequest {
443 pub fn new(task_id: impl Into<String>) -> Self {
444 Self {
445 task_id: task_id.into(),
446 }
447 }
448}
449
450#[derive(Debug, Clone, Serialize, Deserialize)]
452pub struct CheckAsyncTaskRespData {
453 pub status: String,
455 pub error_msg: Option<String>,
457}
458
459impl ApiResponseTrait for CheckAsyncTaskRespData {
460 fn data_format() -> ResponseFormat {
461 ResponseFormat::Data
462 }
463}
464
465impl_executable_builder_owned!(
468 ListFilesRequestBuilder,
469 FolderService,
470 ListFilesRequest,
471 BaseResponse<ListFilesRespData>,
472 list_files
473);