2022-12-20 06:28:43 -06:00
|
|
|
from typing import List, Optional, Union
|
|
|
|
|
|
|
|
from lnbits.helpers import urlsafe_short_hash
|
|
|
|
|
|
|
|
from . import db
|
2022-12-20 07:15:54 -06:00
|
|
|
from .models import Address, CreateAddressData, CreateDomainData, Domain
|
2022-12-20 06:28:43 -06:00
|
|
|
|
|
|
|
|
|
|
|
async def get_domain(domain_id: str) -> Optional[Domain]:
|
|
|
|
row = await db.fetchone(
|
|
|
|
"SELECT * FROM nostrnip5.domains WHERE id = ?", (domain_id,)
|
|
|
|
)
|
|
|
|
return Domain.from_row(row) if row else None
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def get_domain_by_name(domain: str) -> Optional[Domain]:
|
|
|
|
row = await db.fetchone(
|
|
|
|
"SELECT * FROM nostrnip5.domains WHERE domain = ?", (domain,)
|
|
|
|
)
|
|
|
|
return Domain.from_row(row) if row else None
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def get_domains(wallet_ids: Union[str, List[str]]) -> List[Domain]:
|
|
|
|
if isinstance(wallet_ids, str):
|
|
|
|
wallet_ids = [wallet_ids]
|
|
|
|
|
|
|
|
q = ",".join(["?"] * len(wallet_ids))
|
|
|
|
rows = await db.fetchall(
|
|
|
|
f"SELECT * FROM nostrnip5.domains WHERE wallet IN ({q})", (*wallet_ids,)
|
|
|
|
)
|
|
|
|
|
|
|
|
return [Domain.from_row(row) for row in rows]
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def get_address(domain_id: str, address_id: str) -> Optional[Address]:
|
|
|
|
row = await db.fetchone(
|
2022-12-20 07:15:54 -06:00
|
|
|
"SELECT * FROM nostrnip5.addresses WHERE domain_id = ? AND id = ?",
|
|
|
|
(
|
|
|
|
domain_id,
|
|
|
|
address_id,
|
|
|
|
),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
return Address.from_row(row) if row else None
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
|
|
|
async def get_address_by_local_part(
|
|
|
|
domain_id: str, local_part: str
|
|
|
|
) -> Optional[Address]:
|
2022-12-20 06:28:43 -06:00
|
|
|
row = await db.fetchone(
|
2022-12-20 07:15:54 -06:00
|
|
|
"SELECT * FROM nostrnip5.addresses WHERE domain_id = ? AND local_part = ?",
|
|
|
|
(
|
|
|
|
domain_id,
|
2022-12-27 16:13:56 -06:00
|
|
|
local_part.lower(),
|
2022-12-20 07:15:54 -06:00
|
|
|
),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
return Address.from_row(row) if row else None
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def get_addresses(domain_id: str) -> List[Address]:
|
|
|
|
rows = await db.fetchall(
|
|
|
|
f"SELECT * FROM nostrnip5.addresses WHERE domain_id = ?", (domain_id,)
|
|
|
|
)
|
|
|
|
|
|
|
|
return [Address.from_row(row) for row in rows]
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def get_all_addresses(wallet_ids: Union[str, List[str]]) -> List[Address]:
|
|
|
|
if isinstance(wallet_ids, str):
|
|
|
|
wallet_ids = [wallet_ids]
|
|
|
|
|
|
|
|
q = ",".join(["?"] * len(wallet_ids))
|
|
|
|
rows = await db.fetchall(
|
|
|
|
f"""
|
2022-12-30 09:46:45 +01:00
|
|
|
SELECT a.*
|
2022-12-20 06:28:43 -06:00
|
|
|
FROM nostrnip5.addresses a
|
|
|
|
JOIN nostrnip5.domains d ON d.id = a.domain_id
|
|
|
|
WHERE d.wallet IN ({q})
|
2022-12-20 07:15:54 -06:00
|
|
|
""",
|
|
|
|
(*wallet_ids,),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
return [Address.from_row(row) for row in rows]
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 07:16:55 -06:00
|
|
|
async def activate_address(domain_id: str, address_id: str) -> Address:
|
2022-12-20 06:28:43 -06:00
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
UPDATE nostrnip5.addresses
|
|
|
|
SET active = true
|
|
|
|
WHERE domain_id = ?
|
|
|
|
AND id = ?
|
|
|
|
""",
|
|
|
|
(
|
|
|
|
domain_id,
|
|
|
|
address_id,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
address = await get_address(domain_id, address_id)
|
|
|
|
assert address, "Newly updated address couldn't be retrieved"
|
|
|
|
return address
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-21 14:05:45 -06:00
|
|
|
async def rotate_address(domain_id: str, address_id: str, pubkey: str) -> Address:
|
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
UPDATE nostrnip5.addresses
|
|
|
|
SET pubkey = ?
|
|
|
|
WHERE domain_id = ?
|
|
|
|
AND id = ?
|
|
|
|
""",
|
|
|
|
(
|
|
|
|
pubkey,
|
|
|
|
domain_id,
|
|
|
|
address_id,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
address = await get_address(domain_id, address_id)
|
|
|
|
assert address, "Newly updated address couldn't be retrieved"
|
|
|
|
return address
|
|
|
|
|
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def delete_domain(domain_id) -> bool:
|
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
DELETE FROM nostrnip5.addresses WHERE domain_id = ?
|
|
|
|
""",
|
2022-12-20 07:15:54 -06:00
|
|
|
(domain_id,),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
DELETE FROM nostrnip5.domains WHERE id = ?
|
|
|
|
""",
|
2022-12-20 07:15:54 -06:00
|
|
|
(domain_id,),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-30 09:46:45 +01:00
|
|
|
async def delete_address(address_id):
|
2022-12-20 06:28:43 -06:00
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
DELETE FROM nostrnip5.addresses WHERE id = ?
|
|
|
|
""",
|
2022-12-20 07:15:54 -06:00
|
|
|
(address_id,),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def create_address_internal(domain_id: str, data: CreateAddressData) -> Address:
|
|
|
|
address_id = urlsafe_short_hash()
|
|
|
|
|
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
INSERT INTO nostrnip5.addresses (id, domain_id, local_part, pubkey, active)
|
|
|
|
VALUES (?, ?, ?, ?, ?)
|
|
|
|
""",
|
|
|
|
(
|
|
|
|
address_id,
|
|
|
|
domain_id,
|
2022-12-27 16:13:56 -06:00
|
|
|
data.local_part.lower(),
|
2022-12-20 06:28:43 -06:00
|
|
|
data.pubkey,
|
|
|
|
False,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
address = await get_address(domain_id, address_id)
|
|
|
|
assert address, "Newly created address couldn't be retrieved"
|
|
|
|
return address
|
|
|
|
|
2022-12-20 07:15:54 -06:00
|
|
|
|
2022-12-20 06:28:43 -06:00
|
|
|
async def create_domain_internal(wallet_id: str, data: CreateDomainData) -> Domain:
|
|
|
|
domain_id = urlsafe_short_hash()
|
|
|
|
|
|
|
|
await db.execute(
|
|
|
|
"""
|
|
|
|
INSERT INTO nostrnip5.domains (id, wallet, currency, amount, domain)
|
|
|
|
VALUES (?, ?, ?, ?, ?)
|
|
|
|
""",
|
2022-12-20 07:15:54 -06:00
|
|
|
(domain_id, wallet_id, data.currency, int(data.amount * 100), data.domain),
|
2022-12-20 06:28:43 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
domain = await get_domain(domain_id)
|
|
|
|
assert domain, "Newly created domain couldn't be retrieved"
|
2022-12-20 07:15:54 -06:00
|
|
|
return domain
|