111 lines
3.5 KiB
Python
111 lines
3.5 KiB
Python
"""
|
|
사용자 서비스
|
|
사용자 관리 관련 비즈니스 로직을 관리하는 서비스 레이어
|
|
"""
|
|
|
|
from typing import Dict, Any, Optional
|
|
from types import SimpleNamespace
|
|
|
|
from models.user_model.users import Users
|
|
|
|
from repositories import UserRepository
|
|
|
|
from services.auth.cache_service import UserCacheService, JWTBlacklistService
|
|
|
|
from utils.db_decorators import transactional
|
|
from extensions import custom_logger
|
|
import settings
|
|
|
|
logger = custom_logger(f"{settings.LOG_PREFIX}_user_service")
|
|
|
|
class UserService:
|
|
"""
|
|
사용자 서비스
|
|
"""
|
|
|
|
@staticmethod
|
|
def get_user_by_uuid(user_uuid: str, use_cache: bool = True) -> Optional[Users]:
|
|
"""UUID로 사용자 조회 (캐시 우선)"""
|
|
if use_cache:
|
|
# 캐시 조회
|
|
cached_user_data = UserCacheService.get(user_uuid)
|
|
if cached_user_data:
|
|
user = SimpleNamespace(**cached_user_data)
|
|
user.to_dict = lambda: cached_user_data
|
|
logger.debug(f"캐시에서 사용자 조회 성공: {user_uuid}")
|
|
return user
|
|
|
|
# DB 조회
|
|
user_repo = UserRepository()
|
|
user = user_repo.find_by_uuid(user_uuid)
|
|
if user and use_cache:
|
|
# 캐시 저장
|
|
UserCacheService.set(user_uuid, user.to_dict())
|
|
logger.debug(f"DB에서 사용자 조회 후 캐시에 저장: {user_uuid}")
|
|
|
|
return user
|
|
|
|
@staticmethod
|
|
def get_user_by_id(user_ud: str) -> Optional[Users]:
|
|
"""ID로 사용자 조회"""
|
|
user_repo = UserRepository()
|
|
return user_repo.get_by_id(user_ud)
|
|
|
|
@staticmethod
|
|
@transactional
|
|
def update_user_profile(user_uuid: str, update_data: Dict[str, Any]) -> Users:
|
|
"""사용자 프로필 업데이트"""
|
|
user_repo = UserRepository()
|
|
|
|
# 사용자 조회
|
|
user = user_repo.find_by_uuid(user_uuid)
|
|
|
|
if not user:
|
|
return None
|
|
|
|
# 업데이트 가능한 필드만 처리
|
|
if "user_name" in update_data:
|
|
user.user_name = update_data["user_name"]
|
|
|
|
user = user_repo.update(user)
|
|
|
|
# 캐시 갱신
|
|
UserCacheService.refresh(user_uuid, user.to_dict())
|
|
|
|
logger.info(f"사용자 프로필이 업데이트되었습니다: {user_uuid}")
|
|
return user
|
|
|
|
@staticmethod
|
|
def invalidate_user_cache(user_uuid: str) -> bool:
|
|
"""사용자 캐시 무효화"""
|
|
success = UserCacheService.delete(user_uuid)
|
|
if success:
|
|
logger.debug(f"사용자 캐시가 무효화되었습니다: {user_uuid}")
|
|
return success
|
|
|
|
@staticmethod
|
|
@transactional
|
|
def delete_user(user_uuid: str, jti: Optional[str] = None) -> bool:
|
|
"""사용자 삭제 (회원 탈퇴)"""
|
|
user_repo = UserRepository()
|
|
|
|
user = user_repo.find_by_uuid(user_uuid)
|
|
if not user:
|
|
logger.warning(f"삭제할 사용자를 DB에서 찾을 수 없음: {user_uuid}")
|
|
UserCacheService.delete(user_uuid)
|
|
return False
|
|
|
|
# 삭제
|
|
success = user_repo.delete(user)
|
|
if success:
|
|
# 캐시 무효화
|
|
UserCacheService.delete(user_uuid)
|
|
|
|
# JWT 블랙리스트 추가 (현재 토큰 무효화)
|
|
if jti:
|
|
JWTBlacklistService.add(jti)
|
|
logger.debug(f"JWT 블랙리스트 추가: {jti}")
|
|
|
|
logger.info(f"사용자가 삭제되었습니다: {user_uuid}")
|
|
|
|
return success |