use crate::errors::HivehookError;
use crate::resources::_base::{put_opt, vars};
#[cfg(feature = "blocking")]
use crate::transport::BlockingGraphQLTransport;
use crate::types::{ListResult, Organization};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
const FRAGMENT: &str = "id name slug ssoEnabled ssoProvider retentionEvents retentionMessages otlpConfig { endpoint headers insecure sampleRate } createdAt updatedAt";
#[non_exhaustive]
#[derive(Debug, Default, Clone)]
pub struct ListOrganizationsOptions {
pub search: Option<String>,
pub limit: Option<i32>,
pub offset: Option<i32>,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateOrganizationInput {
pub name: String,
pub slug: String,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UpdateOrganizationInput {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SsoConfigInput {
pub provider: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub idp_metadata_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acs_base_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub issuer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_url: Option<String>,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RetentionInput {
pub retention_events: i32,
pub retention_messages: i32,
}
#[non_exhaustive]
#[derive(Debug, Default, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct OtlpConfigInput {
pub endpoint: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub insecure: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sample_rate: Option<f64>,
}
#[derive(Deserialize)]
struct ListData {
organizations: ListResult<Organization>,
}
#[derive(Deserialize)]
struct GetData {
organization: Option<Organization>,
}
#[derive(Deserialize)]
struct CreateData {
#[serde(rename = "createOrganization")]
create_organization: Organization,
}
#[derive(Deserialize)]
struct UpdateData {
#[serde(rename = "updateOrganization")]
update_organization: Organization,
}
#[derive(Deserialize)]
struct DeleteData {
#[serde(rename = "deleteOrganization")]
delete_organization: bool,
}
#[derive(Deserialize)]
struct ConfigureSsoData {
#[serde(rename = "configureSSO")]
configure_sso: Organization,
}
#[derive(Deserialize)]
struct DisableSsoData {
#[serde(rename = "disableSSO")]
disable_sso: Organization,
}
#[derive(Deserialize)]
struct UpdateRetentionData {
#[serde(rename = "updateOrganizationRetention")]
update_organization_retention: Organization,
}
#[derive(Deserialize)]
struct DeleteDataData {
#[serde(rename = "deleteOrganizationData")]
delete_organization_data: bool,
}
#[derive(Deserialize)]
struct ExportDataData {
#[serde(rename = "exportOrganizationData")]
export_organization_data: Option<Value>,
}
#[derive(Deserialize)]
struct ConfigureOtlpData {
#[serde(rename = "configureOTLP")]
configure_otlp: Organization,
}
#[derive(Deserialize)]
struct DisableOtlpData {
#[serde(rename = "disableOTLP")]
disable_otlp: Organization,
}
#[cfg(feature = "blocking")]
pub struct OrganizationService<'a> {
pub(crate) transport: &'a BlockingGraphQLTransport,
}
#[cfg(feature = "blocking")]
impl<'a> OrganizationService<'a> {
pub fn list(
&self,
options: ListOrganizationsOptions,
) -> Result<ListResult<Organization>, HivehookError> {
let query = format!(
r#"query($search: String, $limit: Int, $offset: Int) {{
organizations(search: $search, limit: $limit, offset: $offset) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
let data: ListData = self.transport.execute(&query, Some(v))?;
Ok(data.organizations)
}
pub fn get(&self, id: &str) -> Result<Option<Organization>, HivehookError> {
let query = format!("query($id: UUID!) {{ organization(id: $id) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v))?;
Ok(data.organization)
}
pub fn create(
&self,
input: CreateOrganizationInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($input: CreateOrganizationInput!) {{ createOrganization(input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("input".into(), serde_json::to_value(input)?);
let data: CreateData = self.transport.execute(&query, Some(v))?;
Ok(data.create_organization)
}
pub fn update(
&self,
id: &str,
input: UpdateOrganizationInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($id: UUID!, $input: UpdateOrganizationInput!) {{ updateOrganization(id: $id, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateData = self.transport.execute(&query, Some(v))?;
Ok(data.update_organization)
}
pub fn delete(&self, id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: DeleteData = self.transport.execute(
"mutation($id: UUID!) { deleteOrganization(id: $id) }",
Some(v),
)?;
Ok(data.delete_organization)
}
pub fn configure_sso(
&self,
organization_id: &str,
input: SsoConfigInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: SSOConfigInput!) {{ configureSSO(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: ConfigureSsoData = self.transport.execute(&query, Some(v))?;
Ok(data.configure_sso)
}
pub fn disable_sso(&self, organization_id: &str) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!) {{ disableSSO(organizationId: $organizationId) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DisableSsoData = self.transport.execute(&query, Some(v))?;
Ok(data.disable_sso)
}
pub fn update_retention(
&self,
organization_id: &str,
input: RetentionInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: RetentionInput!) {{ updateOrganizationRetention(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateRetentionData = self.transport.execute(&query, Some(v))?;
Ok(data.update_organization_retention)
}
pub fn delete_data(&self, organization_id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DeleteDataData = self.transport.execute(
"mutation($organizationId: UUID!) { deleteOrganizationData(organizationId: $organizationId) }",
Some(v),
)?;
Ok(data.delete_organization_data)
}
pub fn export_data(&self, organization_id: &str) -> Result<Option<Value>, HivehookError> {
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: ExportDataData = self.transport.execute(
"mutation($organizationId: UUID!) { exportOrganizationData(organizationId: $organizationId) }",
Some(v),
)?;
Ok(data.export_organization_data)
}
pub fn configure_otlp(
&self,
organization_id: &str,
input: OtlpConfigInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: OTLPConfigInput!) {{ configureOTLP(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: ConfigureOtlpData = self.transport.execute(&query, Some(v))?;
Ok(data.configure_otlp)
}
pub fn disable_otlp(&self, organization_id: &str) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!) {{ disableOTLP(organizationId: $organizationId) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DisableOtlpData = self.transport.execute(&query, Some(v))?;
Ok(data.disable_otlp)
}
}
#[cfg(feature = "async")]
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
pub struct AsyncOrganizationService<'a> {
pub(crate) transport: &'a crate::transport::AsyncGraphQLTransport,
}
#[cfg(feature = "async")]
impl<'a> AsyncOrganizationService<'a> {
pub async fn list(
&self,
options: ListOrganizationsOptions,
) -> Result<ListResult<Organization>, HivehookError> {
let query = format!(
r#"query($search: String, $limit: Int, $offset: Int) {{
organizations(search: $search, limit: $limit, offset: $offset) {{
nodes {{ {FRAGMENT} }}
pageInfo {{ total limit offset endCursor hasNextPage }}
}}
}}"#
);
let mut v = vars();
put_opt(&mut v, "search", options.search);
put_opt(&mut v, "limit", options.limit);
put_opt(&mut v, "offset", options.offset);
let data: ListData = self.transport.execute(&query, Some(v)).await?;
Ok(data.organizations)
}
pub async fn get(&self, id: &str) -> Result<Option<Organization>, HivehookError> {
let query = format!("query($id: UUID!) {{ organization(id: $id) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: GetData = self.transport.execute(&query, Some(v)).await?;
Ok(data.organization)
}
pub async fn create(
&self,
input: CreateOrganizationInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($input: CreateOrganizationInput!) {{ createOrganization(input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("input".into(), serde_json::to_value(input)?);
let data: CreateData = self.transport.execute(&query, Some(v)).await?;
Ok(data.create_organization)
}
pub async fn update(
&self,
id: &str,
input: UpdateOrganizationInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($id: UUID!, $input: UpdateOrganizationInput!) {{ updateOrganization(id: $id, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateData = self.transport.execute(&query, Some(v)).await?;
Ok(data.update_organization)
}
pub async fn delete(&self, id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("id".into(), Value::String(id.into()));
let data: DeleteData = self
.transport
.execute(
"mutation($id: UUID!) { deleteOrganization(id: $id) }",
Some(v),
)
.await?;
Ok(data.delete_organization)
}
pub async fn configure_sso(
&self,
organization_id: &str,
input: SsoConfigInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: SSOConfigInput!) {{ configureSSO(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: ConfigureSsoData = self.transport.execute(&query, Some(v)).await?;
Ok(data.configure_sso)
}
pub async fn disable_sso(&self, organization_id: &str) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!) {{ disableSSO(organizationId: $organizationId) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DisableSsoData = self.transport.execute(&query, Some(v)).await?;
Ok(data.disable_sso)
}
pub async fn update_retention(
&self,
organization_id: &str,
input: RetentionInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: RetentionInput!) {{ updateOrganizationRetention(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: UpdateRetentionData = self.transport.execute(&query, Some(v)).await?;
Ok(data.update_organization_retention)
}
pub async fn delete_data(&self, organization_id: &str) -> Result<bool, HivehookError> {
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DeleteDataData = self.transport.execute(
"mutation($organizationId: UUID!) { deleteOrganizationData(organizationId: $organizationId) }",
Some(v),
).await?;
Ok(data.delete_organization_data)
}
pub async fn export_data(
&self,
organization_id: &str,
) -> Result<Option<Value>, HivehookError> {
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: ExportDataData = self.transport.execute(
"mutation($organizationId: UUID!) { exportOrganizationData(organizationId: $organizationId) }",
Some(v),
).await?;
Ok(data.export_organization_data)
}
pub async fn configure_otlp(
&self,
organization_id: &str,
input: OtlpConfigInput,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!, $input: OTLPConfigInput!) {{ configureOTLP(organizationId: $organizationId, input: $input) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
v.insert("input".into(), serde_json::to_value(input)?);
let data: ConfigureOtlpData = self.transport.execute(&query, Some(v)).await?;
Ok(data.configure_otlp)
}
pub async fn disable_otlp(
&self,
organization_id: &str,
) -> Result<Organization, HivehookError> {
let query = format!("mutation($organizationId: UUID!) {{ disableOTLP(organizationId: $organizationId) {{ {FRAGMENT} }} }}");
let mut v = vars();
v.insert("organizationId".into(), Value::String(organization_id.into()));
let data: DisableOtlpData = self.transport.execute(&query, Some(v)).await?;
Ok(data.disable_otlp)
}
}