openlark_workflow/v2/tasklist/
add_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 AddTasklistMembersBody {
17 pub members: Vec<String>,
19}
20
21#[derive(Debug, Clone, Deserialize)]
23pub struct TasklistMember {
24 pub member_id: String,
26 pub member_type: String,
28 pub added_at: String,
30}
31
32#[derive(Debug, Clone, Deserialize)]
34pub struct AddTasklistMembersResponse {
35 pub tasklist_guid: String,
37 #[serde(default)]
39 pub members: Vec<TasklistMember>,
40}
41
42#[derive(Debug, Clone)]
44pub struct AddTasklistMembersRequest {
45 config: Arc<Config>,
47 tasklist_guid: String,
49 body: AddTasklistMembersBody,
51}
52
53impl AddTasklistMembersRequest {
54 pub fn new(config: Arc<Config>, tasklist_guid: impl Into<String>) -> Self {
55 Self {
56 config,
57 tasklist_guid: tasklist_guid.into(),
58 body: AddTasklistMembersBody::default(),
59 }
60 }
61
62 pub fn members(mut self, members: Vec<String>) -> Self {
64 self.body.members = members;
65 self
66 }
67
68 pub fn add_member(mut self, member: impl Into<String>) -> Self {
70 self.body.members.push(member.into());
71 self
72 }
73
74 pub async fn execute(self) -> SDKResult<AddTasklistMembersResponse> {
76 self.execute_with_options(openlark_core::req_option::RequestOption::default())
77 .await
78 }
79
80 pub async fn execute_with_options(
82 self,
83 option: openlark_core::req_option::RequestOption,
84 ) -> SDKResult<AddTasklistMembersResponse> {
85 validate_required!(self.tasklist_guid.trim(), "任务清单GUID不能为空");
87 validate_required!(self.body.members, "成员列表不能为空");
88
89 let api_endpoint = TaskApiV2::TasklistAddMembers(self.tasklist_guid.clone());
90 let mut request = ApiRequest::<AddTasklistMembersResponse>::post(api_endpoint.to_url());
91
92 let request_body = &self.body;
93 request = request.body(serialize_params(request_body, "添加清单成员")?);
94
95 let response =
96 openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
97 extract_response_data(response, "添加清单成员")
98 }
99}
100
101impl ApiResponseTrait for AddTasklistMembersResponse {
102 fn data_format() -> ResponseFormat {
103 ResponseFormat::Data
104 }
105}
106
107#[cfg(test)]
108#[allow(unused_imports)]
109mod tests {
110 use std::sync::Arc;
111
112 use super::*;
113
114 #[test]
115 fn test_add_tasklist_members_builder() {
116 let config = Arc::new(
117 openlark_core::config::Config::builder()
118 .app_id("test")
119 .app_secret("test")
120 .build(),
121 );
122
123 let request = AddTasklistMembersRequest::new(config, "tasklist_123")
124 .members(vec!["user_1".to_string(), "user_2".to_string()]);
125
126 assert_eq!(request.tasklist_guid, "tasklist_123");
127 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
128 }
129
130 #[test]
131 fn test_add_tasklist_member_single() {
132 let config = Arc::new(
133 openlark_core::config::Config::builder()
134 .app_id("test")
135 .app_secret("test")
136 .build(),
137 );
138
139 let request = AddTasklistMembersRequest::new(config, "tasklist_123")
140 .add_member("user_1")
141 .add_member("user_2");
142
143 assert_eq!(request.body.members, vec!["user_1", "user_2"]);
144 }
145
146 #[test]
147 fn test_tasklist_add_members_api_v2_url() {
148 let endpoint = TaskApiV2::TasklistAddMembers("tasklist_123".to_string());
149 assert_eq!(
150 endpoint.to_url(),
151 "/open-apis/task/v2/tasklists/tasklist_123/add_members"
152 );
153 }
154}