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

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        endpoints::cloud_docs::*,
11        http::Transport,
12        req_option::RequestOption,
13        SDKResult,
14    },
15    impl_executable_builder_owned,
16};
17
18/// 文档版本服务
19pub struct FileVersionService {
20    config: Config,
21}
22
23impl FileVersionService {
24    pub fn new(config: Config) -> Self {
25        Self { config }
26    }
27
28    /// 创建文档版本
29    ///
30    /// 该接口用于创建文档版本。
31    ///
32    /// <https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-version/create>
33    pub async fn create_version(
34        &self,
35        request: CreateVersionRequest,
36        option: Option<RequestOption>,
37    ) -> SDKResult<BaseResponse<CreateVersionRespData>> {
38        let mut api_req = ApiRequest {
39            http_method: Method::POST,
40            api_path: DRIVE_V1_FILE_VERSIONS.replace("{}", &request.file_token),
41            supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
42            ..Default::default()
43        };
44
45        let body = serde_json::json!({
46            "name": request.name,
47            "obj_type": request.obj_type
48        });
49        api_req.body = serde_json::to_vec(&body)?;
50
51        let api_resp = Transport::request(api_req, &self.config, option).await?;
52        Ok(api_resp)
53    }
54
55    /// 删除文档版本
56    ///
57    /// 该接口用于删除文档版本。
58    ///
59    /// <https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-version/delete>
60    pub async fn delete_version(
61        &self,
62        request: DeleteVersionRequest,
63        option: Option<RequestOption>,
64    ) -> SDKResult<BaseResponse<DeleteVersionRespData>> {
65        let mut api_req = ApiRequest {
66            http_method: Method::DELETE,
67            api_path: DRIVE_V1_FILE_VERSION_GET
68                .replace("{}", &request.file_token)
69                .replace("{}", &request.version_id),
70            ..Default::default()
71        };
72        api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
73
74        let api_resp = Transport::request(api_req, &self.config, option).await?;
75        Ok(api_resp)
76    }
77
78    /// 获取文档版本
79    ///
80    /// 该接口用于获取文档版本信息。
81    ///
82    /// <https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-version/get>
83    pub async fn get_version(
84        &self,
85        request: GetVersionRequest,
86        option: Option<RequestOption>,
87    ) -> SDKResult<BaseResponse<GetVersionRespData>> {
88        let mut api_req = ApiRequest {
89            http_method: Method::GET,
90            api_path: DRIVE_V1_FILE_VERSION_GET
91                .replace("{}", &request.file_token)
92                .replace("{}", &request.version_id),
93            ..Default::default()
94        };
95        api_req.supported_access_token_types = vec![AccessTokenType::User, AccessTokenType::Tenant];
96
97        let api_resp = Transport::request(api_req, &self.config, option).await?;
98        Ok(api_resp)
99    }
100
101    /// 获取文档版本列表
102    ///
103    /// 该接口用于获取文档的版本列表。
104    ///
105    /// <https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-version/list>
106    pub async fn list_versions(
107        &self,
108        request: ListVersionsRequest,
109        option: Option<RequestOption>,
110    ) -> SDKResult<BaseResponse<ListVersionsRespData>> {
111        let mut api_req = ApiRequest {
112            http_method: Method::GET,
113            api_path: DRIVE_V1_FILE_VERSIONS.replace("{}", &request.file_token),
114            supported_access_token_types: vec![AccessTokenType::User, AccessTokenType::Tenant],
115            ..Default::default()
116        };
117
118        // 添加查询参数
119        if let Some(page_token) = request.page_token {
120            api_req.query_params.insert("page_token", page_token);
121        }
122        if let Some(page_size) = request.page_size {
123            api_req
124                .query_params
125                .insert("page_size", page_size.to_string());
126        }
127
128        let api_resp = Transport::request(api_req, &self.config, option).await?;
129        Ok(api_resp)
130    }
131}
132
133// === 数据结构定义 ===
134
135/// 创建文档版本请求参数
136#[derive(Debug, Clone, Serialize, Deserialize, Default)]
137pub struct CreateVersionRequest {
138    /// 文档token
139    pub file_token: String,
140    /// 版本名称
141    pub name: String,
142    /// 文档类型
143    pub obj_type: String,
144}
145
146impl CreateVersionRequest {
147    pub fn builder() -> CreateVersionRequestBuilder {
148        CreateVersionRequestBuilder::default()
149    }
150
151    pub fn new(
152        file_token: impl Into<String>,
153        name: impl Into<String>,
154        obj_type: impl Into<String>,
155    ) -> Self {
156        Self {
157            file_token: file_token.into(),
158            name: name.into(),
159            obj_type: obj_type.into(),
160        }
161    }
162}
163
164/// 创建文档版本请求构建器
165#[derive(Default)]
166pub struct CreateVersionRequestBuilder {
167    request: CreateVersionRequest,
168}
169
170impl CreateVersionRequestBuilder {
171    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
172        self.request.file_token = file_token.into();
173        self
174    }
175
176    pub fn name(mut self, name: impl Into<String>) -> Self {
177        self.request.name = name.into();
178        self
179    }
180
181    pub fn obj_type(mut self, obj_type: impl Into<String>) -> Self {
182        self.request.obj_type = obj_type.into();
183        self
184    }
185
186    pub fn build(self) -> CreateVersionRequest {
187        self.request
188    }
189}
190
191impl_executable_builder_owned!(
192    CreateVersionRequestBuilder,
193    FileVersionService,
194    CreateVersionRequest,
195    BaseResponse<CreateVersionRespData>,
196    create_version
197);
198
199/// 创建文档版本响应数据
200#[derive(Debug, Clone, Serialize, Deserialize)]
201pub struct CreateVersionRespData {
202    /// 版本ID
203    pub version_id: String,
204    /// 版本名称
205    pub name: String,
206    /// 版本创建时间
207    pub create_time: String,
208    /// 创建者ID
209    pub creator_id: String,
210}
211
212impl ApiResponseTrait for CreateVersionRespData {
213    fn data_format() -> ResponseFormat {
214        ResponseFormat::Data
215    }
216}
217
218/// 删除文档版本请求参数
219#[derive(Debug, Clone, Serialize, Deserialize, Default)]
220pub struct DeleteVersionRequest {
221    /// 文档token
222    pub file_token: String,
223    /// 版本ID
224    pub version_id: String,
225}
226
227impl DeleteVersionRequest {
228    pub fn builder() -> DeleteVersionRequestBuilder {
229        DeleteVersionRequestBuilder::default()
230    }
231
232    pub fn new(file_token: impl Into<String>, version_id: impl Into<String>) -> Self {
233        Self {
234            file_token: file_token.into(),
235            version_id: version_id.into(),
236        }
237    }
238}
239
240/// 删除文档版本请求构建器
241#[derive(Default)]
242pub struct DeleteVersionRequestBuilder {
243    request: DeleteVersionRequest,
244}
245
246impl DeleteVersionRequestBuilder {
247    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
248        self.request.file_token = file_token.into();
249        self
250    }
251
252    pub fn version_id(mut self, version_id: impl Into<String>) -> Self {
253        self.request.version_id = version_id.into();
254        self
255    }
256
257    pub fn build(self) -> DeleteVersionRequest {
258        self.request
259    }
260}
261
262impl_executable_builder_owned!(
263    DeleteVersionRequestBuilder,
264    FileVersionService,
265    DeleteVersionRequest,
266    BaseResponse<DeleteVersionRespData>,
267    delete_version
268);
269
270/// 删除文档版本响应数据
271#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct DeleteVersionRespData {
273    /// 删除结果
274    pub success: bool,
275}
276
277impl ApiResponseTrait for DeleteVersionRespData {
278    fn data_format() -> ResponseFormat {
279        ResponseFormat::Data
280    }
281}
282
283/// 获取文档版本请求参数
284#[derive(Debug, Clone, Serialize, Deserialize, Default)]
285pub struct GetVersionRequest {
286    /// 文档token
287    pub file_token: String,
288    /// 版本ID
289    pub version_id: String,
290}
291
292impl GetVersionRequest {
293    pub fn builder() -> GetVersionRequestBuilder {
294        GetVersionRequestBuilder::default()
295    }
296
297    pub fn new(file_token: impl Into<String>, version_id: impl Into<String>) -> Self {
298        Self {
299            file_token: file_token.into(),
300            version_id: version_id.into(),
301        }
302    }
303}
304
305/// 获取文档版本请求构建器
306#[derive(Default)]
307pub struct GetVersionRequestBuilder {
308    request: GetVersionRequest,
309}
310
311impl GetVersionRequestBuilder {
312    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
313        self.request.file_token = file_token.into();
314        self
315    }
316
317    pub fn version_id(mut self, version_id: impl Into<String>) -> Self {
318        self.request.version_id = version_id.into();
319        self
320    }
321
322    pub fn build(self) -> GetVersionRequest {
323        self.request
324    }
325}
326
327impl_executable_builder_owned!(
328    GetVersionRequestBuilder,
329    FileVersionService,
330    GetVersionRequest,
331    BaseResponse<GetVersionRespData>,
332    get_version
333);
334
335/// 获取文档版本响应数据
336#[derive(Debug, Clone, Serialize, Deserialize)]
337pub struct GetVersionRespData {
338    /// 版本信息
339    pub version: FileVersion,
340}
341
342/// 获取文档版本列表请求参数
343#[derive(Debug, Clone, Serialize, Deserialize, Default)]
344pub struct ListVersionsRequest {
345    /// 文档token
346    pub file_token: String,
347    /// 分页token
348    pub page_token: Option<String>,
349    /// 分页大小
350    pub page_size: Option<i32>,
351}
352
353impl ListVersionsRequest {
354    pub fn builder() -> ListVersionsRequestBuilder {
355        ListVersionsRequestBuilder::default()
356    }
357
358    pub fn new(file_token: impl Into<String>) -> Self {
359        Self {
360            file_token: file_token.into(),
361            page_token: None,
362            page_size: None,
363        }
364    }
365
366    pub fn with_page_token(mut self, page_token: impl Into<String>) -> Self {
367        self.page_token = Some(page_token.into());
368        self
369    }
370
371    pub fn with_page_size(mut self, page_size: i32) -> Self {
372        self.page_size = Some(page_size);
373        self
374    }
375}
376
377/// 获取文档版本列表请求构建器
378#[derive(Default)]
379pub struct ListVersionsRequestBuilder {
380    request: ListVersionsRequest,
381}
382
383impl ListVersionsRequestBuilder {
384    pub fn file_token(mut self, file_token: impl Into<String>) -> Self {
385        self.request.file_token = file_token.into();
386        self
387    }
388
389    pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
390        self.request.page_token = Some(page_token.into());
391        self
392    }
393
394    pub fn page_size(mut self, page_size: i32) -> Self {
395        self.request.page_size = Some(page_size);
396        self
397    }
398
399    pub fn build(self) -> ListVersionsRequest {
400        self.request
401    }
402}
403
404impl_executable_builder_owned!(
405    ListVersionsRequestBuilder,
406    FileVersionService,
407    ListVersionsRequest,
408    BaseResponse<ListVersionsRespData>,
409    list_versions
410);
411
412/// 获取文档版本列表响应数据
413#[derive(Debug, Clone, Serialize, Deserialize)]
414pub struct ListVersionsRespData {
415    /// 是否还有更多数据
416    pub has_more: bool,
417    /// 下一页token
418    pub page_token: Option<String>,
419    /// 版本列表
420    pub items: Vec<FileVersion>,
421}
422
423impl ApiResponseTrait for ListVersionsRespData {
424    fn data_format() -> ResponseFormat {
425        ResponseFormat::Data
426    }
427}
428
429impl ApiResponseTrait for GetVersionRespData {
430    fn data_format() -> ResponseFormat {
431        ResponseFormat::Data
432    }
433}
434
435/// 文档版本信息
436#[derive(Debug, Clone, Serialize, Deserialize)]
437pub struct FileVersion {
438    /// 版本ID
439    pub version_id: String,
440    /// 版本名称
441    pub name: String,
442    /// 文档token
443    pub obj_token: String,
444    /// 文档类型
445    pub obj_type: String,
446    /// 创建者ID
447    pub creator_id: String,
448    /// 创建时间
449    pub create_time: String,
450    /// 版本状态
451    pub status: String,
452    /// 版本父ID
453    pub parent_version_id: Option<String>,
454}