use crate::client::RestClient;
use crate::error::Result;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub uid: u32,
pub email: String,
pub name: Option<String>,
pub role: String,
pub status: Option<String>,
pub auth_method: Option<String>,
pub certificate_subject_line: Option<String>,
pub password_issue_date: Option<String>,
pub email_alerts: Option<bool>,
pub role_uids: Option<Vec<u32>>,
pub bdbs: Option<Vec<u32>>,
pub alert_audit_db_conns: Option<bool>,
pub alert_bdb_backup: Option<bool>,
pub alert_bdb_crdt_src_syncer: Option<bool>,
pub password_expiration_duration: Option<u32>,
}
#[derive(Debug, Serialize, TypedBuilder)]
pub struct CreateUserRequest {
#[builder(setter(into))]
pub email: String,
#[builder(setter(into))]
pub password: String,
#[builder(setter(into))]
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub email_alerts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub bdbs_email_alerts: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub role_uids: Option<Vec<u32>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub auth_method: Option<String>,
}
#[derive(Debug, Serialize, TypedBuilder)]
pub struct UpdateUserRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub role: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub email_alerts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub bdbs_email_alerts: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub role_uids: Option<Vec<u32>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub auth_method: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Role {
pub uid: u32,
pub name: String,
pub management: Option<String>,
pub data_access: Option<String>,
}
pub struct UserHandler {
client: RestClient,
}
pub type UsersHandler = UserHandler;
impl UserHandler {
pub fn new(client: RestClient) -> Self {
UserHandler { client }
}
pub async fn list(&self) -> Result<Vec<User>> {
self.client.get("/v1/users").await
}
pub async fn get(&self, uid: u32) -> Result<User> {
self.client.get(&format!("/v1/users/{}", uid)).await
}
pub async fn create(&self, request: CreateUserRequest) -> Result<User> {
self.client.post("/v1/users", &request).await
}
pub async fn update(&self, uid: u32, request: UpdateUserRequest) -> Result<User> {
self.client
.put(&format!("/v1/users/{}", uid), &request)
.await
}
pub async fn delete(&self, uid: u32) -> Result<()> {
self.client.delete(&format!("/v1/users/{}", uid)).await
}
pub async fn permissions(&self) -> Result<Value> {
self.client.get("/v1/users/permissions").await
}
pub async fn permission_detail(&self, perm: &str) -> Result<Value> {
self.client
.get(&format!("/v1/users/permissions/{}", perm))
.await
}
pub async fn authorize(&self, body: AuthRequest) -> Result<AuthResponse> {
self.client.post("/v1/users/authorize", &body).await
}
pub async fn password_set(&self, body: PasswordSet) -> Result<()> {
self.client.post_action("/v1/users/password", &body).await
}
pub async fn password_update(&self, body: PasswordUpdate) -> Result<()> {
self.client.put("/v1/users/password", &body).await
}
pub async fn password_delete(&self) -> Result<()> {
self.client.delete("/v1/users/password").await
}
pub async fn refresh_jwt(&self, body: JwtRefreshRequest) -> Result<JwtRefreshResponse> {
self.client.post("/v1/users/refresh_jwt", &body).await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthRequest {
pub email: String,
pub password: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AuthResponse {
pub jwt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordSet {
pub email: String,
pub password: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PasswordUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub current_password: Option<String>,
pub new_password: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JwtRefreshRequest {
pub jwt: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JwtRefreshResponse {
pub jwt: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_at: Option<String>,
}
pub struct RoleHandler {
client: RestClient,
}
impl RoleHandler {
pub fn new(client: RestClient) -> Self {
RoleHandler { client }
}
pub async fn list(&self) -> Result<Vec<Role>> {
self.client.get("/v1/roles").await
}
pub async fn get(&self, uid: u32) -> Result<Role> {
self.client.get(&format!("/v1/roles/{}", uid)).await
}
}