open_lark/service/cloud_docs/drive/v1/
files.rs

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    core::{
6        api_req::ApiRequest,
7        api_resp::{ApiResponseTrait, BaseResponse, BinaryResponse, ResponseFormat},
8        config::Config,
9        constants::AccessTokenType,
10        http::Transport,
11        req_option::RequestOption,
12        standard_response::StandardResponse,
13        SDKResult,
14    },
15    impl_executable_builder_owned,
16};
17
18pub struct FilesService {
19    config: Config,
20}
21
22/// 上传文件 请求体
23#[derive(Debug, Clone, Default, Serialize, Deserialize)]
24pub struct UploadAllRequest {
25    /// 请求体
26    #[serde(skip)]
27    api_req: ApiRequest,
28    /// 文件名。
29    ///
30    /// 示例值:"demo.pdf"
31    file_name: String,
32    /// 上传点类型。
33    ///
34    /// 示例值:"explorer"
35    parent_type: String,
36    /// 文件夹token,获取方式见 概述
37    ///
38    /// 示例值:"fldbcO1UuPz8VwnpPx5a92abcef"
39    parent_node: String,
40    /// 文件大小(以字节为单位)。
41    ///
42    /// 示例值:1024
43    size: i32,
44    /// 文件adler32校验和(可选)。
45    checksum: Option<String>,
46}
47
48impl UploadAllRequest {
49    pub fn builder() -> UploadAllRequestBuilder {
50        UploadAllRequestBuilder::default()
51    }
52}
53
54/// 上传文件 请求体构建器
55#[derive(Default)]
56pub struct UploadAllRequestBuilder {
57    request: UploadAllRequest,
58}
59
60impl UploadAllRequestBuilder {
61    /// 文件名
62    pub fn file_name(mut self, file_name: impl ToString) -> Self {
63        self.request.file_name = file_name.to_string();
64        self
65    }
66
67    /// 上传点类型。
68    pub fn parent_type(mut self, parent_type: impl ToString) -> Self {
69        self.request.parent_type = parent_type.to_string();
70        self
71    }
72
73    /// 文件夹token
74    pub fn parent_node(mut self, parent_node: impl ToString) -> Self {
75        self.request.parent_node = parent_node.to_string();
76        self
77    }
78
79    /// 文件大小(以字节为单位)
80    pub fn size(mut self, size: i32) -> Self {
81        self.request.size = size;
82        self
83    }
84
85    /// 文件adler32校验和(可选)
86    pub fn checksum(mut self, checksum: impl ToString) -> Self {
87        self.request.checksum = Some(checksum.to_string());
88        self
89    }
90
91    /// 文件二进制内容。
92    pub fn file(mut self, file: Vec<u8>) -> Self {
93        self.request.api_req.file = file;
94        self
95    }
96
97    pub fn build(mut self) -> UploadAllRequest {
98        self.request.api_req.body = serde_json::to_vec(&self.request).unwrap();
99        self.request
100    }
101}
102
103impl FilesService {
104    pub fn new(config: Config) -> Self {
105        Self { config }
106    }
107
108    /// 创建上传文件Builder
109    pub fn upload_all_builder(&self) -> UploadAllRequestBuilder {
110        UploadAllRequestBuilder::default()
111    }
112
113    /// 创建下载文件Builder  
114    pub fn download_builder(&self) -> DownloadRequestBuilder {
115        DownloadRequestBuilder::default()
116    }
117
118    /// 上传文件
119    pub async fn upload_all(
120        &self,
121        upload_all_request: UploadAllRequest,
122        option: Option<RequestOption>,
123    ) -> SDKResult<UploadAllResponse> {
124        let mut api_req = upload_all_request.api_req;
125        api_req.http_method = Method::POST;
126        api_req.api_path = "/open-apis/drive/v1/files/upload_all".to_string();
127        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
128
129        let api_resp: BaseResponse<UploadAllResponse> =
130            Transport::request(api_req, &self.config, option).await?;
131
132        api_resp.into_result()
133    }
134
135    /// 下载文件
136    pub async fn download(
137        &self,
138        request: DownloadRequest,
139        option: Option<RequestOption>,
140    ) -> SDKResult<BinaryResponse> {
141        let mut api_req = request.api_req;
142        api_req.http_method = Method::GET;
143        api_req.api_path = format!("/open-apis/drive/v1/files/{}/download", request.file_token);
144        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
145
146        let api_resp: BaseResponse<BinaryResponse> =
147            Transport::request(api_req, &self.config, option).await?;
148
149        api_resp.into_result()
150    }
151}
152
153/// 上传文件响应体
154#[derive(Debug, Serialize, Deserialize)]
155pub struct UploadAllResponse {
156    /// 新创建文件的 token
157    pub file_token: String,
158}
159
160impl ApiResponseTrait for UploadAllResponse {
161    fn data_format() -> ResponseFormat {
162        ResponseFormat::Data
163    }
164}
165
166/// 下载文件 请求体
167#[derive(Default, Serialize, Deserialize)]
168pub struct DownloadRequest {
169    /// 请求体
170    #[serde(skip)]
171    api_req: ApiRequest,
172    /// 文件的 token
173    file_token: String,
174}
175
176/// 下载文件 请求体构建器
177#[derive(Default)]
178pub struct DownloadRequestBuilder {
179    req: DownloadRequest,
180}
181
182impl DownloadRequestBuilder {
183    pub fn file_token(mut self, file_token: impl ToString) -> Self {
184        self.req.file_token = file_token.to_string();
185        self
186    }
187
188    pub fn build(self) -> DownloadRequest {
189        self.req
190    }
191}
192
193impl DownloadRequest {
194    pub fn builder() -> DownloadRequestBuilder {
195        DownloadRequestBuilder::default()
196    }
197}
198
199// === 宏实现 ===
200
201impl_executable_builder_owned!(
202    UploadAllRequestBuilder,
203    FilesService,
204    UploadAllRequest,
205    UploadAllResponse,
206    upload_all
207);
208
209impl_executable_builder_owned!(
210    DownloadRequestBuilder,
211    FilesService,
212    DownloadRequest,
213    BinaryResponse,
214    download
215);