""" 초기 시스템 설정 컨트롤러 배포 후 첫 실행 시 시스템 관리자 계정 생성 """ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from pydantic import BaseModel, EmailStr from typing import Optional from ..database import get_db from .models import User, UserRepository from ..utils.logger import get_logger logger = get_logger(__name__) router = APIRouter() class SystemSetupRequest(BaseModel): username: str password: str name: str email: Optional[EmailStr] = None department: Optional[str] = None position: Optional[str] = None class SystemSetupResponse(BaseModel): success: bool message: str user_id: Optional[int] = None setup_completed: bool @router.get("/setup/status") async def get_setup_status(db: Session = Depends(get_db)): """ 시스템 초기 설정 상태 확인 Returns: Dict: 설정 완료 여부 """ try: user_repo = UserRepository(db) # 시스템 관리자가 존재하는지 확인 system_admin = db.query(User).filter(User.role == 'system').first() return { 'success': True, 'setup_completed': system_admin is not None, 'has_system_admin': system_admin is not None, 'total_users': db.query(User).count() } except Exception as e: logger.error(f"Setup status check error: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="설정 상태 확인 중 오류가 발생했습니다" ) @router.post("/setup/initialize", response_model=SystemSetupResponse) async def initialize_system( setup_data: SystemSetupRequest, db: Session = Depends(get_db) ): """ 시스템 초기화 및 첫 번째 시스템 관리자 생성 Args: setup_data: 시스템 관리자 계정 정보 db: 데이터베이스 세션 Returns: SystemSetupResponse: 설정 결과 """ try: user_repo = UserRepository(db) # 이미 시스템 관리자가 존재하는지 확인 existing_admin = db.query(User).filter(User.role == 'system').first() if existing_admin: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="시스템이 이미 초기화되었습니다" ) # 사용자명 중복 확인 existing_user = user_repo.find_by_username(setup_data.username) if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="이미 존재하는 사용자명입니다" ) # 이메일 중복 확인 (이메일이 제공된 경우) if setup_data.email: existing_email = user_repo.find_by_email(setup_data.email) if existing_email: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="이미 존재하는 이메일입니다" ) # 시스템 관리자 계정 생성 user = User( username=setup_data.username, name=setup_data.name, email=setup_data.email, role='system', access_level='system', department=setup_data.department, position=setup_data.position, is_active=True ) # 비밀번호 설정 user.set_password(setup_data.password) # 데이터베이스에 저장 db.add(user) db.commit() db.refresh(user) logger.info(f"System initialized with admin user: {user.username}") return SystemSetupResponse( success=True, message="시스템이 성공적으로 초기화되었습니다", user_id=user.user_id, setup_completed=True ) except HTTPException: raise except Exception as e: db.rollback() logger.error(f"System initialization error: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="시스템 초기화 중 오류가 발생했습니다" ) @router.post("/setup/reset") async def reset_system_setup( confirm_reset: bool = False, db: Session = Depends(get_db) ): """ 시스템 설정 리셋 (개발/테스트 용도) Args: confirm_reset: 리셋 확인 db: 데이터베이스 세션 Returns: Dict: 리셋 결과 """ try: if not confirm_reset: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="리셋을 확인해주세요 (confirm_reset=true)" ) # 개발 환경에서만 허용 from ..config import get_settings settings = get_settings() if settings.environment != 'development': raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="개발 환경에서만 시스템 리셋이 가능합니다" ) # 모든 사용자 삭제 db.query(User).delete() db.commit() logger.warning("System setup has been reset (development only)") return { 'success': True, 'message': '시스템 설정이 리셋되었습니다', 'setup_completed': False } except HTTPException: raise except Exception as e: db.rollback() logger.error(f"System reset error: {str(e)}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="시스템 리셋 중 오류가 발생했습니다" )