refactor: move migrate_databases to core helpers (#2636)

commands.py should be used for cli commands
This commit is contained in:
dni ⚡ 2024-08-30 18:48:50 +02:00 committed by GitHub
parent dd90dec768
commit 9db2429a45
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 67 additions and 69 deletions

View file

@ -12,18 +12,8 @@ from fastapi.exceptions import HTTPException
from loguru import logger from loguru import logger
from packaging import version from packaging import version
from lnbits.core.models import Payment, PaymentState, User from lnbits.core import db as core_db
from lnbits.core.services import check_admin_settings from lnbits.core.crud import (
from lnbits.core.views.extension_api import (
api_install_extension,
api_uninstall_extension,
)
from lnbits.settings import settings
from lnbits.wallets.base import Wallet
from .core import db as core_db
from .core import migrations as core_migrations
from .core.crud import (
delete_accounts_no_wallets, delete_accounts_no_wallets,
delete_unused_wallets, delete_unused_wallets,
delete_wallet_by_id, delete_wallet_by_id,
@ -35,14 +25,20 @@ from .core.crud import (
remove_deleted_wallets, remove_deleted_wallets,
update_payment_status, update_payment_status,
) )
from .core.helpers import migrate_extension_database, run_migration from lnbits.core.helpers import migrate_databases
from .db import COCKROACH, POSTGRES, SQLITE from lnbits.core.models import Payment, PaymentState, User
from .extension_manager import ( from lnbits.core.services import check_admin_settings
from lnbits.core.views.extension_api import (
api_install_extension,
api_uninstall_extension,
)
from lnbits.extension_manager import (
CreateExtension, CreateExtension,
ExtensionRelease, ExtensionRelease,
InstallableExtension, InstallableExtension,
get_valid_extensions,
) )
from lnbits.settings import settings
from lnbits.wallets.base import Wallet
def coro(f): def coro(f):
@ -122,48 +118,6 @@ def database_migrate():
loop.run_until_complete(migrate_databases()) loop.run_until_complete(migrate_databases())
async def db_migrate():
task = asyncio.create_task(migrate_databases())
await task
async def migrate_databases():
"""Creates the necessary databases if they don't exist already; or migrates them."""
async with core_db.connect() as conn:
exists = False
if conn.type == SQLITE:
exists = await conn.fetchone(
"SELECT * FROM sqlite_master WHERE type='table' AND name='dbversions'"
)
elif conn.type in {POSTGRES, COCKROACH}:
exists = await conn.fetchone(
"SELECT * FROM information_schema.tables WHERE table_schema = 'public'"
" AND table_name = 'dbversions'"
)
if not exists:
await core_migrations.m000_create_migrations_table(conn)
current_versions = await get_dbversions(conn)
core_version = current_versions.get("core", 0)
await run_migration(conn, core_migrations, "core", core_version)
# here is the first place we can be sure that the
# `installed_extensions` table has been created
await load_disabled_extension_list()
# todo: revisit, use installed extensions
for ext in get_valid_extensions(False):
current_version = current_versions.get(ext.code, 0)
try:
await migrate_extension_database(ext, current_version)
except Exception as e:
logger.exception(f"Error migrating extension {ext.code}: {e}")
logger.info("✔️ All migrations done.")
@db.command("versions") @db.command("versions")
@coro @coro
async def db_versions(): async def db_versions():
@ -315,12 +269,6 @@ async def check_invalid_payments(
click.echo(" ".join([w, str(data[0]), str(data[1] / 1000).ljust(10)])) click.echo(" ".join([w, str(data[0]), str(data[1] / 1000).ljust(10)]))
async def load_disabled_extension_list() -> None:
"""Update list of extensions that have been explicitly disabled"""
inactive_extensions = await get_installed_extensions(active=False)
settings.lnbits_deactivated_extensions.update([e.id for e in inactive_extensions])
@extensions.command("list") @extensions.command("list")
@coro @coro
async def extensions_list(): async def extensions_list():
@ -696,7 +644,7 @@ async def _can_run_operation(url) -> bool:
elif url: elif url:
click.echo( click.echo(
"The option '--url' has been provided," "The option '--url' has been provided,"
+ f" but no server found runnint at '{url}'" f" but no server found running at '{url}'"
) )
return False return False

View file

@ -6,13 +6,20 @@ from uuid import UUID
import httpx import httpx
from loguru import logger from loguru import logger
from lnbits.core import migrations as core_migrations
from lnbits.core.crud import (
get_dbversions,
get_installed_extensions,
update_migration_version,
)
from lnbits.core.db import db as core_db from lnbits.core.db import db as core_db
from lnbits.db import Connection from lnbits.db import COCKROACH, POSTGRES, SQLITE, Connection
from lnbits.extension_manager import Extension from lnbits.extension_manager import (
Extension,
get_valid_extensions,
)
from lnbits.settings import settings from lnbits.settings import settings
from .crud import update_migration_version
async def migrate_extension_database(ext: Extension, current_version): async def migrate_extension_database(ext: Extension, current_version):
try: try:
@ -119,3 +126,46 @@ def to_valid_user_id(user_id: str) -> UUID:
raise ValueError("Invalid hex string for User ID.") from exc raise ValueError("Invalid hex string for User ID.") from exc
return UUID(hex=user_id[:32], version=4) return UUID(hex=user_id[:32], version=4)
async def load_disabled_extension_list() -> None:
"""Update list of extensions that have been explicitly disabled"""
inactive_extensions = await get_installed_extensions(active=False)
settings.lnbits_deactivated_extensions.update([e.id for e in inactive_extensions])
async def migrate_databases():
"""Creates the necessary databases if they don't exist already; or migrates them."""
async with core_db.connect() as conn:
exists = False
if conn.type == SQLITE:
exists = await conn.fetchone(
"SELECT * FROM sqlite_master WHERE type='table' AND name='dbversions'"
)
elif conn.type in {POSTGRES, COCKROACH}:
exists = await conn.fetchone(
"SELECT * FROM information_schema.tables WHERE table_schema = 'public'"
" AND table_name = 'dbversions'"
)
if not exists:
await core_migrations.m000_create_migrations_table(conn)
current_versions = await get_dbversions(conn)
core_version = current_versions.get("core", 0)
await run_migration(conn, core_migrations, "core", core_version)
# here is the first place we can be sure that the
# `installed_extensions` table has been created
await load_disabled_extension_list()
# todo: revisit, use installed extensions
for ext in get_valid_extensions(False):
current_version = current_versions.get(ext.code, 0)
try:
await migrate_extension_database(ext, current_version)
except Exception as e:
logger.exception(f"Error migrating extension {ext.code}: {e}")
logger.info("✔️ All migrations done.")