From c10f89e1d60cba5cb64d414d8937f1986fdfef78 Mon Sep 17 00:00:00 2001 From: ben Date: Mon, 22 Aug 2022 23:29:42 +0100 Subject: [PATCH] Boots, errors, needs work --- lnbits/extensions/boltcards/__init__.py | 1 - lnbits/extensions/boltcards/crud.py | 9 +++++- lnbits/extensions/boltcards/lnurl.py | 28 +++++++++++++------ lnbits/extensions/boltcards/models.py | 18 +++++++++++- .../extensions/boltcards/static/js/index.js | 27 ++++++++++++++++++ 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/lnbits/extensions/boltcards/__init__.py b/lnbits/extensions/boltcards/__init__.py index 5fcbd12e..63b1252d 100644 --- a/lnbits/extensions/boltcards/__init__.py +++ b/lnbits/extensions/boltcards/__init__.py @@ -16,7 +16,6 @@ boltcards_static_files = [ boltcards_ext: APIRouter = APIRouter(prefix="/boltcards", tags=["boltcards"]) - def boltcards_renderer(): return template_renderer(["lnbits/extensions/boltcards/templates"]) diff --git a/lnbits/extensions/boltcards/crud.py b/lnbits/extensions/boltcards/crud.py index 8707a969..1a846d68 100644 --- a/lnbits/extensions/boltcards/crud.py +++ b/lnbits/extensions/boltcards/crud.py @@ -4,7 +4,7 @@ from typing import List, Optional, Union from lnbits.helpers import urlsafe_short_hash from . import db -from .models import Card, CreateCardData, Hit +from .models import Card, CreateCardData, Hit, Refund async def create_card(data: CreateCardData, wallet_id: str) -> Card: @@ -143,6 +143,13 @@ async def get_hits(cards_ids: Union[str, List[str]]) -> List[Hit]: return [Hit(**row) for row in rows] +async def get_hits_today(card_id: Union[str, List[str]]) -> List[Hit]: + rows = await db.fetchall( + f"SELECT * FROM boltcards.hits WHERE card_id = ? AND timestamp >= DATE() AND timestamp < DATE() + INTERVAL ? DAY", (card_id, 1) + ) + + return [Hit(**row) for row in rows] + async def create_hit(card_id, ip, useragent, old_ctr, new_ctr) -> Hit: hit_id = urlsafe_short_hash() diff --git a/lnbits/extensions/boltcards/lnurl.py b/lnbits/extensions/boltcards/lnurl.py index 51a85e8a..5d98d28d 100644 --- a/lnbits/extensions/boltcards/lnurl.py +++ b/lnbits/extensions/boltcards/lnurl.py @@ -10,6 +10,14 @@ from fastapi import Request from fastapi.param_functions import Query from starlette.exceptions import HTTPException +import secrets +from http import HTTPStatus + +from fastapi.params import Depends, Query +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.responses import HTMLResponse + from lnbits.core.services import create_invoice from lnbits.core.views.api import pay_invoice @@ -24,6 +32,7 @@ from .crud import ( get_card_by_otp, get_card_by_uid, get_hit, + get_hits_today, update_card, update_card_counter, update_card_otp, @@ -31,6 +40,8 @@ from .crud import ( from .models import CreateCardData from .nxp424 import decryptSUN, getSunMAC +###############LNURLWITHDRAW################# + # /boltcards/api/v1/scan?p=00000000000000000000000000000000&c=0000000000000000 @boltcards_ext.get("/api/v1/scan/{card_uid}") async def api_scan(p, c, request: Request, card_uid: str = None): @@ -70,15 +81,14 @@ async def api_scan(p, c, request: Request, card_uid: str = None): agent = request.headers["user-agent"] if "user-agent" in request.headers else "" todays_hits = await get_hits_today(card.id) - int hits_amount = 0 + + hits_amount = 0 for hit in todays_hits: hits_amount = hits_amount + hit.amount if (hits_amount + card.tx_limit) > card.daily_limit: return {"status": "ERROR", "reason": "Max daily liit spent."} hit = await create_hit(card.id, ip, agent, card.counter, ctr_int) - - # link = await get_withdraw_link(card.withdraw, 0) - return link.lnurl_response(request) + lnurlpay = lnurl_encode(request.url_for("boltcards.lnurlp_response", hit_id=hit.id)) return { "tag": "withdrawRequest", "callback": request.url_for( @@ -87,7 +97,7 @@ async def api_scan(p, c, request: Request, card_uid: str = None): "k1": hit.id, "minWithdrawable": 1 * 1000, "maxWithdrawable": card.tx_limit * 1000, - "defaultDescription": f"Boltcard (Refunds address {lnurl_encode(req.url_for("boltcards.lnurlp_response", hit_id=hit.id))})", + "defaultDescription": f"Boltcard (refund address {lnurlpay})", } @boltcards_ext.get( @@ -149,12 +159,12 @@ async def api_auth(a, request: Request): ###############LNURLPAY REFUNDS################# -@satsdice_ext.get( +@boltcards_ext.get( "/api/v1/lnurlp/{hit_id}", response_class=HTMLResponse, name="boltcards.lnurlp_response", ) -async def api_lnurlp_response(req: Request, hit_id: str = Query(None)): +async def lnurlp_response(req: Request, hit_id: str = Query(None)): hit = await get_hit(hit_id) if not hit: return {"status": "ERROR", "reason": f"LNURL-pay record not found."} @@ -168,12 +178,12 @@ async def api_lnurlp_response(req: Request, hit_id: str = Query(None)): return json.dumps(payResponse) -@satsdice_ext.get( +@boltcards_ext.get( "/api/v1/lnurlp/cb/{hit_id}", response_class=HTMLResponse, name="boltcards.lnurlp_callback", ) -async def api_lnurlp_callback( +async def lnurlp_callback( req: Request, hit_id: str = Query(None), amount: str = Query(None) ): hit = await get_hit(hit_id) diff --git a/lnbits/extensions/boltcards/models.py b/lnbits/extensions/boltcards/models.py index e272d2f9..022d636c 100644 --- a/lnbits/extensions/boltcards/models.py +++ b/lnbits/extensions/boltcards/models.py @@ -1,5 +1,15 @@ from fastapi.params import Query from pydantic import BaseModel +from sqlite3 import Row +from typing import Optional + +from fastapi import Request +from lnurl import Lnurl +from lnurl import encode as lnurl_encode # type: ignore +from lnurl.models import LnurlPaySuccessAction, UrlAction # type: ignore +from lnurl.types import LnurlPayMetadata # type: ignore +from pydantic import BaseModel +from pydantic.main import BaseModel ZERO_KEY = "00000000000000000000000000000000" @@ -56,8 +66,14 @@ class Hit(BaseModel): new_ctr: int time: int + def from_row(cls, row: Row) -> "Hit": + return cls(**dict(row)) + class Refund(BaseModel): id: str hit_id: str refund_amount: int - time: int \ No newline at end of file + time: int + + def from_row(cls, row: Row) -> "Refund": + return cls(**dict(row)) \ No newline at end of file diff --git a/lnbits/extensions/boltcards/static/js/index.js b/lnbits/extensions/boltcards/static/js/index.js index 55f2d178..7757ffb4 100644 --- a/lnbits/extensions/boltcards/static/js/index.js +++ b/lnbits/extensions/boltcards/static/js/index.js @@ -52,6 +52,33 @@ new Vue({ rowsPerPage: 10 } }, + refundsTable: { + columns: [ + { + name: 'hit_id', + align: 'left', + label: 'Hit ID', + field: 'hit_id' + }, + { + name: 'refund_amount', + align: 'left', + label: 'Refund Amount', + field: 'oldrefund_amount_ctr' + }, + { + name: 'time', + align: 'left', + label: 'Time', + field: 'time' + } + ], + pagination: { + rowsPerPage: 10, + sortBy: 'date', + descending: true + } + }, hitsTable: { columns: [ {