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.
This commit is contained in:
Greg Heartsfield 2021-12-16 18:53:53 -06:00
parent acf6231277
commit 5b6a20dfa6
2 changed files with 2 additions and 48 deletions

View File

@ -181,16 +181,6 @@ fn query_from_sub(sub: &Subscription) -> String {
for f in sub.filters.iter() { for f in sub.filters.iter() {
// individual filter components // individual filter components
let mut filter_components: Vec<String> = Vec::new(); 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" // Query for "authors"
if f.authors.is_some() { if f.authors.is_some() {
let authors_escaped: Vec<String> = f let authors_escaped: Vec<String> = f

View File

@ -20,8 +20,6 @@ pub struct Subscription {
pub struct ReqFilter { pub struct ReqFilter {
/// Event hash /// Event hash
pub id: Option<String>, pub id: Option<String>,
/// Author public key
pub author: Option<String>,
/// Event kind /// Event kind
pub kind: Option<u64>, pub kind: Option<u64>,
/// Referenced event hash /// Referenced event hash
@ -114,13 +112,6 @@ impl ReqFilter {
.map(|vs| vs.contains(&event.pubkey.to_owned())) .map(|vs| vs.contains(&event.pubkey.to_owned()))
.unwrap_or(true) .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. /// Check if this filter either matches, or does not care about the event tags.
fn event_match(&self, event: &Event) -> bool { fn event_match(&self, event: &Event) -> bool {
self.event self.event
@ -148,7 +139,6 @@ impl ReqFilter {
self.id.as_ref().map(|v| v == &event.id).unwrap_or(true) self.id.as_ref().map(|v| v == &event.id).unwrap_or(true)
&& self.since.map(|t| event.created_at > t).unwrap_or(true) && self.since.map(|t| event.created_at > t).unwrap_or(true)
&& self.kind_match(event.kind) && self.kind_match(event.kind)
&& self.author_match(event)
&& self.authors_match(event) && self.authors_match(event)
&& self.pubkey_match(event) && self.pubkey_match(event)
&& self.event_match(event) && self.event_match(event)
@ -165,17 +155,7 @@ mod tests {
let s: Subscription = serde_json::from_str(raw_json)?; let s: Subscription = serde_json::from_str(raw_json)?;
assert_eq!(s.id, "some-id"); assert_eq!(s.id, "some-id");
assert_eq!(s.filters.len(), 1); 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(())
}
#[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);
Ok(()) Ok(())
} }
@ -277,23 +257,6 @@ mod tests {
Ok(()) 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] #[test]
fn authors_single() -> Result<()> { fn authors_single() -> Result<()> {
// subscription with a filter for ID // subscription with a filter for ID
@ -311,6 +274,7 @@ mod tests {
Ok(()) Ok(())
} }
#[test] #[test]
fn authors_multi_pubkey() -> Result<()> { fn authors_multi_pubkey() -> Result<()> {
// check for any of a set of authors, against the pubkey // check for any of a set of authors, against the pubkey
let s: Subscription = serde_json::from_str(r#"["REQ","xyz",{"authors":["abc", "bcd"]}]"#)?; let s: Subscription = serde_json::from_str(r#"["REQ","xyz",{"authors":["abc", "bcd"]}]"#)?;