open_lark/service/cloud_docs/wiki/v2/space_node/
copy.rs1use 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#[derive(Debug, Serialize, Default)]
20pub struct CopySpaceNodeRequest {
21 #[serde(skip)]
22 api_request: ApiRequest,
23 #[serde(skip)]
25 space_id: String,
26 #[serde(skip)]
28 node_token: String,
29 #[serde(skip_serializing_if = "Option::is_none")]
31 target_parent_token: Option<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
34 target_space_id: Option<String>,
35 #[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 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 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 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 pub fn move_to_root(mut self) -> Self {
80 self.request.target_parent_token = None;
81 self
82 }
83
84 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 pub fn move_to_current_space(mut self) -> Self {
92 self.request.target_space_id = None;
93 self
94 }
95
96 pub fn title(mut self, title: impl ToString) -> Self {
98 self.request.title = Some(title.to_string());
99 self
100 }
101
102 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#[derive(Debug, Deserialize)]
124pub struct CopiedNode {
125 pub space_id: String,
127 pub node_token: String,
129 pub obj_type: String,
131 pub parent_node_token: Option<String>,
133 pub node_type: Option<String>,
135 pub obj_token: Option<String>,
137 pub title: Option<String>,
139}
140
141#[derive(Debug, Deserialize)]
143pub struct CopySpaceNodeResponse {
144 pub node: CopiedNode,
146}
147
148impl ApiResponseTrait for CopySpaceNodeResponse {
149 fn data_format() -> ResponseFormat {
150 ResponseFormat::Data
151 }
152}
153
154pub 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}