open_lark/service/contact/v3/
functional_role_member.rs

1use crate::core::{
2    api_req::ApiRequest, api_resp::ApiResponseTrait, config::Config, constants::AccessTokenType,
3    endpoints::EndpointBuilder, http::Transport,
4};
5use serde::{Deserialize, Serialize};
6
7/// 角色成员服务
8pub struct FunctionalRoleMemberService {
9    config: Config,
10}
11
12impl FunctionalRoleMemberService {
13    pub fn new(config: Config) -> Self {
14        Self { config }
15    }
16
17    /// 添加角色成员
18    pub async fn create(
19        &self,
20        role_id: &str,
21        req: &CreateRoleMemberRequest,
22    ) -> crate::core::SDKResult<CreateRoleMemberResponse> {
23        let api_req = ApiRequest {
24            http_method: reqwest::Method::POST,
25            api_path: EndpointBuilder::replace_param(
26                crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBERS,
27                "role_id",
28                role_id,
29            ),
30            supported_access_token_types: vec![AccessTokenType::Tenant],
31            body: serde_json::to_vec(req)?,
32            ..Default::default()
33        };
34
35        let resp =
36            Transport::<CreateRoleMemberResponse>::request(api_req, &self.config, None).await?;
37        Ok(resp.data.unwrap_or_default())
38    }
39
40    /// 批量添加角色成员
41    pub async fn batch_create(
42        &self,
43        role_id: &str,
44        req: &BatchCreateRoleMembersRequest,
45    ) -> crate::core::SDKResult<BatchCreateRoleMembersResponse> {
46        let api_req = ApiRequest {
47            http_method: reqwest::Method::POST,
48            api_path: EndpointBuilder::replace_param(
49                crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBERS_BATCH_CREATE,
50                "role_id",
51                role_id,
52            ),
53            supported_access_token_types: vec![AccessTokenType::Tenant],
54            body: serde_json::to_vec(req)?,
55            ..Default::default()
56        };
57
58        let resp =
59            Transport::<BatchCreateRoleMembersResponse>::request(api_req, &self.config, None)
60                .await?;
61        Ok(resp.data.unwrap_or_default())
62    }
63
64    /// 批量设置角色成员管理范围
65    pub async fn scopes(
66        &self,
67        role_id: &str,
68        req: &SetRoleMemberScopesRequest,
69    ) -> crate::core::SDKResult<SetRoleMemberScopesResponse> {
70        let api_req = ApiRequest {
71            http_method: reqwest::Method::POST,
72            api_path: EndpointBuilder::replace_param(
73                crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBERS_SCOPES,
74                "role_id",
75                role_id,
76            ),
77            supported_access_token_types: vec![AccessTokenType::Tenant],
78            body: serde_json::to_vec(req)?,
79            ..Default::default()
80        };
81
82        let resp =
83            Transport::<SetRoleMemberScopesResponse>::request(api_req, &self.config, None).await?;
84        Ok(resp.data.unwrap_or_default())
85    }
86
87    /// 查询角色下某个成员的管理范围
88    pub async fn get(
89        &self,
90        role_id: &str,
91        member_id: &str,
92        _req: &GetRoleMemberRequest,
93    ) -> crate::core::SDKResult<GetRoleMemberResponse> {
94        let api_req = ApiRequest {
95            http_method: reqwest::Method::GET,
96            api_path: {
97                let path = EndpointBuilder::replace_param(
98                    crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBER_GET,
99                    "role_id",
100                    role_id,
101                );
102                EndpointBuilder::replace_param(&path, "member_id", member_id)
103            },
104            supported_access_token_types: vec![AccessTokenType::Tenant],
105            body: Vec::new(),
106            query_params: std::collections::HashMap::new(),
107            ..Default::default()
108        };
109
110        let resp = Transport::<GetRoleMemberResponse>::request(api_req, &self.config, None).await?;
111        Ok(resp.data.unwrap_or_default())
112    }
113
114    /// 查询角色下的所有成员信息
115    pub async fn list(
116        &self,
117        role_id: &str,
118        _req: &ListRoleMembersRequest,
119    ) -> crate::core::SDKResult<ListRoleMembersResponse> {
120        let api_req = ApiRequest {
121            http_method: reqwest::Method::GET,
122            api_path: EndpointBuilder::replace_param(
123                crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBERS,
124                "role_id",
125                role_id,
126            ),
127            supported_access_token_types: vec![AccessTokenType::Tenant],
128            body: Vec::new(),
129            query_params: std::collections::HashMap::new(),
130            ..Default::default()
131        };
132
133        let resp =
134            Transport::<ListRoleMembersResponse>::request(api_req, &self.config, None).await?;
135        Ok(resp.data.unwrap_or_default())
136    }
137
138    /// 删除角色下的成员
139    pub async fn batch_delete(
140        &self,
141        role_id: &str,
142        req: &BatchDeleteRoleMembersRequest,
143    ) -> crate::core::SDKResult<BatchDeleteRoleMembersResponse> {
144        let api_req = ApiRequest {
145            http_method: reqwest::Method::POST,
146            api_path: EndpointBuilder::replace_param(
147                crate::core::endpoints::contact::CONTACT_V3_FUNCTIONAL_ROLE_MEMBERS_BATCH_DELETE,
148                "role_id",
149                role_id,
150            ),
151            supported_access_token_types: vec![AccessTokenType::Tenant],
152            body: serde_json::to_vec(req)?,
153            ..Default::default()
154        };
155
156        let resp =
157            Transport::<BatchDeleteRoleMembersResponse>::request(api_req, &self.config, None)
158                .await?;
159        Ok(resp.data.unwrap_or_default())
160    }
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct CreateRoleMemberRequest {
165    /// 成员信息
166    pub member: RoleMemberInfo,
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub user_id_type: Option<String>,
169    #[serde(skip_serializing_if = "Option::is_none")]
170    pub department_id_type: Option<String>,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize, Default)]
174pub struct CreateRoleMemberResponse {
175    pub member_id: String,
176}
177
178impl ApiResponseTrait for CreateRoleMemberResponse {
179    fn data_format() -> crate::core::api_resp::ResponseFormat {
180        crate::core::api_resp::ResponseFormat::Data
181    }
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
185pub struct BatchCreateRoleMembersRequest {
186    pub members: Vec<RoleMemberInfo>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub user_id_type: Option<String>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub department_id_type: Option<String>,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize, Default)]
194pub struct BatchCreateRoleMembersResponse {
195    pub results: Vec<RoleMemberResult>,
196}
197
198impl ApiResponseTrait for BatchCreateRoleMembersResponse {
199    fn data_format() -> crate::core::api_resp::ResponseFormat {
200        crate::core::api_resp::ResponseFormat::Data
201    }
202}
203
204#[derive(Debug, Clone, Serialize, Deserialize)]
205pub struct SetRoleMemberScopesRequest {
206    pub members: Vec<RoleMemberScope>,
207    #[serde(skip_serializing_if = "Option::is_none")]
208    pub user_id_type: Option<String>,
209    #[serde(skip_serializing_if = "Option::is_none")]
210    pub department_id_type: Option<String>,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize, Default)]
214pub struct SetRoleMemberScopesResponse {}
215
216impl ApiResponseTrait for SetRoleMemberScopesResponse {
217    fn data_format() -> crate::core::api_resp::ResponseFormat {
218        crate::core::api_resp::ResponseFormat::Data
219    }
220}
221
222#[derive(Debug, Clone, Default, Serialize, Deserialize)]
223pub struct GetRoleMemberRequest {
224    #[serde(skip_serializing_if = "Option::is_none")]
225    pub user_id_type: Option<String>,
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub department_id_type: Option<String>,
228}
229
230#[derive(Debug, Clone, Serialize, Deserialize, Default)]
231pub struct GetRoleMemberResponse {
232    pub member: RoleMember,
233}
234
235impl ApiResponseTrait for GetRoleMemberResponse {
236    fn data_format() -> crate::core::api_resp::ResponseFormat {
237        crate::core::api_resp::ResponseFormat::Data
238    }
239}
240
241#[derive(Debug, Clone, Default, Serialize, Deserialize)]
242pub struct ListRoleMembersRequest {
243    #[serde(skip_serializing_if = "Option::is_none")]
244    pub page_size: Option<i32>,
245    #[serde(skip_serializing_if = "Option::is_none")]
246    pub page_token: Option<String>,
247    #[serde(skip_serializing_if = "Option::is_none")]
248    pub user_id_type: Option<String>,
249    #[serde(skip_serializing_if = "Option::is_none")]
250    pub department_id_type: Option<String>,
251}
252
253#[derive(Debug, Clone, Serialize, Deserialize, Default)]
254pub struct ListRoleMembersResponse {
255    pub members: Vec<RoleMember>,
256    #[serde(skip_serializing_if = "Option::is_none")]
257    pub has_more: Option<bool>,
258    #[serde(skip_serializing_if = "Option::is_none")]
259    pub page_token: Option<String>,
260}
261
262impl ApiResponseTrait for ListRoleMembersResponse {
263    fn data_format() -> crate::core::api_resp::ResponseFormat {
264        crate::core::api_resp::ResponseFormat::Data
265    }
266}
267
268#[derive(Debug, Clone, Serialize, Deserialize)]
269pub struct BatchDeleteRoleMembersRequest {
270    pub member_ids: Vec<String>,
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub user_id_type: Option<String>,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize, Default)]
276pub struct BatchDeleteRoleMembersResponse {
277    pub results: Vec<RoleMemberResult>,
278}
279
280impl ApiResponseTrait for BatchDeleteRoleMembersResponse {
281    fn data_format() -> crate::core::api_resp::ResponseFormat {
282        crate::core::api_resp::ResponseFormat::Data
283    }
284}
285
286// 公共数据结构
287
288#[derive(Debug, Clone, Serialize, Deserialize, Default)]
289pub struct RoleMemberInfo {
290    /// 成员ID
291    #[serde(skip_serializing_if = "Option::is_none")]
292    pub member_id: Option<String>,
293    /// 成员类型 (user/department)
294    #[serde(skip_serializing_if = "Option::is_none")]
295    pub member_type: Option<String>,
296    /// 管理范围
297    #[serde(skip_serializing_if = "Option::is_none")]
298    pub scope: Option<String>,
299}
300
301#[derive(Debug, Clone, Serialize, Deserialize, Default)]
302pub struct RoleMember {
303    /// 成员ID
304    #[serde(skip_serializing_if = "Option::is_none")]
305    pub member_id: Option<String>,
306    /// 成员类型
307    #[serde(skip_serializing_if = "Option::is_none")]
308    pub member_type: Option<String>,
309    /// 成员信息
310    #[serde(skip_serializing_if = "Option::is_none")]
311    pub member_info: Option<RoleMemberDetail>,
312    /// 管理范围
313    #[serde(skip_serializing_if = "Option::is_none")]
314    pub scopes: Option<Vec<String>>,
315}
316
317#[derive(Debug, Clone, Serialize, Deserialize, Default)]
318pub struct RoleMemberDetail {
319    /// 成员名称
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub name: Option<String>,
322    /// 成员邮箱
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub email: Option<String>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct RoleMemberScope {
329    /// 成员ID
330    pub member_id: String,
331    /// 管理范围列表
332    pub scopes: Vec<String>,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
336pub struct RoleMemberResult {
337    /// 成员ID
338    pub member_id: String,
339    /// 操作是否成功
340    pub success: bool,
341    /// 错误信息
342    #[serde(skip_serializing_if = "Option::is_none")]
343    pub error: Option<String>,
344}