from sqlalchemy.orm import Session from app.shared.crypto import Crypto from app.domain.models.user import User from app.shared.logger import setup_logger from app.presentation.schemas.auth_schema import JoinRequest, JoinResponse, LoginRequest, LoginResponse from app.repositories.user_repository import UserRepository from app.shared.exception.custom_exception import UserIdAlreadyExistsError, UserNotFoundError, PasswordIncorrectError logger = setup_logger(__name__) class AuthService: '''인증 서비스''' def __init__(self, db: Session): self.db = db self.user_repository = UserRepository(db) def join(self, data: JoinRequest) -> JoinResponse: '''회원가입''' # 1. 사용자 ID 중복 체크 if self.user_repository.exists_by_user_id(data.user_id): raise UserIdAlreadyExistsError() # 2. 비밀번호 암호화 hashed_password = Crypto.hash_password(data.password) # 3. 딕셔너리로 데이터 준비 user_data = { "user_id": data.user_id, "name": data.name, "password": hashed_password, "email": data.email, "phone_number": data.phone_number } # 4. 딕셔너리를 전달하여 사용자 생성 new_user = self.user_repository.create(user_data) self.db.commit() # 4. 사용자 반환 return JoinResponse(id=new_user.id, name=new_user.name) def login(self, data: LoginRequest) -> LoginResponse: '''로그인''' # 1. 사용자 ID 조회 user = self.user_repository.get_by_user_id(data.user_id) if not user: raise UserNotFoundError() # 2. 비밀번호 검증 if not Crypto.verify_password(data.password, user.password): raise PasswordIncorrectError() # 3. 사용자 반환 return LoginResponse(id=user.id, name=user.name)