open_lark/service/cloud_docs/permission/member/
update.rs

1use 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/// 更新协作者权限请求
18#[derive(Debug, Serialize, Default, Clone)]
19pub struct UpdatePermissionMemberRequest {
20    #[serde(skip)]
21    api_request: ApiRequest,
22    /// 文档token
23    #[serde(skip)]
24    token: String,
25    /// 文档类型
26    #[serde(skip)]
27    obj_type: String,
28    /// 协作者ID类型
29    #[serde(skip)]
30    member_type: String,
31    /// 协作者ID
32    #[serde(skip)]
33    member_id: String,
34    /// 新权限
35    perm: Permission,
36    /// 是否通知
37    #[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    /// 更新用户权限
64    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    /// 更新群组权限
74    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    /// 更新部门权限
84    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    /// 文档token
101    pub fn token(mut self, token: impl ToString) -> Self {
102        self.request.token = token.to_string();
103        self
104    }
105
106    /// 文档类型
107    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    /// 设置为文档类型
113    pub fn as_doc(mut self) -> Self {
114        self.request.obj_type = "doc".to_string();
115        self
116    }
117
118    /// 设置为电子表格类型
119    pub fn as_sheet(mut self) -> Self {
120        self.request.obj_type = "sheet".to_string();
121        self
122    }
123
124    /// 设置为多维表格类型
125    pub fn as_bitable(mut self) -> Self {
126        self.request.obj_type = "bitable".to_string();
127        self
128    }
129
130    /// 设置为知识库类型
131    pub fn as_wiki(mut self) -> Self {
132        self.request.obj_type = "wiki".to_string();
133        self
134    }
135
136    /// 协作者类型和ID
137    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    /// 用户协作者
144    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    /// 群组协作者
151    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    /// 部门协作者
158    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    /// 新权限
165    pub fn permission(mut self, permission: Permission) -> Self {
166        self.request.perm = permission;
167        self
168    }
169
170    /// 更新为所有者权限
171    pub fn to_owner(mut self) -> Self {
172        self.request.perm = Permission::FullAccess;
173        self
174    }
175
176    /// 更新为编辑权限
177    pub fn to_editor(mut self) -> Self {
178        self.request.perm = Permission::Edit;
179        self
180    }
181
182    /// 更新为评论权限
183    pub fn to_commenter(mut self) -> Self {
184        self.request.perm = Permission::Comment;
185        self
186    }
187
188    /// 更新为查看权限
189    pub fn to_viewer(mut self) -> Self {
190        self.request.perm = Permission::View;
191        self
192    }
193
194    /// 是否通知
195    pub fn need_notification(mut self, need: bool) -> Self {
196        self.request.need_notification = Some(need);
197        self
198    }
199
200    /// 启用通知
201    pub fn with_notification(mut self) -> Self {
202        self.request.need_notification = Some(true);
203        self
204    }
205
206    /// 禁用通知
207    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/// 协作者更新结果
219#[derive(Debug, Deserialize)]
220pub struct PermissionMemberUpdated {
221    /// 协作者ID类型
222    pub member_type: String,
223    /// 协作者ID
224    pub member_id: String,
225    /// 新权限
226    pub perm: Permission,
227    /// 更新时间(毫秒时间戳)
228    pub update_time: Option<i64>,
229    /// 原权限(如果有)
230    pub old_perm: Option<Permission>,
231    /// 是否通知了用户
232    pub notified: Option<bool>,
233}
234
235/// 更新协作者权限响应
236#[derive(Debug, Deserialize)]
237pub struct UpdatePermissionMemberResponse {
238    /// 协作者信息
239    pub member: PermissionMemberUpdated,
240}
241
242impl ApiResponseTrait for UpdatePermissionMemberResponse {
243    fn data_format() -> ResponseFormat {
244        ResponseFormat::Data
245    }
246}
247
248/// 更新协作者权限
249pub 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    // 添加通知参数
267    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    /// 获取成员ID
282    pub fn member_id(&self) -> &str {
283        &self.member_id
284    }
285
286    /// 获取成员类型
287    pub fn member_type(&self) -> &str {
288        &self.member_type
289    }
290
291    /// 获取新权限
292    pub fn new_permission(&self) -> &Permission {
293        &self.perm
294    }
295
296    /// 获取原权限
297    pub fn old_permission(&self) -> Option<&Permission> {
298        self.old_perm.as_ref()
299    }
300
301    /// 是否是用户
302    pub fn is_user(&self) -> bool {
303        self.member_type == "user"
304    }
305
306    /// 是否是群组
307    pub fn is_chat(&self) -> bool {
308        self.member_type == "chat"
309    }
310
311    /// 是否是部门
312    pub fn is_department(&self) -> bool {
313        self.member_type == "department"
314    }
315
316    /// 是否有编辑权限
317    pub fn can_edit(&self) -> bool {
318        self.perm.can_edit()
319    }
320
321    /// 是否是所有者
322    pub fn is_owner(&self) -> bool {
323        self.perm.is_owner()
324    }
325
326    /// 是否通知了用户
327    pub fn was_notified(&self) -> bool {
328        self.notified.unwrap_or(false)
329    }
330
331    /// 是否有更新时间
332    pub fn has_update_time(&self) -> bool {
333        self.update_time.is_some()
334    }
335
336    /// 是否有原权限信息
337    pub fn has_old_permission(&self) -> bool {
338        self.old_perm.is_some()
339    }
340
341    /// 权限是否有变化
342    pub fn permission_changed(&self) -> bool {
343        if let Some(old_perm) = &self.old_perm {
344            old_perm != &self.perm
345        } else {
346            true // 没有原权限信息,认为是有变化的
347        }
348    }
349
350    /// 权限是否升级
351    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    /// 权限是否降级
360    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    /// 获取更新时间的格式化字符串
369    pub fn update_time_formatted(&self) -> Option<String> {
370        self.update_time
371            .map(|timestamp| format!("更新时间: {timestamp}"))
372    }
373
374    /// 获取成员类型描述
375    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    /// 获取权限变化描述
385    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    /// 获取摘要信息
394    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    /// 获取协作者ID
414    pub fn member_id(&self) -> &str {
415        self.member.member_id()
416    }
417
418    /// 获取协作者类型
419    pub fn member_type(&self) -> &str {
420        self.member.member_type()
421    }
422
423    /// 获取新权限
424    pub fn new_permission(&self) -> &Permission {
425        self.member.new_permission()
426    }
427
428    /// 获取原权限
429    pub fn old_permission(&self) -> Option<&Permission> {
430        self.member.old_permission()
431    }
432
433    /// 是否更新成功
434    pub fn is_updated(&self) -> bool {
435        !self.member.member_id.is_empty()
436    }
437
438    /// 权限是否有变化
439    pub fn permission_changed(&self) -> bool {
440        self.member.permission_changed()
441    }
442
443    /// 获取更新成功摘要
444    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    /// 是否通知了用户
453    pub fn was_notified(&self) -> bool {
454        self.member.was_notified()
455    }
456
457    /// 权限级别
458    pub fn permission_level(&self) -> u8 {
459        self.member.perm.level()
460    }
461
462    /// 权限是否升级
463    pub fn permission_upgraded(&self) -> bool {
464        self.member.permission_upgraded()
465    }
466
467    /// 权限是否降级
468    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}