meegle/file/
api.rs

1use super::types::*;
2use crate::client::{AuthType, Client};
3use crate::error::ApiResult;
4
5pub trait FileApi {
6    /// 添加附件
7    /// 该接口用于在指定工作项的一个"附件类型"字段中添加附件,对应的插件应用效果可参考上传附件。
8    fn upload_work_item_file(
9        &self,
10        request: UploadWorkItemFileRequest,
11        auth: AuthType,
12    ) -> impl std::future::Future<Output = ApiResult<UploadWorkItemFileResponse>> + Send;
13
14    /// 上传文件或富文本图片
15    /// 该接口为通用的文件上传接口,会返回上传后的资源路径,主要用于富文本中上传图片。
16    fn upload_file(
17        &self,
18        request: UploadFileRequest,
19        auth: AuthType,
20    ) -> impl std::future::Future<Output = ApiResult<UploadFileResponse>> + Send;
21
22    /// 下载附件
23    /// 该接口用于下载一个工作项下的指定附件。
24    fn download_work_item_file(
25        &self,
26        request: DownloadWorkItemFileRequest,
27        auth: AuthType,
28    ) -> impl std::future::Future<Output = ApiResult<DownloadWorkItemFileResponse>> + Send;
29
30    /// 删除附件
31    /// 该接口用于在指定工作项的一个"附件类型"字段中删除附件。
32    fn delete_file(
33        &self,
34        request: DeleteFileRequest,
35        auth: AuthType,
36    ) -> impl std::future::Future<Output = ApiResult<DeleteFileResponse>> + Send;
37}
38
39impl FileApi for Client {
40    async fn upload_work_item_file(
41        &self,
42        request: UploadWorkItemFileRequest,
43        auth: AuthType,
44    ) -> ApiResult<UploadWorkItemFileResponse> {
45        let url = format!(
46            "{}/work_item/{}/{}/file/upload",
47            request.project_key, request.work_item_type_key, request.work_item_id
48        );
49        
50        Ok(self.post_multipart(&url, request, auth).await?)
51    }
52
53    async fn upload_file(
54        &self,
55        request: UploadFileRequest,
56        auth: AuthType,
57    ) -> ApiResult<UploadFileResponse> {
58        let url = format!("{}/file/upload", request.project_key);
59        
60        Ok(self.post_multipart(&url, request, auth).await?)
61    }
62
63    async fn download_work_item_file(
64        &self,
65        request: DownloadWorkItemFileRequest,
66        auth: AuthType,
67    ) -> ApiResult<DownloadWorkItemFileResponse> {
68        let url = format!(
69            "{}/work_item/{}/{}/file/download",
70            request.project_key, request.work_item_type_key, request.work_item_id
71        );
72
73        Ok(self.post_binary(&url, request, auth).await?)
74    }
75
76    async fn delete_file(
77        &self,
78        request: DeleteFileRequest,
79        auth: AuthType,
80    ) -> ApiResult<DeleteFileResponse> {
81        Ok(self.post("/file/delete", request, auth).await?)
82    }
83}