meegle/project_relation/
api.rs

1use super::types::*;
2use crate::client::{AuthType, Client};
3use crate::error::ApiResult;
4use serde_json;
5
6pub trait ProjectRelationApi {
7    /// 获取空间关联规则列表
8    /// 该接口用于获取指定空间下配置的空间关联规则列表,对应的平台功能介绍可参考空间关联规则配置
9    fn get_project_relation_rules(
10        &self,
11        request: GetProjectRelationRulesRequest,
12        auth: AuthType,
13    ) -> impl std::future::Future<Output = ApiResult<GetProjectRelationRulesResponse>> + Send;
14
15    /// 获取空间关联下的关联工作项实例列表
16    /// 该接口用于获取与指定工作项实例有空间关联的工作项实例列表
17    fn get_relation_instances(
18        &self,
19        request: GetRelationInstancesRequest,
20        auth: AuthType,
21    ) -> impl std::future::Future<Output = ApiResult<GetRelationInstancesResponse>> + Send;
22
23    /// 批量绑定工作项实例
24    /// 该接口用于将指定工作项实例和传入的工作项实例列表建立空间关联绑定关系
25    fn batch_bind_relation(
26        &self,
27        request: BatchBindRelationRequest,
28        auth: AuthType,
29    ) -> impl std::future::Future<Output = ApiResult<BatchBindRelationResponse>> + Send;
30
31    /// 解绑空间关联的关联工作项实例
32    /// 该接口用于将指定工作项实例和传入的工作项实例解除空间关联绑定关系
33    fn unbind_relation(
34        &self,
35        request: UnbindRelationRequest,
36        auth: AuthType,
37    ) -> impl std::future::Future<Output = ApiResult<UnbindRelationResponse>> + Send;
38}
39
40impl ProjectRelationApi for Client {
41    async fn get_project_relation_rules(
42        &self,
43        request: GetProjectRelationRulesRequest,
44        auth: AuthType,
45    ) -> ApiResult<GetProjectRelationRulesResponse> {
46        Ok(self
47            .post(
48                &format!("{}/relation/rules", request.project_key),
49                &request,
50                auth,
51            )
52            .await?)
53    }
54
55    async fn get_relation_instances(
56        &self,
57        request: GetRelationInstancesRequest,
58        auth: AuthType,
59    ) -> ApiResult<GetRelationInstancesResponse> {
60        Ok(self
61            .post(
62                &format!(
63                    "{}/relation/{}/{}/work_item_list",
64                    request.project_key, request.work_item_type_key, request.work_item_id
65                ),
66                &request,
67                auth,
68            )
69            .await?)
70    }
71
72    async fn batch_bind_relation(
73        &self,
74        request: BatchBindRelationRequest,
75        auth: AuthType,
76    ) -> ApiResult<BatchBindRelationResponse> {
77        let BatchBindRelationRequest {
78            project_key,
79            work_item_type_key,
80            work_item_id,
81            instances,
82            relation_rule_id,
83        } = request;
84
85        Ok(self
86            .post(
87                &format!(
88                    "{}/relation/{}/{}/batch_bind",
89                    project_key, work_item_type_key, work_item_id
90                ),
91                &serde_json::json!({
92                    "instances": instances,
93                    "relation_rule_id": relation_rule_id
94                }),
95                auth,
96            )
97            .await?)
98    }
99
100    async fn unbind_relation(
101        &self,
102        request: UnbindRelationRequest,
103        auth: AuthType,
104    ) -> ApiResult<UnbindRelationResponse> {
105        Ok(self
106            .delete_with_body(
107                &format!(
108                    "{}/relation/{}/{}",
109                    request.project_key, request.work_item_type_key, request.work_item_id
110                ),
111                &request,
112                auth,
113            )
114            .await?)
115    }
116}