linguaielts-api / scripts /set_admin.py
AnhviNguyen
audio cloud
ad6916c
Raw
History Blame Contribute Delete
2.03 kB
#!/usr/bin/env python3
"""
Promote an existing user to admin by email.
Uses DATABASE_URL from the environment (same as the API).
Usage (from repo root):
python scripts/set_admin.py your@email.com
On Railway (API service, with Postgres linked):
railway run python scripts/set_admin.py your@email.com
Alternative (from backend/):
python -m app.cli.promote_admin --email your@email.com
"""
from __future__ import annotations
import asyncio
import sys
from pathlib import Path
# Allow `import app` when run from repo root
_BACKEND = Path(__file__).resolve().parent.parent / "backend"
if str(_BACKEND) not in sys.path:
sys.path.insert(0, str(_BACKEND))
from sqlalchemy import func, select
from app.db.database import AsyncSessionLocal
from app.db.models import User
async def set_admin(email: str) -> int:
normalized = email.strip().lower()
if not normalized:
print("Error: email is required.", file=sys.stderr)
return 1
async with AsyncSessionLocal() as db:
try:
result = await db.execute(
select(User).where(func.lower(User.email) == normalized)
)
user = result.scalar_one_or_none()
if not user:
print(f"Error: no user found with email {normalized}", file=sys.stderr)
return 1
if user.role == "admin":
print(f"OK: {normalized} is already admin (id={user.id}).")
return 0
user.role = "admin"
await db.commit()
print(f"Success: promoted user id={user.id} ({normalized}) to admin.")
return 0
except Exception as exc:
await db.rollback()
print(f"Error: {exc}", file=sys.stderr)
return 1
def main() -> None:
if len(sys.argv) != 2:
print("Usage: python scripts/set_admin.py <email>", file=sys.stderr)
raise SystemExit(1)
raise SystemExit(asyncio.run(set_admin(sys.argv[1])))
if __name__ == "__main__":
main()