lnbits-legend/lnbits/extensions/gerty/crud.py

138 lines
3.8 KiB
Python
Raw Normal View History

2022-09-23 14:38:55 +01:00
from typing import List, Optional, Union
2022-11-24 23:31:22 +00:00
import httpx
2022-09-23 14:38:55 +01:00
from lnbits.helpers import urlsafe_short_hash
2022-11-24 19:27:12 +00:00
import time
2022-11-24 23:31:22 +00:00
import json
from loguru import logger
2022-09-23 14:38:55 +01:00
from . import db
2022-11-24 23:31:22 +00:00
from .models import Gerty, Mempool, MempoolEndpoint
2022-09-23 14:38:55 +01:00
2022-09-23 14:38:55 +01:00
async def create_gerty(wallet_id: str, data: Gerty) -> Gerty:
gerty_id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO gerty.gertys (
id,
name,
2022-10-20 16:58:14 +01:00
utc_offset,
type,
2022-11-24 23:31:22 +00:00
wallet,
lnbits_wallets,
mempool_endpoint,
exchange,
2022-10-20 16:58:14 +01:00
display_preferences,
2022-12-16 10:36:49 +00:00
refresh_time,
urls
)
2022-12-16 10:36:49 +00:00
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2022-09-23 14:38:55 +01:00
""",
(
gerty_id,
data.name,
2022-10-20 16:58:14 +01:00
data.utc_offset,
data.type,
2022-11-24 23:31:22 +00:00
wallet_id,
2022-09-23 14:38:55 +01:00
data.lnbits_wallets,
2022-09-26 19:30:40 +01:00
data.mempool_endpoint,
2022-09-23 14:38:55 +01:00
data.exchange,
2022-10-20 16:31:09 +01:00
data.display_preferences,
2022-10-20 16:58:14 +01:00
data.refresh_time,
2022-12-16 10:36:49 +00:00
data.urls,
2022-09-23 14:38:55 +01:00
),
)
gerty = await get_gerty(gerty_id)
assert gerty, "Newly created gerty couldn't be retrieved"
return gerty
2022-09-26 16:16:41 +01:00
2022-10-20 16:31:09 +01:00
2022-09-26 16:16:41 +01:00
async def update_gerty(gerty_id: str, **kwargs) -> Gerty:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute(
f"UPDATE gerty.gertys SET {q} WHERE id = ?", (*kwargs.values(), gerty_id)
)
return await get_gerty(gerty_id)
2022-09-23 14:38:55 +01:00
2022-10-20 16:31:09 +01:00
2022-09-23 14:38:55 +01:00
async def get_gerty(gerty_id: str) -> Optional[Gerty]:
row = await db.fetchone("SELECT * FROM gerty.gertys WHERE id = ?", (gerty_id,))
return Gerty(**row) if row else None
async def get_gertys(wallet_ids: Union[str, List[str]]) -> List[Gerty]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]
q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
f"SELECT * FROM gerty.gertys WHERE wallet IN ({q})", (*wallet_ids,)
)
return [Gerty(**row) for row in rows]
async def delete_gerty(gerty_id: str) -> None:
await db.execute("DELETE FROM gerty.gertys WHERE id = ?", (gerty_id,))
2022-11-24 19:27:12 +00:00
#############MEMPOOL###########
2022-11-24 23:31:22 +00:00
async def get_mempool_info(endPoint: str, gerty) -> Optional[Mempool]:
2022-12-08 13:45:38 +00:00
logger.debug(endPoint)
2022-11-24 23:31:22 +00:00
endpoints = MempoolEndpoint()
url = ""
for endpoint in endpoints:
if endPoint == endpoint[0]:
url = endpoint[1]
row = await db.fetchone(
"SELECT * FROM gerty.mempool WHERE endpoint = ? AND mempool_endpoint = ?",
(
endPoint,
gerty.mempool_endpoint,
),
)
2022-11-24 23:31:22 +00:00
if not row:
2022-11-24 19:27:12 +00:00
async with httpx.AsyncClient() as client:
2022-11-24 23:31:22 +00:00
response = await client.get(gerty.mempool_endpoint + url)
2022-12-08 13:45:38 +00:00
logger.debug(gerty.mempool_endpoint + url)
mempool_id = urlsafe_short_hash()
2022-11-24 23:31:22 +00:00
await db.execute(
"""
2022-11-24 23:31:22 +00:00
INSERT INTO gerty.mempool (
2022-12-08 13:45:38 +00:00
id,
2022-11-24 23:31:22 +00:00
data,
endpoint,
time,
mempool_endpoint
2022-11-24 19:27:12 +00:00
)
2022-12-08 13:45:38 +00:00
VALUES (?, ?, ?, ?, ?)
2022-11-24 23:31:22 +00:00
""",
(
2022-12-08 13:45:38 +00:00
mempool_id,
json.dumps(response.json()),
endPoint,
int(time.time()),
gerty.mempool_endpoint,
),
2022-11-24 23:31:22 +00:00
)
return response.json()
2022-11-24 19:27:12 +00:00
if int(time.time()) - row.time > 20:
async with httpx.AsyncClient() as client:
2022-11-24 23:31:22 +00:00
response = await client.get(gerty.mempool_endpoint + url)
await db.execute(
"UPDATE gerty.mempool SET data = ?, time = ? WHERE endpoint = ? AND mempool_endpoint = ?",
(
json.dumps(response.json()),
int(time.time()),
endPoint,
gerty.mempool_endpoint,
),
2022-11-24 23:31:22 +00:00
)
return response.json()
return json.loads(row.data)