Skip to main content

openlark_workflow/v1/task/
list.rs

1//! 查询所有任务(v1)
2//!
3//! docPath: https://open.feishu.cn/document/server-docs/docs/task-v1/task/list
4
5use openlark_core::{
6    api::{ApiRequest, ApiResponseTrait, ResponseFormat},
7    config::Config,
8    SDKResult,
9};
10use serde::Deserialize;
11use std::sync::Arc;
12
13/// 任务信息(v1)
14#[derive(Debug, Clone, Deserialize)]
15pub struct TaskListItemV1 {
16    /// 任务 ID
17    pub id: String,
18    /// 任务标题
19    pub summary: String,
20    /// 任务描述
21    #[serde(default)]
22    pub description: Option<String>,
23    /// 任务开始时间
24    #[serde(default)]
25    pub start: Option<String>,
26    /// 任务截止时间
27    #[serde(default)]
28    pub due: Option<String>,
29    /// 任务优先级(1-5)
30    #[serde(default)]
31    pub priority: Option<i32>,
32    /// 任务是否完成
33    pub is_completed: bool,
34    /// 创建时间
35    pub created_at: String,
36    /// 更新时间
37    pub updated_at: String,
38}
39
40/// 查询任务响应(v1)
41#[derive(Debug, Clone, Deserialize)]
42pub struct ListTaskResponseV1 {
43    /// 任务列表
44    pub tasks: Vec<TaskListItemV1>,
45    /// 分页令牌
46    #[serde(default)]
47    pub page_token: Option<String>,
48    /// 是否有更多数据
49    #[serde(default)]
50    pub has_more: bool,
51}
52
53/// 查询任务请求(v1)
54#[derive(Debug, Clone)]
55pub struct ListTaskRequestV1 {
56    config: Arc<Config>,
57    page_token: Option<String>,
58    page_size: Option<i32>,
59}
60
61impl ListTaskRequestV1 {
62    pub fn new(config: Arc<Config>) -> Self {
63        Self {
64            config,
65            page_token: None,
66            page_size: None,
67        }
68    }
69
70    /// 设置分页令牌
71    pub fn page_token(mut self, page_token: impl Into<String>) -> Self {
72        self.page_token = Some(page_token.into());
73        self
74    }
75
76    /// 设置每页大小
77    pub fn page_size(mut self, page_size: i32) -> Self {
78        self.page_size = Some(page_size);
79        self
80    }
81
82    /// 执行请求
83    pub async fn execute(self) -> SDKResult<ListTaskResponseV1> {
84        self.execute_with_options(openlark_core::req_option::RequestOption::default())
85            .await
86    }
87
88    /// 执行请求(带选项)
89    pub async fn execute_with_options(
90        self,
91        option: openlark_core::req_option::RequestOption,
92    ) -> SDKResult<ListTaskResponseV1> {
93        let api_endpoint = crate::common::api_endpoints::TaskApiV1::TaskList;
94        let mut request = ApiRequest::<ListTaskResponseV1>::get(api_endpoint.to_url());
95
96        // 添加查询参数
97        if let Some(page_token) = self.page_token {
98            request = request.query("page_token", page_token);
99        }
100        if let Some(page_size) = self.page_size {
101            request = request.query("page_size", page_size.to_string());
102        }
103
104        let response =
105            openlark_core::http::Transport::request(request, &self.config, Some(option)).await?;
106        response.data.ok_or_else(|| {
107            openlark_core::error::validation_error("响应数据为空", "服务器没有返回有效的数据")
108        })
109    }
110}
111
112impl ApiResponseTrait for ListTaskResponseV1 {
113    fn data_format() -> ResponseFormat {
114        ResponseFormat::Data
115    }
116}
117
118#[cfg(test)]
119#[allow(unused_imports)]
120mod tests {
121    use std::sync::Arc;
122
123    use super::*;
124
125    #[test]
126    fn test_list_task_v1_builder() {
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 = ListTaskRequestV1::new(config)
135            .page_token("next_page_token")
136            .page_size(20);
137
138        assert_eq!(request.page_token, Some("next_page_token".to_string()));
139        assert_eq!(request.page_size, Some(20));
140    }
141
142    #[test]
143    fn test_task_api_v1_list_url() {
144        let endpoint = crate::common::api_endpoints::TaskApiV1::TaskList;
145        assert_eq!(endpoint.to_url(), "/open-apis/task/v1/tasks");
146    }
147}