56 lines
1.9 KiB
Python
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) |