use super::manager::{RdfEventsStore, RdfStoreError};
use crate::niri::{FromNamedNode, ToNamedNode};
use nostr::PublicKey;
use oxigraph::model::*;
use std::collections::HashSet;
pub trait MuteManager {
fn mute(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<(), RdfStoreError>;
fn muting(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<bool, RdfStoreError>;
fn unmute(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<(), RdfStoreError>;
fn all_muted_pubkeys(&self) -> Result<HashSet<PublicKey>, RdfStoreError>;
}
fn pred_mutes() -> NamedNode {
NamedNode::new_unchecked("https://w3id.org/nostr#mutes")
}
impl MuteManager for RdfEventsStore {
fn mute(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<(), RdfStoreError> {
let muter_nn = muter_pubk.named_node()?;
let muted_nn = muted_pubk.named_node()?;
let _ = self.store.insert(QuadRef::new(
&muter_nn,
&pred_mutes(),
&muted_nn,
&GraphName::DefaultGraph,
));
Ok(())
}
fn muting(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<bool, RdfStoreError> {
let muter_nn = muter_pubk.named_node()?;
let muted_nn = muted_pubk.named_node()?;
let results = self
.store
.quads_for_pattern(
Some((&muter_nn).into()),
Some((&pred_mutes()).into()),
Some((&muted_nn).into()),
None,
)
.collect::<Result<Vec<_>, _>>()
.map_err(|_| RdfStoreError::QueryError)?;
Ok(results.len() > 0)
}
fn unmute(
&self,
muter_pubk: &PublicKey,
muted_pubk: &PublicKey,
) -> Result<(), RdfStoreError> {
let muter_nn = muter_pubk.named_node()?;
let muted_nn = muted_pubk.named_node()?;
let _ = self.store.remove(QuadRef::new(
&muter_nn,
&pred_mutes(),
&muted_nn,
&GraphName::DefaultGraph,
));
Ok(())
}
fn all_muted_pubkeys(&self) -> Result<HashSet<PublicKey>, RdfStoreError> {
let results = self
.store
.quads_for_pattern(None, Some((&pred_mutes()).into()), None, None)
.collect::<Result<HashSet<_>, _>>()
.map_err(|_| RdfStoreError::QueryError)?;
Ok(results
.iter()
.filter_map(|quad| match &quad.object {
Term::NamedNode(node) => match node.from_named_node() {
Ok(pubk) => Some(pubk),
Err(_) => None,
},
_ => None,
})
.collect())
}
}