[#44] 매장 기능 도입 #45

Merged
pricelees merged 116 commits from feat/#44 into main 2025-09-20 03:15:06 +00:00
6 changed files with 87 additions and 23 deletions
Showing only changes of commit 5aa6a6cc2c - Show all commits

View File

@ -9,11 +9,7 @@ import roomescape.admin.exception.AdminErrorCode
import roomescape.admin.exception.AdminException
import roomescape.admin.infrastructure.persistence.AdminEntity
import roomescape.admin.infrastructure.persistence.AdminRepository
import roomescape.common.dto.AdminLoginCredentials
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.OperatorInfo
import roomescape.common.dto.PrincipalType
import roomescape.common.dto.toCredentials
import roomescape.common.dto.*
private val log: KLogger = KotlinLogging.logger {}
@ -22,12 +18,13 @@ class AdminService(
private val adminRepository: AdminRepository,
) {
@Transactional(readOnly = true)
fun findContextById(id: Long): CurrentUserContext {
fun findContextById(id: Long): CurrentAdminContext {
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 시작: id=${id}" }
val admin: AdminEntity = findOrThrow(id)
return CurrentUserContext(admin.id, admin.name, PrincipalType.ADMIN).also {
return admin.toContext()
.also {
log.info { "[AdminService.findById] 현재 로그인된 관리자 조회 완료: id=${id}" }
}
}

View File

@ -0,0 +1,49 @@
package roomescape.auth.web.support.resolver
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest
import org.springframework.core.MethodParameter
import org.springframework.stereotype.Component
import org.springframework.web.bind.support.WebDataBinderFactory
import org.springframework.web.context.request.NativeWebRequest
import org.springframework.web.method.support.HandlerMethodArgumentResolver
import org.springframework.web.method.support.ModelAndViewContainer
import roomescape.admin.business.AdminService
import roomescape.auth.exception.AuthErrorCode
import roomescape.auth.exception.AuthException
import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.Admin
import roomescape.auth.web.support.accessToken
private val log: KLogger = KotlinLogging.logger {}
@Component
class AdminContextResolver(
private val jwtUtils: JwtUtils,
private val adminService: AdminService,
) : HandlerMethodArgumentResolver {
override fun supportsParameter(parameter: MethodParameter): Boolean {
return parameter.hasParameterAnnotation(Admin::class.java)
}
override fun resolveArgument(
parameter: MethodParameter,
mavContainer: ModelAndViewContainer?,
webRequest: NativeWebRequest,
binderFactory: WebDataBinderFactory?
): Any? {
val request: HttpServletRequest = webRequest.nativeRequest as HttpServletRequest
val token: String? = request.accessToken()
try {
val id: Long = jwtUtils.extractSubject(token).toLong()
return adminService.findContextById(id)
} catch (e: Exception) {
log.info { "[AdminContextResolver] 회원 조회 실패. message=${e.message}" }
throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND)
}
}
}

View File

@ -9,19 +9,19 @@ import org.springframework.web.bind.support.WebDataBinderFactory
import org.springframework.web.context.request.NativeWebRequest
import org.springframework.web.method.support.HandlerMethodArgumentResolver
import org.springframework.web.method.support.ModelAndViewContainer
import roomescape.auth.business.AuthService
import roomescape.auth.exception.AuthErrorCode
import roomescape.auth.exception.AuthException
import roomescape.auth.infrastructure.jwt.JwtUtils
import roomescape.auth.web.support.User
import roomescape.auth.web.support.accessToken
import roomescape.user.business.UserService
private val log: KLogger = KotlinLogging.logger {}
@Component
class UserContextResolver(
private val jwtUtils: JwtUtils,
private val authService: AuthService
private val userService: UserService,
) : HandlerMethodArgumentResolver {
override fun supportsParameter(parameter: MethodParameter): Boolean {
@ -38,11 +38,11 @@ class UserContextResolver(
val token: String? = request.accessToken()
try {
val (id, type) = jwtUtils.extractIdAndType(token)
val id: Long = jwtUtils.extractSubject(token).toLong()
return authService.findContextById(id, type)
return userService.findContextById(id)
} catch (e: Exception) {
log.info { "[MemberIdResolver] 회원 조회 실패. message=${e.message}" }
log.info { "[UserContextResolver] 회원 조회 실패. message=${e.message}" }
throw AuthException(AuthErrorCode.MEMBER_NOT_FOUND)
}
}

View File

@ -6,16 +6,19 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
import roomescape.auth.web.support.interceptors.AdminInterceptor
import roomescape.auth.web.support.interceptors.UserInterceptor
import roomescape.auth.web.support.resolver.AdminContextResolver
import roomescape.auth.web.support.resolver.UserContextResolver
@Configuration
class WebMvcConfig(
private val adminInterceptor: AdminInterceptor,
private val userInterceptor: UserInterceptor,
private val userContextResolver: UserContextResolver
private val adminContextResolver: AdminContextResolver,
private val userContextResolver: UserContextResolver,
) : WebMvcConfigurer {
override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) {
resolvers.add(adminContextResolver)
resolvers.add(userContextResolver)
}

View File

@ -60,12 +60,6 @@ fun UserEntity.toCredentials() = UserLoginCredentials(
name = this.name,
)
data class CurrentUserContext(
val id: Long,
val name: String,
val type: PrincipalType
);
enum class PrincipalType {
USER, ADMIN
}
@ -74,3 +68,24 @@ data class OperatorInfo(
val id: Long,
val name: String
)
data class CurrentUserContext(
val id: Long,
val name: String,
)
data class CurrentAdminContext(
val id: Long,
val name: String,
val type: AdminType,
val storeId: Long?,
val permissionLevel: AdminPermissionLevel
)
fun AdminEntity.toContext() = CurrentAdminContext(
id = this.id,
name = this.name,
type = this.type,
storeId = this.storeId,
permissionLevel = this.permissionLevel
)

View File

@ -8,8 +8,8 @@ import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import roomescape.common.config.next
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.PrincipalType
import roomescape.common.dto.UserLoginCredentials
import roomescape.common.dto.toCredentials
import roomescape.user.exception.UserErrorCode
import roomescape.user.exception.UserException
import roomescape.user.infrastructure.persistence.*
@ -34,7 +34,7 @@ class UserService(
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 시작: id=${id}" }
val user: UserEntity = findOrThrow(id)
return CurrentUserContext(user.id, user.name, PrincipalType.USER)
return CurrentUserContext(user.id, user.name)
.also {
log.info { "[UserService.findContextById] 현재 로그인된 회원 조회 완료: id=${id}" }
}