1use crate::{CloudClient, Result};
53use serde::{Deserialize, Serialize};
54use serde_json::Value;
55use std::collections::HashMap;
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
63#[serde(rename_all = "camelCase")]
64pub struct AccountUserUpdateRequest {
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub user_id: Option<i32>,
67
68 pub name: String,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub role: Option<String>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub command_type: Option<String>,
77
78 #[serde(flatten)]
80 pub extra: Value,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct AccountUsers {
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub account: Option<i32>,
88
89 #[serde(flatten)]
91 pub extra: Value,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
96#[serde(rename_all = "camelCase")]
97pub struct ProcessorResponse {
98 #[serde(skip_serializing_if = "Option::is_none")]
99 pub resource_id: Option<i32>,
100
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub additional_resource_id: Option<i32>,
103
104 #[serde(skip_serializing_if = "Option::is_none")]
105 pub resource: Option<HashMap<String, Value>>,
106
107 #[serde(skip_serializing_if = "Option::is_none")]
108 pub error: Option<String>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
111 pub additional_info: Option<String>,
112
113 #[serde(flatten)]
115 pub extra: Value,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
120#[serde(rename_all = "camelCase")]
121pub struct AccountUserOptions {
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub billing: Option<bool>,
124
125 #[serde(skip_serializing_if = "Option::is_none")]
126 pub email_alerts: Option<bool>,
127
128 #[serde(skip_serializing_if = "Option::is_none")]
129 pub operational_emails: Option<bool>,
130
131 #[serde(skip_serializing_if = "Option::is_none")]
132 pub mfa_enabled: Option<bool>,
133
134 #[serde(flatten)]
136 pub extra: Value,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize)]
141#[serde(rename_all = "camelCase")]
142pub struct TaskStateUpdate {
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub task_id: Option<String>,
145
146 #[serde(skip_serializing_if = "Option::is_none")]
147 pub command_type: Option<String>,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub status: Option<String>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub description: Option<String>,
154
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub timestamp: Option<String>,
157
158 #[serde(skip_serializing_if = "Option::is_none")]
159 pub response: Option<ProcessorResponse>,
160
161 #[serde(skip_serializing_if = "Option::is_none")]
163 pub links: Option<Vec<HashMap<String, Value>>>,
164
165 #[serde(flatten)]
167 pub extra: Value,
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize)]
172#[serde(rename_all = "camelCase")]
173pub struct AccountUser {
174 #[serde(skip_serializing_if = "Option::is_none")]
175 pub id: Option<i32>,
176
177 #[serde(skip_serializing_if = "Option::is_none")]
178 pub name: Option<String>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub email: Option<String>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
184 pub role: Option<String>,
185
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub sign_up: Option<String>,
188
189 #[serde(skip_serializing_if = "Option::is_none")]
190 pub user_type: Option<String>,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
193 pub has_api_key: Option<bool>,
194
195 #[serde(skip_serializing_if = "Option::is_none")]
196 pub options: Option<AccountUserOptions>,
197
198 #[serde(flatten)]
200 pub extra: Value,
201}
202
203pub struct UsersHandler {
212 client: CloudClient,
213}
214
215impl UsersHandler {
216 pub fn new(client: CloudClient) -> Self {
218 Self { client }
219 }
220
221 pub async fn get_all_users(&self) -> Result<AccountUsers> {
226 self.client.get("/users").await
227 }
228
229 pub async fn delete_user_by_id(&self, user_id: i32) -> Result<TaskStateUpdate> {
234 let response = self
235 .client
236 .delete_raw(&format!("/users/{}", user_id))
237 .await?;
238 serde_json::from_value(response).map_err(Into::into)
239 }
240
241 pub async fn get_user_by_id(&self, user_id: i32) -> Result<AccountUser> {
246 self.client.get(&format!("/users/{}", user_id)).await
247 }
248
249 pub async fn update_user(
254 &self,
255 user_id: i32,
256 request: &AccountUserUpdateRequest,
257 ) -> Result<TaskStateUpdate> {
258 self.client
259 .put(&format!("/users/{}", user_id), request)
260 .await
261 }
262}