Skip to main content

openlark_workflow/v2/tasklist/
add_members.rs

1//! 添加清单成员
2//!
3//! docPath: https://open.feishu.cn/document/server-docs/docs/task-v2/tasklist-add_members/create
4
5use 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/// 添加清单成员请求体
15#[derive(Debug, Clone, Serialize, Default)]
16pub struct AddTasklistMembersBody {
17    /// 成员 ID 列表
18    pub members: Vec<String>,
19}
20
21/// 清单成员信息
22#[derive(Debug, Clone, Deserialize)]
23pub struct TasklistMember {
24    /// 成员 ID
25    pub member_id: String,
26    /// 成员类型
27    pub member_type: String,
28    /// 添加时间
29    pub added_at: String,
30}
31
32/// 添加清单成员响应
33#[derive(Debug, Clone, Deserialize)]
34pub struct AddTasklistMembersResponse {
35    /// 任务清单 GUID
36    pub tasklist_guid: String,
37    /// 添加的成员列表
38    #[serde(default)]
39    pub members: Vec<TasklistMember>,
40}
41
42/// 添加清单成员请求
43#[derive(Debug, Clone)]
44pub struct AddTasklistMembersRequest {
45    /// 配置信息
46    config: Arc<Config>,
47    /// 任务清单 GUID
48    tasklist_guid: String,
49    /// 请求体
50    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    /// 设置成员 ID 列表
63    pub fn members(mut self, members: Vec<String>) -> Self {
64        self.body.members = members;
65        self
66    }
67
68    /// 添加单个成员
69    pub fn add_member(mut self, member: impl Into<String>) -> Self {
70        self.body.members.push(member.into());
71        self
72    }
73
74    /// 执行请求
75    pub async fn execute(self) -> SDKResult<AddTasklistMembersResponse> {
76        self.execute_with_options(openlark_core::req_option::RequestOption::default())
77            .await
78    }
79
80    /// 执行请求(带选项)
81    pub async fn execute_with_options(
82        self,
83        option: openlark_core::req_option::RequestOption,
84    ) -> SDKResult<AddTasklistMembersResponse> {
85        // 验证必填字段
86        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}