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    /// 创建分组(全局端点,无 tasklist 作用域)
151    SectionCreate,
152    /// 获取分组详情
153    SectionGet(String),
154    /// 更新分组
155    SectionUpdate(String),
156    /// 删除分组
157    SectionDelete(String),
158    /// 获取分组列表
159    SectionList,
160    /// 创建自定义字段(全局端点,清单 GUID 通过 body resource_id 传)
161    CustomFieldCreate,
162    /// 获取自定义字段详情
163    CustomFieldGet(String),
164    /// 更新自定义字段
165    CustomFieldUpdate(String),
166    /// 删除自定义字段
167    CustomFieldDelete(String),
168    /// 获取自定义字段列表
169    CustomFieldList,
170    /// 创建评论
171    CommentCreate,
172    /// 获取评论详情
173    CommentGet(String),
174    /// 更新评论
175    CommentUpdate(String),
176    /// 删除评论
177    CommentDelete(String),
178    /// 获取评论列表
179    CommentList,
180    /// 上传附件
181    AttachmentUpload,
182    /// 删除附件
183    AttachmentDelete(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    // 搜索
254    /// 搜索任务
255    TaskSearch,
256    /// 搜索清单
257    TasklistSearch,
258}
259
260impl TaskApiV2 {
261    /// 生成对应的 URL
262    pub fn to_url(&self) -> String {
263        match self {
264            // 任务相关
265            TaskApiV2::TaskCreate => "/open-apis/task/v2/tasks".to_string(),
266            TaskApiV2::TaskGet(task_guid) => {
267                format!("/open-apis/task/v2/tasks/{task_guid}")
268            }
269            TaskApiV2::TaskUpdate(task_guid) => {
270                format!("/open-apis/task/v2/tasks/{task_guid}")
271            }
272            TaskApiV2::TaskDelete(task_guid) => {
273                format!("/open-apis/task/v2/tasks/{task_guid}")
274            }
275            TaskApiV2::TaskComplete(task_guid) => {
276                format!("/open-apis/task/v2/tasks/{task_guid}/complete")
277            }
278            TaskApiV2::TaskUncomplete(task_guid) => {
279                format!("/open-apis/task/v2/tasks/{task_guid}/uncomplete")
280            }
281            TaskApiV2::TaskList => "/open-apis/task/v2/tasks".to_string(),
282
283            // 任务清单相关
284            TaskApiV2::TasklistCreate => "/open-apis/task/v2/tasklists".to_string(),
285            TaskApiV2::TasklistGet(tasklist_guid) => {
286                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
287            }
288            TaskApiV2::TasklistUpdate(tasklist_guid) => {
289                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
290            }
291            TaskApiV2::TasklistDelete(tasklist_guid) => {
292                format!("/open-apis/task/v2/tasklists/{tasklist_guid}")
293            }
294            TaskApiV2::TasklistList => "/open-apis/task/v2/tasklists".to_string(),
295
296            // 分组相关(全局端点,无 tasklist 作用域前缀)
297            TaskApiV2::SectionCreate => "/open-apis/task/v2/sections".to_string(),
298            TaskApiV2::SectionGet(section_guid) => {
299                format!("/open-apis/task/v2/sections/{section_guid}")
300            }
301            TaskApiV2::SectionUpdate(section_guid) => {
302                format!("/open-apis/task/v2/sections/{section_guid}")
303            }
304            TaskApiV2::SectionDelete(section_guid) => {
305                format!("/open-apis/task/v2/sections/{section_guid}")
306            }
307            TaskApiV2::SectionList => "/open-apis/task/v2/sections".to_string(),
308
309            // 自定义字段相关(全局端点)
310            TaskApiV2::CustomFieldCreate => "/open-apis/task/v2/custom_fields".to_string(),
311            TaskApiV2::CustomFieldGet(field_guid) => {
312                format!("/open-apis/task/v2/custom_fields/{field_guid}")
313            }
314            TaskApiV2::CustomFieldUpdate(field_guid) => {
315                format!("/open-apis/task/v2/custom_fields/{field_guid}")
316            }
317            TaskApiV2::CustomFieldDelete(field_guid) => {
318                format!("/open-apis/task/v2/custom_fields/{field_guid}")
319            }
320            TaskApiV2::CustomFieldList => "/open-apis/task/v2/custom_fields".to_string(),
321
322            // 评论相关
323            TaskApiV2::CommentCreate => "/open-apis/task/v2/comments".to_string(),
324            TaskApiV2::CommentGet(comment_id) => {
325                format!("/open-apis/task/v2/comments/{comment_id}")
326            }
327            TaskApiV2::CommentUpdate(comment_id) => {
328                format!("/open-apis/task/v2/comments/{comment_id}")
329            }
330            TaskApiV2::CommentDelete(comment_id) => {
331                format!("/open-apis/task/v2/comments/{comment_id}")
332            }
333            TaskApiV2::CommentList => "/open-apis/task/v2/comments".to_string(),
334
335            // 附件相关
336            TaskApiV2::AttachmentUpload => "/open-apis/task/v2/attachments/upload".to_string(),
337            TaskApiV2::AttachmentDelete(attachment_guid) => {
338                format!("/open-apis/task/v2/attachments/{attachment_guid}")
339            }
340
341            // 子任务相关
342            TaskApiV2::SubtaskCreate(task_guid) => {
343                format!("/open-apis/task/v2/tasks/{task_guid}/subtasks")
344            }
345            TaskApiV2::SubtaskList(task_guid) => {
346                format!("/open-apis/task/v2/tasks/{task_guid}/subtasks")
347            }
348
349            // 任务相关扩展
350            TaskApiV2::TaskAddTasklist(task_guid) => {
351                format!("/open-apis/task/v2/tasks/{task_guid}/add_tasklist")
352            }
353            TaskApiV2::TaskRemoveTasklist(task_guid) => {
354                format!("/open-apis/task/v2/tasks/{task_guid}/remove_tasklist")
355            }
356            TaskApiV2::TaskGetTasklists(task_guid) => {
357                format!("/open-apis/task/v2/tasks/{task_guid}/tasklists")
358            }
359            TaskApiV2::TaskAddMembers(task_guid) => {
360                format!("/open-apis/task/v2/tasks/{task_guid}/add_members")
361            }
362            TaskApiV2::TaskRemoveMembers(task_guid) => {
363                format!("/open-apis/task/v2/tasks/{task_guid}/remove_members")
364            }
365            TaskApiV2::TaskAddReminders(task_guid) => {
366                format!("/open-apis/task/v2/tasks/{task_guid}/add_reminders")
367            }
368            TaskApiV2::TaskRemoveReminders(task_guid) => {
369                format!("/open-apis/task/v2/tasks/{task_guid}/remove_reminders")
370            }
371            TaskApiV2::TaskAddDependencies(task_guid) => {
372                format!("/open-apis/task/v2/tasks/{task_guid}/add_dependencies")
373            }
374            TaskApiV2::TaskRemoveDependencies(task_guid) => {
375                format!("/open-apis/task/v2/tasks/{task_guid}/remove_dependencies")
376            }
377
378            // 任务清单相关扩展
379            TaskApiV2::TasklistGetTasks(tasklist_guid) => {
380                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/tasks")
381            }
382            TaskApiV2::TasklistAddMembers(tasklist_guid) => {
383                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/add_members")
384            }
385            TaskApiV2::TasklistRemoveMembers(tasklist_guid) => {
386                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/remove_members")
387            }
388
389            // 分组相关扩展
390            TaskApiV2::SectionGetTasks(section_guid) => {
391                format!("/open-apis/task/v2/sections/{section_guid}/tasks")
392            }
393
394            // 活动订阅相关
395            TaskApiV2::ActivitySubscriptionCreate(tasklist_guid) => {
396                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions")
397            }
398            TaskApiV2::ActivitySubscriptionGet(tasklist_guid, subscription_guid) => {
399                format!(
400                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
401                )
402            }
403            TaskApiV2::ActivitySubscriptionUpdate(tasklist_guid, subscription_guid) => {
404                format!(
405                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
406                )
407            }
408            TaskApiV2::ActivitySubscriptionDelete(tasklist_guid, subscription_guid) => {
409                format!(
410                    "/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions/{subscription_guid}"
411                )
412            }
413            TaskApiV2::ActivitySubscriptionList(tasklist_guid) => {
414                format!("/open-apis/task/v2/tasklists/{tasklist_guid}/activity_subscriptions")
415            }
416
417            // 自定义字段选项相关
418            TaskApiV2::CustomFieldOptionCreate(custom_field_guid) => {
419                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/options")
420            }
421            TaskApiV2::CustomFieldOptionUpdate(custom_field_guid, option_guid) => {
422                format!(
423                    "/open-apis/task/v2/custom_fields/{custom_field_guid}/options/{option_guid}"
424                )
425            }
426
427            // 附件相关扩展
428            TaskApiV2::AttachmentGet(attachment_guid) => {
429                format!("/open-apis/task/v2/attachments/{attachment_guid}")
430            }
431            TaskApiV2::AttachmentList => "/open-apis/task/v2/attachments".to_string(),
432
433            // 自定义字段 add/remove
434            TaskApiV2::CustomFieldAdd(custom_field_guid) => {
435                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/add")
436            }
437            TaskApiV2::CustomFieldRemove(custom_field_guid) => {
438                format!("/open-apis/task/v2/custom_fields/{custom_field_guid}/remove")
439            }
440
441            // 搜索
442            TaskApiV2::TaskSearch => "/open-apis/task/v2/tasks/search".to_string(),
443            TaskApiV2::TasklistSearch => "/open-apis/task/v2/tasklists/search".to_string(),
444        }
445    }
446}
447
448/// 审批 API V4 端点枚举
449#[derive(Debug, Clone, PartialEq)]
450pub enum ApprovalApiV4 {
451    /// 创建审批定义
452    ApprovalCreate,
453    /// 查看指定审批定义
454    ApprovalGet(String),
455    /// 订阅审批事件
456    ApprovalSubscribe(String),
457    /// 取消订阅审批事件
458    ApprovalUnsubscribe(String),
459    /// 创建三方审批定义
460    ExternalApprovalCreate,
461    /// 查看指定三方审批定义
462    ExternalApprovalGet(String),
463    /// 校验三方审批实例
464    ExternalInstanceCheck,
465    /// 同步三方审批实例
466    ExternalInstanceCreate,
467    /// 获取三方审批任务状态
468    ExternalTaskList,
469    /// 审批任务加签
470    InstanceAddSign,
471    /// 抄送审批实例(用户级)
472    InstanceAddCc,
473    /// 撤回审批实例
474    InstanceCancel,
475    /// 抄送审批实例
476    InstanceCc,
477    /// 创建审批实例
478    InstanceCreate,
479    /// 获取单个审批实例详情(用户级)
480    InstanceDetail,
481    /// 获取单个审批实例详情
482    InstanceGet(String),
483    /// 查询用户的已发起审批列表(用户级)
484    InstanceInitiated,
485    /// 批量获取审批实例 ID
486    InstanceList(String),
487    /// 预览审批流程
488    InstancePreview,
489    /// 查询实例列表
490    InstanceQuery,
491    /// 查询抄送列表
492    InstanceSearchCc,
493    /// 单据催办(用户级)
494    InstanceRemind,
495    /// 撤回审批实例(用户级)
496    InstanceRecall,
497    /// 退回审批任务
498    InstanceSpecifiedRollback(String),
499    /// 订阅审批实例状态变更事件
500    InstanceSubscribe,
501    /// 退订审批实例状态变更事件
502    InstanceUnsubscribe,
503    /// 创建评论
504    InstanceCommentCreate(String),
505    /// 删除评论
506    InstanceCommentDelete(String, String),
507    /// 获取评论列表
508    InstanceCommentList(String),
509    /// 审批任务加签(用户级)
510    TaskAddSign,
511    /// 同意审批任务
512    TaskApprove,
513    /// 转交审批任务(用户级)
514    TaskForward,
515    /// 查询审批任务列表(用户级)
516    TaskList,
517    /// 同意审批任务(用户级)
518    TaskPass,
519    /// 查询用户的任务列表
520    TaskQuery,
521    /// 拒绝审批任务(用户级)
522    TaskRefuse,
523    /// 拒绝审批任务
524    TaskReject,
525    /// 退回审批任务(用户级)
526    TaskRollback,
527    /// 重新提交审批任务
528    TaskResubmit,
529    /// 查询任务列表
530    TaskSearch,
531    /// 转交审批任务
532    TaskTransfer,
533    /// 订阅审批任务状态变更事件
534    TaskSubscribe,
535    /// 退订审批任务状态变更事件
536    TaskUnsubscribe,
537}
538
539impl ApprovalApiV4 {
540    /// 生成对应的 URL
541    pub fn to_url(&self) -> String {
542        match self {
543            // 审批定义相关
544            ApprovalApiV4::ApprovalCreate => "/open-apis/approval/v4/approvals".to_string(),
545            ApprovalApiV4::ApprovalGet(approval_code) => {
546                format!("/open-apis/approval/v4/approvals/{approval_code}")
547            }
548            ApprovalApiV4::ApprovalSubscribe(approval_code) => {
549                format!("/open-apis/approval/v4/approvals/{approval_code}/subscribe")
550            }
551            ApprovalApiV4::ApprovalUnsubscribe(approval_code) => {
552                format!("/open-apis/approval/v4/approvals/{approval_code}/unsubscribe")
553            }
554
555            // 三方审批定义相关
556            ApprovalApiV4::ExternalApprovalCreate => {
557                "/open-apis/approval/v4/external_approvals".to_string()
558            }
559            ApprovalApiV4::ExternalApprovalGet(approval_code) => {
560                format!("/open-apis/approval/v4/external_approvals/{approval_code}")
561            }
562
563            // 三方审批实例相关
564            ApprovalApiV4::ExternalInstanceCheck => {
565                "/open-apis/approval/v4/external_instances/check".to_string()
566            }
567            ApprovalApiV4::ExternalInstanceCreate => {
568                "/open-apis/approval/v4/external_instances".to_string()
569            }
570
571            // 三方审批任务相关
572            ApprovalApiV4::ExternalTaskList => "/open-apis/approval/v4/external_tasks".to_string(),
573
574            // 审批实例相关
575            ApprovalApiV4::InstanceAddSign => {
576                "/open-apis/approval/v4/instances/add_sign".to_string()
577            }
578            ApprovalApiV4::InstanceAddCc => "/open-apis/approval/v4/instances/add_cc".to_string(),
579            ApprovalApiV4::InstanceCancel => "/open-apis/approval/v4/instances/cancel".to_string(),
580            ApprovalApiV4::InstanceCc => "/open-apis/approval/v4/instances/cc".to_string(),
581            ApprovalApiV4::InstanceCreate => "/open-apis/approval/v4/instances".to_string(),
582            ApprovalApiV4::InstanceDetail => "/open-apis/approval/v4/instances/detail".to_string(),
583            ApprovalApiV4::InstanceGet(instance_id) => {
584                format!("/open-apis/approval/v4/instances/{instance_id}")
585            }
586            ApprovalApiV4::InstanceInitiated => {
587                "/open-apis/approval/v4/instances/initiated".to_string()
588            }
589            ApprovalApiV4::InstanceList(approval_code) => {
590                format!("/open-apis/approval/v4/instances?approval_code={approval_code}")
591            }
592            ApprovalApiV4::InstancePreview => {
593                "/open-apis/approval/v4/instances/preview".to_string()
594            }
595            ApprovalApiV4::InstanceQuery => "/open-apis/approval/v4/instances/query".to_string(),
596            ApprovalApiV4::InstanceSearchCc => {
597                "/open-apis/approval/v4/instances/search_cc".to_string()
598            }
599            ApprovalApiV4::InstanceRemind => "/open-apis/approval/v4/instances/remind".to_string(),
600            ApprovalApiV4::InstanceRecall => "/open-apis/approval/v4/instances/recall".to_string(),
601            ApprovalApiV4::InstanceSpecifiedRollback(_) => {
602                "/open-apis/approval/v4/instances/specified_rollback".to_string()
603            }
604            ApprovalApiV4::InstanceSubscribe | ApprovalApiV4::InstanceUnsubscribe => {
605                "/open-apis/approval/v4/instances/subscription".to_string()
606            }
607
608            // 审批实例评论相关
609            ApprovalApiV4::InstanceCommentCreate(instance_id) => {
610                format!("/open-apis/approval/v4/instances/{instance_id}/comments")
611            }
612            ApprovalApiV4::InstanceCommentDelete(instance_id, comment_id) => {
613                format!("/open-apis/approval/v4/instances/{instance_id}/comments/{comment_id}")
614            }
615            ApprovalApiV4::InstanceCommentList(instance_id) => {
616                format!("/open-apis/approval/v4/instances/{instance_id}/comments")
617            }
618
619            // 审批任务相关
620            ApprovalApiV4::TaskAddSign => "/open-apis/approval/v4/tasks/add_sign".to_string(),
621            ApprovalApiV4::TaskApprove => "/open-apis/approval/v4/tasks/approve".to_string(),
622            ApprovalApiV4::TaskForward => "/open-apis/approval/v4/tasks/forward".to_string(),
623            ApprovalApiV4::TaskList => "/open-apis/approval/v4/tasks".to_string(),
624            ApprovalApiV4::TaskPass => "/open-apis/approval/v4/tasks/pass".to_string(),
625            ApprovalApiV4::TaskQuery => "/open-apis/approval/v4/tasks/query".to_string(),
626            ApprovalApiV4::TaskRefuse => "/open-apis/approval/v4/tasks/refuse".to_string(),
627            ApprovalApiV4::TaskReject => "/open-apis/approval/v4/tasks/reject".to_string(),
628            ApprovalApiV4::TaskRollback => "/open-apis/approval/v4/tasks/rollback".to_string(),
629            ApprovalApiV4::TaskResubmit => "/open-apis/approval/v4/tasks/resubmit".to_string(),
630            ApprovalApiV4::TaskSearch => "/open-apis/approval/v4/tasks/search".to_string(),
631            ApprovalApiV4::TaskTransfer => "/open-apis/approval/v4/tasks/transfer".to_string(),
632            ApprovalApiV4::TaskSubscribe | ApprovalApiV4::TaskUnsubscribe => {
633                "/open-apis/approval/v4/tasks/subscription".to_string()
634            }
635        }
636    }
637}
638
639/// 白板 API V1 端点枚举
640#[derive(Debug, Clone, PartialEq)]
641pub enum BoardApiV1 {
642    /// 创建节点
643    WhiteboardNodeCreate(String),
644    /// 获取节点列表
645    WhiteboardNodeList(String),
646    /// 更新主题
647    WhiteboardUpdateTheme(String),
648    /// 获取主题
649    WhiteboardTheme(String),
650    /// 下载为图片
651    WhiteboardDownloadAsImage(String),
652    /// 创建 PlantUML 节点
653    WhiteboardNodeCreatePlantuml(String),
654}
655
656impl BoardApiV1 {
657    /// 生成对应的 URL
658    pub fn to_url(&self) -> String {
659        match self {
660            BoardApiV1::WhiteboardNodeCreate(board_id) => {
661                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes")
662            }
663            BoardApiV1::WhiteboardNodeList(board_id) => {
664                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes")
665            }
666            BoardApiV1::WhiteboardUpdateTheme(board_id) => {
667                format!("/open-apis/board/v1/whiteboards/{board_id}/update_theme")
668            }
669            BoardApiV1::WhiteboardTheme(board_id) => {
670                format!("/open-apis/board/v1/whiteboards/{board_id}/theme")
671            }
672            BoardApiV1::WhiteboardDownloadAsImage(board_id) => {
673                format!("/open-apis/board/v1/whiteboards/{board_id}/download_as_image")
674            }
675            BoardApiV1::WhiteboardNodeCreatePlantuml(board_id) => {
676                format!("/open-apis/board/v1/whiteboards/{board_id}/nodes/plantuml")
677            }
678        }
679    }
680}
681
682#[cfg(test)]
683#[allow(unused_imports)]
684mod tests {
685    use super::*;
686
687    #[test]
688    fn test_task_api_v1_to_url() {
689        let cases = vec![
690            (
691                TaskApiV1::TaskCreate,
692                "/open-apis/task/v1/tasks".to_string(),
693            ),
694            (
695                TaskApiV1::TaskGet("task_1".to_string()),
696                "/open-apis/task/v1/tasks/task_1".to_string(),
697            ),
698            (
699                TaskApiV1::TaskUpdate("task_1".to_string()),
700                "/open-apis/task/v1/tasks/task_1".to_string(),
701            ),
702            (
703                TaskApiV1::TaskDelete("task_1".to_string()),
704                "/open-apis/task/v1/tasks/task_1".to_string(),
705            ),
706            (
707                TaskApiV1::TaskComplete("task_1".to_string()),
708                "/open-apis/task/v1/tasks/task_1/complete".to_string(),
709            ),
710            (
711                TaskApiV1::TaskUncomplete("task_1".to_string()),
712                "/open-apis/task/v1/tasks/task_1/uncomplete".to_string(),
713            ),
714            (TaskApiV1::TaskList, "/open-apis/task/v1/tasks".to_string()),
715            (
716                TaskApiV1::TaskFollowerCreate("task_1".to_string()),
717                "/open-apis/task/v1/tasks/task_1/followers".to_string(),
718            ),
719            (
720                TaskApiV1::TaskFollowerDelete("task_1".to_string(), "f1".to_string()),
721                "/open-apis/task/v1/tasks/task_1/followers/f1".to_string(),
722            ),
723            (
724                TaskApiV1::TaskFollowerList("task_1".to_string()),
725                "/open-apis/task/v1/tasks/task_1/followers".to_string(),
726            ),
727            (
728                TaskApiV1::TaskFollowerBatchDelete("task_1".to_string()),
729                "/open-apis/task/v1/tasks/task_1/batch_delete_follower".to_string(),
730            ),
731            (
732                TaskApiV1::TaskCollaboratorCreate("task_1".to_string()),
733                "/open-apis/task/v1/tasks/task_1/collaborators".to_string(),
734            ),
735            (
736                TaskApiV1::TaskCollaboratorDelete("task_1".to_string(), "c1".to_string()),
737                "/open-apis/task/v1/tasks/task_1/collaborators/c1".to_string(),
738            ),
739            (
740                TaskApiV1::TaskCollaboratorList("task_1".to_string()),
741                "/open-apis/task/v1/tasks/task_1/collaborators".to_string(),
742            ),
743            (
744                TaskApiV1::TaskCollaboratorBatchDelete("task_1".to_string()),
745                "/open-apis/task/v1/tasks/task_1/batch_delete_collaborator".to_string(),
746            ),
747            (
748                TaskApiV1::TaskReminderCreate("task_1".to_string()),
749                "/open-apis/task/v1/tasks/task_1/reminders".to_string(),
750            ),
751            (
752                TaskApiV1::TaskReminderDelete("task_1".to_string(), "r1".to_string()),
753                "/open-apis/task/v1/tasks/task_1/reminders/r1".to_string(),
754            ),
755            (
756                TaskApiV1::TaskReminderList("task_1".to_string()),
757                "/open-apis/task/v1/tasks/task_1/reminders".to_string(),
758            ),
759            (
760                TaskApiV1::TaskCommentCreate("task_1".to_string()),
761                "/open-apis/task/v1/tasks/task_1/comments".to_string(),
762            ),
763            (
764                TaskApiV1::TaskCommentGet("task_1".to_string(), "cm1".to_string()),
765                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
766            ),
767            (
768                TaskApiV1::TaskCommentUpdate("task_1".to_string(), "cm1".to_string()),
769                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
770            ),
771            (
772                TaskApiV1::TaskCommentDelete("task_1".to_string(), "cm1".to_string()),
773                "/open-apis/task/v1/tasks/task_1/comments/cm1".to_string(),
774            ),
775            (
776                TaskApiV1::TaskCommentList("task_1".to_string()),
777                "/open-apis/task/v1/tasks/task_1/comments".to_string(),
778            ),
779        ];
780
781        for (api, expected) in cases {
782            assert_eq!(api.to_url(), expected);
783        }
784    }
785
786    #[test]
787    fn test_task_api_v2_to_url() {
788        let cases = vec![
789            (
790                TaskApiV2::TaskCreate,
791                "/open-apis/task/v2/tasks".to_string(),
792            ),
793            (
794                TaskApiV2::TaskGet("t1".to_string()),
795                "/open-apis/task/v2/tasks/t1".to_string(),
796            ),
797            (
798                TaskApiV2::TaskUpdate("t1".to_string()),
799                "/open-apis/task/v2/tasks/t1".to_string(),
800            ),
801            (
802                TaskApiV2::TaskDelete("t1".to_string()),
803                "/open-apis/task/v2/tasks/t1".to_string(),
804            ),
805            (
806                TaskApiV2::TaskComplete("t1".to_string()),
807                "/open-apis/task/v2/tasks/t1/complete".to_string(),
808            ),
809            (
810                TaskApiV2::TaskUncomplete("t1".to_string()),
811                "/open-apis/task/v2/tasks/t1/uncomplete".to_string(),
812            ),
813            (TaskApiV2::TaskList, "/open-apis/task/v2/tasks".to_string()),
814            (
815                TaskApiV2::TasklistCreate,
816                "/open-apis/task/v2/tasklists".to_string(),
817            ),
818            (
819                TaskApiV2::TasklistGet("tl1".to_string()),
820                "/open-apis/task/v2/tasklists/tl1".to_string(),
821            ),
822            (
823                TaskApiV2::TasklistUpdate("tl1".to_string()),
824                "/open-apis/task/v2/tasklists/tl1".to_string(),
825            ),
826            (
827                TaskApiV2::TasklistDelete("tl1".to_string()),
828                "/open-apis/task/v2/tasklists/tl1".to_string(),
829            ),
830            (
831                TaskApiV2::TasklistList,
832                "/open-apis/task/v2/tasklists".to_string(),
833            ),
834            (
835                TaskApiV2::SectionCreate,
836                "/open-apis/task/v2/sections".to_string(),
837            ),
838            (
839                TaskApiV2::SectionGet("s1".to_string()),
840                "/open-apis/task/v2/sections/s1".to_string(),
841            ),
842            (
843                TaskApiV2::SectionUpdate("s1".to_string()),
844                "/open-apis/task/v2/sections/s1".to_string(),
845            ),
846            (
847                TaskApiV2::SectionDelete("s1".to_string()),
848                "/open-apis/task/v2/sections/s1".to_string(),
849            ),
850            (
851                TaskApiV2::SectionList,
852                "/open-apis/task/v2/sections".to_string(),
853            ),
854            (
855                TaskApiV2::CustomFieldCreate,
856                "/open-apis/task/v2/custom_fields".to_string(),
857            ),
858            (
859                TaskApiV2::CustomFieldGet("f1".to_string()),
860                "/open-apis/task/v2/custom_fields/f1".to_string(),
861            ),
862            (
863                TaskApiV2::CustomFieldUpdate("f1".to_string()),
864                "/open-apis/task/v2/custom_fields/f1".to_string(),
865            ),
866            (
867                TaskApiV2::CustomFieldDelete("f1".to_string()),
868                "/open-apis/task/v2/custom_fields/f1".to_string(),
869            ),
870            (
871                TaskApiV2::CustomFieldList,
872                "/open-apis/task/v2/custom_fields".to_string(),
873            ),
874            (
875                TaskApiV2::CommentCreate,
876                "/open-apis/task/v2/comments".to_string(),
877            ),
878            (
879                TaskApiV2::CommentGet("c1".to_string()),
880                "/open-apis/task/v2/comments/c1".to_string(),
881            ),
882            (
883                TaskApiV2::CommentUpdate("c1".to_string()),
884                "/open-apis/task/v2/comments/c1".to_string(),
885            ),
886            (
887                TaskApiV2::CommentDelete("c1".to_string()),
888                "/open-apis/task/v2/comments/c1".to_string(),
889            ),
890            (
891                TaskApiV2::CommentList,
892                "/open-apis/task/v2/comments".to_string(),
893            ),
894            (
895                TaskApiV2::AttachmentUpload,
896                "/open-apis/task/v2/attachments/upload".to_string(),
897            ),
898            (
899                TaskApiV2::AttachmentDelete("a1".to_string()),
900                "/open-apis/task/v2/attachments/a1".to_string(),
901            ),
902            (
903                TaskApiV2::SubtaskCreate("t1".to_string()),
904                "/open-apis/task/v2/tasks/t1/subtasks".to_string(),
905            ),
906            (
907                TaskApiV2::SubtaskList("t1".to_string()),
908                "/open-apis/task/v2/tasks/t1/subtasks".to_string(),
909            ),
910            (
911                TaskApiV2::TaskAddTasklist("t1".to_string()),
912                "/open-apis/task/v2/tasks/t1/add_tasklist".to_string(),
913            ),
914            (
915                TaskApiV2::TaskRemoveTasklist("t1".to_string()),
916                "/open-apis/task/v2/tasks/t1/remove_tasklist".to_string(),
917            ),
918            (
919                TaskApiV2::TaskGetTasklists("t1".to_string()),
920                "/open-apis/task/v2/tasks/t1/tasklists".to_string(),
921            ),
922            (
923                TaskApiV2::TaskAddMembers("t1".to_string()),
924                "/open-apis/task/v2/tasks/t1/add_members".to_string(),
925            ),
926            (
927                TaskApiV2::TaskRemoveMembers("t1".to_string()),
928                "/open-apis/task/v2/tasks/t1/remove_members".to_string(),
929            ),
930            (
931                TaskApiV2::TaskAddReminders("t1".to_string()),
932                "/open-apis/task/v2/tasks/t1/add_reminders".to_string(),
933            ),
934            (
935                TaskApiV2::TaskRemoveReminders("t1".to_string()),
936                "/open-apis/task/v2/tasks/t1/remove_reminders".to_string(),
937            ),
938            (
939                TaskApiV2::TaskAddDependencies("t1".to_string()),
940                "/open-apis/task/v2/tasks/t1/add_dependencies".to_string(),
941            ),
942            (
943                TaskApiV2::TaskRemoveDependencies("t1".to_string()),
944                "/open-apis/task/v2/tasks/t1/remove_dependencies".to_string(),
945            ),
946            (
947                TaskApiV2::TasklistGetTasks("tl1".to_string()),
948                "/open-apis/task/v2/tasklists/tl1/tasks".to_string(),
949            ),
950            (
951                TaskApiV2::TasklistAddMembers("tl1".to_string()),
952                "/open-apis/task/v2/tasklists/tl1/add_members".to_string(),
953            ),
954            (
955                TaskApiV2::TasklistRemoveMembers("tl1".to_string()),
956                "/open-apis/task/v2/tasklists/tl1/remove_members".to_string(),
957            ),
958            (
959                TaskApiV2::SectionGetTasks("s1".to_string()),
960                "/open-apis/task/v2/sections/s1/tasks".to_string(),
961            ),
962            (
963                TaskApiV2::ActivitySubscriptionCreate("tl1".to_string()),
964                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions".to_string(),
965            ),
966            (
967                TaskApiV2::ActivitySubscriptionGet("tl1".to_string(), "as1".to_string()),
968                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
969            ),
970            (
971                TaskApiV2::ActivitySubscriptionUpdate("tl1".to_string(), "as1".to_string()),
972                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
973            ),
974            (
975                TaskApiV2::ActivitySubscriptionDelete("tl1".to_string(), "as1".to_string()),
976                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions/as1".to_string(),
977            ),
978            (
979                TaskApiV2::ActivitySubscriptionList("tl1".to_string()),
980                "/open-apis/task/v2/tasklists/tl1/activity_subscriptions".to_string(),
981            ),
982            (
983                TaskApiV2::CustomFieldOptionCreate("cf1".to_string()),
984                "/open-apis/task/v2/custom_fields/cf1/options".to_string(),
985            ),
986            (
987                TaskApiV2::CustomFieldOptionUpdate("cf1".to_string(), "op1".to_string()),
988                "/open-apis/task/v2/custom_fields/cf1/options/op1".to_string(),
989            ),
990            (
991                TaskApiV2::AttachmentGet("a1".to_string()),
992                "/open-apis/task/v2/attachments/a1".to_string(),
993            ),
994            (
995                TaskApiV2::AttachmentList,
996                "/open-apis/task/v2/attachments".to_string(),
997            ),
998            (
999                TaskApiV2::CustomFieldAdd("cf1".to_string()),
1000                "/open-apis/task/v2/custom_fields/cf1/add".to_string(),
1001            ),
1002            (
1003                TaskApiV2::CustomFieldRemove("cf1".to_string()),
1004                "/open-apis/task/v2/custom_fields/cf1/remove".to_string(),
1005            ),
1006        ];
1007
1008        for (api, expected) in cases {
1009            assert_eq!(api.to_url(), expected);
1010        }
1011    }
1012
1013    #[test]
1014    fn test_approval_api_v4_to_url() {
1015        let cases = vec![
1016            (
1017                ApprovalApiV4::ApprovalCreate,
1018                "/open-apis/approval/v4/approvals".to_string(),
1019            ),
1020            (
1021                ApprovalApiV4::ApprovalGet("code1".to_string()),
1022                "/open-apis/approval/v4/approvals/code1".to_string(),
1023            ),
1024            (
1025                ApprovalApiV4::ApprovalSubscribe("code1".to_string()),
1026                "/open-apis/approval/v4/approvals/code1/subscribe".to_string(),
1027            ),
1028            (
1029                ApprovalApiV4::ApprovalUnsubscribe("code1".to_string()),
1030                "/open-apis/approval/v4/approvals/code1/unsubscribe".to_string(),
1031            ),
1032            (
1033                ApprovalApiV4::ExternalApprovalCreate,
1034                "/open-apis/approval/v4/external_approvals".to_string(),
1035            ),
1036            (
1037                ApprovalApiV4::ExternalApprovalGet("code1".to_string()),
1038                "/open-apis/approval/v4/external_approvals/code1".to_string(),
1039            ),
1040            (
1041                ApprovalApiV4::ExternalInstanceCheck,
1042                "/open-apis/approval/v4/external_instances/check".to_string(),
1043            ),
1044            (
1045                ApprovalApiV4::ExternalInstanceCreate,
1046                "/open-apis/approval/v4/external_instances".to_string(),
1047            ),
1048            (
1049                ApprovalApiV4::ExternalTaskList,
1050                "/open-apis/approval/v4/external_tasks".to_string(),
1051            ),
1052            (
1053                ApprovalApiV4::InstanceAddSign,
1054                "/open-apis/approval/v4/instances/add_sign".to_string(),
1055            ),
1056            (
1057                ApprovalApiV4::InstanceCancel,
1058                "/open-apis/approval/v4/instances/cancel".to_string(),
1059            ),
1060            (
1061                ApprovalApiV4::InstanceCc,
1062                "/open-apis/approval/v4/instances/cc".to_string(),
1063            ),
1064            (
1065                ApprovalApiV4::InstanceCreate,
1066                "/open-apis/approval/v4/instances".to_string(),
1067            ),
1068            (
1069                ApprovalApiV4::InstanceGet("ins1".to_string()),
1070                "/open-apis/approval/v4/instances/ins1".to_string(),
1071            ),
1072            (
1073                ApprovalApiV4::InstanceList("code1".to_string()),
1074                "/open-apis/approval/v4/instances?approval_code=code1".to_string(),
1075            ),
1076            (
1077                ApprovalApiV4::InstancePreview,
1078                "/open-apis/approval/v4/instances/preview".to_string(),
1079            ),
1080            (
1081                ApprovalApiV4::InstanceQuery,
1082                "/open-apis/approval/v4/instances/query".to_string(),
1083            ),
1084            (
1085                ApprovalApiV4::InstanceSearchCc,
1086                "/open-apis/approval/v4/instances/search_cc".to_string(),
1087            ),
1088            (
1089                ApprovalApiV4::InstanceSpecifiedRollback("ins1".to_string()),
1090                "/open-apis/approval/v4/instances/specified_rollback".to_string(),
1091            ),
1092            (
1093                ApprovalApiV4::InstanceCommentCreate("ins1".to_string()),
1094                "/open-apis/approval/v4/instances/ins1/comments".to_string(),
1095            ),
1096            (
1097                ApprovalApiV4::InstanceCommentDelete("ins1".to_string(), "c1".to_string()),
1098                "/open-apis/approval/v4/instances/ins1/comments/c1".to_string(),
1099            ),
1100            (
1101                ApprovalApiV4::InstanceCommentList("ins1".to_string()),
1102                "/open-apis/approval/v4/instances/ins1/comments".to_string(),
1103            ),
1104            (
1105                ApprovalApiV4::TaskApprove,
1106                "/open-apis/approval/v4/tasks/approve".to_string(),
1107            ),
1108            (
1109                ApprovalApiV4::TaskQuery,
1110                "/open-apis/approval/v4/tasks/query".to_string(),
1111            ),
1112            (
1113                ApprovalApiV4::TaskReject,
1114                "/open-apis/approval/v4/tasks/reject".to_string(),
1115            ),
1116            (
1117                ApprovalApiV4::TaskResubmit,
1118                "/open-apis/approval/v4/tasks/resubmit".to_string(),
1119            ),
1120            (
1121                ApprovalApiV4::TaskSearch,
1122                "/open-apis/approval/v4/tasks/search".to_string(),
1123            ),
1124            (
1125                ApprovalApiV4::TaskTransfer,
1126                "/open-apis/approval/v4/tasks/transfer".to_string(),
1127            ),
1128        ];
1129
1130        for (api, expected) in cases {
1131            assert_eq!(api.to_url(), expected);
1132        }
1133    }
1134
1135    #[test]
1136    fn test_board_api_v1_to_url() {
1137        let cases = vec![
1138            (
1139                BoardApiV1::WhiteboardNodeCreate("b1".to_string()),
1140                "/open-apis/board/v1/whiteboards/b1/nodes".to_string(),
1141            ),
1142            (
1143                BoardApiV1::WhiteboardNodeList("b1".to_string()),
1144                "/open-apis/board/v1/whiteboards/b1/nodes".to_string(),
1145            ),
1146            (
1147                BoardApiV1::WhiteboardUpdateTheme("b1".to_string()),
1148                "/open-apis/board/v1/whiteboards/b1/update_theme".to_string(),
1149            ),
1150            (
1151                BoardApiV1::WhiteboardTheme("b1".to_string()),
1152                "/open-apis/board/v1/whiteboards/b1/theme".to_string(),
1153            ),
1154            (
1155                BoardApiV1::WhiteboardDownloadAsImage("b1".to_string()),
1156                "/open-apis/board/v1/whiteboards/b1/download_as_image".to_string(),
1157            ),
1158            (
1159                BoardApiV1::WhiteboardNodeCreatePlantuml("b1".to_string()),
1160                "/open-apis/board/v1/whiteboards/b1/nodes/plantuml".to_string(),
1161            ),
1162        ];
1163
1164        for (api, expected) in cases {
1165            assert_eq!(api.to_url(), expected);
1166        }
1167    }
1168
1169    #[test]
1170    fn issue_194_workflow_new_endpoint_paths() {
1171        assert_eq!(
1172            crate::common::BoardV1Endpoint::WhiteboardNodeBatchDelete("board_123".to_string())
1173                .to_url(),
1174            "/open-apis/board/v1/whiteboards/board_123/nodes/batch_delete"
1175        );
1176        assert_eq!(
1177            crate::common::TaskV2Endpoint::TaskSetAncestorTask("task_123".to_string()).to_url(),
1178            "/open-apis/task/v2/tasks/task_123/set_ancestor_task"
1179        );
1180        assert_eq!(
1181            crate::common::TaskV2Endpoint::ListRelatedTask.to_url(),
1182            "/open-apis/task/v2/task_v2/list_related_task"
1183        );
1184        assert_eq!(
1185            crate::common::TaskV2Endpoint::TaskSubscription.to_url(),
1186            "/open-apis/task/v2/task_v2/task_subscription"
1187        );
1188    }
1189}