use std::fmt::Debug;
use tonic::transport::Channel;
use tracing::{instrument, trace};
use crate::data::DamlResult;
use crate::data::identity_provider::DamlIdentityProviderConfig;
use crate::grpc_protobuf::com::daml::ledger::api::v2::admin::identity_provider_config_service_client::IdentityProviderConfigServiceClient;
use crate::grpc_protobuf::com::daml::ledger::api::v2::admin::{
CreateIdentityProviderConfigRequest, DeleteIdentityProviderConfigRequest, GetIdentityProviderConfigRequest,
ListIdentityProviderConfigsRequest, UpdateIdentityProviderConfigRequest,
};
use crate::service::common::make_request;
use crate::util::Required;
#[derive(Debug)]
pub struct DamlIdentityProviderConfigService<'a> {
channel: Channel,
auth_token: Option<&'a str>,
}
impl<'a> DamlIdentityProviderConfigService<'a> {
pub fn new(channel: Channel, auth_token: Option<&'a str>) -> Self {
Self {
channel,
auth_token,
}
}
pub fn with_token(self, auth_token: &'a str) -> Self {
Self {
auth_token: Some(auth_token),
..self
}
}
#[instrument(skip(self))]
pub async fn create_identity_provider_config(
&self,
config: DamlIdentityProviderConfig,
) -> DamlResult<DamlIdentityProviderConfig> {
let payload = CreateIdentityProviderConfigRequest {
identity_provider_config: Some(config.into()),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response =
self.client().create_identity_provider_config(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlIdentityProviderConfig::from(response.identity_provider_config.req()?))
}
#[instrument(skip(self))]
pub async fn get_identity_provider_config(
&self,
identity_provider_id: impl Into<String> + Debug,
) -> DamlResult<DamlIdentityProviderConfig> {
let payload = GetIdentityProviderConfigRequest {
identity_provider_id: identity_provider_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response =
self.client().get_identity_provider_config(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlIdentityProviderConfig::from(response.identity_provider_config.req()?))
}
#[instrument(skip(self, update_paths))]
pub async fn update_identity_provider_config(
&self,
config: DamlIdentityProviderConfig,
update_paths: impl IntoIterator<Item = String>,
) -> DamlResult<DamlIdentityProviderConfig> {
let payload = UpdateIdentityProviderConfigRequest {
identity_provider_config: Some(config.into()),
update_mask: Some(prost_types::FieldMask {
paths: update_paths.into_iter().collect(),
}),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response =
self.client().update_identity_provider_config(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlIdentityProviderConfig::from(response.identity_provider_config.req()?))
}
#[instrument(skip(self))]
pub async fn list_identity_provider_configs(&self) -> DamlResult<Vec<DamlIdentityProviderConfig>> {
let payload = ListIdentityProviderConfigsRequest {};
trace!(payload = ?payload, token = ?self.auth_token);
let response =
self.client().list_identity_provider_configs(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(response.identity_provider_configs.into_iter().map(DamlIdentityProviderConfig::from).collect())
}
#[instrument(skip(self))]
pub async fn delete_identity_provider_config(
&self,
identity_provider_id: impl Into<String> + Debug,
) -> DamlResult<()> {
let payload = DeleteIdentityProviderConfigRequest {
identity_provider_id: identity_provider_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
self.client().delete_identity_provider_config(make_request(payload, self.auth_token)?).await?;
Ok(())
}
fn client(&self) -> IdentityProviderConfigServiceClient<Channel> {
IdentityProviderConfigServiceClient::new(self.channel.clone())
}
}