From 8b2b36a4f9fdb17947be63812fa9a1bb5943f662 Mon Sep 17 00:00:00 2001 From: Arc Date: Fri, 15 Nov 2024 00:06:28 +0000 Subject: [PATCH] another v1 fixup + moved lnurl stuff to models --- __init__.py | 3 +- config.json | 2 +- crud.py | 66 ++++++-------------------- migrations.py | 4 +- models.py | 20 +++++++- tasks.py | 3 +- templates/myextension/index.html | 6 +-- templates/myextension/myextension.html | 8 ++-- views.py | 4 +- views_api.py | 66 ++++++++++++++------------ views_lnurl.py | 4 +- 11 files changed, 82 insertions(+), 104 deletions(-) diff --git a/__init__.py b/__init__.py index 77d9291..66e1d8b 100644 --- a/__init__.py +++ b/__init__.py @@ -1,6 +1,7 @@ import asyncio from fastapi import APIRouter +from lnbits.tasks import create_permanent_unique_task from loguru import logger from .crud import db @@ -39,8 +40,6 @@ def myextension_stop(): def myextension_start(): - from lnbits.tasks import create_permanent_unique_task - task = create_permanent_unique_task("ext_myextension", wait_for_paid_invoices) scheduled_tasks.append(task) diff --git a/config.json b/config.json index 1e2cf03..6d51a5a 100644 --- a/config.json +++ b/config.json @@ -2,7 +2,7 @@ "name": "MyExtension", "short_description": "Minimal extension to build on", "tile": "/myextension/static/image/myextension.png", - "min_lnbits_version": "0.12.5", + "min_lnbits_version": "1.0.0", "contributors": [ { "name": "Alan Bits", diff --git a/crud.py b/crud.py index 474c487..57a15a3 100644 --- a/crud.py +++ b/crud.py @@ -1,77 +1,41 @@ -from typing import Optional, Union +from typing import List, Optional, Union from lnbits.db import Database -from lnbits.helpers import insert_query, update_query from .models import MyExtension db = Database("ext_myextension") -table_name = "myextension.maintable" async def create_myextension(data: MyExtension) -> MyExtension: - await db.execute( - insert_query(table_name, data), - (*data.dict().values(),), - ) + await db.insert("myextension.maintable", data) return data - # this is how we used to do it - - # myextension_id = urlsafe_short_hash() - # await db.execute( - # """ - # INSERT INTO myextension.maintable - # (id, wallet, name, lnurlpayamount, lnurlwithdrawamount) - # VALUES (?, ?, ?, ?, ?) - # """, - # ( - # myextension_id, - # wallet_id, - # data.name, - # data.lnurlpayamount, - # data.lnurlwithdrawamount, - # ), - # ) - # myextension = await get_myextension(myextension_id) - # assert myextension, "Newly created table couldn't be retrieved" - async def get_myextension(myextension_id: str) -> Optional[MyExtension]: - row = await db.fetchone( - f"SELECT * FROM {table_name} WHERE id = ?", (myextension_id,) + return await db.fetchone( + "SELECT * FROM myextension.maintable WHERE id = :id", + {"id": myextension_id}, + MyExtension, ) - return MyExtension(**row) if row else None -async def get_myextensions(wallet_ids: Union[str, list[str]]) -> list[MyExtension]: +async def get_myextensions(wallet_ids: Union[str, List[str]]) -> List[MyExtension]: if isinstance(wallet_ids, str): wallet_ids = [wallet_ids] - - q = ",".join(["?"] * len(wallet_ids)) - rows = await db.fetchall( - f"SELECT * FROM {table_name} WHERE wallet IN ({q})", (*wallet_ids,) + q = ",".join([f"'{w}'" for w in wallet_ids]) + return await db.fetchall( + f"SELECT * FROM myextension.maintable WHERE wallet IN ({q}) ORDER BY id", + model=MyExtension, ) - return [MyExtension(**row) for row in rows] async def update_myextension(data: MyExtension) -> MyExtension: - await db.execute( - update_query(table_name, data), - ( - *data.dict().values(), - data.id, - ), - ) + await db.update("myextension.maintable", data) return data - # this is how we used to do it - - # q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) - # await db.execute( - # f"UPDATE myextension.maintable SET {q} WHERE id = ?", - # (*kwargs.values(), myextension_id), - # ) async def delete_myextension(myextension_id: str) -> None: - await db.execute(f"DELETE FROM {table_name} WHERE id = ?", (myextension_id,)) + await db.execute( + "DELETE FROM myextension.maintable WHERE id = :id", {"id": myextension_id} + ) diff --git a/migrations.py b/migrations.py index 046c3bb..afe4e6d 100644 --- a/migrations.py +++ b/migrations.py @@ -15,9 +15,7 @@ async def m001_initial(db): name TEXT NOT NULL, total INTEGER DEFAULT 0, lnurlpayamount INTEGER DEFAULT 0, - lnurlwithdrawamount INTEGER DEFAULT 0, - lnurlwithdraw TEXT, - lnurlpay TEXT + lnurlwithdrawamount INTEGER DEFAULT 0 ); """ ) diff --git a/models.py b/models.py index 2eb1fb4..3c68d9f 100644 --- a/models.py +++ b/models.py @@ -2,6 +2,8 @@ from typing import Optional +from fastapi import Request +from lnurl.core import encode as lnurl_encode from pydantic import BaseModel @@ -20,5 +22,19 @@ class MyExtension(BaseModel): name: str lnurlwithdrawamount: int total: int - lnurlpay: Optional[str] - lnurlwithdraw: Optional[str] + + def lnurlpay(self, req: Request) -> str: + url = req.url_for("myextension.api_lnurl_pay", myextension_id=self.id) + url_str = str(url) + if url.netloc.endswith(".onion"): + url_str = url_str.replace("https://", "http://") + + return lnurl_encode(url_str) + + def lnurlwithdraw(self, req: Request) -> str: + url = req.url_for("myextension.api_lnurl_withdraw", myextension_id=self.id) + url_str = str(url) + if url.netloc.endswith(".onion"): + url_str = url_str.replace("https://", "http://") + + return lnurl_encode(url_str) diff --git a/tasks.py b/tasks.py index 0a56d9a..7e2700d 100644 --- a/tasks.py +++ b/tasks.py @@ -2,7 +2,6 @@ import asyncio from lnbits.core.models import Payment from lnbits.core.services import websocket_updater -from lnbits.helpers import get_current_extension_name from lnbits.tasks import register_invoice_listener from .crud import get_myextension, update_myextension @@ -16,7 +15,7 @@ from .crud import get_myextension, update_myextension async def wait_for_paid_invoices(): invoice_queue = asyncio.Queue() - register_invoice_listener(invoice_queue, get_current_extension_name()) + register_invoice_listener(invoice_queue, "ext_myextension") while True: payment = await invoice_queue.get() await on_invoice_paid(payment) diff --git a/templates/myextension/index.html b/templates/myextension/index.html index 7c1f0dd..267f9bc 100644 --- a/templates/myextension/index.html +++ b/templates/myextension/index.html @@ -27,10 +27,10 @@ @@ -250,7 +250,7 @@ obj.myextension = ['/myextension/', obj.id].join('') return obj } - new Vue({ + window.app = Vue.createApp({ el: '#vue', mixins: [windowMixin], delimiters: ['${', '}'], diff --git a/templates/myextension/myextension.html b/templates/myextension/myextension.html index 8886b39..bc52349 100644 --- a/templates/myextension/myextension.html +++ b/templates/myextension/myextension.html @@ -10,11 +10,11 @@ @@ -49,9 +49,7 @@ {% endblock %} {% block scripts %}