diff --git a/lnbits/extensions/lndhub/views_api.py b/lnbits/extensions/lndhub/views_api.py index de61820a8..057c8d08a 100644 --- a/lnbits/extensions/lndhub/views_api.py +++ b/lnbits/extensions/lndhub/views_api.py @@ -2,6 +2,11 @@ import time from base64 import urlsafe_b64encode from quart import jsonify, g, request +from fastapi import FastAPI, Query +from fastapi.encoders import jsonable_encoder +from fastapi.responses import JSONResponse +from pydantic import BaseModel + from lnbits.core.services import pay_invoice, create_invoice from lnbits.core.crud import get_payments, delete_expired_invoices from lnbits.decorators import api_validate_post_request @@ -13,62 +18,62 @@ from .decorators import check_wallet from .utils import to_buffer, decoded_as_lndhub -@lndhub_ext.route("/ext/getinfo", methods=["GET"]) +@lndhub_ext.get("/ext/getinfo") async def lndhub_getinfo(): - return jsonify({"error": True, "code": 1, "message": "bad auth"}) + return {"error": True, "code": 1, "message": "bad auth"} -@lndhub_ext.route("/ext/auth", methods=["POST"]) -@api_validate_post_request( - schema={ - "login": {"type": "string", "required": True, "excludes": "refresh_token"}, - "password": {"type": "string", "required": True, "excludes": "refresh_token"}, - "refresh_token": { - "type": "string", - "required": True, - "excludes": ["login", "password"], - }, - } -) -async def lndhub_auth(): +@lndhub_ext.post("/ext/auth") +# @api_validate_post_request( +# schema={ +# "login": {"type": "string", "required": True, "excludes": "refresh_token"}, +# "password": {"type": "string", "required": True, "excludes": "refresh_token"}, +# "refresh_token": { +# "type": "string", +# "required": True, +# "excludes": ["login", "password"], +# }, +# } +# ) +async def lndhub_auth(login: str, password: str, refresh_token: str): #missing the "excludes" thing token = ( - g.data["refresh_token"] - if "refresh_token" in g.data and g.data["refresh_token"] + refresh_token + if refresh_token else urlsafe_b64encode( - (g.data["login"] + ":" + g.data["password"]).encode("utf-8") + (login + ":" + password).encode("utf-8") ).decode("ascii") ) - return jsonify({"refresh_token": token, "access_token": token}) + return {"refresh_token": token, "access_token": token} -@lndhub_ext.route("/ext/addinvoice", methods=["POST"]) +@lndhub_ext.post("/ext/addinvoice") @check_wallet() -@api_validate_post_request( - schema={ - "amt": {"type": "string", "required": True}, - "memo": {"type": "string", "required": True}, - "preimage": {"type": "string", "required": False}, - } -) -async def lndhub_addinvoice(): +# @api_validate_post_request( +# schema={ +# "amt": {"type": "string", "required": True}, +# "memo": {"type": "string", "required": True}, +# "preimage": {"type": "string", "required": False}, +# } +# ) +async def lndhub_addinvoice(amt: str, memo: str, preimage: str = ""): try: _, pr = await create_invoice( wallet_id=g.wallet.id, - amount=int(g.data["amt"]), - memo=g.data["memo"], + amount=int(amt), + memo=memo, extra={"tag": "lndhub"}, ) except Exception as e: - return jsonify( + return { "error": True, "code": 7, "message": "Failed to create invoice: " + str(e), } - ) + invoice = bolt11.decode(pr) - return jsonify( + return { "pay_req": pr, "payment_request": pr, @@ -76,30 +81,30 @@ async def lndhub_addinvoice(): "r_hash": to_buffer(invoice.payment_hash), "hash": invoice.payment_hash, } - ) -@lndhub_ext.route("/ext/payinvoice", methods=["POST"]) + +@lndhub_ext.post("/ext/payinvoice") @check_wallet(requires_admin=True) -@api_validate_post_request(schema={"invoice": {"type": "string", "required": True}}) -async def lndhub_payinvoice(): +# @api_validate_post_request(schema={"invoice": {"type": "string", "required": True}}) +async def lndhub_payinvoice(invoice: str): try: await pay_invoice( wallet_id=g.wallet.id, - payment_request=g.data["invoice"], + payment_request=invoice, extra={"tag": "lndhub"}, ) except Exception as e: - return jsonify( + return { "error": True, "code": 10, "message": "Payment failed: " + str(e), } - ) - invoice: bolt11.Invoice = bolt11.decode(g.data["invoice"]) - return jsonify( + + invoice: bolt11.Invoice = bolt11.decode(invoice) + return { "payment_error": "", "payment_preimage": "0" * 64, @@ -113,16 +118,16 @@ async def lndhub_payinvoice(): "timestamp": int(time.time()), "memo": invoice.description, } - ) -@lndhub_ext.route("/ext/balance", methods=["GET"]) + +@lndhub_ext.get("/ext/balance") @check_wallet() async def lndhub_balance(): - return jsonify({"BTC": {"AvailableBalance": g.wallet.balance}}) + return {"BTC": {"AvailableBalance": g.wallet.balance}} -@lndhub_ext.route("/ext/gettxs", methods=["GET"]) +@lndhub_ext.get("/ext/gettxs") @check_wallet() async def lndhub_gettxs(): for payment in await get_payments( @@ -138,7 +143,7 @@ async def lndhub_gettxs(): ) limit = int(request.args.get("limit", 200)) - return jsonify( + return [ { "payment_preimage": payment.preimage, @@ -164,10 +169,10 @@ async def lndhub_gettxs(): )[:limit] ) ] - ) -@lndhub_ext.route("/ext/getuserinvoices", methods=["GET"]) + +@lndhub_ext.get("/ext/getuserinvoices") @check_wallet() async def lndhub_getuserinvoices(): await delete_expired_invoices() @@ -184,7 +189,7 @@ async def lndhub_getuserinvoices(): ) limit = int(request.args.get("limit", 200)) - return jsonify( + return [ { "r_hash": to_buffer(invoice.payment_hash), @@ -210,31 +215,31 @@ async def lndhub_getuserinvoices(): )[:limit] ) ] - ) -@lndhub_ext.route("/ext/getbtc", methods=["GET"]) + +@lndhub_ext.get("/ext/getbtc") @check_wallet() async def lndhub_getbtc(): "load an address for incoming onchain btc" - return jsonify([]) + return [] -@lndhub_ext.route("/ext/getpending", methods=["GET"]) +@lndhub_ext.get("/ext/getpending") @check_wallet() async def lndhub_getpending(): "pending onchain transactions" - return jsonify([]) + return [] -@lndhub_ext.route("/ext/decodeinvoice", methods=["GET"]) +@lndhub_ext.get("/ext/decodeinvoice") async def lndhub_decodeinvoice(): invoice = request.args.get("invoice") inv = bolt11.decode(invoice) - return jsonify(decoded_as_lndhub(inv)) + return decoded_as_lndhub(inv) -@lndhub_ext.route("/ext/checkrouteinvoice", methods=["GET"]) +@lndhub_ext.get("/ext/checkrouteinvoice") async def lndhub_checkrouteinvoice(): "not implemented on canonical lndhub" pass