import click from flask.cli import with_appcontext from .extensions import db from .utils import ( ensure_database_ready, init_database_with_retry, safe_db_rollback, set_login_hosts, set_user_password, ) def register_cli_commands(app): @app.cli.command("init-db") @click.option("--attempts", default=20, type=int, show_default=True) @click.option("--delay", default=3, type=int, show_default=True) def init_db_command(attempts: int, delay: int): """Inicjalizuje baze i czeka az bedzie gotowa.""" ok = init_database_with_retry(app, max_attempts=attempts, delay=delay, raise_on_failure=False) if not ok: raise click.ClickException("Nie udalo sie zainicjalizowac bazy danych.") click.echo("Baza danych gotowa.") @app.cli.command("set-admin-password") @click.option("--username", default="admin", show_default=True) @click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True) @with_appcontext def set_admin_password_command(username: str, password: str): """Ustawia haslo administratora.""" try: ensure_database_ready(create_schema=True, create_admin=True) user = set_user_password(username=username, password=password, is_admin=True) click.echo(f"Haslo admina ustawione dla uzytkownika: {user.uzytkownik}") except Exception as exc: safe_db_rollback() raise click.ClickException(str(exc)) @app.cli.command("set-user-password") @click.argument("username") @click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True) @click.option("--admin/--no-admin", default=None) @with_appcontext def set_user_password_command(username: str, password: str, admin: bool | None): """Tworzy uzytkownika lub zmienia jego haslo.""" try: ensure_database_ready(create_schema=True, create_admin=True) user = set_user_password(username=username, password=password, is_admin=admin) click.echo(f"Haslo ustawione dla uzytkownika: {user.uzytkownik}") except Exception as exc: safe_db_rollback() raise click.ClickException(str(exc)) @app.cli.command("set-login-hosts") @click.argument("hosts", required=False, default="") @with_appcontext def set_login_hosts_command(hosts: str): """Ustawia dozwolone hosty lub IP do logowania.""" try: ensure_database_ready(create_schema=True, create_admin=True) settings = set_login_hosts(hosts) click.echo( "Dozwolone hosty logowania ustawione na: " f"{settings.dozwolone_hosty_logowania or '(brak - logowanie zablokowane)'}" ) except Exception as exc: safe_db_rollback() raise click.ClickException(str(exc)) @app.cli.command("db-ping") @with_appcontext def db_ping_command(): """Sprawdza polaczenie z baza danych.""" try: ensure_database_ready(create_schema=False, create_admin=False) click.echo("OK") except Exception as exc: safe_db_rollback() raise click.ClickException(f"DB ERROR: {exc}")