54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
|
|
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"))
|