Added refunds

This commit is contained in:
ben 2022-08-27 16:37:31 +01:00
parent 330a026379
commit 99595ba96b
5 changed files with 80 additions and 9 deletions

View file

@ -20,5 +20,6 @@ def boltcards_renderer():
return template_renderer(["lnbits/extensions/boltcards/templates"])
from .lnurl import * # noqa
from .tasks import * # noqa
from .views import * # noqa
from .views_api import * # noqa

View file

@ -71,12 +71,6 @@ async def get_cards(wallet_ids: Union[str, List[str]]) -> List[Card]:
return [Card(**row) for row in rows]
async def get_all_cards() -> List[Card]:
rows = await db.fetchall(f"SELECT * FROM boltcards.cards")
return [Card(**row) for row in rows]
async def get_card(card_id: str) -> Optional[Card]:
row = await db.fetchone("SELECT * FROM boltcards.cards WHERE id = ?", (card_id,))
if not row:
@ -188,3 +182,41 @@ async def create_hit(card_id, ip, useragent, old_ctr, new_ctr) -> Hit:
hit = await get_hit(hit_id)
assert hit, "Newly recorded hit couldn't be retrieved"
return hit
async def create_refund(hit_id, refund_amount) -> Refund:
refund_id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO boltcards.hits (
id,
hit_id,
refund_amount,
payment_hash
)
VALUES (?, ?, ?, ?)
""",
(
refund_id,
hit_id,
refund_amount,
payment_hash,
),
)
refund = await get_refund(refund_id)
assert refund, "Newly recorded hit couldn't be retrieved"
return refund
async def get_refund(refund_id: str) -> Optional[Refund]:
row = await db.fetchone(f"SELECT * FROM boltcards.refunds WHERE id = ?", (refund_id))
if not row:
return None
refund = dict(**row)
return Refund.parse_obj(refund)
async def get_refunds(hits_ids: Union[str, List[str]]) -> List[Refund]:
q = ",".join(["?"] * len(hits_ids))
rows = await db.fetchall(
f"SELECT * FROM boltcards.refunds WHERE hit_id IN ({q})", (*hits_ids,)
)
return [Refund(**row) for row in rows]

View file

@ -140,7 +140,7 @@ new Vue({
.request(
'GET',
'/boltcards/api/v1/cards?all_wallets=true',
this.g.user.wallets[0].inkey
this.g.user.wallets[0].adminkey
)
.then(function (response) {
self.cards = response.data.map(function (obj) {

View file

@ -0,0 +1,34 @@
import asyncio
import json
import httpx
from lnbits.core import db as core_db
from lnbits.core.models import Payment
from lnbits.tasks import register_invoice_listener
from .crud import get_hit, create_refund
async def wait_for_paid_invoices():
invoice_queue = asyncio.Queue()
register_invoice_listener(invoice_queue)
while True:
payment = await invoice_queue.get()
await on_invoice_paid(payment)
async def on_invoice_paid(payment: Payment) -> None:
if payment.extra.get("tag")[0:6] != "Refund":
# not an lnurlp invoice
return
if payment.extra.get("wh_status"):
# this webhook has already been sent
return
hit = await get_hit(payment.extra.get("tag")[7:len(payment.extra.get("tag"))])
if hit:
refund = await create_refund(hit_id=hit.id, refund_amount=payment.extra.get("amount"))
await mark_webhook_sent(payment, 1)

View file

@ -13,7 +13,6 @@ from .crud import (
create_card,
create_hit,
delete_card,
get_all_cards,
get_card,
get_card_by_otp,
get_card_by_uid,
@ -22,6 +21,7 @@ from .crud import (
update_card,
update_card_counter,
update_card_otp,
get_refunds,
)
from .models import CreateCardData
from .nxp424 import decryptSUN, getSunMAC
@ -135,5 +135,9 @@ async def api_hits(
cards_ids = []
for card in cards:
cards_ids.append(card.id)
hits = await get_hits(cards_ids)
hits_ids = []
for hit in hits:
hits_ids.append(hit.id)
return [hit.dict() for hit in await get_hits(cards_ids)]
return [refund.dict() for refund in await get_refunds(hits_ids)]