File size: 2,192 Bytes
cd3078d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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))