openlark_workflow/v2/tasklist/
remove_members.rs1use crate::common::{api_endpoints::TaskApiV2, api_utils::*};
6use openlark_core::{
7 SDKResult,
8 api::{ApiRequest, ApiResponseTrait, ResponseFormat},
9 config::Config,
10 validate_required,
11};
12use serde::{Deserialize, Serialize};
13use std::sync::Arc;
14
15#[derive(Debug, Clone, Serialize, Default)]
17pub struct RemoveTasklistMembersBody {
18 pub members: Vec<String>,
20}
21
22#[derive(Debug, Clone, Deserialize)]
24pub struct RemoveTasklistMembersResponse {
25 pub tasklist_guid: String,
27 #[serde(default)]
29 pub removed_members: Vec<String>,
30}
31
32#[derive(Debug, Clone)]
34pub struct RemoveTasklistMembersRequest {
35 config: Arc<Config>,
37 tasklist_guid: String,
39 body: RemoveTasklistMembersBody,
41}
42
43impl RemoveTasklistMembersRequest {
44 pub fn new(config: Arc<Config>, tasklist_guid: impl Into<String>) -> Self {
46 Self {
47 config,
48 tasklist_guid: tasklist_guid.into(),
49 body: RemoveTasklistMembersBody::default(),
50 }
51 }
52
53 pub fn members(mut self, members: Vec<String>) -> Self {
55 self.body.members = members;
56 self
57 }
58
59 pub fn remove_member(mut self, member: impl Into<String>) -> Self {
61 self.body.members.push(member.into());
62 self
63 }
64
65 pub async fn execute(self) -> SDKResult<RemoveTasklistMembersResponse> {
67 self.execute_with_options(openlark_core::req_option::RequestOption::default())
68 .await
69 }
70
71 pub async fn execute_with_options(
73 self,
74 option: openlark_core::req_option::RequestOption,
75 ) -> SDKResult<RemoveTasklistMembersResponse> {
76 validate_required!(self.tasklist_guid.trim(), "任务清单GUID不能为空");
78 validate_required!(self.body.members, "成员列表不能为空");
79
80 let api_endpoint = TaskApiV2::TasklistRemoveMembers(self.tasklist_guid.clone());
81 let mut request = ApiRequest::<RemoveTasklistMembersResponse>::post(api_endpoint.to_url());
82
83 let request_body = &self.body;
84 request = request.body(serialize_params(request_body, "移除清单成员")?);
85
86 let response =
87 openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
88 extract_response_data(response, "移除清单成员")
89 }
90}
91
92impl ApiResponseTrait for RemoveTasklistMembersResponse {
93 fn data_format() -> ResponseFormat {
94 ResponseFormat::Data
95 }
96}
97
98#[cfg(test)]
99#[allow(unused_imports)]
100mod tests {
101 use std::sync::Arc;
102
103 use super::*;
104
105 #[test]
106 fn test_remove_tasklist_members_builder() {
107 let config = Arc::new(
108 openlark_core::config::Config::builder()
109 .app_id("test")
110 .app_secret("test")
111 .build(),
112 );
113
114 let request = RemoveTasklistMembersRequest::new(config, "tasklist_123")
115 .members(vec!["user_1".to_string(), "user_2".to_string()]);
116
117 assert_eq!(request.tasklist_guid, "tasklist_123");
118 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
119 }
120
121 #[test]
122 fn test_remove_tasklist_member_single() {
123 let config = Arc::new(
124 openlark_core::config::Config::builder()
125 .app_id("test")
126 .app_secret("test")
127 .build(),
128 );
129
130 let request = RemoveTasklistMembersRequest::new(config, "tasklist_123")
131 .remove_member("user_1")
132 .remove_member("user_2");
133
134 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
135 }
136
137 #[test]
138 fn test_tasklist_remove_members_api_v2_url() {
139 let endpoint = TaskApiV2::TasklistRemoveMembers("tasklist_123".to_string());
140 assert_eq!(
141 endpoint.to_url(),
142 "/open-apis/task/v2/tasklists/tasklist_123/remove_members"
143 );
144 }
145}