use std::collections::HashSet;
use crate::{
commons::channel::SenderEnd,
database::DB,
ledger::LedgerCommand,
message::{MessageConfig, MessageTaskCommand},
protocol::protocol_message_manager::TapleMessages,
DatabaseCollection, DigestIdentifier, KeyIdentifier,
};
use super::error::AuthorizedSubjectsError;
pub struct AuthorizedSubjects<C: DatabaseCollection> {
database: DB<C>,
message_channel: SenderEnd<MessageTaskCommand<TapleMessages>, ()>,
our_id: KeyIdentifier,
}
impl<C: DatabaseCollection> AuthorizedSubjects<C> {
pub fn new(
database: DB<C>,
message_channel: SenderEnd<MessageTaskCommand<TapleMessages>, ()>,
our_id: KeyIdentifier,
) -> Self {
Self {
database,
message_channel,
our_id,
}
}
pub async fn ask_for_all(&self) -> Result<(), AuthorizedSubjectsError> {
let preauthorized_subjects = match self
.database
.get_allowed_subjects_and_providers(None, 10000)
{
Ok(psp) => psp,
Err(error) => match error {
_ => return Err(AuthorizedSubjectsError::DatabaseError(error)),
},
};
for (subject_id, providers) in preauthorized_subjects.into_iter() {
if !providers.is_empty() {
self.message_channel
.tell(MessageTaskCommand::Request(
None,
TapleMessages::LedgerMessages(LedgerCommand::GetLCE {
who_asked: self.our_id.clone(),
subject_id,
}),
providers.into_iter().collect(),
MessageConfig::direct_response(),
))
.await?;
}
}
Ok(())
}
pub async fn new_authorized_subject(
&self,
subject_id: DigestIdentifier,
providers: HashSet<KeyIdentifier>,
) -> Result<(), AuthorizedSubjectsError> {
self.database
.set_preauthorized_subject_and_providers(&subject_id, providers.clone())?;
if !providers.is_empty() {
self.message_channel
.tell(MessageTaskCommand::Request(
None,
TapleMessages::LedgerMessages(LedgerCommand::GetLCE {
who_asked: self.our_id.clone(),
subject_id,
}),
providers.into_iter().collect(),
MessageConfig::direct_response(),
))
.await?;
}
Ok(())
}
}