package roomescape.auth.service import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Service import roomescape.auth.exception.AuthErrorCode import roomescape.auth.exception.AuthException import roomescape.auth.infrastructure.jwt.JwtHandler import roomescape.auth.web.LoginCheckResponse import roomescape.auth.web.LoginRequest import roomescape.auth.web.LoginResponse import roomescape.member.business.MemberService import roomescape.member.infrastructure.persistence.MemberEntity private val log: KLogger = KotlinLogging.logger {} @Service class AuthService( private val memberService: MemberService, private val jwtHandler: JwtHandler ) { fun login(request: LoginRequest): LoginResponse { val member: MemberEntity = fetchMemberOrThrow(AuthErrorCode.LOGIN_FAILED) { memberService.findByEmailAndPassword(request.email, request.password) } val accessToken: String = jwtHandler.createToken(member.id!!) return LoginResponse(accessToken) } fun checkLogin(memberId: Long): LoginCheckResponse { val member: MemberEntity = fetchMemberOrThrow(AuthErrorCode.UNIDENTIFIABLE_MEMBER) { memberService.findById(memberId) } return LoginCheckResponse(member.name, member.role.name) } private fun fetchMemberOrThrow( errorCode: AuthErrorCode, block: () -> MemberEntity ): MemberEntity { try { return block() } catch (_: Exception) { throw AuthException(errorCode) } } fun logout(memberId: Long?) { if (memberId != null) { log.info { "requested logout for $memberId" } } } }