use super::manager::{RdfEventsStore, RdfStoreError};
use super::prelude::*;
use crate::ldbuilder::NostrFilterBuilder;
use nostr::{Filter, SubscriptionId, Timestamp};
pub trait NostrFilterManager {
fn filter_save<T: Into<String>>(
&self,
filter: Filter,
id_salt: T,
) -> Result<(), RdfStoreError>;
}
pub const PRED_FILTER_KIND: NamedNodeRef<'static> =
NamedNodeRef::new_unchecked("http://nostralink.org/NostrFilter#kind");
impl NostrFilterManager for RdfEventsStore {
fn filter_save<T: Into<String>>(
&self,
filter: Filter,
id_salt: T,
) -> Result<(), RdfStoreError> {
let sub_id = SubscriptionId::new(id_salt);
let fobj = NostrFilterBuilder::from_filter(&filter)
.subscription_id(sub_id.to_string())
.since(filter.since.unwrap_or(Timestamp::now()).as_secs())
.until(filter.until.unwrap_or(Timestamp::now()).as_secs())
.kinds(
filter
.kinds
.unwrap_or_default()
.iter()
.map(|k| k.as_u16())
.collect::<Vec<_>>(),
)
.authors(
filter
.authors
.unwrap_or_default()
.iter()
.map(|pk| pk.to_hex())
.collect::<Vec<_>>(),
)
.build()
.unwrap();
self.feed_nobject(Box::new(fobj) as Box<dyn NostraObject + Send>)?;
Ok(())
}
}