use crate::util::RequestBuilderExt;
use reqwest::{Method, StatusCode};
use serde::{Deserialize, Serialize};
use serde_json::json;
use time::OffsetDateTime;
use uuid::Uuid;
use crate::serde::Empty;
use crate::util::StrIteratorExt;
use crate::{error, Client, Error};
const TENANT_PATH: [&str; 4] = ["tenants", "resources", "tenants", "v1"];
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TenantRequest<'a> {
#[serde(rename = "tenantId")]
pub id: Uuid,
pub name: &'a str,
pub metadata: serde_json::Value,
pub creator_name: Option<&'a str>,
pub creator_email: Option<&'a str>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Tenant {
#[serde(rename = "tenantId")]
pub id: Uuid,
pub name: String,
#[serde(default = "crate::serde::empty_json_object")]
#[serde(deserialize_with = "crate::serde::nested_json::deserialize")]
pub metadata: serde_json::Value,
pub creator_name: Option<String>,
pub creator_email: Option<String>,
#[serde(with = "time::serde::rfc3339")]
pub created_at: OffsetDateTime,
#[serde(with = "time::serde::rfc3339")]
pub updated_at: OffsetDateTime,
#[serde(with = "time::serde::rfc3339::option")]
pub deleted_at: Option<OffsetDateTime>,
}
impl Client {
pub async fn list_tenants(&self) -> Result<Vec<Tenant>, Error> {
let req = self.build_request(Method::GET, TENANT_PATH);
let res = self.send_request(req).await?;
Ok(res)
}
pub async fn create_tenant(&self, tenant: &TenantRequest<'_>) -> Result<Tenant, Error> {
let req = self.build_request(Method::POST, TENANT_PATH);
let req = req.json(tenant);
let res = self.send_request(req).await?;
Ok(res)
}
pub async fn get_tenant(&self, id: Uuid) -> Result<Tenant, Error> {
let req = self.build_request(Method::GET, TENANT_PATH.chain_one(id));
let mut res: Vec<Tenant> = self.send_request(req).await?;
res.pop().ok_or(Error::Api(error::ApiError {
status_code: StatusCode::NOT_FOUND,
messages: vec!["Tenant not found".to_string()],
}))
}
pub async fn delete_tenant(&self, id: Uuid) -> Result<(), Error> {
let req = self.build_request(Method::DELETE, TENANT_PATH.chain_one(id));
let _: Empty = self.send_request(req).await?;
Ok(())
}
pub async fn set_tenant_metadata(
&self,
id: Uuid,
metadata: &serde_json::Value,
) -> Result<Tenant, Error> {
let req = self
.build_request(
Method::POST,
TENANT_PATH.chain_one(id).chain_one("metadata"),
)
.json(&json!({ "metadata": metadata }));
let res = self.send_request(req).await?;
Ok(res)
}
pub async fn delete_tenant_metadata(&self, id: Uuid, key: &str) -> Result<Tenant, Error> {
let req = self.build_request(
Method::DELETE,
TENANT_PATH
.chain_one(id)
.chain_one("metadata")
.chain_one(key),
);
let res = self.send_request(req).await?;
Ok(res)
}
}