open_lark/service/cloud_docs/wiki/v2/space_node/
copy.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::*, EndpointBuilder},
11        http::Transport,
12        req_option::RequestOption,
13        SDKResult,
14    },
15    impl_executable_builder_owned,
16};
17
18/// 复制知识空间节点请求
19#[derive(Debug, Serialize, Default)]
20pub struct CopySpaceNodeRequest {
21    #[serde(skip)]
22    api_request: ApiRequest,
23    /// 知识空间id
24    #[serde(skip)]
25    space_id: String,
26    /// 节点token
27    #[serde(skip)]
28    node_token: String,
29    /// 目标父节点token,复制到根目录时可以为空
30    #[serde(skip_serializing_if = "Option::is_none")]
31    target_parent_token: Option<String>,
32    /// 目标知识空间id,不填时复制到当前知识空间
33    #[serde(skip_serializing_if = "Option::is_none")]
34    target_space_id: Option<String>,
35    /// 复制后的标题,不填时使用原标题
36    #[serde(skip_serializing_if = "Option::is_none")]
37    title: Option<String>,
38}
39
40impl CopySpaceNodeRequest {
41    pub fn builder() -> CopySpaceNodeRequestBuilder {
42        CopySpaceNodeRequestBuilder::default()
43    }
44
45    pub fn new(space_id: impl ToString, node_token: impl ToString) -> Self {
46        Self {
47            space_id: space_id.to_string(),
48            node_token: node_token.to_string(),
49            ..Default::default()
50        }
51    }
52}
53
54#[derive(Default)]
55pub struct CopySpaceNodeRequestBuilder {
56    request: CopySpaceNodeRequest,
57}
58
59impl CopySpaceNodeRequestBuilder {
60    /// 知识空间id
61    pub fn space_id(mut self, space_id: impl ToString) -> Self {
62        self.request.space_id = space_id.to_string();
63        self
64    }
65
66    /// 要复制的节点token
67    pub fn node_token(mut self, node_token: impl ToString) -> Self {
68        self.request.node_token = node_token.to_string();
69        self
70    }
71
72    /// 目标父节点token
73    pub fn target_parent_token(mut self, target_parent_token: impl ToString) -> Self {
74        self.request.target_parent_token = Some(target_parent_token.to_string());
75        self
76    }
77
78    /// 复制到根目录
79    pub fn move_to_root(mut self) -> Self {
80        self.request.target_parent_token = None;
81        self
82    }
83
84    /// 目标知识空间id
85    pub fn target_space_id(mut self, target_space_id: impl ToString) -> Self {
86        self.request.target_space_id = Some(target_space_id.to_string());
87        self
88    }
89
90    /// 复制到当前空间
91    pub fn move_to_current_space(mut self) -> Self {
92        self.request.target_space_id = None;
93        self
94    }
95
96    /// 复制后的标题
97    pub fn title(mut self, title: impl ToString) -> Self {
98        self.request.title = Some(title.to_string());
99        self
100    }
101
102    /// 使用原标题
103    pub fn keep_original_title(mut self) -> Self {
104        self.request.title = None;
105        self
106    }
107
108    pub fn build(mut self) -> CopySpaceNodeRequest {
109        self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
110        self.request
111    }
112}
113
114impl_executable_builder_owned!(
115    CopySpaceNodeRequestBuilder,
116    crate::service::cloud_docs::wiki::v2::space_node::SpaceNodeService,
117    CopySpaceNodeRequest,
118    CopySpaceNodeResponse,
119    copy
120);
121
122/// 复制后的节点信息
123#[derive(Debug, Deserialize)]
124pub struct CopiedNode {
125    /// 知识空间id
126    pub space_id: String,
127    /// 节点token
128    pub node_token: String,
129    /// 文档类型
130    pub obj_type: String,
131    /// 父节点token
132    pub parent_node_token: Option<String>,
133    /// 节点类型
134    pub node_type: Option<String>,
135    /// 原始文档token
136    pub obj_token: Option<String>,
137    /// 文档标题
138    pub title: Option<String>,
139}
140
141/// 复制知识空间节点响应
142#[derive(Debug, Deserialize)]
143pub struct CopySpaceNodeResponse {
144    /// 复制后的节点信息
145    pub node: CopiedNode,
146}
147
148impl ApiResponseTrait for CopySpaceNodeResponse {
149    fn data_format() -> ResponseFormat {
150        ResponseFormat::Data
151    }
152}
153
154/// 复制知识空间节点
155pub async fn copy_space_node(
156    request: CopySpaceNodeRequest,
157    config: &Config,
158    option: Option<RequestOption>,
159) -> SDKResult<BaseResponse<CopySpaceNodeResponse>> {
160    let mut api_req = request.api_request;
161    api_req.http_method = Method::POST;
162    api_req.api_path = {
163        let mut path =
164            EndpointBuilder::replace_param(WIKI_V2_SPACE_NODE_COPY, "space_id", &request.space_id);
165        path = EndpointBuilder::replace_param(&path, "node_token", &request.node_token);
166        path
167    };
168    api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
169
170    let api_resp = Transport::request(api_req, config, option).await?;
171    Ok(api_resp)
172}
173
174#[cfg(test)]
175#[allow(unused_variables, unused_unsafe)]
176mod tests {
177    use super::*;
178
179    #[test]
180    fn test_copy_space_node_request_builder() {
181        let request = CopySpaceNodeRequest::builder()
182            .space_id("spcxxxxxx")
183            .node_token("wikcnxxxxxx")
184            .target_parent_token("wikcnyyyyyyy")
185            .target_space_id("spcyyyyyy")
186            .title("复制的文档")
187            .build();
188
189        assert_eq!(request.space_id, "spcxxxxxx");
190        assert_eq!(request.node_token, "wikcnxxxxxx");
191        assert_eq!(
192            request.target_parent_token,
193            Some("wikcnyyyyyyy".to_string())
194        );
195        assert_eq!(request.target_space_id, Some("spcyyyyyy".to_string()));
196        assert_eq!(request.title, Some("复制的文档".to_string()));
197    }
198
199    #[test]
200    fn test_copy_to_root_current_space() {
201        let request = CopySpaceNodeRequest::builder()
202            .space_id("spcxxxxxx")
203            .node_token("wikcnxxxxxx")
204            .move_to_root()
205            .move_to_current_space()
206            .keep_original_title()
207            .build();
208
209        assert_eq!(request.space_id, "spcxxxxxx");
210        assert_eq!(request.node_token, "wikcnxxxxxx");
211        assert_eq!(request.target_parent_token, None);
212        assert_eq!(request.target_space_id, None);
213        assert_eq!(request.title, None);
214    }
215}