mirror of
https://github.com/lnbits/lnbits.git
synced 2025-08-04 16:05:50 +02:00
fix: offlineshop ext lnurl handling
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import hashlib
|
||||
from lnbits.extensions.offlineshop.models import Item
|
||||
from fastapi.params import Query
|
||||
|
||||
from starlette.requests import Request
|
||||
@@ -13,8 +14,8 @@ from .crud import get_shop, get_item
|
||||
|
||||
|
||||
@offlineshop_ext.get("/lnurl/{item_id}", name="offlineshop.lnurl_response")
|
||||
async def lnurl_response(item_id: int = Query(...)):
|
||||
item = await get_item(item_id)
|
||||
async def lnurl_response(req: Request, item_id: int = Query(...)):
|
||||
item = await get_item(item_id) # type: Item
|
||||
if not item:
|
||||
return {"status": "ERROR", "reason": "Item not found."}
|
||||
|
||||
@@ -28,7 +29,7 @@ async def lnurl_response(item_id: int = Query(...)):
|
||||
) * 1000
|
||||
|
||||
resp = LnurlPayResponse(
|
||||
callback=url_for("offlineshop.lnurl_callback", item_id=item.id, _external=True),
|
||||
callback=req.url_for("offlineshop.lnurl_callback", item_id=item.id),
|
||||
min_sendable=price_msat,
|
||||
max_sendable=price_msat,
|
||||
metadata=await item.lnurlpay_metadata(),
|
||||
@@ -37,9 +38,9 @@ async def lnurl_response(item_id: int = Query(...)):
|
||||
return resp.dict()
|
||||
|
||||
|
||||
@offlineshop_ext.get("/lnurl/cb/<item_id>")
|
||||
@offlineshop_ext.get("/lnurl/cb/{item_id}", name="offlineshop.lnurl_callback")
|
||||
async def lnurl_callback(request: Request, item_id: int):
|
||||
item = await get_item(item_id)
|
||||
item = await get_item(item_id) # type: Item
|
||||
if not item:
|
||||
return {"status": "ERROR", "reason": "Couldn't find item."}
|
||||
|
||||
@@ -52,7 +53,7 @@ async def lnurl_callback(request: Request, item_id: int):
|
||||
min = price * 995
|
||||
max = price * 1010
|
||||
|
||||
amount_received = int(request.args.get("amount") or 0)
|
||||
amount_received = int(request.query_params.get("amount") or 0)
|
||||
if amount_received < min:
|
||||
return LnurlErrorResponse(
|
||||
reason=f"Amount {amount_received} is smaller than minimum {min}."
|
||||
|
@@ -14,7 +14,8 @@ from .helpers import totp
|
||||
shop_counters: Dict = {}
|
||||
|
||||
|
||||
class ShopCounter(BaseModel):
|
||||
class ShopCounter():
|
||||
wordlist: List[str]
|
||||
fulfilled_payments: OrderedDict
|
||||
counter: int
|
||||
|
||||
@@ -88,6 +89,11 @@ class Item(BaseModel):
|
||||
price: int
|
||||
unit: str
|
||||
|
||||
def lnurl(self, req: Request) -> str:
|
||||
return lnurl_encode(
|
||||
req.url_for("offlineshop.lnurl_response", item_id=self.id)
|
||||
)
|
||||
|
||||
def values(self, req: Request):
|
||||
values = self.dict()
|
||||
values["lnurl"] = lnurl_encode(
|
||||
|
@@ -1,8 +1,9 @@
|
||||
import time
|
||||
from datetime import datetime
|
||||
from http import HTTPStatus
|
||||
from typing import List
|
||||
|
||||
from fastapi.params import Depends
|
||||
from fastapi.params import Depends, Query
|
||||
from starlette.responses import HTMLResponse
|
||||
|
||||
from lnbits.decorators import check_user_exists
|
||||
@@ -10,6 +11,7 @@ from lnbits.core.models import Payment, User
|
||||
from lnbits.core.crud import get_standalone_payment
|
||||
|
||||
from . import offlineshop_ext, offlineshop_renderer
|
||||
from .models import Item
|
||||
from .crud import get_item, get_shop
|
||||
from fastapi import Request, HTTPException
|
||||
|
||||
@@ -20,14 +22,14 @@ async def index(request: Request, user: User = Depends(check_user_exists)):
|
||||
|
||||
|
||||
@offlineshop_ext.get("/print", response_class=HTMLResponse)
|
||||
async def print_qr_codes(request: Request):
|
||||
async def print_qr_codes(request: Request, items: List[int] = None):
|
||||
items = []
|
||||
for item_id in request.args.get("items").split(","):
|
||||
item = await get_item(item_id)
|
||||
for item_id in request.query_params.get("items").split(","):
|
||||
item = await get_item(item_id) # type: Item
|
||||
if item:
|
||||
items.append(
|
||||
{
|
||||
"lnurl": item.lnurl,
|
||||
"lnurl": item.lnurl(request),
|
||||
"name": item.name,
|
||||
"price": f"{item.price} {item.unit}",
|
||||
}
|
||||
@@ -36,8 +38,9 @@ async def print_qr_codes(request: Request):
|
||||
return offlineshop_renderer().TemplateResponse("offlineshop/print.html", {"request": request,"items":items})
|
||||
|
||||
|
||||
@offlineshop_ext.get("/confirmation")
|
||||
async def confirmation_code(p: str):
|
||||
@offlineshop_ext.get("/confirmation/{p}", name="offlineshop.confirmation_code",
|
||||
response_class=HTMLResponse)
|
||||
async def confirmation_code(p: str = Query(...)):
|
||||
style = "<style>* { font-size: 100px}</style>"
|
||||
|
||||
payment_hash = p
|
||||
|
Reference in New Issue
Block a user