fix: show proper total balances fix cleanups (#2490)

payments are not deleted oif we delete a wallets, so to get a accurate
total representation of the lnbits balance we need to create the
balances view based on the wallets table, not payments, else deleted
balances will still show up.

2nd, delete_unused_wallets and delete_accounts was never working if
because they never got an updated_at time, so i just check if its null
else i check to timedelta on created_at
This commit is contained in:
dni ⚡ 2024-05-13 19:01:53 +02:00 committed by GitHub
parent a5623ef7c3
commit 32596758cc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 5 deletions

View File

@ -206,7 +206,7 @@ async def database_delete_wallet(wallet: str):
@click.option("-c", "--checking-id", required=True, help="Payment checking Id.") @click.option("-c", "--checking-id", required=True, help="Payment checking Id.")
@coro @coro
async def database_delete_wallet_payment(wallet: str, checking_id: str): async def database_delete_wallet_payment(wallet: str, checking_id: str):
"""Mark wallet as deleted""" """Delete wallet payment"""
async with core_db.connect() as conn: async with core_db.connect() as conn:
await delete_wallet_payment( await delete_wallet_payment(
wallet_id=wallet, checking_id=checking_id, conn=conn wallet_id=wallet, checking_id=checking_id, conn=conn

View File

@ -207,14 +207,21 @@ async def delete_accounts_no_wallets(
time_delta: int, time_delta: int,
conn: Optional[Connection] = None, conn: Optional[Connection] = None,
) -> None: ) -> None:
delta = int(time()) - time_delta
await (conn or db).execute( await (conn or db).execute(
f""" f"""
DELETE FROM accounts DELETE FROM accounts
WHERE NOT EXISTS ( WHERE NOT EXISTS (
SELECT wallets.id FROM wallets WHERE wallets.user = accounts.id SELECT wallets.id FROM wallets WHERE wallets.user = accounts.id
) AND updated_at < {db.timestamp_placeholder} ) AND (
(updated_at is null AND created_at < {db.timestamp_placeholder})
OR updated_at < {db.timestamp_placeholder}
)
""", """,
(int(time()) - time_delta,), (
delta,
delta,
),
) )
@ -588,14 +595,21 @@ async def delete_unused_wallets(
time_delta: int, time_delta: int,
conn: Optional[Connection] = None, conn: Optional[Connection] = None,
) -> None: ) -> None:
delta = int(time()) - time_delta
await (conn or db).execute( await (conn or db).execute(
f""" f"""
DELETE FROM wallets DELETE FROM wallets
WHERE ( WHERE (
SELECT COUNT(*) FROM apipayments WHERE wallet = wallets.id SELECT COUNT(*) FROM apipayments WHERE wallet = wallets.id
) = 0 AND updated_at < {db.timestamp_placeholder} ) = 0 AND (
(updated_at is null AND created_at < {db.timestamp_placeholder})
OR updated_at < {db.timestamp_placeholder}
)
""", """,
(int(time()) - time_delta,), (
delta,
delta,
),
) )

View File

@ -491,3 +491,24 @@ async def m018_balances_view_exclude_deleted(db):
GROUP BY wallet GROUP BY wallet
""" """
) )
async def m019_balances_view_based_on_wallets(db):
"""
Make deleted wallets not show up in the balances view.
Important for querying whole lnbits balances.
"""
await db.execute("DROP VIEW balances")
await db.execute(
"""
CREATE VIEW balances AS
SELECT apipayments.wallet,
SUM(apipayments.amount - ABS(apipayments.fee)) AS balance
FROM wallets
LEFT JOIN apipayments ON apipayments.wallet = wallets.id
WHERE (wallets.deleted = false OR wallets.deleted is NULL)
AND ((apipayments.pending = false AND apipayments.amount > 0)
OR apipayments.amount < 0)
GROUP BY apipayments.wallet
"""
)