import argparse import asyncio import sys from datetime import datetime, timezone from pathlib import Path from typing import Optional # Ensure "app" imports work when running this file directly. BACKEND_ROOT = Path(__file__).resolve().parent.parent if str(BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(BACKEND_ROOT)) from app.auth import hash_password from app.database import close_db, connect_db, get_db async def setup_admin(email: str, name: str, password: Optional[str]) -> None: await connect_db() try: db = get_db() existing = await db.users.find_one({"email": email}) if existing: update_fields = {"role": "admin", "is_approved": True} if password: update_fields["password_hash"] = hash_password(password) await db.users.update_one({"_id": existing["_id"]}, {"$set": update_fields}) print(f"Promoted existing user to admin: {email}") else: if not password: raise ValueError("Password is required when creating a new admin user.") await db.users.insert_one( { "email": email, "name": name, "password_hash": hash_password(password), "role": "admin", "is_approved": True, "token_version": 0, "created_at": datetime.now(timezone.utc), } ) print(f"Created new admin user: {email}") finally: await close_db() def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Create or promote an admin user." ) parser.add_argument("--email", required=True, help="Admin user email") parser.add_argument("--name", default="Admin", help="Admin display name for new users") parser.add_argument( "--password", default=None, help="Password (required for new user, optional for existing user)", ) return parser.parse_args() if __name__ == "__main__": args = parse_args() asyncio.run(setup_admin(args.email, args.name, args.password))