mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2024-11-19 01:43:42 +01:00
304ad3035b
* feat: add generic lnurl error response handler this is used multiple times in extensions to safeguard `views_lnurl.py` endpoint to not return a wrong lnurl error response. you use it by just setting following on your lnurl router/view ``` withdraw_ext_lnurl = APIRouter(prefix="/api/v1/lnurl") withdraw_ext_lnurl.route_class = LNURLErrorResponseHandler ```
66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
from typing import Callable
|
|
|
|
from fastapi import HTTPException, Request, Response
|
|
from fastapi.responses import JSONResponse
|
|
from fastapi.routing import APIRoute
|
|
from lnurl import LnurlErrorResponse, decode, encode, handle
|
|
from loguru import logger
|
|
|
|
from lnbits.exceptions import InvoiceError, PaymentError
|
|
|
|
|
|
class LnurlErrorResponseHandler(APIRoute):
|
|
"""
|
|
Custom APIRoute class to handle LNURL errors.
|
|
LNURL errors always return with status 200 and
|
|
a JSON response with `status="ERROR"` and a `reason` key.
|
|
Helps to catch HTTPException and return a valid lnurl error response
|
|
|
|
Example:
|
|
withdraw_lnurl_router = APIRouter(prefix="/api/v1/lnurl")
|
|
withdraw_lnurl_router.route_class = LnurlErrorResponseHandler
|
|
"""
|
|
|
|
def get_route_handler(self) -> Callable:
|
|
original_route_handler = super().get_route_handler()
|
|
|
|
async def lnurl_route_handler(request: Request) -> Response:
|
|
try:
|
|
response = await original_route_handler(request)
|
|
return response
|
|
except (InvoiceError, PaymentError) as exc:
|
|
logger.debug(f"Wallet Error: {exc}")
|
|
response = JSONResponse(
|
|
status_code=200,
|
|
content={"status": "ERROR", "reason": f"{exc.message}"},
|
|
)
|
|
return response
|
|
except HTTPException as exc:
|
|
logger.debug(f"HTTPException: {exc}")
|
|
response = JSONResponse(
|
|
status_code=200,
|
|
content={"status": "ERROR", "reason": f"{exc.detail}"},
|
|
)
|
|
return response
|
|
except Exception as exc:
|
|
logger.error("Unknown Error:", exc)
|
|
response = JSONResponse(
|
|
status_code=200,
|
|
content={
|
|
"status": "ERROR",
|
|
"reason": f"UNKNOWN ERROR: {exc!s}",
|
|
},
|
|
)
|
|
return response
|
|
|
|
return lnurl_route_handler
|
|
|
|
|
|
__all__ = [
|
|
"decode",
|
|
"encode",
|
|
"handle",
|
|
"LnurlErrorResponse",
|
|
"LnurlErrorResponseHandler",
|
|
]
|