Skip to main content

openlark_workflow/v2/task/
tasklists.rs

1//! 列取任务所在清单
2//!
3//! docPath: https://open.feishu.cn/document/server-docs/docs/task-v2/task-tasklists/list
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, Deserialize, PartialEq)]
16pub struct TaskTasklistItem {
17    /// 任务清单 GUID
18    pub tasklist_guid: String,
19    /// 任务清单名称
20    pub tasklist_name: String,
21    /// 分组 GUID
22    #[serde(default)]
23    pub section_guid: Option<String>,
24    /// 分组名称
25    #[serde(default)]
26    pub section_name: Option<String>,
27}
28
29/// 列取任务所在清单响应
30#[derive(Debug, Clone, Deserialize)]
31pub struct GetTaskTasklistsResponse {
32    /// 任务清单列表
33    #[serde(default)]
34    pub items: Vec<TaskTasklistItem>,
35    /// 总数
36    #[serde(default)]
37    pub total: Option<i32>,
38}
39
40/// 列取任务所在清单请求
41#[derive(Debug, Clone)]
42pub struct GetTaskTasklistsRequest {
43    /// 配置信息
44    config: Arc<Config>,
45    /// 任务 GUID
46    task_guid: String,
47}
48
49impl GetTaskTasklistsRequest {
50    pub fn new(config: Arc<Config>, task_guid: impl Into<String>) -> Self {
51        Self {
52            config,
53            task_guid: task_guid.into(),
54        }
55    }
56
57    /// 执行请求
58    pub async fn execute(self) -> SDKResult<GetTaskTasklistsResponse> {
59        self.execute_with_options(openlark_core::req_option::RequestOption::default())
60            .await
61    }
62
63    /// 执行请求(带选项)
64    pub async fn execute_with_options(
65        self,
66        option: openlark_core::req_option::RequestOption,
67    ) -> SDKResult<GetTaskTasklistsResponse> {
68        // 验证必填字段
69        validate_required!(self.task_guid.trim(), "任务GUID不能为空");
70
71        let api_endpoint = TaskApiV2::TaskGetTasklists(self.task_guid.clone());
72        let request = ApiRequest::<GetTaskTasklistsResponse>::get(api_endpoint.to_url());
73
74        let response =
75            openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
76        extract_response_data(response, "列取任务所在清单")
77    }
78}
79
80impl ApiResponseTrait for GetTaskTasklistsResponse {
81    fn data_format() -> ResponseFormat {
82        ResponseFormat::Data
83    }
84}
85
86#[cfg(test)]
87#[allow(unused_imports)]
88mod tests {
89    use std::sync::Arc;
90
91    use super::*;
92
93    #[test]
94    fn test_get_task_tasklists_request() {
95        let config = openlark_core::config::Config::builder()
96            .app_id("test")
97            .app_secret("test")
98            .build();
99
100        let request = GetTaskTasklistsRequest::new(Arc::new(config), "task_123");
101
102        assert_eq!(request.task_guid, "task_123");
103    }
104
105    #[test]
106    fn test_task_get_tasklists_api_v2_url() {
107        let endpoint = TaskApiV2::TaskGetTasklists("task_123".to_string());
108        assert_eq!(
109            endpoint.to_url(),
110            "/open-apis/task/v2/tasks/task_123/tasklists"
111        );
112    }
113}