"""CLI commands for Ten31Portal.""" import argparse import sys from sqlmodel import Session, select from ten31portal.auth import hash_password from ten31portal.database import engine from ten31portal.db_init import run_migrations from ten31portal.models import User, UserRole def create_user(args: argparse.Namespace) -> None: """Create a new user account.""" run_migrations() with Session(engine) as session: existing = session.exec(select(User).where(User.email == args.email)).first() if existing: print(f"Error: user with email {args.email} already exists.", file=sys.stderr) sys.exit(1) try: role = UserRole(args.role) except ValueError: print(f"Error: invalid role '{args.role}'. Must be one of: {', '.join(r.value for r in UserRole)}", file=sys.stderr) sys.exit(1) user = User( name=args.name, email=args.email, password_hash=hash_password(args.password), role=role, ) session.add(user) session.commit() print(f"Created user: {user.name} ({user.email}) with role {user.role.value}") def main() -> None: parser = argparse.ArgumentParser(prog="ten31portal-cli") sub = parser.add_subparsers(dest="command") create = sub.add_parser("create-user", help="Provision a new user") create.add_argument("--name", required=True) create.add_argument("--email", required=True) create.add_argument("--role", required=True, choices=[r.value for r in UserRole]) create.add_argument("--password", required=True) args = parser.parse_args() if args.command == "create-user": create_user(args) else: parser.print_help() if __name__ == "__main__": main()