O2Sound_ver2_final/backend/app/services/auth_service.py

56 lines
1.9 KiB
Python

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)