84 lines
2.5 KiB
Python
84 lines
2.5 KiB
Python
"""
|
|
관리자 계정 초기 생성 스크립트.
|
|
사용법: python -m app.scripts.create_admin
|
|
"""
|
|
import asyncio
|
|
import sys
|
|
|
|
|
|
async def main():
|
|
print("=== SmartBot KR 관리자 계정 생성 ===\n")
|
|
|
|
tenant_id = input("테넌트 ID (예: dongducheon): ").strip()
|
|
if not tenant_id:
|
|
print("오류: 테넌트 ID를 입력하세요.")
|
|
sys.exit(1)
|
|
|
|
email = input("관리자 이메일: ").strip()
|
|
if not email:
|
|
print("오류: 이메일을 입력하세요.")
|
|
sys.exit(1)
|
|
|
|
import getpass
|
|
password = getpass.getpass("비밀번호 (8자 이상): ")
|
|
if len(password) < 8:
|
|
print("오류: 비밀번호는 8자 이상이어야 합니다.")
|
|
sys.exit(1)
|
|
|
|
from app.core.database import engine, Base
|
|
from app.models.tenant import Tenant, TenantConfig
|
|
from app.models.admin import AdminUser, AdminRole
|
|
from app.core.security import hash_password
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy import select
|
|
import uuid
|
|
|
|
async with engine.begin() as conn:
|
|
await conn.run_sync(Base.metadata.create_all)
|
|
|
|
async with AsyncSession(engine) as db:
|
|
# 테넌트 확인 / 생성
|
|
result = await db.execute(select(Tenant).where(Tenant.id == tenant_id))
|
|
tenant = result.scalar_one_or_none()
|
|
if not tenant:
|
|
tenant = Tenant(id=tenant_id, name=tenant_id, slug=tenant_id)
|
|
db.add(tenant)
|
|
await db.flush()
|
|
config = TenantConfig(
|
|
id=str(uuid.uuid4()),
|
|
tenant_id=tenant_id,
|
|
key="tenant_name",
|
|
value=tenant_id,
|
|
)
|
|
db.add(config)
|
|
print(f"테넌트 생성: {tenant_id}")
|
|
|
|
# 관리자 생성
|
|
result = await db.execute(
|
|
select(AdminUser).where(
|
|
AdminUser.tenant_id == tenant_id,
|
|
AdminUser.email == email,
|
|
)
|
|
)
|
|
existing = result.scalar_one_or_none()
|
|
if existing:
|
|
print(f"이미 존재하는 계정입니다: {email}")
|
|
else:
|
|
admin = AdminUser(
|
|
id=str(uuid.uuid4()),
|
|
tenant_id=tenant_id,
|
|
email=email,
|
|
hashed_pw=hash_password(password),
|
|
role=AdminRole.admin,
|
|
)
|
|
db.add(admin)
|
|
print(f"관리자 계정 생성: {email} (role: admin)")
|
|
|
|
await db.commit()
|
|
|
|
print("\n✅ 완료! 대시보드에서 로그인하세요.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|