diff --git a/lnbits/commands.py b/lnbits/commands.py index 584d0ca4..30b88932 100644 --- a/lnbits/commands.py +++ b/lnbits/commands.py @@ -206,7 +206,7 @@ async def database_delete_wallet(wallet: str): @click.option("-c", "--checking-id", required=True, help="Payment checking Id.") @coro 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: await delete_wallet_payment( wallet_id=wallet, checking_id=checking_id, conn=conn diff --git a/lnbits/core/crud.py b/lnbits/core/crud.py index dedb9911..4ad1fca7 100644 --- a/lnbits/core/crud.py +++ b/lnbits/core/crud.py @@ -207,14 +207,21 @@ async def delete_accounts_no_wallets( time_delta: int, conn: Optional[Connection] = None, ) -> None: + delta = int(time()) - time_delta await (conn or db).execute( f""" DELETE FROM accounts WHERE NOT EXISTS ( 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, conn: Optional[Connection] = None, ) -> None: + delta = int(time()) - time_delta await (conn or db).execute( f""" DELETE FROM wallets WHERE ( 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, + ), ) diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index ac5b411c..6dde83f4 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -491,3 +491,24 @@ async def m018_balances_view_exclude_deleted(db): 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 + """ + )