use crate::error::{map_manager_err, ManagerError};
use crate::gen::manager::apis::configuration::Configuration;
use crate::gen::manager::apis::manager_api;
use crate::gen::manager::apis::user_management_api as api;
use crate::gen::manager::models;
use crate::resources::raw::get_json;
use crate::retry::{with_retry, RetryPolicy};
use crate::token::SharedCfg;
#[derive(Debug, Clone, Default)]
pub struct ListUsersQuery {
pub email: Option<String>,
}
pub struct UsersResource {
pub(crate) cfg: SharedCfg<Configuration>,
pub(crate) retry: RetryPolicy,
}
impl UsersResource {
#[allow(deprecated)]
pub async fn me(&self) -> Result<models::GenericItemResponse, ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, true, || manager_api::get_me(cfg))
.await
.map_err(map_manager_err)
}
pub async fn get_by_email(
&self,
email: &str,
) -> Result<models::ManagedUserItemResponse, ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, true, || {
manager_api::get_user_by_email(cfg, email)
})
.await
.map_err(map_manager_err)
}
pub async fn list(
&self,
query: ListUsersQuery,
) -> Result<Vec<models::ManagedUser>, ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
let mut path = "/api/v2/users".to_string();
if let Some(email) = &query.email {
path.push_str(&format!(
"?email={}",
crate::gen::manager::apis::urlencode(email)
));
}
let resp: models::PaginatedManagedUserResponse = with_retry(&self.retry, true, || async {
let v = get_json(cfg, &path).await?;
serde_json::from_value(v).map_err(|e| ManagerError::Decode(e.to_string()))
})
.await?;
Ok(resp.items)
}
pub async fn list_all(&self) -> Result<Vec<models::ManagedUser>, ManagerError> {
self.list(ListUsersQuery::default()).await
}
pub async fn create(
&self,
user: models::CreateManagedUserRequest,
) -> Result<models::ManagedUserItemResponse, ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::create_user(cfg, Some(user.clone()))
})
.await
.map_err(map_manager_err)
}
pub async fn enable(&self, emails: Vec<String>) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::enable_users(cfg, Some(email_list(&emails)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
pub async fn disable(&self, emails: Vec<String>) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::disable_users(cfg, Some(email_list(&emails)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
pub async fn delete(&self, emails: Vec<String>) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::delete_users(cfg, Some(email_list(&emails)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
pub async fn reset_passwords(&self, emails: Vec<String>) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::reset_passwords(cfg, Some(email_list(&emails)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
pub async fn list_roles(&self) -> Result<Vec<models::AccountRole>, ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
let resp = with_retry(&self.retry, true, || api::list_available_roles(cfg))
.await
.map_err(map_manager_err)?;
Ok(resp.items)
}
pub async fn add_roles(
&self,
emails: Vec<String>,
roles: Vec<models::AccountRole>,
) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::add_roles(cfg, Some(role_binding(&emails, &roles)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
pub async fn remove_roles(
&self,
emails: Vec<String>,
roles: Vec<models::AccountRole>,
) -> Result<(), ManagerError> {
let cfg = self.cfg.get().await?;
let cfg = cfg.as_ref();
with_retry(&self.retry, false, || {
api::remove_roles(cfg, Some(role_binding(&emails, &roles)))
})
.await
.map_err(map_manager_err)?;
Ok(())
}
}
fn email_list(emails: &[String]) -> models::EmailListRequest {
models::EmailListRequest {
emails: emails.to_vec(),
}
}
fn role_binding(emails: &[String], roles: &[models::AccountRole]) -> models::EmailRoleBinding {
models::EmailRoleBinding {
emails: Some(emails.to_vec()),
roles: Some(roles.to_vec()),
}
}