package roomescape.auth.business import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional 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.implement.MemberFinder import roomescape.member.infrastructure.persistence.MemberEntity private val log: KLogger = KotlinLogging.logger {} @Service class AuthService( private val memberFinder: MemberFinder, private val jwtHandler: JwtHandler, ) { @Transactional(readOnly = true) fun login(request: LoginRequest): LoginResponse { val params = "email=${request.email}, password=${request.password}" log.debug { "[AuthService.login] 시작: $params" } val member: MemberEntity = fetchOrThrow(AuthErrorCode.LOGIN_FAILED) { memberFinder.findByEmailAndPassword(request.email, request.password) } val accessToken: String = jwtHandler.createToken(member.id!!) return LoginResponse(accessToken) .also { log.info { "[AuthService.login] 완료: email=${request.email}, memberId=${member.id}" } } } @Transactional(readOnly = true) fun checkLogin(memberId: Long): LoginCheckResponse { log.debug { "[AuthService.checkLogin] 시작: memberId=$memberId" } val member: MemberEntity = fetchOrThrow(AuthErrorCode.MEMBER_NOT_FOUND) { memberFinder.findById(memberId) } return LoginCheckResponse(member.name, member.role.name) .also { log.info { "[AuthService.checkLogin] 완료: memberId=$memberId, role=${it.role}" } } } private fun fetchOrThrow(errorCode: AuthErrorCode, block: () -> MemberEntity): MemberEntity { try { return block() } catch (e: Exception) { throw AuthException(errorCode, e.message ?: errorCode.message) } } fun logout(memberId: Long) { log.info { "[AuthService.logout] 로그아웃: memberId=$memberId" } } }