use std::fmt::Debug;
use tonic::transport::Channel;
use tracing::{instrument, trace};
use crate::data::DamlResult;
use crate::data::party::{DamlObjectMeta, DamlPartyDetails};
use crate::grpc_protobuf::com::daml::ledger::api::v2::admin::party_management_service_client::PartyManagementServiceClient;
use crate::grpc_protobuf::com::daml::ledger::api::v2::admin::{
AllocatePartyRequest, GetParticipantIdRequest, GetPartiesRequest, ListKnownPartiesRequest,
UpdatePartyDetailsRequest, UpdatePartyIdentityProviderIdRequest,
};
use crate::service::common::make_request;
use crate::util::Required;
#[derive(Debug)]
pub struct DamlPartyManagementService<'a> {
channel: Channel,
auth_token: Option<&'a str>,
}
#[derive(Debug, Clone, Eq, PartialEq, Default)]
pub struct DamlPartyDetailsPage {
pub party_details: Vec<DamlPartyDetails>,
pub next_page_token: String,
}
impl<'a> DamlPartyManagementService<'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 get_participant_id(&self) -> DamlResult<String> {
let payload = GetParticipantIdRequest {};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().get_participant_id(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(response.participant_id)
}
#[instrument(skip(self))]
pub async fn get_parties(
&self,
parties: impl Into<Vec<String>> + Debug,
identity_provider_id: impl Into<String> + Debug,
) -> DamlResult<Vec<DamlPartyDetails>> {
let payload = GetPartiesRequest {
parties: parties.into(),
identity_provider_id: identity_provider_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().get_parties(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(response.party_details.into_iter().map(DamlPartyDetails::from).collect())
}
#[instrument(skip(self))]
pub async fn list_known_parties(
&self,
identity_provider_id: impl Into<String> + Debug,
page_token: impl Into<String> + Debug,
page_size: i32,
filter_party: impl Into<String> + Debug,
) -> DamlResult<DamlPartyDetailsPage> {
let payload = ListKnownPartiesRequest {
page_token: page_token.into(),
page_size,
identity_provider_id: identity_provider_id.into(),
filter_party: filter_party.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().list_known_parties(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlPartyDetailsPage {
party_details: response.party_details.into_iter().map(DamlPartyDetails::from).collect(),
next_page_token: response.next_page_token,
})
}
#[instrument(skip(self))]
pub async fn allocate_party(
&self,
party_id_hint: impl Into<String> + Debug,
local_metadata: Option<DamlObjectMeta>,
identity_provider_id: impl Into<String> + Debug,
synchronizer_id: impl Into<String> + Debug,
user_id: impl Into<String> + Debug,
) -> DamlResult<DamlPartyDetails> {
let payload = AllocatePartyRequest {
party_id_hint: party_id_hint.into(),
local_metadata: local_metadata.map(Into::into),
identity_provider_id: identity_provider_id.into(),
synchronizer_id: synchronizer_id.into(),
user_id: user_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
let response = self.client().allocate_party(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlPartyDetails::from(response.party_details.req()?))
}
#[instrument(skip(self, update_paths))]
pub async fn update_party_details(
&self,
party_details: DamlPartyDetails,
update_paths: impl IntoIterator<Item = String>,
) -> DamlResult<DamlPartyDetails> {
let payload = UpdatePartyDetailsRequest {
party_details: Some(party_details.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_party_details(make_request(payload, self.auth_token)?).await?.into_inner();
trace!(?response);
Ok(DamlPartyDetails::from(response.party_details.req()?))
}
#[instrument(skip(self))]
pub async fn update_party_identity_provider_id(
&self,
party: impl Into<String> + Debug,
source_identity_provider_id: impl Into<String> + Debug,
target_identity_provider_id: impl Into<String> + Debug,
) -> DamlResult<()> {
let payload = UpdatePartyIdentityProviderIdRequest {
party: party.into(),
source_identity_provider_id: source_identity_provider_id.into(),
target_identity_provider_id: target_identity_provider_id.into(),
};
trace!(payload = ?payload, token = ?self.auth_token);
self.client().update_party_identity_provider_id(make_request(payload, self.auth_token)?).await?;
Ok(())
}
fn client(&self) -> PartyManagementServiceClient<Channel> {
PartyManagementServiceClient::new(self.channel.clone())
}
}