Skip to main content

openlark_workflow/common/
api_endpoints.rs

1//! 任务 API 端点定义(类型安全枚举系统)
2//!
3//! 本模块提供基于枚举的 API 端点定义,用于生产代码中的类型安全调用。
4
5/// 任务 API V1 端点枚举
6#[derive(Debug, Clone, PartialEq)]
7pub enum TaskApiV1 {
8    /// 创建任务
9    TaskCreate,
10    /// 获取任务详情
11    TaskGet(String),
12    /// 更新任务
13    TaskUpdate(String),
14    /// 删除任务
15    TaskDelete(String),
16    /// 完成任务
17    TaskComplete(String),
18    /// 取消完成任务
19    TaskUncomplete(String),
20    /// 获取任务列表
21    TaskList,
22    /// 创建任务关注者
23    TaskFollowerCreate(String),
24    /// 删除任务关注者
25    TaskFollowerDelete(String, String),
26    /// 获取任务关注者列表
27    TaskFollowerList(String),
28    /// 批量删除任务关注者
29    TaskFollowerBatchDelete(String),
30    /// 创建任务协作者
31    TaskCollaboratorCreate(String),
32    /// 删除任务协作者
33    TaskCollaboratorDelete(String, String),
34    /// 获取任务协作者列表
35    TaskCollaboratorList(String),
36    /// 批量删除任务协作者
37    TaskCollaboratorBatchDelete(String),
38    /// 创建任务提醒
39    TaskReminderCreate(String),
40    /// 删除任务提醒
41    TaskReminderDelete(String, String),
42    /// 获取任务提醒列表
43    TaskReminderList(String),
44    /// 创建任务评论
45    TaskCommentCreate(String),
46    /// 获取任务评论详情
47    TaskCommentGet(String, String),
48    /// 更新任务评论
49    TaskCommentUpdate(String, String),
50    /// 删除任务评论
51    TaskCommentDelete(String, String),
52    /// 获取任务评论列表
53    TaskCommentList(String),
54}
55
56impl TaskApiV1 {
57    /// 生成对应的 URL
58    pub fn to_url(&self) -> String {
59        match self {
60            TaskApiV1::TaskCreate => "/open-apis/task/v1/tasks".to_string(),
61            TaskApiV1::TaskGet(task_id) => format!("/open-apis/task/v1/tasks/{task_id}"),
62            TaskApiV1::TaskUpdate(task_id) => format!("/open-apis/task/v1/tasks/{task_id}"),
63            TaskApiV1::TaskDelete(task_id) => format!("/open-apis/task/v1/tasks/{task_id}"),
64            TaskApiV1::TaskComplete(task_id) => {
65                format!("/open-apis/task/v1/tasks/{task_id}/complete")
66            }
67            TaskApiV1::TaskUncomplete(task_id) => {
68                format!("/open-apis/task/v1/tasks/{task_id}/uncomplete")
69            }
70            TaskApiV1::TaskList => "/open-apis/task/v1/tasks".to_string(),
71            TaskApiV1::TaskFollowerCreate(task_id) => {
72                format!("/open-apis/task/v1/tasks/{task_id}/followers")
73            }
74            TaskApiV1::TaskFollowerDelete(task_id, follower_id) => {
75                format!("/open-apis/task/v1/tasks/{task_id}/followers/{follower_id}")
76            }
77            TaskApiV1::TaskFollowerList(task_id) => {
78                format!("/open-apis/task/v1/tasks/{task_id}/followers")
79            }
80            TaskApiV1::TaskFollowerBatchDelete(task_id) => {
81                format!("/open-apis/task/v1/tasks/{task_id}/batch_delete_follower")
82            }
83            TaskApiV1::TaskCollaboratorCreate(task_id) => {
84                format!("/open-apis/task/v1/tasks/{task_id}/collaborators")
85            }
86            TaskApiV1::TaskCollaboratorDelete(task_id, collaborator_id) => {
87                format!("/open-apis/task/v1/tasks/{task_id}/collaborators/{collaborator_id}")
88            }
89            TaskApiV1::TaskCollaboratorList(task_id) => {
90                format!("/open-apis/task/v1/tasks/{task_id}/collaborators")
91            }
92            TaskApiV1::TaskCollaboratorBatchDelete(task_id) => {
93                format!("/open-apis/task/v1/tasks/{task_id}/batch_delete_collaborator")
94            }
95            TaskApiV1::TaskReminderCreate(task_id) => {
96                format!("/open-apis/task/v1/tasks/{task_id}/reminders")
97            }
98            TaskApiV1::TaskReminderDelete(task_id, reminder_id) => {
99                format!("/open-apis/task/v1/tasks/{task_id}/reminders/{reminder_id}")
100            }
101            TaskApiV1::TaskReminderList(task_id) => {
102                format!("/open-apis/task/v1/tasks/{task_id}/reminders")
103            }
104            TaskApiV1::TaskCommentCreate(task_id) => {
105                format!("/open-apis/task/v1/tasks/{task_id}/comments")
106            }
107            TaskApiV1::TaskCommentGet(task_id, comment_id) => {
108                format!("/open-apis/task/v1/tasks/{task_id}/comments/{comment_id}")
109            }
110            TaskApiV1::TaskCommentUpdate(task_id, comment_id) => {
111                format!("/open-apis/task/v1/tasks/{task_id}/comments/{comment_id}")
112            }
113            TaskApiV1::TaskCommentDelete(task_id, comment_id) => {
114                format!("/open-apis/task/v1/tasks/{task_id}/comments/{comment_id}")
115            }
116            TaskApiV1::TaskCommentList(task_id) => {
117                format!("/open-apis/task/v1/tasks/{task_id}/comments")
118            }
119        }
120    }
121}
122
123/// 任务 API V2 端点枚举
124#[derive(Debug, Clone, PartialEq)]
125pub enum TaskApiV2 {
126    /// 创建任务
127    TaskCreate,
128    /// 获取任务详情
129    TaskGet(String),
130    /// 更新任务
131    TaskUpdate(String),
132    /// 删除任务
133    TaskDelete(String),
134    /// 完成任务
135    TaskComplete(String),
136    /// 取消完成任务
137    TaskUncomplete(String),
138    /// 获取任务列表
139    TaskList,
140    /// 创建任务清单
141    TasklistCreate,
142    /// 获取任务清单详情
143    TasklistGet(String),
144    /// 更新任务清单
145    TasklistUpdate(String),
146    /// 删除任务清单
147    TasklistDelete(String),
148    /// 获取任务清单列表
149    TasklistList,
150    /// 创建分组
151    SectionCreate(String),
152    /// 获取分组详情
153    SectionGet(String, String),
154    /// 更新分组
155    SectionUpdate(String, String),
156    /// 删除分组
157    SectionDelete(String, String),
158    /// 获取分组列表
159    SectionList(String),
160    /// 创建自定义字段
161    CustomFieldCreate(String),
162    /// 获取自定义字段详情
163    CustomFieldGet(String, String),
164    /// 更新自定义字段
165    CustomFieldUpdate(String, String),
166    /// 删除自定义字段
167    CustomFieldDelete(String, String),
168    /// 获取自定义字段列表
169    CustomFieldList(String),
170    /// 创建评论
171    CommentCreate(String),
172    /// 获取评论详情
173    CommentGet(String, String),
174    /// 更新评论
175    CommentUpdate(String, String),
176    /// 删除评论
177    CommentDelete(String, String),
178    /// 获取评论列表
179    CommentList(String),
180    /// 上传附件
181    AttachmentUpload(String),
182    /// 删除附件
183    AttachmentDelete(String, String),
184
185    // 子任务相关
186    /// 创建子任务
187    SubtaskCreate(String),
188    /// 获取子任务列表
189    SubtaskList(String),
190
191    // 任务相关扩展
192    /// 添加任务到任务清单
193    TaskAddTasklist(String),
194    /// 从任务清单移除任务
195    TaskRemoveTasklist(String),
196    /// 获取任务所属任务清单列表
197    TaskGetTasklists(String),
198    /// 添加任务成员
199    TaskAddMembers(String),
200    /// 移除任务成员
201    TaskRemoveMembers(String),
202    /// 添加任务提醒
203    TaskAddReminders(String),
204    /// 移除任务提醒
205    TaskRemoveReminders(String),
206    /// 添加任务依赖
207    TaskAddDependencies(String),
208    /// 移除任务依赖
209    TaskRemoveDependencies(String),
210
211    // 任务清单相关扩展
212    /// 获取任务清单中的任务列表
213    TasklistGetTasks(String),
214    /// 添加任务清单成员
215    TasklistAddMembers(String),
216    /// 移除任务清单成员
217    TasklistRemoveMembers(String),
218
219    // 分组相关扩展
220    /// 获取分组中的任务列表
221    SectionGetTasks(String),
222
223    // 活动订阅相关
224    /// 创建活动订阅
225    ActivitySubscriptionCreate(String),
226    /// 获取活动订阅详情
227    ActivitySubscriptionGet(String, String),
228    /// 更新活动订阅
229    ActivitySubscriptionUpdate(String, String),
230    /// 删除活动订阅
231    ActivitySubscriptionDelete(String, String),
232    /// 获取活动订阅列表
233    ActivitySubscriptionList(String),
234
235    // 自定义字段选项相关
236    /// 创建自定义字段选项
237    CustomFieldOptionCreate(String),
238    /// 更新自定义字段选项
239    CustomFieldOptionUpdate(String, String),
240
241    // 附件相关扩展
242    /// 获取附件详情
243    AttachmentGet(String),
244    /// 获取附件列表
245    AttachmentList,
246
247    // 自定义字段 add/remove
248    /// 添加自定义字段到任务清单
249    CustomFieldAdd(String),
250    /// 从任务清单移除自定义字段
251    CustomFieldRemove(String),
252}
253
254impl TaskApiV2 {
255    /// 生成对应的 URL
256    pub fn to_url(&self) -> String {
257        match self {
258            // 任务相关
259            TaskApiV2::TaskCreate => "/open-apis/task/v2/tasks".to_string(),
260            TaskApiV2::TaskGet(task_guid) => {
261                format!("/open-apis/task/v2/tasks/{task_guid}")
262            }
263            TaskApiV2::TaskUpdate(task_guid) => {
264                format!("/open-apis/task/v2/tasks/{task_guid}")
265            }
266            TaskApiV2::TaskDelete(task_guid) => {
267                format!("/open-apis/task/v2/tasks/{task_guid}")
268            }
269            TaskApiV2::TaskComplete(task_guid) => {
270                format!("/open-apis/task/v2/tasks/{task_guid}/complete")
271            }
272            TaskApiV2::TaskUncomplete(task_guid) => {
273                format!("/open-apis/task/v2/tasks/{task_guid}/uncomplete")
274            }
275            TaskApiV2::TaskList => "/open-apis/task/v2/tasks".to_string(),
276
277            // 任务清单相关
278            TaskApiV2::TasklistCreate => "/open-apis/task/v2/tasklists".to_string(),
279            TaskApiV2::TasklistGet(tasklist_guid) => {
280                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
281            }
282            TaskApiV2::TasklistUpdate(tasklist_guid) => {
283                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
284            }
285            TaskApiV2::TasklistDelete(tasklist_guid) => {
286                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
287            }
288            TaskApiV2::TasklistList => "/open-apis/task/v2/tasklists".to_string(),
289
290            // 分组相关
291            TaskApiV2::SectionCreate(tasklist_guid) => {
292                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/sections")
293            }
294            TaskApiV2::SectionGet(tasklist_guid, section_guid) => {
295                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/sections/{section_guid}")
296            }
297            TaskApiV2::SectionUpdate(tasklist_guid, section_guid) => {
298                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/sections/{section_guid}")
299            }
300            TaskApiV2::SectionDelete(tasklist_guid, section_guid) => {
301                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/sections/{section_guid}")
302            }
303            TaskApiV2::SectionList(tasklist_guid) => {
304                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/sections")
305            }
306
307            // 自定义字段相关
308            TaskApiV2::CustomFieldCreate(tasklist_guid) => {
309                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/custom_fields")
310            }
311            TaskApiV2::CustomFieldGet(tasklist_guid, field_guid) => {
312                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/custom_fields/{field_guid}")
313            }
314            TaskApiV2::CustomFieldUpdate(tasklist_guid, field_guid) => {
315                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/custom_fields/{field_guid}")
316            }
317            TaskApiV2::CustomFieldDelete(tasklist_guid, field_guid) => {
318                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/custom_fields/{field_guid}")
319            }
320            TaskApiV2::CustomFieldList(tasklist_guid) => {
321                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/custom_fields")
322            }
323
324            // 评论相关
325            TaskApiV2::CommentCreate(task_guid) => {
326                format!("/open-apis/task/v2/tasks/{task_guid}/comments")
327            }
328            TaskApiV2::CommentGet(task_guid, comment_guid) => {
329                format!("/open-apis/task/v2/tasks/{task_guid}/comments/{comment_guid}")
330            }
331            TaskApiV2::CommentUpdate(task_guid, comment_guid) => {
332                format!("/open-apis/task/v2/tasks/{task_guid}/comments/{comment_guid}")
333            }
334            TaskApiV2::CommentDelete(task_guid, comment_guid) => {
335                format!("/open-apis/task/v2/tasks/{task_guid}/comments/{comment_guid}")
336            }
337            TaskApiV2::CommentList(task_guid) => {
338                format!("/open-apis/task/v2/tasks/{task_guid}/comments")
339            }
340
341            // 附件相关
342            TaskApiV2::AttachmentUpload(task_guid) => {
343                format!("/open-apis/task/v2/tasks/{task_guid}/attachments")
344            }
345            TaskApiV2::AttachmentDelete(task_guid, attachment_guid) => {
346                format!("/open-apis/task/v2/tasks/{task_guid}/attachments/{attachment_guid}")
347            }
348
349            // 子任务相关
350            TaskApiV2::SubtaskCreate(task_guid) => {
351                format!("/open-apis/task/v2/tasks/{task_guid}/subtasks")
352            }
353            TaskApiV2::SubtaskList(task_guid) => {
354                format!("/open-apis/task/v2/tasks/{task_guid}/subtasks")
355            }
356
357            // 任务相关扩展
358            TaskApiV2::TaskAddTasklist(task_guid) => {
359                format!("/open-apis/task/v2/tasks/{task_guid}/add_tasklist")
360            }
361            TaskApiV2::TaskRemoveTasklist(task_guid) => {
362                format!("/open-apis/task/v2/tasks/{task_guid}/remove_tasklist")
363            }
364            TaskApiV2::TaskGetTasklists(task_guid) => {
365                format!("/open-apis/task/v2/tasks/{task_guid}/tasklists")
366            }
367            TaskApiV2::TaskAddMembers(task_guid) => {
368                format!("/open-apis/task/v2/tasks/{task_guid}/add_members")
369            }
370            TaskApiV2::TaskRemoveMembers(task_guid) => {
371                format!("/open-apis/task/v2/tasks/{task_guid}/remove_members")
372            }
373            TaskApiV2::TaskAddReminders(task_guid) => {
374                format!("/open-apis/task/v2/tasks/{task_guid}/add_reminders")
375            }
376            TaskApiV2::TaskRemoveReminders(task_guid) => {
377                format!("/open-apis/task/v2/tasks/{task_guid}/remove_reminders")
378            }
379            TaskApiV2::TaskAddDependencies(task_guid) => {
380                format!("/open-apis/task/v2/tasks/{task_guid}/add_dependencies")
381            }
382            TaskApiV2::TaskRemoveDependencies(task_guid) => {
383                format!("/open-apis/task/v2/tasks/{task_guid}/remove_dependencies")
384            }
385
386            // 任务清单相关扩展
387            TaskApiV2::TasklistGetTasks(tasklist_guid) => {
388                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/tasks")
389            }
390            TaskApiV2::TasklistAddMembers(tasklist_guid) => {
391                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/add_members")
392            }
393            TaskApiV2::TasklistRemoveMembers(tasklist_guid) => {
394                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/remove_members")
395            }
396
397            // 分组相关扩展
398            TaskApiV2::SectionGetTasks(section_guid) => {
399                format!("/open-apis/task/v2/sections/{section_guid}/tasks")
400            }
401
402            // 活动订阅相关
403            TaskApiV2::ActivitySubscriptionCreate(tasklist_guid) => {
404                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions")
405            }
406            TaskApiV2::ActivitySubscriptionGet(tasklist_guid, subscription_guid) => {
407                format!(
408                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
409                )
410            }
411            TaskApiV2::ActivitySubscriptionUpdate(tasklist_guid, subscription_guid) => {
412                format!(
413                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
414                )
415            }
416            TaskApiV2::ActivitySubscriptionDelete(tasklist_guid, subscription_guid) => {
417                format!(
418                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
419                )
420            }
421            TaskApiV2::ActivitySubscriptionList(tasklist_guid) => {
422                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions")
423            }
424
425            // 自定义字段选项相关
426            TaskApiV2::CustomFieldOptionCreate(custom_field_guid) => {
427                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/options")
428            }
429            TaskApiV2::CustomFieldOptionUpdate(custom_field_guid, option_guid) => {
430                format!(
431                    "/open-apis/task/v2/custom_fields/{custom_field_guid}/options/{option_guid}"
432                )
433            }
434
435            // 附件相关扩展
436            TaskApiV2::AttachmentGet(attachment_guid) => {
437                format!("/open-apis/task/v2/attachments/{attachment_guid}")
438            }
439            TaskApiV2::AttachmentList => "/open-apis/task/v2/attachments".to_string(),
440
441            // 自定义字段 add/remove
442            TaskApiV2::CustomFieldAdd(custom_field_guid) => {
443                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/add")
444            }
445            TaskApiV2::CustomFieldRemove(custom_field_guid) => {
446                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/remove")
447            }
448        }
449    }
450}
451
452/// 审批 API V4 端点枚举
453#[derive(Debug, Clone, PartialEq)]
454pub enum ApprovalApiV4 {
455    /// 创建审批定义
456    ApprovalCreate,
457    /// 查看指定审批定义
458    ApprovalGet(String),
459    /// 订阅审批事件
460    ApprovalSubscribe(String),
461    /// 取消订阅审批事件
462    ApprovalUnsubscribe(String),
463    /// 创建三方审批定义
464    ExternalApprovalCreate,
465    /// 查看指定三方审批定义
466    ExternalApprovalGet(String),
467    /// 校验三方审批实例
468    ExternalInstanceCheck,
469    /// 同步三方审批实例
470    ExternalInstanceCreate,
471    /// 获取三方审批任务状态
472    ExternalTaskList,
473    /// 审批任务加签
474    InstanceAddSign,
475    /// 撤回审批实例
476    InstanceCancel,
477    /// 抄送审批实例
478    InstanceCc,
479    /// 创建审批实例
480    InstanceCreate,
481    /// 获取单个审批实例详情
482    InstanceGet(String),
483    /// 批量获取审批实例 ID
484    InstanceList(String),
485    /// 预览审批流程
486    InstancePreview,
487    /// 查询实例列表
488    InstanceQuery,
489    /// 查询抄送列表
490    InstanceSearchCc,
491    /// 退回审批任务
492    InstanceSpecifiedRollback(String),
493    /// 创建评论
494    InstanceCommentCreate(String),
495    /// 删除评论
496    InstanceCommentDelete(String, String),
497    /// 获取评论列表
498    InstanceCommentList(String),
499    /// 同意审批任务
500    TaskApprove,
501    /// 查询用户的任务列表
502    TaskQuery,
503    /// 拒绝审批任务
504    TaskReject,
505    /// 重新提交审批任务
506    TaskResubmit,
507    /// 查询任务列表
508    TaskSearch,
509    /// 转交审批任务
510    TaskTransfer,
511}
512
513impl ApprovalApiV4 {
514    /// 生成对应的 URL
515    pub fn to_url(&self) -> String {
516        match self {
517            // 审批定义相关
518            ApprovalApiV4::ApprovalCreate => "/open-apis/approval/v4/approvals".to_string(),
519            ApprovalApiV4::ApprovalGet(approval_code) => {
520                format!("/open-apis/approval/v4/approvals/{approval_code}")
521            }
522            ApprovalApiV4::ApprovalSubscribe(approval_code) => {
523                format!("/open-apis/approval/v4/approvals/{approval_code}/subscribe")
524            }
525            ApprovalApiV4::ApprovalUnsubscribe(approval_code) => {
526                format!("/open-apis/approval/v4/approvals/{approval_code}/unsubscribe")
527            }
528
529            // 三方审批定义相关
530            ApprovalApiV4::ExternalApprovalCreate => {
531                "/open-apis/approval/v4/external_approvals".to_string()
532            }
533            ApprovalApiV4::ExternalApprovalGet(approval_code) => {
534                format!("/open-apis/approval/v4/external_approvals/{approval_code}")
535            }
536
537            // 三方审批实例相关
538            ApprovalApiV4::ExternalInstanceCheck => {
539                "/open-apis/approval/v4/external_instances/check".to_string()
540            }
541            ApprovalApiV4::ExternalInstanceCreate => {
542                "/open-apis/approval/v4/external_instances".to_string()
543            }
544
545            // 三方审批任务相关
546            ApprovalApiV4::ExternalTaskList => "/open-apis/approval/v4/external_tasks".to_string(),
547
548            // 审批实例相关
549            ApprovalApiV4::InstanceAddSign => {
550                "/open-apis/approval/v4/instances/add_sign".to_string()
551            }
552            ApprovalApiV4::InstanceCancel => "/open-apis/approval/v4/instances/cancel".to_string(),
553            ApprovalApiV4::InstanceCc => "/open-apis/approval/v4/instances/cc".to_string(),
554            ApprovalApiV4::InstanceCreate => "/open-apis/approval/v4/instances".to_string(),
555            ApprovalApiV4::InstanceGet(instance_id) => {
556                format!("/open-apis/approval/v4/instances/{instance_id}")
557            }
558            ApprovalApiV4::InstanceList(approval_code) => {
559                format!("/open-apis/approval/v4/instances?approval_code={approval_code}")
560            }
561            ApprovalApiV4::InstancePreview => {
562                "/open-apis/approval/v4/instances/preview".to_string()
563            }
564            ApprovalApiV4::InstanceQuery => "/open-apis/approval/v4/instances/query".to_string(),
565            ApprovalApiV4::InstanceSearchCc => {
566                "/open-apis/approval/v4/instances/search_cc".to_string()
567            }
568            ApprovalApiV4::InstanceSpecifiedRollback(_) => {
569                "/open-apis/approval/v4/instances/specified_rollback".to_string()
570            }
571
572            // 审批实例评论相关
573            ApprovalApiV4::InstanceCommentCreate(instance_id) => {
574                format!("/open-apis/approval/v4/instances/{instance_id}/comments")
575            }
576            ApprovalApiV4::InstanceCommentDelete(instance_id, comment_id) => {
577                format!("/open-apis/approval/v4/instances/{instance_id}/comments/{comment_id}")
578            }
579            ApprovalApiV4::InstanceCommentList(instance_id) => {
580                format!("/open-apis/approval/v4/instances/{instance_id}/comments")
581            }
582
583            // 审批任务相关
584            ApprovalApiV4::TaskApprove => "/open-apis/approval/v4/tasks/approve".to_string(),
585            ApprovalApiV4::TaskQuery => "/open-apis/approval/v4/tasks/query".to_string(),
586            ApprovalApiV4::TaskReject => "/open-apis/approval/v4/tasks/reject".to_string(),
587            ApprovalApiV4::TaskResubmit => "/open-apis/approval/v4/tasks/resubmit".to_string(),
588            ApprovalApiV4::TaskSearch => "/open-apis/approval/v4/tasks/search".to_string(),
589            ApprovalApiV4::TaskTransfer => "/open-apis/approval/v4/tasks/transfer".to_string(),
590        }
591    }
592}
593
594/// 白板 API V1 端点枚举
595#[derive(Debug, Clone, PartialEq)]
596pub enum BoardApiV1 {
597    /// 创建节点
598    WhiteboardNodeCreate(String),
599    /// 获取节点列表
600    WhiteboardNodeList(String),
601    /// 更新主题
602    WhiteboardUpdateTheme(String),
603    /// 获取主题
604    WhiteboardTheme(String),
605    /// 下载为图片
606    WhiteboardDownloadAsImage(String),
607    /// 创建 PlantUML 节点
608    WhiteboardNodeCreatePlantuml(String),
609}
610
611impl BoardApiV1 {
612    /// 生成对应的 URL
613    pub fn to_url(&self) -> String {
614        match self {
615            BoardApiV1::WhiteboardNodeCreate(board_id) => {
616                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes")
617            }
618            BoardApiV1::WhiteboardNodeList(board_id) => {
619                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes")
620            }
621            BoardApiV1::WhiteboardUpdateTheme(board_id) => {
622                format!("/open-apis/board/v1/whiteboards/{board_id}/update_theme")
623            }
624            BoardApiV1::WhiteboardTheme(board_id) => {
625                format!("/open-apis/board/v1/whiteboards/{board_id}/theme")
626            }
627            BoardApiV1::WhiteboardDownloadAsImage(board_id) => {
628                format!("/open-apis/board/v1/whiteboards/{board_id}/download_as_image")
629            }
630            BoardApiV1::WhiteboardNodeCreatePlantuml(board_id) => {
631                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes/plantuml")
632            }
633        }
634    }
635}
636
637#[cfg(test)]
638#[allow(unused_imports)]
639mod tests {
640    use super::*;
641
642    #[test]
643    fn test_task_api_v1_to_url() {
644        let cases = vec![
645            (
646                TaskApiV1::TaskCreate,
647                "/open-apis/task/v1/tasks".to_string(),
648            ),
649            (
650                TaskApiV1::TaskGet("task_1".to_string()),
651                "/open-apis/task/v1/tasks/task_1".to_string(),
652            ),
653            (
654                TaskApiV1::TaskUpdate("task_1".to_string()),
655                "/open-apis/task/v1/tasks/task_1".to_string(),
656            ),
657            (
658                TaskApiV1::TaskDelete("task_1".to_string()),
659                "/open-apis/task/v1/tasks/task_1".to_string(),
660            ),
661            (
662                TaskApiV1::TaskComplete("task_1".to_string()),
663                "/open-apis/task/v1/tasks/task_1/complete".to_string(),
664            ),
665            (
666                TaskApiV1::TaskUncomplete("task_1".to_string()),
667                "/open-apis/task/v1/tasks/task_1/uncomplete".to_string(),
668            ),
669            (TaskApiV1::TaskList, "/open-apis/task/v1/tasks".to_string()),
670            (
671                TaskApiV1::TaskFollowerCreate("task_1".to_string()),
672                "/open-apis/task/v1/tasks/task_1/followers".to_string(),
673            ),
674            (
675                TaskApiV1::TaskFollowerDelete("task_1".to_string(), "f1".to_string()),
676                "/open-apis/task/v1/tasks/task_1/followers/f1".to_string(),
677            ),
678            (
679                TaskApiV1::TaskFollowerList("task_1".to_string()),
680                "/open-apis/task/v1/tasks/task_1/followers".to_string(),
681            ),
682            (
683                TaskApiV1::TaskFollowerBatchDelete("task_1".to_string()),
684                "/open-apis/task/v1/tasks/task_1/batch_delete_follower".to_string(),
685            ),
686            (
687                TaskApiV1::TaskCollaboratorCreate("task_1".to_string()),
688                "/open-apis/task/v1/tasks/task_1/collaborators".to_string(),
689            ),
690            (
691                TaskApiV1::TaskCollaboratorDelete("task_1".to_string(), "c1".to_string()),
692                "/open-apis/task/v1/tasks/task_1/collaborators/c1".to_string(),
693            ),
694            (
695                TaskApiV1::TaskCollaboratorList("task_1".to_string()),
696                "/open-apis/task/v1/tasks/task_1/collaborators".to_string(),
697            ),
698            (
699                TaskApiV1::TaskCollaboratorBatchDelete("task_1".to_string()),
700                "/open-apis/task/v1/tasks/task_1/batch_delete_collaborator".to_string(),
701            ),
702            (
703                TaskApiV1::TaskReminderCreate("task_1".to_string()),
704                "/open-apis/task/v1/tasks/task_1/reminders".to_string(),
705            ),
706            (
707                TaskApiV1::TaskReminderDelete("task_1".to_string(), "r1".to_string()),
708                "/open-apis/task/v1/tasks/task_1/reminders/r1".to_string(),
709            ),
710            (
711                TaskApiV1::TaskReminderList("task_1".to_string()),
712                "/open-apis/task/v1/tasks/task_1/reminders".to_string(),
713            ),
714            (
715                TaskApiV1::TaskCommentCreate("task_1".to_string()),
716                "/open-apis/task/v1/tasks/task_1/comments".to_string(),
717            ),
718            (
719                TaskApiV1::TaskCommentGet("task_1".to_string(), "cm1".to_string()),
720                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
721            ),
722            (
723                TaskApiV1::TaskCommentUpdate("task_1".to_string(), "cm1".to_string()),
724                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
725            ),
726            (
727                TaskApiV1::TaskCommentDelete("task_1".to_string(), "cm1".to_string()),
728                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
729            ),
730            (
731                TaskApiV1::TaskCommentList("task_1".to_string()),
732                "/open-apis/task/v1/tasks/task_1/comments".to_string(),
733            ),
734        ];
735
736        for (api, expected) in cases {
737            assert_eq!(api.to_url(), expected);
738        }
739    }
740
741    #[test]
742    fn test_task_api_v2_to_url() {
743        let cases = vec![
744            (
745                TaskApiV2::TaskCreate,
746                "/open-apis/task/v2/tasks".to_string(),
747            ),
748            (
749                TaskApiV2::TaskGet("t1".to_string()),
750                "/open-apis/task/v2/tasks/t1".to_string(),
751            ),
752            (
753                TaskApiV2::TaskUpdate("t1".to_string()),
754                "/open-apis/task/v2/tasks/t1".to_string(),
755            ),
756            (
757                TaskApiV2::TaskDelete("t1".to_string()),
758                "/open-apis/task/v2/tasks/t1".to_string(),
759            ),
760            (
761                TaskApiV2::TaskComplete("t1".to_string()),
762                "/open-apis/task/v2/tasks/t1/complete".to_string(),
763            ),
764            (
765                TaskApiV2::TaskUncomplete("t1".to_string()),
766                "/open-apis/task/v2/tasks/t1/uncomplete".to_string(),
767            ),
768            (TaskApiV2::TaskList, "/open-apis/task/v2/tasks".to_string()),
769            (
770                TaskApiV2::TasklistCreate,
771                "/open-apis/task/v2/tasklists".to_string(),
772            ),
773            (
774                TaskApiV2::TasklistGet("tl1".to_string()),
775                "/open-apis/task/v2/tasklists/tl1".to_string(),
776            ),
777            (
778                TaskApiV2::TasklistUpdate("tl1".to_string()),
779                "/open-apis/task/v2/tasklists/tl1".to_string(),
780            ),
781            (
782                TaskApiV2::TasklistDelete("tl1".to_string()),
783                "/open-apis/task/v2/tasklists/tl1".to_string(),
784            ),
785            (
786                TaskApiV2::TasklistList,
787                "/open-apis/task/v2/tasklists".to_string(),
788            ),
789            (
790                TaskApiV2::SectionCreate("tl1".to_string()),
791                "/open-apis/task/v2/tasklists/tl1/sections".to_string(),
792            ),
793            (
794                TaskApiV2::SectionGet("tl1".to_string(), "s1".to_string()),
795                "/open-apis/task/v2/tasklists/tl1/sections/s1".to_string(),
796            ),
797            (
798                TaskApiV2::SectionUpdate("tl1".to_string(), "s1".to_string()),
799                "/open-apis/task/v2/tasklists/tl1/sections/s1".to_string(),
800            ),
801            (
802                TaskApiV2::SectionDelete("tl1".to_string(), "s1".to_string()),
803                "/open-apis/task/v2/tasklists/tl1/sections/s1".to_string(),
804            ),
805            (
806                TaskApiV2::SectionList("tl1".to_string()),
807                "/open-apis/task/v2/tasklists/tl1/sections".to_string(),
808            ),
809            (
810                TaskApiV2::CustomFieldCreate("tl1".to_string()),
811                "/open-apis/task/v2/tasklists/tl1/custom_fields".to_string(),
812            ),
813            (
814                TaskApiV2::CustomFieldGet("tl1".to_string(), "f1".to_string()),
815                "/open-apis/task/v2/tasklists/tl1/custom_fields/f1".to_string(),
816            ),
817            (
818                TaskApiV2::CustomFieldUpdate("tl1".to_string(), "f1".to_string()),
819                "/open-apis/task/v2/tasklists/tl1/custom_fields/f1".to_string(),
820            ),
821            (
822                TaskApiV2::CustomFieldDelete("tl1".to_string(), "f1".to_string()),
823                "/open-apis/task/v2/tasklists/tl1/custom_fields/f1".to_string(),
824            ),
825            (
826                TaskApiV2::CustomFieldList("tl1".to_string()),
827                "/open-apis/task/v2/tasklists/tl1/custom_fields".to_string(),
828            ),
829            (
830                TaskApiV2::CommentCreate("t1".to_string()),
831                "/open-apis/task/v2/tasks/t1/comments".to_string(),
832            ),
833            (
834                TaskApiV2::CommentGet("t1".to_string(), "c1".to_string()),
835                "/open-apis/task/v2/tasks/t1/comments/c1".to_string(),
836            ),
837            (
838                TaskApiV2::CommentUpdate("t1".to_string(), "c1".to_string()),
839                "/open-apis/task/v2/tasks/t1/comments/c1".to_string(),
840            ),
841            (
842                TaskApiV2::CommentDelete("t1".to_string(), "c1".to_string()),
843                "/open-apis/task/v2/tasks/t1/comments/c1".to_string(),
844            ),
845            (
846                TaskApiV2::CommentList("t1".to_string()),
847                "/open-apis/task/v2/tasks/t1/comments".to_string(),
848            ),
849            (
850                TaskApiV2::AttachmentUpload("t1".to_string()),
851                "/open-apis/task/v2/tasks/t1/attachments".to_string(),
852            ),
853            (
854                TaskApiV2::AttachmentDelete("t1".to_string(), "a1".to_string()),
855                "/open-apis/task/v2/tasks/t1/attachments/a1".to_string(),
856            ),
857            (
858                TaskApiV2::SubtaskCreate("t1".to_string()),
859                "/open-apis/task/v2/tasks/t1/subtasks".to_string(),
860            ),
861            (
862                TaskApiV2::SubtaskList("t1".to_string()),
863                "/open-apis/task/v2/tasks/t1/subtasks".to_string(),
864            ),
865            (
866                TaskApiV2::TaskAddTasklist("t1".to_string()),
867                "/open-apis/task/v2/tasks/t1/add_tasklist".to_string(),
868            ),
869            (
870                TaskApiV2::TaskRemoveTasklist("t1".to_string()),
871                "/open-apis/task/v2/tasks/t1/remove_tasklist".to_string(),
872            ),
873            (
874                TaskApiV2::TaskGetTasklists("t1".to_string()),
875                "/open-apis/task/v2/tasks/t1/tasklists".to_string(),
876            ),
877            (
878                TaskApiV2::TaskAddMembers("t1".to_string()),
879                "/open-apis/task/v2/tasks/t1/add_members".to_string(),
880            ),
881            (
882                TaskApiV2::TaskRemoveMembers("t1".to_string()),
883                "/open-apis/task/v2/tasks/t1/remove_members".to_string(),
884            ),
885            (
886                TaskApiV2::TaskAddReminders("t1".to_string()),
887                "/open-apis/task/v2/tasks/t1/add_reminders".to_string(),
888            ),
889            (
890                TaskApiV2::TaskRemoveReminders("t1".to_string()),
891                "/open-apis/task/v2/tasks/t1/remove_reminders".to_string(),
892            ),
893            (
894                TaskApiV2::TaskAddDependencies("t1".to_string()),
895                "/open-apis/task/v2/tasks/t1/add_dependencies".to_string(),
896            ),
897            (
898                TaskApiV2::TaskRemoveDependencies("t1".to_string()),
899                "/open-apis/task/v2/tasks/t1/remove_dependencies".to_string(),
900            ),
901            (
902                TaskApiV2::TasklistGetTasks("tl1".to_string()),
903                "/open-apis/task/v2/tasklists/tl1/tasks".to_string(),
904            ),
905            (
906                TaskApiV2::TasklistAddMembers("tl1".to_string()),
907                "/open-apis/task/v2/tasklists/tl1/add_members".to_string(),
908            ),
909            (
910                TaskApiV2::TasklistRemoveMembers("tl1".to_string()),
911                "/open-apis/task/v2/tasklists/tl1/remove_members".to_string(),
912            ),
913            (
914                TaskApiV2::SectionGetTasks("s1".to_string()),
915                "/open-apis/task/v2/sections/s1/tasks".to_string(),
916            ),
917            (
918                TaskApiV2::ActivitySubscriptionCreate("tl1".to_string()),
919                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions".to_string(),
920            ),
921            (
922                TaskApiV2::ActivitySubscriptionGet("tl1".to_string(), "as1".to_string()),
923                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
924            ),
925            (
926                TaskApiV2::ActivitySubscriptionUpdate("tl1".to_string(), "as1".to_string()),
927                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
928            ),
929            (
930                TaskApiV2::ActivitySubscriptionDelete("tl1".to_string(), "as1".to_string()),
931                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
932            ),
933            (
934                TaskApiV2::ActivitySubscriptionList("tl1".to_string()),
935                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions".to_string(),
936            ),
937            (
938                TaskApiV2::CustomFieldOptionCreate("cf1".to_string()),
939                "/open-apis/task/v2/custom_fields/cf1/options".to_string(),
940            ),
941            (
942                TaskApiV2::CustomFieldOptionUpdate("cf1".to_string(), "op1".to_string()),
943                "/open-apis/task/v2/custom_fields/cf1/options/op1".to_string(),
944            ),
945            (
946                TaskApiV2::AttachmentGet("a1".to_string()),
947                "/open-apis/task/v2/attachments/a1".to_string(),
948            ),
949            (
950                TaskApiV2::AttachmentList,
951                "/open-apis/task/v2/attachments".to_string(),
952            ),
953            (
954                TaskApiV2::CustomFieldAdd("cf1".to_string()),
955                "/open-apis/task/v2/custom_fields/cf1/add".to_string(),
956            ),
957            (
958                TaskApiV2::CustomFieldRemove("cf1".to_string()),
959                "/open-apis/task/v2/custom_fields/cf1/remove".to_string(),
960            ),
961        ];
962
963        for (api, expected) in cases {
964            assert_eq!(api.to_url(), expected);
965        }
966    }
967
968    #[test]
969    fn test_approval_api_v4_to_url() {
970        let cases = vec![
971            (
972                ApprovalApiV4::ApprovalCreate,
973                "/open-apis/approval/v4/approvals".to_string(),
974            ),
975            (
976                ApprovalApiV4::ApprovalGet("code1".to_string()),
977                "/open-apis/approval/v4/approvals/code1".to_string(),
978            ),
979            (
980                ApprovalApiV4::ApprovalSubscribe("code1".to_string()),
981                "/open-apis/approval/v4/approvals/code1/subscribe".to_string(),
982            ),
983            (
984                ApprovalApiV4::ApprovalUnsubscribe("code1".to_string()),
985                "/open-apis/approval/v4/approvals/code1/unsubscribe".to_string(),
986            ),
987            (
988                ApprovalApiV4::ExternalApprovalCreate,
989                "/open-apis/approval/v4/external_approvals".to_string(),
990            ),
991            (
992                ApprovalApiV4::ExternalApprovalGet("code1".to_string()),
993                "/open-apis/approval/v4/external_approvals/code1".to_string(),
994            ),
995            (
996                ApprovalApiV4::ExternalInstanceCheck,
997                "/open-apis/approval/v4/external_instances/check".to_string(),
998            ),
999            (
1000                ApprovalApiV4::ExternalInstanceCreate,
1001                "/open-apis/approval/v4/external_instances".to_string(),
1002            ),
1003            (
1004                ApprovalApiV4::ExternalTaskList,
1005                "/open-apis/approval/v4/external_tasks".to_string(),
1006            ),
1007            (
1008                ApprovalApiV4::InstanceAddSign,
1009                "/open-apis/approval/v4/instances/add_sign".to_string(),
1010            ),
1011            (
1012                ApprovalApiV4::InstanceCancel,
1013                "/open-apis/approval/v4/instances/cancel".to_string(),
1014            ),
1015            (
1016                ApprovalApiV4::InstanceCc,
1017                "/open-apis/approval/v4/instances/cc".to_string(),
1018            ),
1019            (
1020                ApprovalApiV4::InstanceCreate,
1021                "/open-apis/approval/v4/instances".to_string(),
1022            ),
1023            (
1024                ApprovalApiV4::InstanceGet("ins1".to_string()),
1025                "/open-apis/approval/v4/instances/ins1".to_string(),
1026            ),
1027            (
1028                ApprovalApiV4::InstanceList("code1".to_string()),
1029                "/open-apis/approval/v4/instances?approval_code=code1".to_string(),
1030            ),
1031            (
1032                ApprovalApiV4::InstancePreview,
1033                "/open-apis/approval/v4/instances/preview".to_string(),
1034            ),
1035            (
1036                ApprovalApiV4::InstanceQuery,
1037                "/open-apis/approval/v4/instances/query".to_string(),
1038            ),
1039            (
1040                ApprovalApiV4::InstanceSearchCc,
1041                "/open-apis/approval/v4/instances/search_cc".to_string(),
1042            ),
1043            (
1044                ApprovalApiV4::InstanceSpecifiedRollback("ins1".to_string()),
1045                "/open-apis/approval/v4/instances/specified_rollback".to_string(),
1046            ),
1047            (
1048                ApprovalApiV4::InstanceCommentCreate("ins1".to_string()),
1049                "/open-apis/approval/v4/instances/ins1/comments".to_string(),
1050            ),
1051            (
1052                ApprovalApiV4::InstanceCommentDelete("ins1".to_string(), "c1".to_string()),
1053                "/open-apis/approval/v4/instances/ins1/comments/c1".to_string(),
1054            ),
1055            (
1056                ApprovalApiV4::InstanceCommentList("ins1".to_string()),
1057                "/open-apis/approval/v4/instances/ins1/comments".to_string(),
1058            ),
1059            (
1060                ApprovalApiV4::TaskApprove,
1061                "/open-apis/approval/v4/tasks/approve".to_string(),
1062            ),
1063            (
1064                ApprovalApiV4::TaskQuery,
1065                "/open-apis/approval/v4/tasks/query".to_string(),
1066            ),
1067            (
1068                ApprovalApiV4::TaskReject,
1069                "/open-apis/approval/v4/tasks/reject".to_string(),
1070            ),
1071            (
1072                ApprovalApiV4::TaskResubmit,
1073                "/open-apis/approval/v4/tasks/resubmit".to_string(),
1074            ),
1075            (
1076                ApprovalApiV4::TaskSearch,
1077                "/open-apis/approval/v4/tasks/search".to_string(),
1078            ),
1079            (
1080                ApprovalApiV4::TaskTransfer,
1081                "/open-apis/approval/v4/tasks/transfer".to_string(),
1082            ),
1083        ];
1084
1085        for (api, expected) in cases {
1086            assert_eq!(api.to_url(), expected);
1087        }
1088    }
1089
1090    #[test]
1091    fn test_board_api_v1_to_url() {
1092        let cases = vec![
1093            (
1094                BoardApiV1::WhiteboardNodeCreate("b1".to_string()),
1095                "/open-apis/board/v1/whiteboards/b1/nodes".to_string(),
1096            ),
1097            (
1098                BoardApiV1::WhiteboardNodeList("b1".to_string()),
1099                "/open-apis/board/v1/whiteboards/b1/nodes".to_string(),
1100            ),
1101            (
1102                BoardApiV1::WhiteboardUpdateTheme("b1".to_string()),
1103                "/open-apis/board/v1/whiteboards/b1/update_theme".to_string(),
1104            ),
1105            (
1106                BoardApiV1::WhiteboardTheme("b1".to_string()),
1107                "/open-apis/board/v1/whiteboards/b1/theme".to_string(),
1108            ),
1109            (
1110                BoardApiV1::WhiteboardDownloadAsImage("b1".to_string()),
1111                "/open-apis/board/v1/whiteboards/b1/download_as_image".to_string(),
1112            ),
1113            (
1114                BoardApiV1::WhiteboardNodeCreatePlantuml("b1".to_string()),
1115                "/open-apis/board/v1/whiteboards/b1/nodes/plantuml".to_string(),
1116            ),
1117        ];
1118
1119        for (api, expected) in cases {
1120            assert_eq!(api.to_url(), expected);
1121        }
1122    }
1123
1124    #[test]
1125    fn issue_194_workflow_new_endpoint_paths() {
1126        assert_eq!(
1127            crate::common::BoardV1Endpoint::WhiteboardNodeBatchDelete("board_123".to_string())
1128                .to_url(),
1129            "/open-apis/board/v1/whiteboards/board_123/nodes/batch_delete"
1130        );
1131        assert_eq!(
1132            crate::common::TaskV2Endpoint::TaskSetAncestorTask("task_123".to_string()).to_url(),
1133            "/open-apis/task/v2/tasks/task_123/set_ancestor_task"
1134        );
1135        assert_eq!(
1136            crate::common::TaskV2Endpoint::ListRelatedTask.to_url(),
1137            "/open-apis/task/v2/task_v2/list_related_task"
1138        );
1139        assert_eq!(
1140            crate::common::TaskV2Endpoint::TaskSubscription.to_url(),
1141            "/open-apis/task/v2/task_v2/task_subscription"
1142        );
1143    }
1144}