feat: handle tags

This commit is contained in:
Vlad Stan 2023-01-30 17:56:12 +02:00
parent 4b82905f78
commit 009dee690e
3 changed files with 78 additions and 25 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
__pycache__

99
crud.py
View file

@ -1,4 +1,6 @@
from typing import Any, List import json
import re
from typing import Any, List, Optional
from . import db from . import db
from .models import NostrEvent, NostrFilter from .models import NostrEvent, NostrFilter
@ -17,35 +19,40 @@ async def create_event(relay_id: str, e: NostrEvent):
sig sig
) )
VALUES (?, ?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (id) DO NOTHING
""", """,
(relay_id, e.id, e.pubkey, e.created_at, e.kind, e.content, e.sig), (relay_id, e.id, e.pubkey, e.created_at, e.kind, e.content, e.sig),
) )
# todo: optimize with bulk insert # todo: optimize with bulk insert
for tag in e.tags: for tag in e.tags:
await create_event_tags(relay_id, e.id, tag[0], tag[1]) name, value, *rest = tag
extra = json.dumps(rest) if rest else None
await create_event_tags(relay_id, e.id, name, value, extra)
async def create_event_tags(
relay_id: str, event_id: str, tag_name: str, tag_value: str
):
await db.execute(
"""
INSERT INTO nostrrelay.event_tags (
relay_id,
event_id,
name,
value
)
VALUES (?, ?, ?, ?)
""",
(relay_id, event_id, tag_name, tag_value),
)
async def get_events(relay_id: str, filter: NostrFilter) -> List[NostrEvent]: async def get_events(relay_id: str, filter: NostrFilter) -> List[NostrEvent]:
query = "SELECT * FROM nostrrelay.events WHERE relay_id = ?" values: List[Any] = []
values: List[Any] = [relay_id] query = "SELECT id, pubkey, created_at, kind, content, sig FROM nostrrelay.events"
if len(filter.e) or len(filter.p):
query += " INNER JOIN nostrrelay.event_tags ON nostrrelay.events.id = nostrrelay.event_tags.event_id WHERE"
if len(filter.e):
values += filter.e
e_s = ",".join(["?"] * len(filter.e))
query += f" nostrrelay.event_tags.value in ({e_s}) AND nostrrelay.event_tags.name = 'e'"
if len(filter.p):
values += filter.p
p_s = ",".join(["?"] * len(filter.p))
and_op = " AND " if len(filter.e) else ""
query += f"{and_op} nostrrelay.event_tags.value in ({p_s}) AND nostrrelay.event_tags.name = 'p'"
query += " AND nostrrelay.events.relay_id = ?"
else:
query += " WHERE nostrrelay.events.relay_id = ?"
values.append(relay_id)
if len(filter.ids) != 0: if len(filter.ids) != 0:
ids = ",".join(["?"] * len(filter.ids)) ids = ",".join(["?"] * len(filter.ids))
query += f" AND id IN ({ids})" query += f" AND id IN ({ids})"
@ -69,11 +76,55 @@ async def get_events(relay_id: str, filter: NostrFilter) -> List[NostrEvent]:
if filter.limit and type(filter.limit) == int and filter.limit > 0: if filter.limit and type(filter.limit) == int and filter.limit > 0:
query += f" LIMIT {filter.limit}" query += f" LIMIT {filter.limit}"
# print("### query: ", query) print("### query: ", query)
# print("### values: ", tuple(values)) print("### values: ", tuple(values))
rows = await db.fetchall(query, tuple(values)) rows = await db.fetchall(query, tuple(values))
events = [NostrEvent.from_row(row) for row in rows] # events = [NostrEvent.from_row(row) for row in rows]
# print("### events: ", len(events)) events = []
for row in rows:
event = NostrEvent.from_row(row)
event.tags = await get_event_tags(relay_id, event.id)
events.append(event)
print("### events: ", len(events))
return events return events
async def create_event_tags(
relay_id: str, event_id: str, tag_name: str, tag_value: str, extra_values: Optional[str]
):
await db.execute(
"""
INSERT INTO nostrrelay.event_tags (
relay_id,
event_id,
name,
value,
extra
)
VALUES (?, ?, ?, ?, ?)
""",
(relay_id, event_id, tag_name, tag_value, extra_values),
)
async def get_event_tags(
relay_id: str, event_id: str
) -> List[List[str]]:
rows = await db.fetchall(
"SELECT * FROM nostrrelay.event_tags WHERE relay_id = ? and event_id = ?",
(relay_id, event_id),
)
tags: List[List[str]] = []
for row in rows:
tag = [row["name"], row["value"]]
extra = row["extra"]
if extra:
tag += json.loads(extra)
tags.append(tag)
return tags

View file

@ -32,7 +32,8 @@ async def m001_initial(db):
relay_id TEXT NOT NULL, relay_id TEXT NOT NULL,
event_id TEXT NOT NULL, event_id TEXT NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,
value TEXT NOT NULL value TEXT NOT NULL,
extra TEXT
); );
""" """
) )