linguaielts-api / backend /app /cli /promote_admin.py
AnhviNguyen
update reading-listening + phát âm vob
b3e4ba6
Raw
History Blame Contribute Delete
1.59 kB
"""
One-shot CLI to grant admin role to an existing user by email.
Usage (from backend/):
python -m app.cli.promote_admin --email admin@example.com
Does not auto-promote at login/register — assign admin deliberately via this tool
or direct SQL: UPDATE users SET role='admin' WHERE email='...';
"""
from __future__ import annotations
import argparse
import asyncio
import logging
import sys
from sqlalchemy import select
from app.db.database import AsyncSessionLocal
from app.db.models import User
logger = logging.getLogger(__name__)
async def _promote(email: str) -> int:
normalized = email.strip().lower()
if not normalized:
print("Email is required.", file=sys.stderr)
return 1
async with AsyncSessionLocal() as db:
result = await db.execute(select(User).where(User.email == normalized))
user = result.scalar_one_or_none()
if not user:
print(f"No user found with email: {normalized}", file=sys.stderr)
return 1
if user.role == "admin":
print(f"User {normalized} is already admin (id={user.id}).")
return 0
user.role = "admin"
await db.commit()
print(f"Promoted user id={user.id} ({normalized}) to admin.")
return 0
def main() -> None:
parser = argparse.ArgumentParser(description="Promote a user to admin by email.")
parser.add_argument("--email", required=True, help="Registered user email")
args = parser.parse_args()
raise SystemExit(asyncio.run(_promote(args.email)))
if __name__ == "__main__":
main()