forked from lnbits/lnurlp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcrud.py
142 lines (115 loc) · 4.23 KB
/
crud.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import re
from typing import List, Optional, Union
from lnbits.helpers import urlsafe_short_hash
from . import db # , maindb
from .models import CreatePayLinkData, PayLink
from .services import check_lnaddress_format
# from loguru import logger
async def check_lnaddress_update(username: str, id: str) -> bool:
# check no duplicates for lnaddress when updating an username
row = await db.fetchall(
"SELECT username FROM lnurlp.pay_links WHERE username = ? AND id = ?",
(username, id),
)
if row:
raise Exception("Username already exists. Try a different one.")
else:
return True
async def check_lnaddress_not_exists(username: str) -> bool:
# check if lnaddress username exists in the database when creating a new entry
row = await db.fetchall(
"SELECT username FROM lnurlp.pay_links WHERE username = ?", (username,)
)
if row:
raise Exception("Username already exists. Try a different one.")
else:
return True
async def create_pay_link(data: CreatePayLinkData, wallet_id: str) -> PayLink:
if data.username:
await check_lnaddress_format(data.username)
await check_lnaddress_not_exists(data.username)
link_id = urlsafe_short_hash()[:6]
result = await db.execute(
"""
INSERT INTO lnurlp.pay_links (
id,
wallet,
description,
min,
max,
served_meta,
served_pr,
webhook_url,
webhook_headers,
webhook_body,
success_text,
success_url,
comment_chars,
currency,
fiat_base_multiplier,
username,
zaps
)
VALUES (?, ?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
link_id,
wallet_id,
data.description,
data.min,
data.max,
data.webhook_url,
data.webhook_headers,
data.webhook_body,
data.success_text,
data.success_url,
data.comment_chars,
data.currency,
data.fiat_base_multiplier,
data.username,
data.zaps,
),
)
assert result
link = await get_pay_link(link_id)
assert link, "Newly created link couldn't be retrieved"
return link
async def get_address_data(username: str) -> Optional[PayLink]:
row = await db.fetchone(
"SELECT * FROM lnurlp.pay_links WHERE username = ?", (username,)
)
return PayLink.from_row(row) if row else None
async def get_pay_link(link_id: str) -> Optional[PayLink]:
row = await db.fetchone("SELECT * FROM lnurlp.pay_links WHERE id = ?", (link_id,))
return PayLink.from_row(row) if row else None
async def get_pay_links(wallet_ids: Union[str, List[str]]) -> List[PayLink]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]
q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
f"""
SELECT * FROM lnurlp.pay_links WHERE wallet IN ({q})
ORDER BY Id
""",
(*wallet_ids,),
)
return [PayLink.from_row(row) for row in rows]
async def update_pay_link(link_id: str, **kwargs) -> Optional[PayLink]:
if "lnaddress" in kwargs:
await check_lnaddress_format(kwargs["lnaddress"])
await check_lnaddress_update(kwargs["lnaddress"], link_id)
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute(
f"UPDATE lnurlp.pay_links SET {q} WHERE id = ?", (*kwargs.values(), link_id)
)
row = await db.fetchone("SELECT * FROM lnurlp.pay_links WHERE id = ?", (link_id,))
return PayLink.from_row(row) if row else None
async def increment_pay_link(link_id: str, **kwargs) -> Optional[PayLink]:
q = ", ".join([f"{field[0]} = {field[0]} + ?" for field in kwargs.items()])
await db.execute(
f"UPDATE lnurlp.pay_links SET {q} WHERE id = ?", (*kwargs.values(), link_id)
)
row = await db.fetchone("SELECT * FROM lnurlp.pay_links WHERE id = ?", (link_id,))
return PayLink.from_row(row) if row else None
async def delete_pay_link(link_id: str) -> None:
await db.execute("DELETE FROM lnurlp.pay_links WHERE id = ?", (link_id,))