nostralink 0.1.9

Linked data library for nostr
Documentation
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())
    }
}