Skip to content

Commit

Permalink
feat: update to lnbits 1.0.0
Browse files Browse the repository at this point in the history
chore: format

fixes
  • Loading branch information
dni committed Sep 5, 2024
1 parent 7213d5c commit ed32563
Show file tree
Hide file tree
Showing 8 changed files with 824 additions and 754 deletions.
2 changes: 1 addition & 1 deletion config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "Bolt Cards",
"short_description": "Self custody Bolt Cards with one time LNURLw",
"tile": "/boltcards/static/image/boltcard.png",
"min_lnbits_version": "0.12.5",
"min_lnbits_version": "1.0.0",
"contributors": [
{
"name": "dni",
Expand Down
159 changes: 78 additions & 81 deletions crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from typing import List, Optional

from lnbits.db import Database
from lnbits.helpers import urlsafe_short_hash
from lnbits.helpers import update_query, urlsafe_short_hash

from .models import Card, CreateCardData, Hit, Refund

Expand Down Expand Up @@ -31,57 +31,56 @@ async def create_card(data: CreateCardData, wallet_id: str) -> Card:
k2,
otp
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
VALUES (
:id, :uid, :external_id, :wallet, :card_name, :counter,
:tx_limit, :daily_limit, :enable, :k0, :k1, :k2, :otp
)
""",
(
card_id,
data.uid.upper(),
extenal_id,
wallet_id,
data.card_name,
data.counter,
data.tx_limit,
data.daily_limit,
True,
data.k0,
data.k1,
data.k2,
secrets.token_hex(16),
),
{
"id": card_id,
"uid": data.uid.upper(),
"external_id": extenal_id,
"wallet": wallet_id,
"card_name": data.card_name,
"counter": data.counter,
"tx_limit": data.tx_limit,
"daily_limit": data.daily_limit,
"enable": True,
"k0": data.k0,
"k1": data.k1,
"k2": data.k2,
"otp": secrets.token_hex(16),
},
)
card = await get_card(card_id)
assert card, "Newly created card couldn't be retrieved"
return card


async def update_card(card_id: str, **kwargs) -> Optional[Card]:
if "is_unique" in kwargs:
kwargs["is_unique"] = int(kwargs["is_unique"])
if "uid" in kwargs:
kwargs["uid"] = kwargs["uid"].upper()
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
async def update_card(card_id: str, data: CreateCardData) -> Card:
await db.execute(
f"UPDATE boltcards.cards SET {q} WHERE id = ?",
(*kwargs.values(), card_id),
update_query("boltcards.cards", data),
{**data.dict(), "id": card_id},
)
row = await db.fetchone(
"SELECT * FROM boltcards.cards WHERE id = :id", {"id": card_id}
)
row = await db.fetchone("SELECT * FROM boltcards.cards WHERE id = ?", (card_id,))
return Card(**row) if row else None
assert row, "Updated card couldn't be retrieved"
return Card(**row)


async def get_cards(wallet_ids: List[str]) -> List[Card]:
if len(wallet_ids) == 0:
return []

q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
f"SELECT * FROM boltcards.cards WHERE wallet IN ({q})", (*wallet_ids,)
)

q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])
rows = await db.fetchall(f"SELECT * FROM boltcards.cards WHERE wallet IN ({q})")
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,))
row = await db.fetchone(
"SELECT * FROM boltcards.cards WHERE id = :id", {"id": card_id}
)
if not row:
return None

Expand All @@ -92,7 +91,7 @@ async def get_card(card_id: str) -> Optional[Card]:

async def get_card_by_uid(card_uid: str) -> Optional[Card]:
row = await db.fetchone(
"SELECT * FROM boltcards.cards WHERE uid = ?", (card_uid.upper(),)
"SELECT * FROM boltcards.cards WHERE uid = :uid", {"uid": card_uid.upper()}
)
if not row:
return None
Expand All @@ -104,7 +103,8 @@ async def get_card_by_uid(card_uid: str) -> Optional[Card]:

async def get_card_by_external_id(external_id: str) -> Optional[Card]:
row = await db.fetchone(
"SELECT * FROM boltcards.cards WHERE external_id = ?", (external_id.lower(),)
"SELECT * FROM boltcards.cards WHERE external_id = :ext_id",
{"ext_id": external_id.lower()},
)
if not row:
return None
Expand All @@ -115,7 +115,9 @@ async def get_card_by_external_id(external_id: str) -> Optional[Card]:


async def get_card_by_otp(otp: str) -> Optional[Card]:
row = await db.fetchone("SELECT * FROM boltcards.cards WHERE otp = ?", (otp,))
row = await db.fetchone(
"SELECT * FROM boltcards.cards WHERE otp = :otp", {"otp": otp}
)
if not row:
return None

Expand All @@ -126,43 +128,45 @@ async def get_card_by_otp(otp: str) -> Optional[Card]:

async def delete_card(card_id: str) -> None:
# Delete cards
await db.execute("DELETE FROM boltcards.cards WHERE id = ?", (card_id,))
await db.execute("DELETE FROM boltcards.cards WHERE id = :id", {"id": card_id})
# Delete hits
hits = await get_hits([card_id])
for hit in hits:
await db.execute("DELETE FROM boltcards.hits WHERE id = ?", (hit.id,))
await db.execute("DELETE FROM boltcards.hits WHERE id = :id", {"id": hit.id})
# Delete refunds
refunds = await get_refunds([hit.id])
for refund in refunds:
await db.execute(
"DELETE FROM boltcards.refunds WHERE id = ?", (refund.hit_id,)
"DELETE FROM boltcards.refunds WHERE id = :id", {"id": refund.id}
)


async def update_card_counter(counter: int, card_id: str):
await db.execute(
"UPDATE boltcards.cards SET counter = ? WHERE id = ?",
(counter, card_id),
"UPDATE boltcards.cards SET counter = :counter WHERE id = :id",
{"counter": counter, "id": card_id},
)


async def enable_disable_card(enable: bool, card_id: str) -> Optional[Card]:
await db.execute(
"UPDATE boltcards.cards SET enable = ? WHERE id = ?",
(enable, card_id),
"UPDATE boltcards.cards SET enable = :enable WHERE id = :id",
{"enable": enable, "id": card_id},
)
return await get_card(card_id)


async def update_card_otp(otp: str, card_id: str):
await db.execute(
"UPDATE boltcards.cards SET otp = ? WHERE id = ?",
(otp, card_id),
"UPDATE boltcards.cards SET otp = :otp WHERE id = :id",
{"otp": otp, "id": card_id},
)


async def get_hit(hit_id: str) -> Optional[Hit]:
row = await db.fetchone("SELECT * FROM boltcards.hits WHERE id = ?", (hit_id,))
row = await db.fetchone(
"SELECT * FROM boltcards.hits WHERE id = :id", {"id": hit_id}
)
if not row:
return None

Expand All @@ -175,31 +179,28 @@ async def get_hits(cards_ids: List[str]) -> List[Hit]:
if len(cards_ids) == 0:
return []

q = ",".join(["?"] * len(cards_ids))
rows = await db.fetchall(
f"SELECT * FROM boltcards.hits WHERE card_id IN ({q})", (*cards_ids,)
)

q = ",".join([f"'{card_id}'" for card_id in cards_ids])
rows = await db.fetchall(f"SELECT * FROM boltcards.hits WHERE card_id IN ({q})")
return [Hit(**row) for row in rows]


async def get_hits_today(card_id: str) -> List[Hit]:
rows = await db.fetchall(
"SELECT * FROM boltcards.hits WHERE card_id = ?",
(card_id,),
"SELECT * FROM boltcards.hits WHERE card_id = :id",
{"id": card_id},
)
updatedrow = []
for row in rows:
if datetime.now().date() == datetime.fromtimestamp(row.time).date():
if datetime.now().date() == datetime.fromtimestamp(row["time"]).date():
updatedrow.append(row)

return [Hit(**row) for row in updatedrow]


async def spend_hit(card_id: str, amount: int):
await db.execute(
"UPDATE boltcards.hits SET spent = ?, amount = ? WHERE id = ?",
(True, amount, card_id),
"UPDATE boltcards.hits SET spent = :spent, amount = :amount WHERE id = :id",
{"spent": True, "amount": amount, "id": card_id},
)
return await get_hit(card_id)

Expand All @@ -218,18 +219,18 @@ async def create_hit(card_id, ip, useragent, old_ctr, new_ctr) -> Hit:
new_ctr,
amount
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
VALUES (:id, :card_id, :ip, :spent, :useragent, :old_ctr, :new_ctr, :amount)
""",
(
hit_id,
card_id,
ip,
False,
useragent,
old_ctr,
new_ctr,
0,
),
{
"id": hit_id,
"card_id": card_id,
"ip": ip,
"spent": False,
"useragent": useragent,
"old_ctr": old_ctr,
"new_ctr": new_ctr,
"amount": 0,
},
)
hit = await get_hit(hit_id)
assert hit, "Newly recorded hit couldn't be retrieved"
Expand All @@ -245,13 +246,13 @@ async def create_refund(hit_id, refund_amount) -> Refund:
hit_id,
refund_amount
)
VALUES (?, ?, ?)
VALUES (:id, :hit_id, :refund_amount)
""",
(
refund_id,
hit_id,
refund_amount,
),
{
"id": refund_id,
"hit_id": hit_id,
"refund_amount": refund_amount,
},
)
refund = await get_refund(refund_id)
assert refund, "Newly recorded hit couldn't be retrieved"
Expand All @@ -260,7 +261,7 @@ async def create_refund(hit_id, refund_amount) -> Refund:

async def get_refund(refund_id: str) -> Optional[Refund]:
row = await db.fetchone(
"SELECT * FROM boltcards.refunds WHERE id = ?", (refund_id,)
"SELECT * FROM boltcards.refunds WHERE id = :id", {"id": refund_id}
)
if not row:
return None
Expand All @@ -271,10 +272,6 @@ async def get_refund(refund_id: str) -> Optional[Refund]:
async def get_refunds(hits_ids: List[str]) -> List[Refund]:
if len(hits_ids) == 0:
return []

q = ",".join(["?"] * len(hits_ids))
rows = await db.fetchall(
f"SELECT * FROM boltcards.refunds WHERE hit_id IN ({q})", (*hits_ids,)
)

q = ",".join([f"'{hit_id}'" for hit_id in hits_ids])
rows = await db.fetchall(f"SELECT * FROM boltcards.refunds WHERE hit_id IN ({q})")
return [Refund(**row) for row in rows]
Loading

0 comments on commit ed32563

Please sign in to comment.