refactor: extract NostrFilter.to_sql_components

This commit is contained in:
Vlad Stan 2023-02-08 09:10:04 +02:00
parent f97cd1dff6
commit d0341911b9
3 changed files with 51 additions and 52 deletions

View file

@ -129,13 +129,15 @@ class NostrClientConnection:
self.relay_id, NostrFilter(kinds=[e.kind], authors=[e.pubkey])
)
await create_event(self.relay_id, e)
await self.broadcast_event(self, e)
if self.broadcast_event:
await self.broadcast_event(self, e)
if e.is_delete_event():
await self.__handle_delete_event(e)
resp_nip20 += [True, ""]
except ValueError:
resp_nip20 += [False, "invalid: wrong event `id` or `sig`"]
except Exception:
except Exception as ex:
logger.debug(ex)
event = await get_event(self.relay_id, e.id)
# todo: handle NIP20 in detail
resp_nip20 += [event != None, f"error: failed to create event"]

49
crud.py
View file

@ -117,14 +117,14 @@ async def get_event(relay_id: str, id: str) -> Optional[NostrEvent]:
async def mark_events_deleted(relay_id: str, filter: NostrFilter):
if filter.is_empty():
return None
_, where, values = build_where_clause(relay_id, filter)
_, where, values = filter.to_sql_components(relay_id)
await db.execute(f"""UPDATE nostrrelay.events SET deleted=true WHERE {" AND ".join(where)}""", tuple(values))
async def delete_events(relay_id: str, filter: NostrFilter):
if filter.is_empty():
return None
_, where, values = build_where_clause(relay_id, filter)
_, where, values = filter.to_sql_components(relay_id)
query = f"""DELETE from nostrrelay.events WHERE {" AND ".join(where)}"""
await db.execute(query, tuple(values))
@ -168,7 +168,7 @@ async def get_event_tags(
def build_select_events_query(relay_id:str, filter:NostrFilter):
inner_joins, where, values = build_where_clause(relay_id, filter)
inner_joins, where, values = filter.to_sql_components(relay_id)
query = f"""
SELECT id, pubkey, created_at, kind, content, sig
@ -183,46 +183,3 @@ def build_select_events_query(relay_id:str, filter:NostrFilter):
query += f" LIMIT {filter.limit}"
return values, query
def build_where_clause(relay_id:str, filter:NostrFilter):
inner_joins = []
where = ["deleted=false", "nostrrelay.events.relay_id = ?"]
values: List[Any] = [relay_id]
if len(filter.e):
values += filter.e
e_s = ",".join(["?"] * len(filter.e))
inner_joins.append("INNER JOIN nostrrelay.event_tags e_tags ON nostrrelay.events.id = e_tags.event_id")
where.append(f" (e_tags.value in ({e_s}) AND e_tags.name = 'e')")
if len(filter.p):
values += filter.p
p_s = ",".join(["?"] * len(filter.p))
inner_joins.append("INNER JOIN nostrrelay.event_tags p_tags ON nostrrelay.events.id = p_tags.event_id")
where.append(f" p_tags.value in ({p_s}) AND p_tags.name = 'p'")
if len(filter.ids) != 0:
ids = ",".join(["?"] * len(filter.ids))
where.append(f"id IN ({ids})")
values += filter.ids
if len(filter.authors) != 0:
authors = ",".join(["?"] * len(filter.authors))
where.append(f"pubkey IN ({authors})")
values += filter.authors
if len(filter.kinds) != 0:
kinds = ",".join(["?"] * len(filter.kinds))
where.append(f"kind IN ({kinds})")
values += filter.kinds
if filter.since:
where.append("created_at >= ?")
values += [filter.since]
if filter.until:
where.append("created_at < ?")
values += [filter.until]
return inner_joins, where, values

View file

@ -2,7 +2,7 @@ import hashlib
import json
from enum import Enum
from sqlite3 import Row
from typing import List, Optional
from typing import Any, List, Optional, Tuple
from pydantic import BaseModel, Field
from secp256k1 import PublicKey
@ -48,9 +48,6 @@ class NostrRelay(BaseModel):
}
class NostrEventType(str, Enum):
EVENT = "EVENT"
REQ = "REQ"
@ -169,3 +166,46 @@ class NostrFilter(BaseModel):
and (not self.since)
and (not self.until)
)
def to_sql_components(self, relay_id: str) -> Tuple[List[str], List[str], List[Any]]:
inner_joins: List[str] = []
where = ["deleted=false", "nostrrelay.events.relay_id = ?"]
values: List[Any] = [relay_id]
if len(self.e):
values += self.e
e_s = ",".join(["?"] * len(self.e))
inner_joins.append("INNER JOIN nostrrelay.event_tags e_tags ON nostrrelay.events.id = e_tags.event_id")
where.append(f" (e_tags.value in ({e_s}) AND e_tags.name = 'e')")
if len(self.p):
values += self.p
p_s = ",".join(["?"] * len(self.p))
inner_joins.append("INNER JOIN nostrrelay.event_tags p_tags ON nostrrelay.events.id = p_tags.event_id")
where.append(f" p_tags.value in ({p_s}) AND p_tags.name = 'p'")
if len(self.ids) != 0:
ids = ",".join(["?"] * len(self.ids))
where.append(f"id IN ({ids})")
values += self.ids
if len(self.authors) != 0:
authors = ",".join(["?"] * len(self.authors))
where.append(f"pubkey IN ({authors})")
values += self.authors
if len(self.kinds) != 0:
kinds = ",".join(["?"] * len(self.kinds))
where.append(f"kind IN ({kinds})")
values += self.kinds
if self.since:
where.append("created_at >= ?")
values += [self.since]
if self.until:
where.append("created_at < ?")
values += [self.until]
return inner_joins, where, values