AWS-Panel/backend/db/init_admin.py

54 lines
1.9 KiB
Python
Raw Normal View History

2025-12-10 12:02:17 +08:00
import asyncio
import sys
from pathlib import Path
from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
ROOT_DIR = Path(__file__).resolve().parents[1]
if str(ROOT_DIR.parent) not in sys.path:
sys.path.insert(0, str(ROOT_DIR.parent))
from backend.core.security import get_password_hash # noqa: E402
from backend.db import import_all_models # noqa: F401,E402
from backend.db.session import AsyncSessionLocal # noqa: E402
from backend.modules.users.models import Role, RoleName, User # noqa: E402
async def ensure_roles(session):
existing = {r.name for r in (await session.scalars(select(Role))).all()}
for name in [RoleName.ADMIN.value, RoleName.CUSTOMER_ADMIN.value, RoleName.CUSTOMER_USER.value]:
if name not in existing:
session.add(Role(name=name, description=f"{name} role"))
await session.commit()
async def ensure_admin(username: str, password: str):
async with AsyncSessionLocal() as session:
await ensure_roles(session)
role = await session.scalar(select(Role).where(Role.name == RoleName.ADMIN.value))
user = await session.scalar(select(User).where(User.username == username))
if user:
print(f"User {username} already exists (id={user.id})")
return
admin = User(
username=username,
email=None,
password_hash=get_password_hash(password),
role_id=role.id,
customer_id=None,
is_active=1,
)
session.add(admin)
try:
await session.commit()
await session.refresh(admin)
print(f"Created admin user {username} with id={admin.id}")
except IntegrityError:
await session.rollback()
print("Failed to create admin (maybe already exists)")
if __name__ == "__main__":
asyncio.run(ensure_admin("admin", "Admin@123"))