open_lark/service/cloud_docs/permission/member/
update.rs1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::core::{
5 api_req::ApiRequest,
6 api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
7 config::Config,
8 constants::AccessTokenType,
9 endpoints::{cloud_docs::*, EndpointBuilder},
10 http::Transport,
11 req_option::RequestOption,
12 SDKResult,
13};
14
15use super::batch_create::Permission;
16
17#[derive(Debug, Serialize, Default, Clone)]
19pub struct UpdatePermissionMemberRequest {
20 #[serde(skip)]
21 api_request: ApiRequest,
22 #[serde(skip)]
24 token: String,
25 #[serde(skip)]
27 obj_type: String,
28 #[serde(skip)]
30 member_type: String,
31 #[serde(skip)]
33 member_id: String,
34 perm: Permission,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 need_notification: Option<bool>,
39}
40
41impl UpdatePermissionMemberRequest {
42 pub fn builder() -> UpdatePermissionMemberRequestBuilder {
43 UpdatePermissionMemberRequestBuilder::default()
44 }
45
46 pub fn new(
47 token: impl ToString,
48 obj_type: impl ToString,
49 member_type: impl ToString,
50 member_id: impl ToString,
51 permission: Permission,
52 ) -> Self {
53 Self {
54 token: token.to_string(),
55 obj_type: obj_type.to_string(),
56 member_type: member_type.to_string(),
57 member_id: member_id.to_string(),
58 perm: permission,
59 ..Default::default()
60 }
61 }
62
63 pub fn for_user(
65 token: impl ToString,
66 obj_type: impl ToString,
67 user_id: impl ToString,
68 permission: Permission,
69 ) -> Self {
70 Self::new(token, obj_type, "user", user_id, permission)
71 }
72
73 pub fn for_chat(
75 token: impl ToString,
76 obj_type: impl ToString,
77 chat_id: impl ToString,
78 permission: Permission,
79 ) -> Self {
80 Self::new(token, obj_type, "chat", chat_id, permission)
81 }
82
83 pub fn for_department(
85 token: impl ToString,
86 obj_type: impl ToString,
87 department_id: impl ToString,
88 permission: Permission,
89 ) -> Self {
90 Self::new(token, obj_type, "department", department_id, permission)
91 }
92}
93
94#[derive(Default)]
95pub struct UpdatePermissionMemberRequestBuilder {
96 request: UpdatePermissionMemberRequest,
97}
98
99impl UpdatePermissionMemberRequestBuilder {
100 pub fn token(mut self, token: impl ToString) -> Self {
102 self.request.token = token.to_string();
103 self
104 }
105
106 pub fn obj_type(mut self, obj_type: impl ToString) -> Self {
108 self.request.obj_type = obj_type.to_string();
109 self
110 }
111
112 pub fn as_doc(mut self) -> Self {
114 self.request.obj_type = "doc".to_string();
115 self
116 }
117
118 pub fn as_sheet(mut self) -> Self {
120 self.request.obj_type = "sheet".to_string();
121 self
122 }
123
124 pub fn as_bitable(mut self) -> Self {
126 self.request.obj_type = "bitable".to_string();
127 self
128 }
129
130 pub fn as_wiki(mut self) -> Self {
132 self.request.obj_type = "wiki".to_string();
133 self
134 }
135
136 pub fn member(mut self, member_type: impl ToString, member_id: impl ToString) -> Self {
138 self.request.member_type = member_type.to_string();
139 self.request.member_id = member_id.to_string();
140 self
141 }
142
143 pub fn user(mut self, user_id: impl ToString) -> Self {
145 self.request.member_type = "user".to_string();
146 self.request.member_id = user_id.to_string();
147 self
148 }
149
150 pub fn chat(mut self, chat_id: impl ToString) -> Self {
152 self.request.member_type = "chat".to_string();
153 self.request.member_id = chat_id.to_string();
154 self
155 }
156
157 pub fn department(mut self, department_id: impl ToString) -> Self {
159 self.request.member_type = "department".to_string();
160 self.request.member_id = department_id.to_string();
161 self
162 }
163
164 pub fn permission(mut self, permission: Permission) -> Self {
166 self.request.perm = permission;
167 self
168 }
169
170 pub fn to_owner(mut self) -> Self {
172 self.request.perm = Permission::FullAccess;
173 self
174 }
175
176 pub fn to_editor(mut self) -> Self {
178 self.request.perm = Permission::Edit;
179 self
180 }
181
182 pub fn to_commenter(mut self) -> Self {
184 self.request.perm = Permission::Comment;
185 self
186 }
187
188 pub fn to_viewer(mut self) -> Self {
190 self.request.perm = Permission::View;
191 self
192 }
193
194 pub fn need_notification(mut self, need: bool) -> Self {
196 self.request.need_notification = Some(need);
197 self
198 }
199
200 pub fn with_notification(mut self) -> Self {
202 self.request.need_notification = Some(true);
203 self
204 }
205
206 pub fn without_notification(mut self) -> Self {
208 self.request.need_notification = Some(false);
209 self
210 }
211
212 pub fn build(mut self) -> UpdatePermissionMemberRequest {
213 self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
214 self.request
215 }
216}
217
218#[derive(Debug, Deserialize)]
220pub struct PermissionMemberUpdated {
221 pub member_type: String,
223 pub member_id: String,
225 pub perm: Permission,
227 pub update_time: Option<i64>,
229 pub old_perm: Option<Permission>,
231 pub notified: Option<bool>,
233}
234
235#[derive(Debug, Deserialize)]
237pub struct UpdatePermissionMemberResponse {
238 pub member: PermissionMemberUpdated,
240}
241
242impl ApiResponseTrait for UpdatePermissionMemberResponse {
243 fn data_format() -> ResponseFormat {
244 ResponseFormat::Data
245 }
246}
247
248pub async fn update_permission_member(
250 request: UpdatePermissionMemberRequest,
251 config: &Config,
252 option: Option<RequestOption>,
253) -> SDKResult<BaseResponse<UpdatePermissionMemberResponse>> {
254 let mut api_req = request.api_request;
255 api_req.http_method = Method::PUT;
256 api_req.api_path = format!(
257 "{}?type={}&member_type={}",
258 EndpointBuilder::replace_params_from_array(
259 DRIVE_V1_PERMISSIONS_MEMBER_GET,
260 &[("token", &request.token), ("member_id", &request.member_id)]
261 ),
262 request.obj_type,
263 request.member_type
264 );
265
266 if let Some(need_notification) = request.need_notification {
268 api_req.api_path = format!(
269 "{}&need_notification={}",
270 api_req.api_path, need_notification
271 );
272 }
273
274 api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
275
276 let api_resp = Transport::request(api_req, config, option).await?;
277 Ok(api_resp)
278}
279
280impl PermissionMemberUpdated {
281 pub fn member_id(&self) -> &str {
283 &self.member_id
284 }
285
286 pub fn member_type(&self) -> &str {
288 &self.member_type
289 }
290
291 pub fn new_permission(&self) -> &Permission {
293 &self.perm
294 }
295
296 pub fn old_permission(&self) -> Option<&Permission> {
298 self.old_perm.as_ref()
299 }
300
301 pub fn is_user(&self) -> bool {
303 self.member_type == "user"
304 }
305
306 pub fn is_chat(&self) -> bool {
308 self.member_type == "chat"
309 }
310
311 pub fn is_department(&self) -> bool {
313 self.member_type == "department"
314 }
315
316 pub fn can_edit(&self) -> bool {
318 self.perm.can_edit()
319 }
320
321 pub fn is_owner(&self) -> bool {
323 self.perm.is_owner()
324 }
325
326 pub fn was_notified(&self) -> bool {
328 self.notified.unwrap_or(false)
329 }
330
331 pub fn has_update_time(&self) -> bool {
333 self.update_time.is_some()
334 }
335
336 pub fn has_old_permission(&self) -> bool {
338 self.old_perm.is_some()
339 }
340
341 pub fn permission_changed(&self) -> bool {
343 if let Some(old_perm) = &self.old_perm {
344 old_perm != &self.perm
345 } else {
346 true }
348 }
349
350 pub fn permission_upgraded(&self) -> bool {
352 if let Some(old_perm) = &self.old_perm {
353 self.perm.level() > old_perm.level()
354 } else {
355 false
356 }
357 }
358
359 pub fn permission_downgraded(&self) -> bool {
361 if let Some(old_perm) = &self.old_perm {
362 self.perm.level() < old_perm.level()
363 } else {
364 false
365 }
366 }
367
368 pub fn update_time_formatted(&self) -> Option<String> {
370 self.update_time
371 .map(|timestamp| format!("更新时间: {timestamp}"))
372 }
373
374 pub fn member_type_description(&self) -> String {
376 match self.member_type.as_str() {
377 "user" => "用户".to_string(),
378 "chat" => "群组".to_string(),
379 "department" => "部门".to_string(),
380 _ => "未知".to_string(),
381 }
382 }
383
384 pub fn permission_change_description(&self) -> String {
386 if let Some(old_perm) = &self.old_perm {
387 format!("{} → {}", old_perm.description(), self.perm.description())
388 } else {
389 format!("权限: {}", self.perm.description())
390 }
391 }
392
393 pub fn summary(&self) -> String {
395 let mut parts = vec![
396 format!("{} ({})", self.member_id, self.member_type_description()),
397 self.permission_change_description(),
398 ];
399
400 if let Some(time) = self.update_time_formatted() {
401 parts.push(time);
402 }
403
404 if self.was_notified() {
405 parts.push("已通知".to_string());
406 }
407
408 parts.join(", ")
409 }
410}
411
412impl UpdatePermissionMemberResponse {
413 pub fn member_id(&self) -> &str {
415 self.member.member_id()
416 }
417
418 pub fn member_type(&self) -> &str {
420 self.member.member_type()
421 }
422
423 pub fn new_permission(&self) -> &Permission {
425 self.member.new_permission()
426 }
427
428 pub fn old_permission(&self) -> Option<&Permission> {
430 self.member.old_permission()
431 }
432
433 pub fn is_updated(&self) -> bool {
435 !self.member.member_id.is_empty()
436 }
437
438 pub fn permission_changed(&self) -> bool {
440 self.member.permission_changed()
441 }
442
443 pub fn success_summary(&self) -> String {
445 if self.permission_changed() {
446 format!("协作者权限更新成功: {}", self.member.summary())
447 } else {
448 format!("协作者权限无变化: {}", self.member.summary())
449 }
450 }
451
452 pub fn was_notified(&self) -> bool {
454 self.member.was_notified()
455 }
456
457 pub fn permission_level(&self) -> u8 {
459 self.member.perm.level()
460 }
461
462 pub fn permission_upgraded(&self) -> bool {
464 self.member.permission_upgraded()
465 }
466
467 pub fn permission_downgraded(&self) -> bool {
469 self.member.permission_downgraded()
470 }
471}
472
473#[cfg(test)]
474#[allow(unused_variables, unused_unsafe)]
475mod tests {
476 use super::*;
477
478 #[test]
479 fn test_update_permission_member_request_builder() {
480 let request = UpdatePermissionMemberRequest::builder()
481 .token("doccnxxxxxx")
482 .as_doc()
483 .user("user123")
484 .to_editor()
485 .with_notification()
486 .build();
487
488 assert_eq!(request.token, "doccnxxxxxx");
489 assert_eq!(request.obj_type, "doc");
490 assert_eq!(request.member_type, "user");
491 assert_eq!(request.member_id, "user123");
492 assert!(matches!(request.perm, Permission::Edit));
493 assert_eq!(request.need_notification, Some(true));
494 }
495
496 #[test]
497 fn test_update_permission_member_convenience_methods() {
498 let request = UpdatePermissionMemberRequest::for_user(
499 "doccnxxxxxx",
500 "doc",
501 "user123",
502 Permission::Edit,
503 );
504 assert_eq!(request.member_type, "user");
505 assert_eq!(request.member_id, "user123");
506
507 let request = UpdatePermissionMemberRequest::for_chat(
508 "doccnxxxxxx",
509 "doc",
510 "chat456",
511 Permission::View,
512 );
513 assert_eq!(request.member_type, "chat");
514 assert_eq!(request.member_id, "chat456");
515
516 let request = UpdatePermissionMemberRequest::for_department(
517 "doccnxxxxxx",
518 "doc",
519 "dept789",
520 Permission::Comment,
521 );
522 assert_eq!(request.member_type, "department");
523 assert_eq!(request.member_id, "dept789");
524 }
525
526 #[test]
527 fn test_permission_member_updated_methods() {
528 let member = PermissionMemberUpdated {
529 member_type: "user".to_string(),
530 member_id: "user123".to_string(),
531 perm: Permission::Edit,
532 update_time: Some(1234567890),
533 old_perm: Some(Permission::View),
534 notified: Some(true),
535 };
536
537 assert!(member.is_user());
538 assert!(!member.is_chat());
539 assert!(!member.is_department());
540 assert!(member.can_edit());
541 assert!(!member.is_owner());
542 assert!(member.was_notified());
543 assert!(member.has_update_time());
544 assert!(member.has_old_permission());
545 assert!(member.permission_changed());
546 assert!(member.permission_upgraded());
547 assert!(!member.permission_downgraded());
548 assert_eq!(member.member_type_description(), "用户");
549 assert_eq!(member.permission_change_description(), "阅读者 → 编辑者");
550 }
551}