commit 5b6a20dfa68f00d160983de2d423953e86ffcfa9
parent acf62312774ef3834abf3d7e33294dbf07b108b3
Author: Greg Heartsfield <scsibug@imap.cc>
Date: Thu, 16 Dec 2021 18:53:53 -0600
feat: remove `author` from subscriptions (NIP-01 Spec)
The `authors` field is sufficient to represent all queries that
`author` could have been used in. See
https://github.com/fiatjaf/nostr/issues/34 for the discussion leading
to this removal.
Diffstat:
2 files changed, 2 insertions(+), 48 deletions(-)
diff --git a/src/db.rs b/src/db.rs
@@ -181,16 +181,6 @@ fn query_from_sub(sub: &Subscription) -> String {
for f in sub.filters.iter() {
// individual filter components
let mut filter_components: Vec<String> = Vec::new();
- // Query for "author"
- // https://github.com/fiatjaf/nostr/issues/34
- // I believe the author & authors fields are redundant.
- if f.author.is_some() {
- let author_str = f.author.as_ref().unwrap();
- if is_hex(author_str) {
- let author_clause = format!("author = x'{}'", author_str);
- filter_components.push(author_clause);
- }
- }
// Query for "authors"
if f.authors.is_some() {
let authors_escaped: Vec<String> = f
diff --git a/src/subscription.rs b/src/subscription.rs
@@ -20,8 +20,6 @@ pub struct Subscription {
pub struct ReqFilter {
/// Event hash
pub id: Option<String>,
- /// Author public key
- pub author: Option<String>,
/// Event kind
pub kind: Option<u64>,
/// Referenced event hash
@@ -114,13 +112,6 @@ impl ReqFilter {
.map(|vs| vs.contains(&event.pubkey.to_owned()))
.unwrap_or(true)
}
- /// Check for a specific author match
- fn author_match(&self, event: &Event) -> bool {
- self.author
- .as_ref()
- .map(|v| v == &event.pubkey)
- .unwrap_or(true)
- }
/// Check if this filter either matches, or does not care about the event tags.
fn event_match(&self, event: &Event) -> bool {
self.event
@@ -148,7 +139,6 @@ impl ReqFilter {
self.id.as_ref().map(|v| v == &event.id).unwrap_or(true)
&& self.since.map(|t| event.created_at > t).unwrap_or(true)
&& self.kind_match(event.kind)
- && self.author_match(event)
&& self.authors_match(event)
&& self.pubkey_match(event)
&& self.event_match(event)
@@ -165,17 +155,7 @@ mod tests {
let s: Subscription = serde_json::from_str(raw_json)?;
assert_eq!(s.id, "some-id");
assert_eq!(s.filters.len(), 1);
- assert_eq!(s.filters.get(0).unwrap().author, None);
- Ok(())
- }
-
- #[test]
- fn multi_empty_request_parse() -> Result<()> {
- let raw_json = r#"["REQ","some-id",{}]"#;
- let s: Subscription = serde_json::from_str(raw_json)?;
- assert_eq!(s.id, "some-id");
- assert_eq!(s.filters.len(), 1);
- assert_eq!(s.filters.get(0).unwrap().author, None);
+ assert_eq!(s.filters.get(0).unwrap().authors, None);
Ok(())
}
@@ -278,23 +258,6 @@ mod tests {
}
#[test]
- fn author_single() -> Result<()> {
- // subscription with a filter for ID
- let s: Subscription = serde_json::from_str(r#"["REQ","xyz",{"author":"abc"}]"#)?;
- let e = Event {
- id: "123".to_owned(),
- pubkey: "abc".to_owned(),
- created_at: 0,
- kind: 0,
- tags: Vec::new(),
- content: "".to_owned(),
- sig: "".to_owned(),
- };
- assert_eq!(s.interested_in_event(&e), true);
- Ok(())
- }
-
- #[test]
fn authors_single() -> Result<()> {
// subscription with a filter for ID
let s: Subscription = serde_json::from_str(r#"["REQ","xyz",{"authors":["abc"]}]"#)?;
@@ -311,6 +274,7 @@ mod tests {
Ok(())
}
#[test]
+
fn authors_multi_pubkey() -> Result<()> {
// check for any of a set of authors, against the pubkey
let s: Subscription = serde_json::from_str(r#"["REQ","xyz",{"authors":["abc", "bcd"]}]"#)?;