import click from flask.cli import with_appcontext from .extensions import db from .models import User @click.command("init-db") @click.option("--admin-user", required=True, help="Username for the initial admin") @click.option("--admin-pass", required=True, help="Password for the initial admin") @with_appcontext def init_db_command(admin_user: str, admin_pass: str): """Create tables and ensure an admin account exists.""" db.create_all() # Lightweight migration for older SQLite DBs: ensure User.email column exists. # This avoids requiring Alembic for this small project. try: cols = [r[1] for r in db.session.execute(db.text("PRAGMA table_info(user)")).fetchall()] if "email" not in cols: db.session.execute(db.text("ALTER TABLE user ADD COLUMN email VARCHAR(255)")) db.session.commit() except Exception: # Best-effort; if it fails we continue so fresh DBs still work. db.session.rollback() existing = User.query.filter_by(username=admin_user).first() if existing: if not existing.is_admin: existing.is_admin = True existing.set_password(admin_pass) db.session.commit() click.echo(f"Updated admin user '{admin_user}'.") return u = User(username=admin_user, is_admin=True) u.set_password(admin_pass) db.session.add(u) db.session.commit() click.echo(f"Created admin user '{admin_user}'.")