Skip to main content

openlark_workflow/v2/task/subtask/
list.rs

1//! 获取任务的子任务列表
2//!
3//! docPath: https://open.feishu.cn/document/server-docs/docs/task-v2/task-subtask/list
4
5use crate::common::{api_endpoints::TaskApiV2, api_utils::*};
6use crate::v2::task::models::TaskItem;
7use openlark_core::{
8    SDKResult,
9    api::{ApiRequest, ApiResponseTrait, ResponseFormat},
10    config::Config,
11};
12use serde::{Deserialize, Serialize};
13use std::sync::Arc;
14
15/// 获取子任务列表响应
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
17pub struct ListSubtasksResponse {
18    /// 是否还有更多项
19    #[serde(default)]
20    pub has_more: bool,
21
22    /// 分页标记
23    #[serde(skip_serializing_if = "Option::is_none")]
24    pub page_token: Option<String>,
25
26    /// 总数
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub total: Option<i32>,
29
30    /// 子任务列表
31    #[serde(default)]
32    pub items: Vec<TaskItem>,
33}
34
35/// 获取子任务列表请求
36#[derive(Debug, Clone)]
37pub struct ListSubtasksRequest {
38    /// 配置信息
39    config: Arc<Config>,
40    /// 父任务 GUID
41    task_guid: String,
42    /// 分页大小
43    page_size: Option<i32>,
44    /// 分页标记
45    page_token: Option<String>,
46}
47
48impl ListSubtasksRequest {
49    /// 创建新的请求构建器。
50    pub fn new(config: Arc<Config>, task_guid: impl Into<String>) -> Self {
51        Self {
52            config,
53            task_guid: task_guid.into(),
54            page_size: None,
55            page_token: None,
56        }
57    }
58
59    /// 设置分页大小
60    pub fn page_size(mut self, page_size: i32) -> Self {
61        self.page_size = Some(page_size);
62        self
63    }
64
65    /// 设置分页标记
66    pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
67        self.page_token = Some(page_token.into());
68        self
69    }
70
71    /// 执行请求
72    pub async fn execute(self) -> SDKResult<ListSubtasksResponse> {
73        self.execute_with_options(openlark_core::req_option::RequestOption::default())
74            .await
75    }
76
77    /// 执行请求(带选项)
78    pub async fn execute_with_options(
79        self,
80        option: openlark_core::req_option::RequestOption,
81    ) -> SDKResult<ListSubtasksResponse> {
82        let api_endpoint = TaskApiV2::SubtaskList(self.task_guid.clone());
83        let mut request = ApiRequest::<ListSubtasksResponse>::get(api_endpoint.to_url());
84
85        // 构建查询参数
86        if let Some(page_size) = self.page_size {
87            request = request.query("page_size", page_size.to_string());
88        }
89        if let Some(page_token) = &self.page_token {
90            request = request.query("page_token", page_token);
91        }
92
93        let response =
94            openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
95        extract_response_data(response, "获取子任务列表")
96    }
97}
98
99impl ApiResponseTrait for ListSubtasksResponse {
100    fn data_format() -> ResponseFormat {
101        ResponseFormat::Data
102    }
103}
104
105#[cfg(test)]
106#[allow(unused_imports)]
107mod tests {
108    use std::sync::Arc;
109
110    use super::*;
111
112    #[test]
113    fn test_list_subtasks_request() {
114        let config = openlark_core::config::Config::builder()
115            .app_id("test")
116            .app_secret("test")
117            .build();
118
119        let request = ListSubtasksRequest::new(Arc::new(config), "parent_task_123")
120            .page_size(20)
121            .page_token("next_page_token");
122
123        assert_eq!(request.task_guid, "parent_task_123");
124        assert_eq!(request.page_size, Some(20));
125        assert_eq!(request.page_token, Some("next_page_token".to_string()));
126    }
127
128    #[test]
129    fn test_list_subtasks_api_v2_url() {
130        let endpoint = TaskApiV2::SubtaskList("task_123".to_string());
131        assert_eq!(
132            endpoint.to_url(),
133            "/open-apis/task/v2/tasks/task_123/subtasks"
134        );
135    }
136}