From 5b6a20dfa68f00d160983de2d423953e86ffcfa9 Mon Sep 17 00:00:00 2001 From: Greg Heartsfield Date: Thu, 16 Dec 2021 18:53:53 -0600 Subject: [PATCH] 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. --- src/db.rs | 10 ---------- src/subscription.rs | 40 ++-------------------------------------- 2 files changed, 2 insertions(+), 48 deletions(-) diff --git a/src/db.rs b/src/db.rs index 5e3959a..9288daf 100644 --- 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 = 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 = f diff --git a/src/subscription.rs b/src/subscription.rs index 4087de9..aa21847 100644 --- a/src/subscription.rs +++ b/src/subscription.rs @@ -20,8 +20,6 @@ pub struct Subscription { pub struct ReqFilter { /// Event hash pub id: Option, - /// Author public key - pub author: Option, /// Event kind pub kind: Option, /// 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(()) } @@ -277,23 +257,6 @@ mod tests { Ok(()) } - #[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 @@ -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"]}]"#)?;