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
7pub struct FunctionalRoleMemberService {
9 config: Config,
10}
11
12impl FunctionalRoleMemberService {
13 pub fn new(config: Config) -> Self {
14 Self { config }
15 }
16
17 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 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 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 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 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 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 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#[derive(Debug, Clone, Serialize, Deserialize, Default)]
289pub struct RoleMemberInfo {
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub member_id: Option<String>,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub member_type: Option<String>,
296 #[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 #[serde(skip_serializing_if = "Option::is_none")]
305 pub member_id: Option<String>,
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub member_type: Option<String>,
309 #[serde(skip_serializing_if = "Option::is_none")]
311 pub member_info: Option<RoleMemberDetail>,
312 #[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 #[serde(skip_serializing_if = "Option::is_none")]
321 pub name: Option<String>,
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub email: Option<String>,
325}
326
327#[derive(Debug, Clone, Serialize, Deserialize)]
328pub struct RoleMemberScope {
329 pub member_id: String,
331 pub scopes: Vec<String>,
333}
334
335#[derive(Debug, Clone, Serialize, Deserialize)]
336pub struct RoleMemberResult {
337 pub member_id: String,
339 pub success: bool,
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub error: Option<String>,
344}