use crate::types::{Link, ProcessorResponse};
use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountUserUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<i32>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccountUsers {
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub users: Option<Vec<AccountUser>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountUserOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub billing: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email_alerts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub operational_emails: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mfa_enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TaskStateUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub task_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<ProcessorResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountUser {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sign_up: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_api_key: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<AccountUserOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
pub struct UsersHandler {
client: CloudClient,
}
impl UsersHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_all_users(&self) -> Result<AccountUsers> {
self.client.get("/users").await
}
pub async fn delete_user_by_id(&self, user_id: i32) -> Result<TaskStateUpdate> {
let response = self.client.delete_raw(&format!("/users/{user_id}")).await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn get_user_by_id(&self, user_id: i32) -> Result<AccountUser> {
self.client.get(&format!("/users/{user_id}")).await
}
pub async fn update_user(
&self,
user_id: i32,
request: &AccountUserUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client.put(&format!("/users/{user_id}"), request).await
}
}