openlark_workflow/v2/task/
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 RemoveMembersBody {
18 pub members: Vec<String>,
20}
21
22#[derive(Debug, Clone, Deserialize)]
24pub struct RemoveMembersResponse {
25 pub task_guid: String,
27 #[serde(default)]
29 pub removed_members: Vec<String>,
30}
31
32#[derive(Debug, Clone)]
34pub struct RemoveMembersRequest {
35 config: Arc<Config>,
37 task_guid: String,
39 body: RemoveMembersBody,
41}
42
43impl RemoveMembersRequest {
44 pub fn new(config: Arc<Config>, task_guid: impl Into<String>) -> Self {
46 Self {
47 config,
48 task_guid: task_guid.into(),
49 body: RemoveMembersBody::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<RemoveMembersResponse> {
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<RemoveMembersResponse> {
76 validate_required!(self.task_guid.trim(), "任务GUID不能为空");
78 validate_required!(self.body.members, "成员列表不能为空");
79
80 let api_endpoint = TaskApiV2::TaskRemoveMembers(self.task_guid.clone());
81 let mut request = ApiRequest::<RemoveMembersResponse>::post(api_endpoint.to_url());
82
83 let request_body = &self.body;
84 request = request.body(serialize_params(request_body, "移除任务成员")?);
85
86 openlark_core::http::Transport::request_typed(
87 request,
88 &self.config,
89 Some(option),
90 "移除任务成员",
91 )
92 .await
93 }
94}
95
96impl ApiResponseTrait for RemoveMembersResponse {
97 fn data_format() -> ResponseFormat {
98 ResponseFormat::Data
99 }
100}
101
102#[cfg(test)]
103#[allow(unused_imports)]
104mod tests {
105 use std::sync::Arc;
106
107 use super::*;
108
109 #[test]
110 fn test_remove_members_builder() {
111 let config = Arc::new(
112 openlark_core::config::Config::builder()
113 .app_id("test")
114 .app_secret("test")
115 .build(),
116 );
117
118 let request = RemoveMembersRequest::new(config, "task_123")
119 .members(vec!["user_1".to_string(), "user_2".to_string()]);
120
121 assert_eq!(request.task_guid, "task_123");
122 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
123 }
124
125 #[test]
126 fn test_remove_member_single() {
127 let config = Arc::new(
128 openlark_core::config::Config::builder()
129 .app_id("test")
130 .app_secret("test")
131 .build(),
132 );
133
134 let request = RemoveMembersRequest::new(config, "task_123")
135 .remove_member("user_1")
136 .remove_member("user_2");
137
138 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
139 }
140
141 #[test]
142 fn test_task_remove_members_api_v2_url() {
143 let endpoint = TaskApiV2::TaskRemoveMembers("task_123".to_string());
144 assert_eq!(
145 endpoint.to_url(),
146 "/open-apis/task/v2/tasks/task_123/remove_members"
147 );
148 }
149}