refactor: extract NostrFilter.to_sql_components
This commit is contained in:
parent
f97cd1dff6
commit
d0341911b9
3 changed files with 51 additions and 52 deletions
|
|
@ -129,13 +129,15 @@ class NostrClientConnection:
|
||||||
self.relay_id, NostrFilter(kinds=[e.kind], authors=[e.pubkey])
|
self.relay_id, NostrFilter(kinds=[e.kind], authors=[e.pubkey])
|
||||||
)
|
)
|
||||||
await create_event(self.relay_id, e)
|
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():
|
if e.is_delete_event():
|
||||||
await self.__handle_delete_event(e)
|
await self.__handle_delete_event(e)
|
||||||
resp_nip20 += [True, ""]
|
resp_nip20 += [True, ""]
|
||||||
except ValueError:
|
except ValueError:
|
||||||
resp_nip20 += [False, "invalid: wrong event `id` or `sig`"]
|
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)
|
event = await get_event(self.relay_id, e.id)
|
||||||
# todo: handle NIP20 in detail
|
# todo: handle NIP20 in detail
|
||||||
resp_nip20 += [event != None, f"error: failed to create event"]
|
resp_nip20 += [event != None, f"error: failed to create event"]
|
||||||
|
|
|
||||||
49
crud.py
49
crud.py
|
|
@ -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):
|
async def mark_events_deleted(relay_id: str, filter: NostrFilter):
|
||||||
if filter.is_empty():
|
if filter.is_empty():
|
||||||
return None
|
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))
|
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):
|
async def delete_events(relay_id: str, filter: NostrFilter):
|
||||||
if filter.is_empty():
|
if filter.is_empty():
|
||||||
return None
|
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)}"""
|
query = f"""DELETE from nostrrelay.events WHERE {" AND ".join(where)}"""
|
||||||
await db.execute(query, tuple(values))
|
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):
|
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"""
|
query = f"""
|
||||||
SELECT id, pubkey, created_at, kind, content, sig
|
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}"
|
query += f" LIMIT {filter.limit}"
|
||||||
|
|
||||||
return values, query
|
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
|
|
||||||
48
models.py
48
models.py
|
|
@ -2,7 +2,7 @@ import hashlib
|
||||||
import json
|
import json
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from sqlite3 import Row
|
from sqlite3 import Row
|
||||||
from typing import List, Optional
|
from typing import Any, List, Optional, Tuple
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
from secp256k1 import PublicKey
|
from secp256k1 import PublicKey
|
||||||
|
|
@ -48,9 +48,6 @@ class NostrRelay(BaseModel):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NostrEventType(str, Enum):
|
class NostrEventType(str, Enum):
|
||||||
EVENT = "EVENT"
|
EVENT = "EVENT"
|
||||||
REQ = "REQ"
|
REQ = "REQ"
|
||||||
|
|
@ -169,3 +166,46 @@ class NostrFilter(BaseModel):
|
||||||
and (not self.since)
|
and (not self.since)
|
||||||
and (not self.until)
|
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue