Skip to main content

openlark_workflow/v2/task/
models.rs

1//! 任务 API v2 的数据模型
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6/// 创建任务请求体
7#[derive(Debug, Clone, Serialize, Default)]
8pub struct CreateTaskBody {
9    /// 任务标题
10    pub summary: String,
11
12    /// 任务描述
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub description: Option<String>,
15
16    /// 任务开始时间
17    #[serde(skip_serializing_if = "Option::is_none")]
18    pub start: Option<String>,
19
20    /// 任务截止时间
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub due: Option<String>,
23
24    /// 任务所属的任务清单 GUID
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub tasklist_guid: Option<String>,
27
28    /// 任务所属的分组 GUID
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub section_guid: Option<String>,
31
32    /// 任务优先级(1-5)
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub priority: Option<i32>,
35
36    /// 自定义字段
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub custom_fields: Option<Value>,
39
40    /// 任务关注者
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub followers: Option<Vec<String>>,
43
44    /// 子任务
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub subtasks: Option<Vec<Value>>,
47
48    /// 任务执行者
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub assignee: Option<String>,
51
52    /// 任务提醒时间
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub remind_time: Option<String>,
55
56    /// 重复规则
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub repeat_rule: Option<Value>,
59}
60
61/// 更新任务请求体
62#[derive(Debug, Clone, Serialize, Default)]
63pub struct UpdateTaskBody {
64    /// 任务标题
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub summary: Option<String>,
67
68    /// 任务描述
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub description: Option<String>,
71
72    /// 任务开始时间
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub start: Option<String>,
75
76    /// 任务截止时间
77    #[serde(skip_serializing_if = "Option::is_none")]
78    pub due: Option<String>,
79
80    /// 任务优先级(1-5)
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub priority: Option<i32>,
83
84    /// 自定义字段
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub custom_fields: Option<Value>,
87
88    /// 任务关注者
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub followers: Option<Vec<String>>,
91
92    /// 子任务
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub subtasks: Option<Vec<Value>>,
95
96    /// 任务执行者
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub assignee: Option<String>,
99
100    /// 任务提醒时间
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub remind_time: Option<String>,
103
104    /// 重复规则
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub repeat_rule: Option<Value>,
107
108    /// 任务状态
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub status: Option<String>,
111}
112
113/// 创建任务响应
114#[derive(Debug, Clone, Deserialize)]
115pub struct CreateTaskResponse {
116    /// 任务 GUID
117    pub task_guid: String,
118
119    /// 任务标题
120    pub summary: String,
121
122    /// 任务描述
123    #[serde(default)]
124    pub description: Option<String>,
125
126    /// 任务状态
127    pub status: String,
128
129    /// 任务清单 GUID
130    #[serde(default)]
131    pub tasklist_guid: Option<String>,
132
133    /// 分组 GUID
134    #[serde(default)]
135    pub section_guid: Option<String>,
136
137    /// 创建时间
138    pub created_at: String,
139
140    /// 更新时间
141    pub updated_at: String,
142}
143
144/// 获取任务响应
145#[derive(Debug, Clone, Deserialize)]
146pub struct GetTaskResponse {
147    /// 任务 GUID
148    pub task_guid: String,
149
150    /// 任务标题
151    pub summary: String,
152
153    /// 任务描述
154    #[serde(default)]
155    pub description: Option<String>,
156
157    /// 任务状态
158    pub status: String,
159
160    /// 任务清单 GUID
161    #[serde(default)]
162    pub tasklist_guid: Option<String>,
163
164    /// 分组 GUID
165    #[serde(default)]
166    pub section_guid: Option<String>,
167
168    /// 任务优先级
169    #[serde(default)]
170    pub priority: Option<i32>,
171
172    /// 任务开始时间
173    #[serde(default)]
174    pub start: Option<String>,
175
176    /// 任务截止时间
177    #[serde(default)]
178    pub due: Option<String>,
179
180    /// 创建时间
181    pub created_at: String,
182
183    /// 更新时间
184    pub updated_at: String,
185
186    /// 完成时间
187    #[serde(default)]
188    pub completed_at: Option<String>,
189}
190
191/// 更新任务响应
192#[derive(Debug, Clone, Deserialize)]
193pub struct UpdateTaskResponse {
194    /// 任务 GUID
195    pub task_guid: String,
196
197    /// 任务标题
198    pub summary: String,
199
200    /// 任务描述
201    #[serde(default)]
202    pub description: Option<String>,
203
204    /// 任务状态
205    pub status: String,
206
207    /// 更新时间
208    pub updated_at: String,
209}
210
211/// 删除任务响应
212#[derive(Debug, Clone, Deserialize)]
213pub struct DeleteTaskResponse {
214    /// 是否删除成功
215    pub success: bool,
216
217    /// 任务 GUID
218    pub task_guid: String,
219}
220
221/// 完成任务响应
222#[derive(Debug, Clone, Deserialize)]
223pub struct CompleteTaskResponse {
224    /// 任务 GUID
225    pub task_guid: String,
226
227    /// 任务状态
228    pub status: String,
229
230    /// 完成时间
231    pub completed_at: String,
232}
233
234/// 取消完成任务响应
235#[derive(Debug, Clone, Deserialize)]
236pub struct UncompleteTaskResponse {
237    /// 任务 GUID
238    pub task_guid: String,
239
240    /// 任务状态
241    pub status: String,
242
243    /// 更新时间
244    pub updated_at: String,
245}
246
247/// 任务列表项
248#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
249pub struct TaskItem {
250    /// 任务 GUID
251    pub task_guid: String,
252
253    /// 任务标题
254    pub summary: String,
255
256    /// 任务描述
257    #[serde(default)]
258    pub description: Option<String>,
259
260    /// 任务状态
261    pub status: String,
262
263    /// 任务清单 GUID
264    #[serde(default)]
265    pub tasklist_guid: Option<String>,
266
267    /// 分组 GUID
268    #[serde(default)]
269    pub section_guid: Option<String>,
270
271    /// 任务优先级
272    #[serde(default)]
273    pub priority: Option<i32>,
274
275    /// 任务开始时间
276    #[serde(default)]
277    pub start: Option<String>,
278
279    /// 任务截止时间
280    #[serde(default)]
281    pub due: Option<String>,
282
283    /// 创建时间
284    pub created_at: String,
285
286    /// 更新时间
287    pub updated_at: String,
288
289    /// 完成时间
290    #[serde(default)]
291    pub completed_at: Option<String>,
292
293    /// 任务执行者
294    #[serde(default)]
295    pub assignee: Option<String>,
296
297    /// 任务创建者
298    #[serde(default)]
299    pub creator: Option<String>,
300}
301
302/// 获取任务列表响应
303#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
304pub struct ListTasksResponse {
305    /// 是否还有更多项
306    #[serde(default)]
307    pub has_more: bool,
308
309    /// 分页标记
310    #[serde(skip_serializing_if = "Option::is_none")]
311    pub page_token: Option<String>,
312
313    /// 总数
314    #[serde(skip_serializing_if = "Option::is_none")]
315    pub total: Option<i32>,
316
317    /// 列表项
318    #[serde(default)]
319    pub items: Vec<TaskItem>,
320}
321
322#[cfg(test)]
323#[allow(unused_imports)]
324mod tests {
325
326    #[test]
327    fn test_serialization_roundtrip() {
328        // 基础序列化测试
329        let json = r#"{"test": "value"}"#;
330        assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
331    }
332
333    #[test]
334    fn test_deserialization_from_json() {
335        // 基础反序列化测试
336        let json = r#"{"field": "data"}"#;
337        let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
338        assert_eq!(value["field"], "data");
339    }
340}