1use crate::types::{Link, ProcessorResponse};
53use crate::{CloudClient, Result};
54use serde::{Deserialize, Serialize};
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
62#[serde(rename_all = "camelCase")]
63pub struct AccountUserUpdateRequest {
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub user_id: Option<i32>,
66
67 pub name: String,
69
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub role: Option<String>,
73
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub command_type: Option<String>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct AccountUsers {
81 #[serde(skip_serializing_if = "Option::is_none")]
82 pub account: Option<i32>,
83
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub users: Option<Vec<AccountUser>>,
87
88 #[serde(skip_serializing_if = "Option::is_none")]
90 pub links: Option<Vec<Link>>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
95#[serde(rename_all = "camelCase")]
96pub struct AccountUserOptions {
97 #[serde(skip_serializing_if = "Option::is_none")]
98 pub billing: Option<bool>,
99
100 #[serde(skip_serializing_if = "Option::is_none")]
101 pub email_alerts: Option<bool>,
102
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub operational_emails: Option<bool>,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub mfa_enabled: Option<bool>,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112#[serde(rename_all = "camelCase")]
113pub struct TaskStateUpdate {
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub task_id: Option<String>,
116
117 #[serde(skip_serializing_if = "Option::is_none")]
118 pub command_type: Option<String>,
119
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub status: Option<String>,
122
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub description: Option<String>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub timestamp: Option<String>,
128
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub response: Option<ProcessorResponse>,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub links: Option<Vec<Link>>,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
139#[serde(rename_all = "camelCase")]
140pub struct AccountUser {
141 #[serde(skip_serializing_if = "Option::is_none")]
142 pub id: Option<i32>,
143
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub name: Option<String>,
146
147 #[serde(skip_serializing_if = "Option::is_none")]
148 pub email: Option<String>,
149
150 #[serde(skip_serializing_if = "Option::is_none")]
151 pub role: Option<String>,
152
153 #[serde(skip_serializing_if = "Option::is_none")]
154 pub sign_up: Option<String>,
155
156 #[serde(skip_serializing_if = "Option::is_none")]
157 pub user_type: Option<String>,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub has_api_key: Option<bool>,
161
162 #[serde(skip_serializing_if = "Option::is_none")]
163 pub options: Option<AccountUserOptions>,
164
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub links: Option<Vec<Link>>,
168}
169
170pub struct UsersHandler {
179 client: CloudClient,
180}
181
182impl UsersHandler {
183 #[must_use]
185 pub fn new(client: CloudClient) -> Self {
186 Self { client }
187 }
188
189 pub async fn get_all_users(&self) -> Result<AccountUsers> {
194 self.client.get("/users").await
195 }
196
197 pub async fn delete_user_by_id(&self, user_id: i32) -> Result<TaskStateUpdate> {
202 let response = self.client.delete_raw(&format!("/users/{user_id}")).await?;
203 serde_json::from_value(response).map_err(Into::into)
204 }
205
206 pub async fn get_user_by_id(&self, user_id: i32) -> Result<AccountUser> {
211 self.client.get(&format!("/users/{user_id}")).await
212 }
213
214 pub async fn update_user(
219 &self,
220 user_id: i32,
221 request: &AccountUserUpdateRequest,
222 ) -> Result<TaskStateUpdate> {
223 self.client.put(&format!("/users/{user_id}"), request).await
224 }
225}