feat: use uv instead of poetry for CI, docker and development (#3325)

Co-authored-by: arcbtc <ben@arc.wales>
This commit is contained in:
dni ⚡
2025-08-21 16:17:19 +02:00
committed by GitHub
co-authored by arcbtc
parent 15984fa49b
commit 5ba06d42d0
88 changed files with 4265 additions and 1303 deletions
+8 -10
View File
@@ -1,5 +1,3 @@
from typing import Optional
from lnbits.core.db import db
from lnbits.core.models import AuditEntry, AuditFilters
from lnbits.core.models.audit import AuditCountStat
@@ -8,14 +6,14 @@ from lnbits.db import Connection, Filters, Page
async def create_audit_entry(
entry: AuditEntry,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
await (conn or db).insert("audit", entry)
async def get_audit_entries(
filters: Optional[Filters[AuditFilters]] = None,
conn: Optional[Connection] = None,
filters: Filters[AuditFilters] | None = None,
conn: Connection | None = None,
) -> Page[AuditEntry]:
return await (conn or db).fetch_page(
"SELECT * from audit",
@@ -27,7 +25,7 @@ async def get_audit_entries(
async def delete_expired_audit_entries(
conn: Optional[Connection] = None,
conn: Connection | None = None,
):
await (conn or db).execute(
# Timestamp placeholder is safe from SQL injection (not user input)
@@ -40,8 +38,8 @@ async def delete_expired_audit_entries(
async def get_count_stats(
field: str,
filters: Optional[Filters[AuditFilters]] = None,
conn: Optional[Connection] = None,
filters: Filters[AuditFilters] | None = None,
conn: Connection | None = None,
) -> list[AuditCountStat]:
if field not in ["request_method", "component", "response_code"]:
return []
@@ -67,8 +65,8 @@ async def get_count_stats(
async def get_long_duration_stats(
filters: Optional[Filters[AuditFilters]] = None,
conn: Optional[Connection] = None,
filters: Filters[AuditFilters] | None = None,
conn: Connection | None = None,
) -> list[AuditCountStat]:
if not filters:
filters = Filters()
+4 -6
View File
@@ -1,5 +1,3 @@
from typing import Optional
from lnbits.core.db import db
from lnbits.db import Connection
@@ -7,8 +5,8 @@ from ..models import DbVersion
async def get_db_version(
ext_id: str, conn: Optional[Connection] = None
) -> Optional[DbVersion]:
ext_id: str, conn: Connection | None = None
) -> DbVersion | None:
return await (conn or db).fetchone(
"SELECT * FROM dbversions WHERE db = :ext_id",
{"ext_id": ext_id},
@@ -16,7 +14,7 @@ async def get_db_version(
)
async def get_db_versions(conn: Optional[Connection] = None) -> list[DbVersion]:
async def get_db_versions(conn: Connection | None = None) -> list[DbVersion]:
return await (conn or db).fetchall("SELECT * FROM dbversions", model=DbVersion)
@@ -30,7 +28,7 @@ async def update_migration_version(conn, db_name, version):
)
async def delete_dbversion(*, ext_id: str, conn: Optional[Connection] = None) -> None:
async def delete_dbversion(*, ext_id: str, conn: Connection | None = None) -> None:
await (conn or db).execute(
"""
DELETE FROM dbversions WHERE db = :ext
+15 -17
View File
@@ -1,5 +1,3 @@
from typing import Optional
from lnbits.core.db import db
from lnbits.core.models.extensions import (
InstallableExtension,
@@ -10,20 +8,20 @@ from lnbits.db import Connection, Database
async def create_installed_extension(
ext: InstallableExtension,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
await (conn or db).insert("installed_extensions", ext)
async def update_installed_extension(
ext: InstallableExtension,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
await (conn or db).update("installed_extensions", ext)
async def update_installed_extension_state(
*, ext_id: str, active: bool, conn: Optional[Connection] = None
*, ext_id: str, active: bool, conn: Connection | None = None
) -> None:
await (conn or db).execute(
"""
@@ -34,7 +32,7 @@ async def update_installed_extension_state(
async def delete_installed_extension(
*, ext_id: str, conn: Optional[Connection] = None
*, ext_id: str, conn: Connection | None = None
) -> None:
await (conn or db).execute(
"""
@@ -44,7 +42,7 @@ async def delete_installed_extension(
)
async def drop_extension_db(ext_id: str, conn: Optional[Connection] = None) -> None:
async def drop_extension_db(ext_id: str, conn: Connection | None = None) -> None:
row: dict = await (conn or db).fetchone(
"SELECT * FROM dbversions WHERE db = :id",
{"id": ext_id},
@@ -65,8 +63,8 @@ async def drop_extension_db(ext_id: str, conn: Optional[Connection] = None) -> N
async def get_installed_extension(
ext_id: str, conn: Optional[Connection] = None
) -> Optional[InstallableExtension]:
ext_id: str, conn: Connection | None = None
) -> InstallableExtension | None:
extension = await (conn or db).fetchone(
"SELECT * FROM installed_extensions WHERE id = :id",
{"id": ext_id},
@@ -76,8 +74,8 @@ async def get_installed_extension(
async def get_installed_extensions(
active: Optional[bool] = None,
conn: Optional[Connection] = None,
active: bool | None = None,
conn: Connection | None = None,
) -> list[InstallableExtension]:
query = "SELECT * FROM installed_extensions"
if active is not None:
@@ -93,8 +91,8 @@ async def get_installed_extensions(
async def get_user_extension(
user_id: str, extension: str, conn: Optional[Connection] = None
) -> Optional[UserExtension]:
user_id: str, extension: str, conn: Connection | None = None
) -> UserExtension | None:
return await (conn or db).fetchone(
"""
SELECT * FROM extensions
@@ -106,7 +104,7 @@ async def get_user_extension(
async def get_user_extensions(
user_id: str, conn: Optional[Connection] = None
user_id: str, conn: Connection | None = None
) -> list[UserExtension]:
return await (conn or db).fetchall(
"""SELECT * FROM extensions WHERE "user" = :user""",
@@ -116,20 +114,20 @@ async def get_user_extensions(
async def create_user_extension(
user_extension: UserExtension, conn: Optional[Connection] = None
user_extension: UserExtension, conn: Connection | None = None
) -> None:
await (conn or db).insert("extensions", user_extension)
async def update_user_extension(
user_extension: UserExtension, conn: Optional[Connection] = None
user_extension: UserExtension, conn: Connection | None = None
) -> None:
where = """WHERE extension = :extension AND "user" = :user"""
await (conn or db).update("extensions", user_extension, where)
async def get_user_active_extensions_ids(
user_id: str, conn: Optional[Connection] = None
user_id: str, conn: Connection | None = None
) -> list[str]:
exts = await (conn or db).fetchall(
"""
+40 -40
View File
@@ -1,5 +1,5 @@
from time import time
from typing import Any, Optional
from typing import Any
from lnbits.core.crud.wallets import get_total_balance, get_wallet, get_wallets_ids
from lnbits.core.db import db
@@ -23,7 +23,7 @@ def update_payment_extra():
pass
async def get_payment(checking_id: str, conn: Optional[Connection] = None) -> Payment:
async def get_payment(checking_id: str, conn: Connection | None = None) -> Payment:
return await (conn or db).fetchone(
"SELECT * FROM apipayments WHERE checking_id = :checking_id",
{"checking_id": checking_id},
@@ -33,10 +33,10 @@ async def get_payment(checking_id: str, conn: Optional[Connection] = None) -> Pa
async def get_standalone_payment(
checking_id_or_hash: str,
conn: Optional[Connection] = None,
incoming: Optional[bool] = False,
wallet_id: Optional[str] = None,
) -> Optional[Payment]:
conn: Connection | None = None,
incoming: bool | None = False,
wallet_id: str | None = None,
) -> Payment | None:
clause: str = "checking_id = :checking_id OR payment_hash = :hash"
values = {
"wallet_id": wallet_id,
@@ -64,8 +64,8 @@ async def get_standalone_payment(
async def get_wallet_payment(
wallet_id: str, payment_hash: str, conn: Optional[Connection] = None
) -> Optional[Payment]:
wallet_id: str, payment_hash: str, conn: Connection | None = None
) -> Payment | None:
payment = await (conn or db).fetchone(
"""
SELECT *
@@ -102,17 +102,17 @@ async def get_latest_payments_by_extension(
async def get_payments_paginated( # noqa: C901
*,
wallet_id: Optional[str] = None,
user_id: Optional[str] = None,
wallet_id: str | None = None,
user_id: str | None = None,
complete: bool = False,
pending: bool = False,
failed: bool = False,
outgoing: bool = False,
incoming: bool = False,
since: Optional[int] = None,
since: int | None = None,
exclude_uncheckable: bool = False,
filters: Optional[Filters[PaymentFilters]] = None,
conn: Optional[Connection] = None,
filters: Filters[PaymentFilters] | None = None,
conn: Connection | None = None,
) -> Page[Payment]:
"""
Filters payments to be returned by:
@@ -176,17 +176,17 @@ async def get_payments_paginated( # noqa: C901
async def get_payments(
*,
wallet_id: Optional[str] = None,
wallet_id: str | None = None,
complete: bool = False,
pending: bool = False,
outgoing: bool = False,
incoming: bool = False,
since: Optional[int] = None,
since: int | None = None,
exclude_uncheckable: bool = False,
filters: Optional[Filters[PaymentFilters]] = None,
conn: Optional[Connection] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
filters: Filters[PaymentFilters] | None = None,
conn: Connection | None = None,
limit: int | None = None,
offset: int | None = None,
) -> list[Payment]:
"""
Filters payments to be returned by complete | pending | outgoing | incoming.
@@ -230,7 +230,7 @@ async def get_payments_status_count() -> PaymentsStatusCount:
async def delete_expired_invoices(
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
# first we delete all invoices older than one month
@@ -259,7 +259,7 @@ async def create_payment(
checking_id: str,
data: CreatePayment,
status: PaymentState = PaymentState.PENDING,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> Payment:
# we don't allow the creation of the same invoice twice
# note: this can be removed if the db uniqueness constraints are set appropriately
@@ -290,7 +290,7 @@ async def create_payment(
async def update_payment_checking_id(
checking_id: str, new_checking_id: str, conn: Optional[Connection] = None
checking_id: str, new_checking_id: str, conn: Connection | None = None
) -> None:
await (conn or db).execute(
"UPDATE apipayments SET checking_id = :new_id WHERE checking_id = :old_id",
@@ -300,8 +300,8 @@ async def update_payment_checking_id(
async def update_payment(
payment: Payment,
new_checking_id: Optional[str] = None,
conn: Optional[Connection] = None,
new_checking_id: str | None = None,
conn: Connection | None = None,
) -> None:
await (conn or db).update(
"apipayments", payment, "WHERE checking_id = :checking_id"
@@ -311,9 +311,9 @@ async def update_payment(
async def get_payments_history(
wallet_id: Optional[str] = None,
wallet_id: str | None = None,
group: DateTrunc = "day",
filters: Optional[Filters] = None,
filters: Filters | None = None,
) -> list[PaymentHistoryPoint]:
if not filters:
filters = Filters()
@@ -376,9 +376,9 @@ async def get_payments_history(
async def get_payment_count_stats(
field: PaymentCountField,
filters: Optional[Filters[PaymentFilters]] = None,
user_id: Optional[str] = None,
conn: Optional[Connection] = None,
filters: Filters[PaymentFilters] | None = None,
user_id: str | None = None,
conn: Connection | None = None,
) -> list[PaymentCountStat]:
if not filters:
@@ -409,9 +409,9 @@ async def get_payment_count_stats(
async def get_daily_stats(
filters: Optional[Filters[PaymentFilters]] = None,
user_id: Optional[str] = None,
conn: Optional[Connection] = None,
filters: Filters[PaymentFilters] | None = None,
user_id: str | None = None,
conn: Connection | None = None,
) -> tuple[list[PaymentDailyStats], list[PaymentDailyStats]]:
if not filters:
@@ -459,9 +459,9 @@ async def get_daily_stats(
async def get_wallets_stats(
filters: Optional[Filters[PaymentFilters]] = None,
user_id: Optional[str] = None,
conn: Optional[Connection] = None,
filters: Filters[PaymentFilters] | None = None,
user_id: str | None = None,
conn: Connection | None = None,
) -> list[PaymentWalletStats]:
if not filters:
@@ -508,7 +508,7 @@ async def get_wallets_stats(
async def delete_wallet_payment(
checking_id: str, wallet_id: str, conn: Optional[Connection] = None
checking_id: str, wallet_id: str, conn: Connection | None = None
) -> None:
await (conn or db).execute(
"DELETE FROM apipayments WHERE checking_id = :checking_id AND wallet = :wallet",
@@ -517,8 +517,8 @@ async def delete_wallet_payment(
async def check_internal(
payment_hash: str, conn: Optional[Connection] = None
) -> Optional[Payment]:
payment_hash: str, conn: Connection | None = None
) -> Payment | None:
"""
Returns the checking_id of the internal payment if it exists,
otherwise None
@@ -534,7 +534,7 @@ async def check_internal(
async def is_internal_status_success(
payment_hash: str, conn: Optional[Connection] = None
payment_hash: str, conn: Connection | None = None
) -> bool:
"""
Returns True if the internal payment was found and is successful,
@@ -563,7 +563,7 @@ async def mark_webhook_sent(payment_hash: str, status: str) -> None:
async def _only_user_wallets_statement(
user_id: str, conn: Optional[Connection] = None
user_id: str, conn: Connection | None = None
) -> str:
wallet_ids = await get_wallets_ids(user_id=user_id, conn=conn) or [
"no-wallets-for-user"
+9 -11
View File
@@ -1,5 +1,5 @@
import json
from typing import Any, Optional
from typing import Any
from loguru import logger
@@ -14,7 +14,7 @@ from lnbits.settings import (
)
async def get_super_settings() -> Optional[SuperSettings]:
async def get_super_settings() -> SuperSettings | None:
data = await get_settings_by_tag("core")
if data:
super_user = await get_settings_field("super_user")
@@ -24,7 +24,7 @@ async def get_super_settings() -> Optional[SuperSettings]:
return None
async def get_admin_settings(is_super_user: bool = False) -> Optional[AdminSettings]:
async def get_admin_settings(is_super_user: bool = False) -> AdminSettings | None:
sets = await get_super_settings()
if not sets:
return None
@@ -41,7 +41,7 @@ async def get_admin_settings(is_super_user: bool = False) -> Optional[AdminSetti
async def update_admin_settings(
data: EditableSettings, tag: Optional[str] = "core"
data: EditableSettings, tag: str | None = "core"
) -> None:
editable_settings = await get_settings_by_tag("core") or {}
editable_settings.update(data.dict(exclude_unset=True))
@@ -61,7 +61,7 @@ async def update_super_user(super_user: str) -> SuperSettings:
return settings
async def delete_admin_settings(tag: Optional[str] = "core") -> None:
async def delete_admin_settings(tag: str | None = "core") -> None:
await db.execute(
"DELETE FROM system_settings WHERE tag = :tag",
{"tag": tag},
@@ -93,8 +93,8 @@ async def create_admin_settings(super_user: str, new_settings: dict) -> SuperSet
async def get_settings_field(
id_: str, tag: Optional[str] = "core"
) -> Optional[SettingsField]:
id_: str, tag: str | None = "core"
) -> SettingsField | None:
row: dict = await db.fetchone(
"""
@@ -108,9 +108,7 @@ async def get_settings_field(
return SettingsField(id=row["id"], value=json.loads(row["value"]), tag=row["tag"])
async def set_settings_field(
id_: str, value: Optional[Any], tag: Optional[str] = "core"
):
async def set_settings_field(id_: str, value: Any | None, tag: str | None = "core"):
value = json.dumps(value) if value is not None else None
await db.execute(
"""
@@ -122,7 +120,7 @@ async def set_settings_field(
)
async def get_settings_by_tag(tag: str) -> Optional[dict[str, Any]]:
async def get_settings_by_tag(tag: str) -> dict[str, Any] | None:
rows: list[dict] = await db.fetchall(
"SELECT * FROM system_settings WHERE tag = :tag", {"tag": tag}
)
+1 -3
View File
@@ -1,5 +1,3 @@
from typing import Optional
import shortuuid
from lnbits.core.db import db
@@ -19,7 +17,7 @@ async def create_tinyurl(domain: str, endless: bool, wallet: str):
return await get_tinyurl(tinyurl_id)
async def get_tinyurl(tinyurl_id: str) -> Optional[TinyURL]:
async def get_tinyurl(tinyurl_id: str) -> TinyURL | None:
return await db.fetchone(
"SELECT * FROM tiny_url WHERE id = :tinyurl",
{"tinyurl": tinyurl_id},
+20 -22
View File
@@ -1,6 +1,6 @@
from datetime import datetime, timezone
from time import time
from typing import Any, Optional
from typing import Any
from uuid import uuid4
from lnbits.core.crud.extensions import get_user_active_extensions_ids
@@ -18,8 +18,8 @@ from ..models import (
async def create_account(
account: Optional[Account] = None,
conn: Optional[Connection] = None,
account: Account | None = None,
conn: Connection | None = None,
) -> Account:
if account:
account.validate_fields()
@@ -36,7 +36,7 @@ async def update_account(account: Account) -> Account:
return account
async def delete_account(user_id: str, conn: Optional[Connection] = None) -> None:
async def delete_account(user_id: str, conn: Connection | None = None) -> None:
await (conn or db).execute(
"DELETE from accounts WHERE id = :user",
{"user": user_id},
@@ -44,8 +44,8 @@ async def delete_account(user_id: str, conn: Optional[Connection] = None) -> Non
async def get_accounts(
filters: Optional[Filters[AccountFilters]] = None,
conn: Optional[Connection] = None,
filters: Filters[AccountFilters] | None = None,
conn: Connection | None = None,
) -> Page[AccountOverview]:
where_clauses = []
values: dict[str, Any] = {}
@@ -92,9 +92,7 @@ async def get_accounts(
)
async def get_account(
user_id: str, conn: Optional[Connection] = None
) -> Optional[Account]:
async def get_account(user_id: str, conn: Connection | None = None) -> Account | None:
if len(user_id) == 0:
return None
return await (conn or db).fetchone(
@@ -106,7 +104,7 @@ async def get_account(
async def delete_accounts_no_wallets(
time_delta: int,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
delta = int(time()) - time_delta
await (conn or db).execute(
@@ -125,8 +123,8 @@ async def delete_accounts_no_wallets(
async def get_account_by_username(
username: str, conn: Optional[Connection] = None
) -> Optional[Account]:
username: str, conn: Connection | None = None
) -> Account | None:
if len(username) == 0:
return None
return await (conn or db).fetchone(
@@ -137,8 +135,8 @@ async def get_account_by_username(
async def get_account_by_pubkey(
pubkey: str, conn: Optional[Connection] = None
) -> Optional[Account]:
pubkey: str, conn: Connection | None = None
) -> Account | None:
return await (conn or db).fetchone(
"SELECT * FROM accounts WHERE LOWER(pubkey) = :pubkey",
{"pubkey": pubkey.lower()},
@@ -147,8 +145,8 @@ async def get_account_by_pubkey(
async def get_account_by_email(
email: str, conn: Optional[Connection] = None
) -> Optional[Account]:
email: str, conn: Connection | None = None
) -> Account | None:
if len(email) == 0:
return None
return await (conn or db).fetchone(
@@ -159,8 +157,8 @@ async def get_account_by_email(
async def get_account_by_username_or_email(
username_or_email: str, conn: Optional[Connection] = None
) -> Optional[Account]:
username_or_email: str, conn: Connection | None = None
) -> Account | None:
return await (conn or db).fetchone(
"""
SELECT * FROM accounts
@@ -171,7 +169,7 @@ async def get_account_by_username_or_email(
)
async def get_user(user_id: str, conn: Optional[Connection] = None) -> Optional[User]:
async def get_user(user_id: str, conn: Connection | None = None) -> User | None:
account = await get_account(user_id, conn)
if not account:
return None
@@ -179,8 +177,8 @@ async def get_user(user_id: str, conn: Optional[Connection] = None) -> Optional[
async def get_user_from_account(
account: Account, conn: Optional[Connection] = None
) -> Optional[User]:
account: Account, conn: Connection | None = None
) -> User | None:
extensions = await get_user_active_extensions_ids(account.id, conn)
wallets = await get_wallets(account.id, False, conn=conn)
return User(
@@ -207,7 +205,7 @@ async def update_user_access_control_list(user_acls: UserAcls):
async def get_user_access_control_lists(
user_id: str, conn: Optional[Connection] = None
user_id: str, conn: Connection | None = None
) -> UserAcls:
user_acls = await (conn or db).fetchone(
"SELECT id, access_control_list FROM accounts WHERE id = :id",
+19 -22
View File
@@ -1,6 +1,5 @@
from datetime import datetime, timezone
from time import time
from typing import Optional
from uuid import uuid4
from lnbits.core.db import db
@@ -14,8 +13,8 @@ from ..models import Wallet
async def create_wallet(
*,
user_id: str,
wallet_name: Optional[str] = None,
conn: Optional[Connection] = None,
wallet_name: str | None = None,
conn: Connection | None = None,
) -> Wallet:
wallet_id = uuid4().hex
wallet = Wallet(
@@ -32,7 +31,7 @@ async def create_wallet(
async def update_wallet(
wallet: Wallet,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> Wallet:
wallet.updated_at = datetime.now(timezone.utc)
await (conn or db).update("wallets", wallet)
@@ -44,7 +43,7 @@ async def delete_wallet(
user_id: str,
wallet_id: str,
deleted: bool = True,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
now = int(time())
await (conn or db).execute(
@@ -58,9 +57,7 @@ async def delete_wallet(
)
async def force_delete_wallet(
wallet_id: str, conn: Optional[Connection] = None
) -> None:
async def force_delete_wallet(wallet_id: str, conn: Connection | None = None) -> None:
await (conn or db).execute(
"DELETE FROM wallets WHERE id = :wallet",
{"wallet": wallet_id},
@@ -68,8 +65,8 @@ async def force_delete_wallet(
async def delete_wallet_by_id(
wallet_id: str, conn: Optional[Connection] = None
) -> Optional[int]:
wallet_id: str, conn: Connection | None = None
) -> int | None:
now = int(time())
result = await (conn or db).execute(
# Timestamp placeholder is safe from SQL injection (not user input)
@@ -83,13 +80,13 @@ async def delete_wallet_by_id(
return result.rowcount
async def remove_deleted_wallets(conn: Optional[Connection] = None) -> None:
async def remove_deleted_wallets(conn: Connection | None = None) -> None:
await (conn or db).execute("DELETE FROM wallets WHERE deleted = true")
async def delete_unused_wallets(
time_delta: int,
conn: Optional[Connection] = None,
conn: Connection | None = None,
) -> None:
delta = int(time()) - time_delta
await (conn or db).execute(
@@ -107,8 +104,8 @@ async def delete_unused_wallets(
async def get_wallet(
wallet_id: str, deleted: Optional[bool] = None, conn: Optional[Connection] = None
) -> Optional[Wallet]:
wallet_id: str, deleted: bool | None = None, conn: Connection | None = None
) -> Wallet | None:
query = """
SELECT *, COALESCE((
SELECT balance FROM balances WHERE wallet_id = wallets.id
@@ -125,7 +122,7 @@ async def get_wallet(
async def get_wallets(
user_id: str, deleted: Optional[bool] = None, conn: Optional[Connection] = None
user_id: str, deleted: bool | None = None, conn: Connection | None = None
) -> list[Wallet]:
query = """
SELECT *, COALESCE((
@@ -144,9 +141,9 @@ async def get_wallets(
async def get_wallets_paginated(
user_id: str,
deleted: Optional[bool] = None,
filters: Optional[Filters[WalletsFilters]] = None,
conn: Optional[Connection] = None,
deleted: bool | None = None,
filters: Filters[WalletsFilters] | None = None,
conn: Connection | None = None,
) -> Page[Wallet]:
if deleted is None:
deleted = False
@@ -166,7 +163,7 @@ async def get_wallets_paginated(
async def get_wallets_ids(
user_id: str, deleted: Optional[bool] = None, conn: Optional[Connection] = None
user_id: str, deleted: bool | None = None, conn: Connection | None = None
) -> list[str]:
query = """SELECT id FROM wallets WHERE "user" = :user"""
if deleted is not None:
@@ -186,8 +183,8 @@ async def get_wallets_count():
async def get_wallet_for_key(
key: str,
conn: Optional[Connection] = None,
) -> Optional[Wallet]:
conn: Connection | None = None,
) -> Wallet | None:
return await (conn or db).fetchone(
"""
SELECT *, COALESCE((
@@ -201,7 +198,7 @@ async def get_wallet_for_key(
)
async def get_total_balance(conn: Optional[Connection] = None):
async def get_total_balance(conn: Connection | None = None):
result = await (conn or db).execute("SELECT SUM(balance) as balance FROM balances")
row = result.mappings().first()
return row.get("balance", 0) or 0
+1 -3
View File
@@ -1,5 +1,3 @@
from typing import Optional
from lnbits.core.db import db
from ..models import WebPushSubscription
@@ -7,7 +5,7 @@ from ..models import WebPushSubscription
async def get_webpush_subscription(
endpoint: str, user: str
) -> Optional[WebPushSubscription]:
) -> WebPushSubscription | None:
return await db.fetchone(
"""
SELECT * FROM webpush_subscriptions