openlark_workflow/lib.rs
1//! # OpenLark 工作流模块
2//!
3//! OpenLark SDK 的工作流模块,提供飞书任务、审批和看板 API 的完整访问。
4//! Communication / Workflow helper 分层边界见 `docs/communication-workflow-helper-boundaries.md`。
5//!
6//! ## 功能特性
7//!
8//! - **任务管理**: 创建、更新、删除、查询待办事项
9//! - **审批流程**: 审批定义、审批实例管理,以及高频审批任务 helper
10//! - **看板管理**: 看板创建、任务卡片管理
11//! - **协作支持**: 添加执行者、关注者、提醒
12//! - **版本支持**: 支持 task v1/v2,以及 approval v4 helper 场景
13//!
14//! ## 使用示例
15//!
16//! ```rust,no_run
17//! use openlark_workflow::{
18//! ApprovalTaskAction, ApprovalTaskQuery, WorkflowService, WorkflowTaskListQuery,
19//! WorkflowTaskMutation,
20//! };
21//! use openlark_core::config::Config;
22//!
23//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
24//! let config = Config::builder()
25//! .app_id("your_app_id")
26//! .app_secret("your_app_secret")
27//! .build();
28//!
29//! let workflow_service = WorkflowService::new(config);
30//!
31//! // 列取任务清单中的任务
32//! let tasks = workflow_service
33//! .list_tasks_all(WorkflowTaskListQuery::for_tasklist("tasklist_guid"))
34//! .await?;
35//!
36//! // 更新任务
37//! let result = workflow_service
38//! .mutate_task(
39//! "task_guid",
40//! WorkflowTaskMutation::new()
41//! .summary("完成项目文档")
42//! .priority(3),
43//! )
44//! .await?;
45//!
46//! // 处理待审批任务
47//! let approval_tasks = workflow_service
48//! .query_approval_tasks(
49//! ApprovalTaskQuery::new("ou_example_user", "1")
50//! .user_id_type("open_id")
51//! .status("Todo"),
52//! )
53//! .await?;
54//! if let Some(task) = approval_tasks.first() {
55//! let _ = workflow_service
56//! .approve_task(
57//! ApprovalTaskAction::new(
58//! task.approval_code.clone(),
59//! task.instance_code.clone(),
60//! "ou_example_user",
61//! task.task_id.clone(),
62//! )
63//! .user_id_type("open_id")
64//! .comment("同意"),
65//! )
66//! .await?;
67//! }
68//! # Ok(())
69//! # }
70//! ```
71
72mod service;
73
74// 通用模块
75/// 工作流通用工具、端点与模型。
76pub mod common;
77
78// 版本模块
79#[cfg(feature = "v1")]
80/// 任务 v1 API 模块。
81pub mod v1;
82
83#[cfg(feature = "v2")]
84/// 任务 v2 API 模块。
85pub mod v2;
86
87// 看板模块
88#[cfg(feature = "board")]
89/// 白板/看板模块。
90pub mod board;
91
92// Prelude 模块
93/// 常用工作流类型预导出模块。
94pub mod prelude;
95
96// 重新导出核心服务
97pub use service::{
98 ApprovalTaskAction, ApprovalTaskQuery, WorkflowService, WorkflowTaskListQuery,
99 WorkflowTaskMutation,
100};
101
102/// 工作流服务客户端类型别名(统一命名为 `XxxClient`)。
103pub type WorkflowClient = WorkflowService;
104
105/// 工作流模块版本信息
106pub const VERSION: &str = env!("CARGO_PKG_VERSION");
107
108#[cfg(test)]
109#[allow(unused_imports)]
110mod tests {
111 use crate::VERSION;
112
113 #[test]
114 fn test_version() {
115 assert_ne!(VERSION, "");
116 }
117}
118
119#[cfg(test)]
120mod service_tests {
121 use super::*;
122 use openlark_core::config::Config;
123
124 fn create_test_config() -> Config {
125 Config::builder()
126 .app_id("test_app")
127 .app_secret("test_secret")
128 .build()
129 }
130
131 #[test]
132 fn test_workflow_service_creation() {
133 let config = create_test_config();
134 let service = WorkflowService::new(config);
135 // Service created successfully
136 let _ = service;
137 }
138
139 #[test]
140 fn test_workflow_service_clone() {
141 let config = create_test_config();
142 let service = WorkflowService::new(config);
143 let _cloned = service.clone();
144 }
145
146 #[cfg(feature = "v1")]
147 #[test]
148 fn test_workflow_service_v1() {
149 let config = create_test_config();
150 let service = WorkflowService::new(config);
151 let _v1 = service.v1();
152 }
153
154 #[cfg(feature = "v2")]
155 #[test]
156 fn test_workflow_service_v2() {
157 let config = create_test_config();
158 let service = WorkflowService::new(config);
159 let _v2 = service.v2();
160 }
161
162 #[cfg(feature = "v2")]
163 #[test]
164 fn test_workflow_service_task() {
165 let config = create_test_config();
166 let service = WorkflowService::new(config);
167 let _task = service.task();
168 }
169
170 #[cfg(feature = "v2")]
171 #[test]
172 fn test_workflow_service_tasklist() {
173 let config = create_test_config();
174 let service = WorkflowService::new(config);
175 let _tasklist = service.tasklist();
176 }
177}