From 1a9cd81ee9e89b23e9d503c5f2badac36a4ce35c Mon Sep 17 00:00:00 2001 From: Vlad Stan Date: Fri, 25 Nov 2022 14:12:13 +0200 Subject: [PATCH] fix: persist webhook call status --- lnbits/extensions/satspay/helpers.py | 8 ++++---- lnbits/extensions/satspay/models.py | 15 +++++++++++++-- lnbits/extensions/satspay/tasks.py | 8 ++++++-- .../satspay/templates/satspay/index.html | 7 ++++++- lnbits/extensions/satspay/views.py | 5 ++--- lnbits/extensions/satspay/views_api.py | 9 ++++++++- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/lnbits/extensions/satspay/helpers.py b/lnbits/extensions/satspay/helpers.py index 6862c608..04846280 100644 --- a/lnbits/extensions/satspay/helpers.py +++ b/lnbits/extensions/satspay/helpers.py @@ -35,18 +35,18 @@ async def call_webhook(charge: Charges): json=public_charge(charge), timeout=40, ) - except AssertionError: - charge.webhook = None + return {"webhook_success": r.is_success, "webhook_message": r.reason_phrase} except Exception as e: logger.warning(f"Failed to call webhook for charge {charge.id}") logger.warning(e) + return {"webhook_success": False, "webhook_message": str(e)} async def fetch_onchain_balance(charge: Charges): endpoint = ( f"{charge.config['mempool_endpoint']}/testnet" - if charge.config["network"] == "Testnet" - else charge.config["mempool_endpoint"] + if charge.config.network == "Testnet" + else charge.config.mempool_endpoint ) async with httpx.AsyncClient() as client: r = await client.get(endpoint + "/api/address/" + charge.onchainaddress) diff --git a/lnbits/extensions/satspay/models.py b/lnbits/extensions/satspay/models.py index 8d2602e1..1e7c95c9 100644 --- a/lnbits/extensions/satspay/models.py +++ b/lnbits/extensions/satspay/models.py @@ -19,6 +19,13 @@ class CreateCharge(BaseModel): extra: str = "{}" +class ChargeConfig(BaseModel): + mempool_endpoint: Optional[str] + network: Optional[str] + webhook_success: Optional[bool] = False + webhook_message: Optional[str] + + class Charges(BaseModel): id: str description: Optional[str] @@ -59,5 +66,9 @@ class Charges(BaseModel): return False @property - def config(self): - return json.loads(self.extra) + def config(self) -> ChargeConfig: + charge_config = json.loads(self.extra) + return ChargeConfig(**charge_config) + + def must_call_webhook(self): + return self.webhook and self.paid and self.config.webhook_success == False diff --git a/lnbits/extensions/satspay/tasks.py b/lnbits/extensions/satspay/tasks.py index 27eb879a..ce54b44a 100644 --- a/lnbits/extensions/satspay/tasks.py +++ b/lnbits/extensions/satspay/tasks.py @@ -1,4 +1,5 @@ import asyncio +import json from loguru import logger @@ -7,6 +8,7 @@ from lnbits.extensions.satspay.crud import check_address_balance, get_charge from lnbits.helpers import get_current_extension_name from lnbits.tasks import register_invoice_listener +from .crud import update_charge from .helpers import call_webhook @@ -32,5 +34,7 @@ async def on_invoice_paid(payment: Payment) -> None: await payment.set_pending(False) charge = await check_address_balance(charge_id=charge.id) - if charge.paid and charge.webhook: - await call_webhook(charge) + if charge.must_call_webhook(): + resp = await call_webhook(charge) + extra = {**charge.config.dict(), **resp} + await update_charge(charge_id=charge.id, extra=json.dumps(extra)) diff --git a/lnbits/extensions/satspay/templates/satspay/index.html b/lnbits/extensions/satspay/templates/satspay/index.html index 3543dee3..60c4d519 100644 --- a/lnbits/extensions/satspay/templates/satspay/index.html +++ b/lnbits/extensions/satspay/templates/satspay/index.html @@ -203,9 +203,14 @@ :href="props.row.webhook" target="_blank" style="color: unset; text-decoration: none" - >{{props.row.webhook || props.row.webhook}}{{props.row.webhook}} +
+ + {{props.row.webhook_message }} + +
ID:
diff --git a/lnbits/extensions/satspay/views.py b/lnbits/extensions/satspay/views.py index 5faebe7a..fdf0d86d 100644 --- a/lnbits/extensions/satspay/views.py +++ b/lnbits/extensions/satspay/views.py @@ -34,10 +34,9 @@ async def display(request: Request, charge_id: str): view_data = { "request": request, "charge_data": public_charge(charge), + "mempool_endpoint": charge.config.mempool_endpoint, + "network": charge.config.network } - if "mempool_endpoint" in charge.config: - view_data["mempool_endpoint"] = charge.config["mempool_endpoint"] - view_data["network"] = charge.config["network"] return satspay_renderer().TemplateResponse( "satspay/display.html", diff --git a/lnbits/extensions/satspay/views_api.py b/lnbits/extensions/satspay/views_api.py index 73581022..bfff55a2 100644 --- a/lnbits/extensions/satspay/views_api.py +++ b/lnbits/extensions/satspay/views_api.py @@ -1,3 +1,4 @@ +import json from http import HTTPStatus from fastapi.params import Depends @@ -19,7 +20,7 @@ from .crud import ( get_charges, update_charge, ) -from .helpers import public_charge +from .helpers import call_webhook, public_charge from .models import CreateCharge #############################CHARGES########################## @@ -57,6 +58,7 @@ async def api_charges_retrieve(wallet: WalletTypeInfo = Depends(get_key_type)): **{"time_elapsed": charge.time_elapsed}, **{"time_left": charge.time_left}, **{"paid": charge.paid}, + **{"webhook_message": charge.config.webhook_message}, } for charge in await get_charges(wallet.wallet.user) ] @@ -118,4 +120,9 @@ async def api_charge_balance(charge_id): status_code=HTTPStatus.NOT_FOUND, detail="Charge does not exist." ) + if charge.must_call_webhook(): + resp = await call_webhook(charge) + extra = {**charge.config.dict(), **resp} + await update_charge(charge_id=charge.id, extra=json.dumps(extra)) + return {**public_charge(charge)}