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