1use crate::client::RestClient;
13use crate::error::Result;
14use serde::{Deserialize, Serialize};
15use serde_json::Value;
16use typed_builder::TypedBuilder;
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct User {
21 pub uid: u32,
22 pub email: String,
24 pub name: Option<String>,
26 pub role: String,
28 pub status: Option<String>,
30 pub auth_method: Option<String>,
32 pub certificate_subject_line: Option<String>,
34 pub password_issue_date: Option<String>,
36 pub email_alerts: Option<bool>,
38 pub role_uids: Option<Vec<u32>>,
40 pub bdbs: Option<Vec<u32>>,
42 pub alert_audit_db_conns: Option<bool>,
44 pub alert_bdb_backup: Option<bool>,
46 pub alert_bdb_crdt_src_syncer: Option<bool>,
48 pub password_expiration_duration: Option<u32>,
50
51 #[serde(flatten)]
52 pub extra: Value,
53}
54
55#[derive(Debug, Serialize, TypedBuilder)]
71pub struct CreateUserRequest {
72 #[builder(setter(into))]
74 pub email: String,
75 #[builder(setter(into))]
77 pub password: String,
78 #[builder(setter(into))]
80 pub role: String,
81 #[serde(skip_serializing_if = "Option::is_none")]
83 #[builder(default, setter(into, strip_option))]
84 pub name: Option<String>,
85 #[serde(skip_serializing_if = "Option::is_none")]
87 #[builder(default, setter(strip_option))]
88 pub email_alerts: Option<bool>,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 #[builder(default, setter(strip_option))]
92 pub bdbs_email_alerts: Option<Vec<String>>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 #[builder(default, setter(strip_option))]
96 pub role_uids: Option<Vec<u32>>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 #[builder(default, setter(into, strip_option))]
100 pub auth_method: Option<String>,
101}
102
103#[derive(Debug, Serialize, TypedBuilder)]
116pub struct UpdateUserRequest {
117 #[serde(skip_serializing_if = "Option::is_none")]
119 #[builder(default, setter(into, strip_option))]
120 pub password: Option<String>,
121 #[serde(skip_serializing_if = "Option::is_none")]
123 #[builder(default, setter(into, strip_option))]
124 pub role: Option<String>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 #[builder(default, setter(into, strip_option))]
128 pub email: Option<String>,
129 #[serde(skip_serializing_if = "Option::is_none")]
131 #[builder(default, setter(into, strip_option))]
132 pub name: Option<String>,
133 #[serde(skip_serializing_if = "Option::is_none")]
135 #[builder(default, setter(strip_option))]
136 pub email_alerts: Option<bool>,
137 #[serde(skip_serializing_if = "Option::is_none")]
139 #[builder(default, setter(strip_option))]
140 pub bdbs_email_alerts: Option<Vec<String>>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 #[builder(default, setter(strip_option))]
144 pub role_uids: Option<Vec<u32>>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 #[builder(default, setter(into, strip_option))]
148 pub auth_method: Option<String>,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
153pub struct Role {
154 pub uid: u32,
155 pub name: String,
156 pub management: Option<String>,
157 pub data_access: Option<String>,
158
159 #[serde(flatten)]
160 pub extra: Value,
161}
162
163pub struct UserHandler {
165 client: RestClient,
166}
167
168pub type UsersHandler = UserHandler;
170
171impl UserHandler {
172 pub fn new(client: RestClient) -> Self {
173 UserHandler { client }
174 }
175
176 pub async fn list(&self) -> Result<Vec<User>> {
178 self.client.get("/v1/users").await
179 }
180
181 pub async fn get(&self, uid: u32) -> Result<User> {
183 self.client.get(&format!("/v1/users/{}", uid)).await
184 }
185
186 pub async fn create(&self, request: CreateUserRequest) -> Result<User> {
188 self.client.post("/v1/users", &request).await
189 }
190
191 pub async fn update(&self, uid: u32, request: UpdateUserRequest) -> Result<User> {
193 self.client
194 .put(&format!("/v1/users/{}", uid), &request)
195 .await
196 }
197
198 pub async fn delete(&self, uid: u32) -> Result<()> {
200 self.client.delete(&format!("/v1/users/{}", uid)).await
201 }
202
203 pub async fn permissions(&self) -> Result<Value> {
205 self.client.get("/v1/users/permissions").await
206 }
207
208 pub async fn permission_detail(&self, perm: &str) -> Result<Value> {
210 self.client
211 .get(&format!("/v1/users/permissions/{}", perm))
212 .await
213 }
214
215 pub async fn authorize(&self, body: AuthRequest) -> Result<AuthResponse> {
217 self.client.post("/v1/users/authorize", &body).await
218 }
219
220 pub async fn password_set(&self, body: PasswordSet) -> Result<()> {
222 self.client.post_action("/v1/users/password", &body).await
223 }
224
225 pub async fn password_update(&self, body: PasswordUpdate) -> Result<()> {
227 self.client.put("/v1/users/password", &body).await
228 }
229
230 pub async fn password_delete(&self) -> Result<()> {
232 self.client.delete("/v1/users/password").await
233 }
234
235 pub async fn refresh_jwt(&self, body: JwtRefreshRequest) -> Result<JwtRefreshResponse> {
237 self.client.post("/v1/users/refresh_jwt", &body).await
238 }
239}
240
241#[derive(Debug, Clone, Serialize, Deserialize)]
242pub struct AuthRequest {
243 pub email: String,
244 pub password: String,
245}
246
247#[derive(Debug, Clone, Serialize, Deserialize)]
248pub struct AuthResponse {
249 pub jwt: String,
250 #[serde(skip_serializing_if = "Option::is_none")]
251 pub expires_at: Option<String>,
252 #[serde(flatten)]
253 pub extra: Value,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize)]
257pub struct PasswordSet {
258 pub email: String,
259 pub password: String,
260}
261
262#[derive(Debug, Clone, Serialize, Deserialize)]
263pub struct PasswordUpdate {
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub current_password: Option<String>,
266 pub new_password: String,
267}
268
269#[derive(Debug, Clone, Serialize, Deserialize)]
270pub struct JwtRefreshRequest {
271 pub jwt: String,
272}
273
274#[derive(Debug, Clone, Serialize, Deserialize)]
275pub struct JwtRefreshResponse {
276 pub jwt: String,
277 #[serde(skip_serializing_if = "Option::is_none")]
278 pub expires_at: Option<String>,
279}
280
281pub struct RoleHandler {
283 client: RestClient,
284}
285
286impl RoleHandler {
287 pub fn new(client: RestClient) -> Self {
288 RoleHandler { client }
289 }
290
291 pub async fn list(&self) -> Result<Vec<Role>> {
293 self.client.get("/v1/roles").await
294 }
295
296 pub async fn get(&self, uid: u32) -> Result<Role> {
298 self.client.get(&format!("/v1/roles/{}", uid)).await
299 }
300}