chore: Optimize Imports & Rearrange Code

This commit is contained in:
이상진 2025-10-05 22:06:29 +09:00
parent c270ca9f67
commit e290c2293f
78 changed files with 298 additions and 218 deletions

View File

@ -7,7 +7,6 @@ import io.kotest.assertions.assertSoftly
import io.kotest.core.spec.style.FunSpec import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.equals.shouldBeEqual import io.kotest.matchers.equals.shouldBeEqual
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.mockk.every import io.mockk.every
import io.mockk.mockk import io.mockk.mockk
@ -48,7 +47,10 @@ class AbstractLogMaskingConverterTest : FunSpec({
event.formattedMessage event.formattedMessage
} returns json.format(account, address) } returns json.format(account, address)
converter.convert(event) shouldBeEqual json.format("${account.first()}${converter.mask}${account.last()}", "${address.first()}${converter.mask}${address.last()}") converter.convert(event) shouldBeEqual json.format(
"${account.first()}${converter.mask}${account.last()}",
"${address.first()}${converter.mask}${address.last()}"
)
} }
} }
} }

View File

@ -5,11 +5,7 @@ import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.equality.shouldBeEqualUsingFields import io.kotest.matchers.equality.shouldBeEqualUsingFields
import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import io.mockk.clearMocks import io.mockk.*
import io.mockk.every
import io.mockk.mockk
import io.mockk.slot
import io.mockk.verify
import org.junit.jupiter.api.assertThrows import org.junit.jupiter.api.assertThrows
import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.PlatformTransactionManager
import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.TransactionDefinition

View File

@ -30,7 +30,8 @@ class KoreaDateTimeExtensionsTest : FunSpec({
assertSoftly(KoreaDateTime.nowWithOffset()) { assertSoftly(KoreaDateTime.nowWithOffset()) {
val utcNow = OffsetDateTime.now(ZoneId.of("UTC")) val utcNow = OffsetDateTime.now(ZoneId.of("UTC"))
this.toLocalDateTime().withSecond(0).withNano(0) shouldBe utcNow.toLocalDateTime().plusHours(9).withSecond(0).withNano(0) this.toLocalDateTime().withSecond(0).withNano(0) shouldBe utcNow.toLocalDateTime().plusHours(9)
.withSecond(0).withNano(0)
} }
} }

View File

@ -13,7 +13,8 @@ class ServiceObservationAspect(
) { ) {
@Pointcut("execution(* com.sangdol..business..*Service*.*(..))") @Pointcut("execution(* com.sangdol..business..*Service*.*(..))")
fun allServices() {} fun allServices() {
}
@Around("allServices()") @Around("allServices()")
fun runWithObserve(joinPoint: ProceedingJoinPoint): Any? { fun runWithObserve(joinPoint: ProceedingJoinPoint): Any? {

View File

@ -18,7 +18,10 @@ class WebLogMessageConverter(
return objectMapper.writeValueAsString(payload) return objectMapper.writeValueAsString(payload)
} }
fun convertToControllerInvokedMessage(servletRequest: HttpServletRequest, controllerPayload: Map<String, Any>): String { fun convertToControllerInvokedMessage(
servletRequest: HttpServletRequest,
controllerPayload: Map<String, Any>
): String {
val payload = LogPayloadBuilder(type = LogType.CONTROLLER_INVOKED, servletRequest = servletRequest) val payload = LogPayloadBuilder(type = LogType.CONTROLLER_INVOKED, servletRequest = servletRequest)
.endpoint() .endpoint()
.principalId() .principalId()

View File

@ -121,7 +121,10 @@ class WebLogMessageConverterTest : FunSpec({
this["duration_ms"].shouldNotBeNull() this["duration_ms"].shouldNotBeNull()
this["principal_id"] shouldBe principalId this["principal_id"] shouldBe principalId
this["response_body"] shouldBe null this["response_body"] shouldBe null
this["exception"] shouldBe mapOf("class" to exception.javaClass.simpleName, "message" to exception.message) this["exception"] shouldBe mapOf(
"class" to exception.javaClass.simpleName,
"message" to exception.message
)
} }
} }
@ -141,7 +144,10 @@ class WebLogMessageConverterTest : FunSpec({
this["duration_ms"].shouldNotBeNull() this["duration_ms"].shouldNotBeNull()
this["principal_id"] shouldBe principalId this["principal_id"] shouldBe principalId
this["response_body"] shouldBe body this["response_body"] shouldBe body
this["exception"] shouldBe mapOf("class" to exception.javaClass.simpleName, "message" to exception.message) this["exception"] shouldBe mapOf(
"class" to exception.javaClass.simpleName,
"message" to exception.message
)
} }
} }

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.admin.business package com.sangdol.roomescape.admin.business
import com.sangdol.roomescape.common.types.Auditor
import com.sangdol.roomescape.admin.business.dto.AdminLoginCredentials import com.sangdol.roomescape.admin.business.dto.AdminLoginCredentials
import com.sangdol.roomescape.admin.business.dto.toCredentials import com.sangdol.roomescape.admin.business.dto.toCredentials
import com.sangdol.roomescape.admin.exception.AdminErrorCode import com.sangdol.roomescape.admin.exception.AdminErrorCode
import com.sangdol.roomescape.admin.exception.AdminException import com.sangdol.roomescape.admin.exception.AdminException
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository
import com.sangdol.roomescape.common.types.Auditor
import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.auth.docs package com.sangdol.roomescape.auth.docs
import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.common.types.CurrentUserContext
import com.sangdol.roomescape.auth.web.LoginRequest import com.sangdol.roomescape.auth.web.LoginRequest
import com.sangdol.roomescape.auth.web.LoginSuccessResponse import com.sangdol.roomescape.auth.web.LoginSuccessResponse
import com.sangdol.roomescape.auth.web.support.Public import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.User import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.types.CurrentUserContext
import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses import io.swagger.v3.oas.annotations.responses.ApiResponses

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.auth.exception package com.sangdol.roomescape.auth.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.web.HttpStatus
enum class AuthErrorCode( enum class AuthErrorCode(
override val httpStatus: HttpStatus, override val httpStatus: HttpStatus,

View File

@ -1,5 +1,7 @@
package com.sangdol.roomescape.auth.infrastructure.jwt package com.sangdol.roomescape.auth.infrastructure.jwt
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import io.jsonwebtoken.Claims import io.jsonwebtoken.Claims
@ -8,8 +10,6 @@ import io.jsonwebtoken.Jwts
import io.jsonwebtoken.security.Keys import io.jsonwebtoken.security.Keys
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import java.util.* import java.util.*
import javax.crypto.SecretKey import javax.crypto.SecretKey

View File

@ -1,6 +1,5 @@
package com.sangdol.roomescape.auth.web package com.sangdol.roomescape.auth.web
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
enum class PrincipalType { enum class PrincipalType {

View File

@ -1,12 +1,6 @@
package com.sangdol.roomescape.auth.web.support.interceptors package com.sangdol.roomescape.auth.web.support.interceptors
import io.github.oshai.kotlinlogging.KLogger import com.sangdol.common.utils.MdcPrincipalIdUtil
import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege
@ -17,7 +11,13 @@ import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.auth.web.support.AdminOnly import com.sangdol.roomescape.auth.web.support.AdminOnly
import com.sangdol.roomescape.auth.web.support.accessToken import com.sangdol.roomescape.auth.web.support.accessToken
import com.sangdol.common.utils.MdcPrincipalIdUtil import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse
import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -47,7 +47,10 @@ class AdminInterceptor(
return true return true
} catch (e: Exception) { } catch (e: Exception) {
when (e) { when (e) {
is AuthException -> { throw e } is AuthException -> {
throw e
}
else -> { else -> {
log.warn { "[AdminInterceptor] 예상치 못한 예외: message=${e.message}" } log.warn { "[AdminInterceptor] 예상치 못한 예외: message=${e.message}" }
throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR) throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR)

View File

@ -1,5 +1,12 @@
package com.sangdol.roomescape.auth.web.support.interceptors package com.sangdol.roomescape.auth.web.support.interceptors
import com.sangdol.common.utils.MdcPrincipalIdUtil
import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.auth.web.support.accessToken
import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
@ -7,13 +14,6 @@ import jakarta.servlet.http.HttpServletResponse
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.web.method.HandlerMethod import org.springframework.web.method.HandlerMethod
import org.springframework.web.servlet.HandlerInterceptor import org.springframework.web.servlet.HandlerInterceptor
import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.auth.web.support.accessToken
import com.sangdol.common.utils.MdcPrincipalIdUtil
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -47,7 +47,10 @@ class UserInterceptor(
return true return true
} catch (e: Exception) { } catch (e: Exception) {
when (e) { when (e) {
is AuthException -> { throw e } is AuthException -> {
throw e
}
else -> { else -> {
log.warn { "[UserInterceptor] 예상치 못한 예외: message=${e.message}" } log.warn { "[UserInterceptor] 예상치 못한 예외: message=${e.message}" }
throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR) throw AuthException(AuthErrorCode.TEMPORARY_AUTH_ERROR)

View File

@ -1,5 +1,11 @@
package com.sangdol.roomescape.auth.web.support.resolver package com.sangdol.roomescape.auth.web.support.resolver
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.accessToken
import com.sangdol.roomescape.user.business.UserService
import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
@ -9,12 +15,6 @@ import org.springframework.web.bind.support.WebDataBinderFactory
import org.springframework.web.context.request.NativeWebRequest import org.springframework.web.context.request.NativeWebRequest
import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.method.support.HandlerMethodArgumentResolver
import org.springframework.web.method.support.ModelAndViewContainer import org.springframework.web.method.support.ModelAndViewContainer
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.accessToken
import com.sangdol.roomescape.user.business.UserService
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.common.config package com.sangdol.roomescape.common.config
import com.sangdol.common.web.config.JacksonConfig
import com.sangdol.common.log.message.AbstractLogMaskingConverter import com.sangdol.common.log.message.AbstractLogMaskingConverter
import com.sangdol.common.web.config.JacksonConfig
class RoomescapeLogMaskingConverter : AbstractLogMaskingConverter( class RoomescapeLogMaskingConverter : AbstractLogMaskingConverter(
sensitiveKeys = setOf("password", "accessToken", "phone"), sensitiveKeys = setOf("password", "accessToken", "phone"),

View File

@ -9,7 +9,6 @@ import org.springframework.boot.jdbc.DataSourceBuilder
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary import org.springframework.context.annotation.Primary
import org.springframework.context.annotation.Profile
import javax.sql.DataSource import javax.sql.DataSource
@Configuration @Configuration

View File

@ -1,7 +1,6 @@
package com.sangdol.roomescape.common.config package com.sangdol.roomescape.common.config
import io.swagger.v3.oas.models.OpenAPI import io.swagger.v3.oas.models.OpenAPI
import io.swagger.v3.oas.models.info.Info
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration

View File

@ -1,12 +1,12 @@
package com.sangdol.roomescape.common.config package com.sangdol.roomescape.common.config
import com.sangdol.roomescape.auth.web.support.interceptors.AdminInterceptor
import com.sangdol.roomescape.auth.web.support.interceptors.UserInterceptor
import com.sangdol.roomescape.auth.web.support.resolver.UserContextResolver
import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Configuration
import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.method.support.HandlerMethodArgumentResolver
import org.springframework.web.servlet.config.annotation.InterceptorRegistry import org.springframework.web.servlet.config.annotation.InterceptorRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer import org.springframework.web.servlet.config.annotation.WebMvcConfigurer
import com.sangdol.roomescape.auth.web.support.interceptors.AdminInterceptor
import com.sangdol.roomescape.auth.web.support.interceptors.UserInterceptor
import com.sangdol.roomescape.auth.web.support.resolver.UserContextResolver
@Configuration @Configuration
class WebMvcConfig( class WebMvcConfig(

View File

@ -1,9 +1,5 @@
package com.sangdol.roomescape.payment.business package com.sangdol.roomescape.payment.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 com.sangdol.common.persistence.TransactionExecutionUtil import com.sangdol.common.persistence.TransactionExecutionUtil
import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException import com.sangdol.roomescape.payment.exception.PaymentException
@ -12,6 +8,10 @@ import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirm
import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient
import com.sangdol.roomescape.payment.infrastructure.persistence.* import com.sangdol.roomescape.payment.infrastructure.persistence.*
import com.sangdol.roomescape.payment.web.* import com.sangdol.roomescape.payment.web.*
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.payment.exception package com.sangdol.roomescape.payment.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.web.HttpStatus
enum class PaymentErrorCode( enum class PaymentErrorCode(
override val httpStatus: HttpStatus, override val httpStatus: HttpStatus,

View File

@ -1,10 +1,10 @@
package com.sangdol.roomescape.payment.infrastructure.common package com.sangdol.roomescape.payment.infrastructure.common
import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonCreator
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException import com.sangdol.roomescape.payment.exception.PaymentException
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.region.business package com.sangdol.roomescape.region.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 com.sangdol.roomescape.region.exception.RegionErrorCode import com.sangdol.roomescape.region.exception.RegionErrorCode
import com.sangdol.roomescape.region.exception.RegionException import com.sangdol.roomescape.region.exception.RegionException
import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository
import com.sangdol.roomescape.region.web.* import com.sangdol.roomescape.region.web.*
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.region.exception package com.sangdol.roomescape.region.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.exception.RoomescapeException import com.sangdol.common.types.exception.RoomescapeException
import com.sangdol.common.types.web.HttpStatus
class RegionException( class RegionException(
override val errorCode: RegionErrorCode, override val errorCode: RegionErrorCode,

View File

@ -1,14 +1,14 @@
package com.sangdol.roomescape.reservation.business package com.sangdol.roomescape.reservation.business
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
import com.sangdol.roomescape.reservation.exception.ReservationErrorCode import com.sangdol.roomescape.reservation.exception.ReservationErrorCode
import com.sangdol.roomescape.reservation.exception.ReservationException import com.sangdol.roomescape.reservation.exception.ReservationException
import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.schedule.web.ScheduleSummaryResponse import com.sangdol.roomescape.schedule.web.ScheduleSummaryResponse
import com.sangdol.roomescape.theme.web.ThemeInfoResponse import com.sangdol.roomescape.theme.web.ThemeInfoResponse
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,9 +1,9 @@
package com.sangdol.roomescape.reservation.docs package com.sangdol.roomescape.reservation.docs
import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.common.types.CurrentUserContext
import com.sangdol.roomescape.auth.web.support.User import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.UserOnly import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.types.CurrentUserContext
import com.sangdol.roomescape.reservation.web.* import com.sangdol.roomescape.reservation.web.*
import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponse

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.reservation.exception package com.sangdol.roomescape.reservation.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.web.HttpStatus
enum class ReservationErrorCode( enum class ReservationErrorCode(
override val httpStatus: HttpStatus, override val httpStatus: HttpStatus,

View File

@ -11,7 +11,8 @@ interface ReservationRepository : JpaRepository<ReservationEntity, Long> {
fun findAllByUserIdAndStatusIsIn(userId: Long, statuses: List<ReservationStatus>): List<ReservationEntity> fun findAllByUserIdAndStatusIsIn(userId: Long, statuses: List<ReservationStatus>): List<ReservationEntity>
@Modifying @Modifying
@Query(""" @Query(
"""
UPDATE UPDATE
reservation r reservation r
JOIN JOIN
@ -23,6 +24,7 @@ interface ReservationRepository : JpaRepository<ReservationEntity, Long> {
s.hold_expired_at = NULL s.hold_expired_at = NULL
WHERE WHERE
r.status = 'PENDING' AND r.created_at <= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 MINUTE) r.status = 'PENDING' AND r.created_at <= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 5 MINUTE)
""", nativeQuery = true) """, nativeQuery = true
)
fun expirePendingReservations(@Param("now") now: Instant): Int fun expirePendingReservations(@Param("now") now: Instant): Int
} }

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.reservation.web package com.sangdol.roomescape.reservation.web
import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.common.types.CurrentUserContext
import com.sangdol.roomescape.auth.web.support.User import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.types.CurrentUserContext
import com.sangdol.roomescape.reservation.business.ReservationService import com.sangdol.roomescape.reservation.business.ReservationService
import com.sangdol.roomescape.reservation.docs.ReservationAPI import com.sangdol.roomescape.reservation.docs.ReservationAPI
import jakarta.validation.Valid import jakarta.validation.Valid

View File

@ -57,7 +57,7 @@ class ScheduleService(
val schedules: List<ScheduleOverview> = val schedules: List<ScheduleOverview> =
scheduleRepository.findStoreSchedulesWithThemeByDate(storeId, date) scheduleRepository.findStoreSchedulesWithThemeByDate(storeId, date)
.filter { it.time.isAfter(currentTime) } .filter { it.date.isAfter(currentDate) || it.time.isAfter(currentTime) }
return schedules.toResponse() return schedules.toResponse()
.also { .also {

View File

@ -1,12 +1,12 @@
package com.sangdol.roomescape.schedule.docs package com.sangdol.roomescape.schedule.docs
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege
import com.sangdol.roomescape.auth.web.support.AdminOnly import com.sangdol.roomescape.auth.web.support.AdminOnly
import com.sangdol.roomescape.auth.web.support.Public import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.UserOnly import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.schedule.web.* import com.sangdol.roomescape.schedule.web.*
import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponse

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.schedule.exception package com.sangdol.roomescape.schedule.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.web.HttpStatus
enum class ScheduleErrorCode( enum class ScheduleErrorCode(
override val httpStatus: HttpStatus, override val httpStatus: HttpStatus,

View File

@ -14,14 +14,16 @@ import java.time.LocalTime
interface ScheduleRepository : JpaRepository<ScheduleEntity, Long> { interface ScheduleRepository : JpaRepository<ScheduleEntity, Long> {
@Lock(value = LockModeType.PESSIMISTIC_WRITE) @Lock(value = LockModeType.PESSIMISTIC_WRITE)
@Query(""" @Query(
"""
SELECT SELECT
s s
FROM FROM
ScheduleEntity s ScheduleEntity s
WHERE WHERE
s._id = :id s._id = :id
""") """
)
fun findByIdForUpdate(id: Long): ScheduleEntity? fun findByIdForUpdate(id: Long): ScheduleEntity?
@Query( @Query(
@ -117,7 +119,12 @@ interface ScheduleRepository : JpaRepository<ScheduleEntity, Long> {
s.status = :currentStatus s.status = :currentStatus
""" """
) )
fun changeStatus(id: Long, currentStatus: ScheduleStatus, changeStatus: ScheduleStatus, expiredAt: Instant = Instant.now().plusSeconds(5 * 60)): Int fun changeStatus(
id: Long,
currentStatus: ScheduleStatus,
changeStatus: ScheduleStatus,
expiredAt: Instant = Instant.now().plusSeconds(5 * 60)
): Int
@Modifying @Modifying
@Query( @Query(

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.schedule.web package com.sangdol.roomescape.schedule.web
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.business.ScheduleService
import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI
import jakarta.validation.Valid import jakarta.validation.Valid

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.store.business package com.sangdol.roomescape.store.business
import com.sangdol.common.persistence.IDGenerator import com.sangdol.common.persistence.IDGenerator
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.admin.business.AdminService import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.business.RegionService import com.sangdol.roomescape.region.business.RegionService
import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException import com.sangdol.roomescape.store.exception.StoreException

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.store.business package com.sangdol.roomescape.store.business
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException import com.sangdol.roomescape.store.exception.StoreException
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.web.StoreRegisterRequest import com.sangdol.roomescape.store.web.StoreRegisterRequest
import com.sangdol.roomescape.store.web.StoreUpdateRequest import com.sangdol.roomescape.store.web.StoreUpdateRequest
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.store.exception package com.sangdol.roomescape.store.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.exception.RoomescapeException import com.sangdol.common.types.exception.RoomescapeException
import com.sangdol.common.types.web.HttpStatus
class StoreException( class StoreException(
override val errorCode: StoreErrorCode, override val errorCode: StoreErrorCode,

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.theme.business package com.sangdol.roomescape.theme.business
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.exception.ThemeErrorCode
import com.sangdol.roomescape.theme.exception.ThemeException import com.sangdol.roomescape.theme.exception.ThemeException
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository
import com.sangdol.roomescape.theme.web.ThemeCreateRequest import com.sangdol.roomescape.theme.web.ThemeCreateRequest
import com.sangdol.roomescape.theme.web.ThemeUpdateRequest import com.sangdol.roomescape.theme.web.ThemeUpdateRequest
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.theme.exception package com.sangdol.roomescape.theme.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.web.HttpStatus
enum class ThemeErrorCode( enum class ThemeErrorCode(
override val httpStatus: HttpStatus, override val httpStatus: HttpStatus,

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.theme.infrastructure.persistence package com.sangdol.roomescape.theme.infrastructure.persistence
import com.sangdol.roomescape.theme.business.domain.ThemeInfo
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
import com.sangdol.roomescape.theme.business.domain.ThemeInfo
import java.time.LocalDate import java.time.LocalDate
interface ThemeRepository : JpaRepository<ThemeEntity, Long> { interface ThemeRepository : JpaRepository<ThemeEntity, Long> {

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.user.business package com.sangdol.roomescape.user.business
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
import com.sangdol.roomescape.user.exception.UserErrorCode import com.sangdol.roomescape.user.exception.UserErrorCode
import com.sangdol.roomescape.user.exception.UserException import com.sangdol.roomescape.user.exception.UserException
import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.user.exception package com.sangdol.roomescape.user.exception
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.exception.RoomescapeException import com.sangdol.common.types.exception.RoomescapeException
import com.sangdol.common.types.web.HttpStatus
class UserException( class UserException(
override val errorCode: UserErrorCode, override val errorCode: UserErrorCode,

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.user.web package com.sangdol.roomescape.user.web
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
import com.sangdol.roomescape.user.infrastructure.persistence.UserStatus
import jakarta.validation.constraints.Email import jakarta.validation.constraints.Email
import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.NotEmpty
import jakarta.validation.constraints.Pattern import jakarta.validation.constraints.Pattern
import jakarta.validation.constraints.Size import jakarta.validation.constraints.Size
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
import com.sangdol.roomescape.user.infrastructure.persistence.UserStatus
const val MIN_PASSWORD_LENGTH = 8 const val MIN_PASSWORD_LENGTH = 8

View File

@ -494,8 +494,16 @@ class ScheduleDataInitializer : AbstractDataInitializer() {
val storeAdminId = store.second val storeAdminId = store.second
batchArgs.add( batchArgs.add(
arrayOf( arrayOf(
idGenerator.create(), storeId, theme.id, themeCreatedDate, time, idGenerator.create(),
status, storeAdminId, storeAdminId, themeCreatedTime.plusHours(1), themeCreatedTime.plusHours(1) storeId,
theme.id,
themeCreatedDate,
time,
status,
storeAdminId,
storeAdminId,
themeCreatedTime.plusHours(1),
themeCreatedTime.plusHours(1)
) )
) )
@ -631,7 +639,8 @@ data class PaymentWithMethods(
class PaymentDataInitializer : AbstractDataInitializer() { class PaymentDataInitializer : AbstractDataInitializer() {
companion object { companion object {
val requestedAtCache: Timestamp = Timestamp.valueOf(KoreaDateTime.nowWithOffset().toLocalDateTime()) val requestedAtCache: Timestamp = Timestamp.valueOf(KoreaDateTime.nowWithOffset().toLocalDateTime())
val approvedAtCache: Timestamp = Timestamp.valueOf(KoreaDateTime.nowWithOffset().plusSeconds(5).toLocalDateTime()) val approvedAtCache: Timestamp =
Timestamp.valueOf(KoreaDateTime.nowWithOffset().plusSeconds(5).toLocalDateTime())
val supportedPaymentMethods = listOf(PaymentMethod.TRANSFER, PaymentMethod.EASY_PAY, PaymentMethod.CARD) val supportedPaymentMethods = listOf(PaymentMethod.TRANSFER, PaymentMethod.EASY_PAY, PaymentMethod.CARD)
val supportedCardType = listOf(CardType.CREDIT, CardType.CHECK) val supportedCardType = listOf(CardType.CREDIT, CardType.CHECK)
@ -850,7 +859,10 @@ class PaymentDataInitializer : AbstractDataInitializer() {
executeBatch(paymentCardDetailSql, cardBatchArgs).also { cardBatchArgs.clear() } executeBatch(paymentCardDetailSql, cardBatchArgs).also { cardBatchArgs.clear() }
} }
if (easypayPrepaidBatchArgs.isNotEmpty()) { if (easypayPrepaidBatchArgs.isNotEmpty()) {
executeBatch(paymentEasypayPrepaidDetailSql, easypayPrepaidBatchArgs).also { easypayPrepaidBatchArgs.clear() } executeBatch(
paymentEasypayPrepaidDetailSql,
easypayPrepaidBatchArgs
).also { easypayPrepaidBatchArgs.clear() }
} }
} }

View File

@ -129,7 +129,12 @@ class StoreDataInitializer {
val randomPositiveWord = positiveWords.random() val randomPositiveWord = positiveWords.random()
storeName = "${parseSigunguName(region.sigunguName)}${randomPositiveWord}" storeName = "${parseSigunguName(region.sigunguName)}${randomPositiveWord}"
address = address =
"${region.sidoName} ${region.sigunguName} ${randomPositiveWord}${Random.nextInt(1, 10)}${Random.nextInt(1, 100)}" "${region.sidoName} ${region.sigunguName} ${randomPositiveWord}${
Random.nextInt(
1,
10
)
} ${Random.nextInt(1, 100)}"
} while (usedStoreName.contains(storeName)) } while (usedStoreName.contains(storeName))
usedStoreName.add(storeName) usedStoreName.add(storeName)
@ -158,13 +163,17 @@ class StoreDataInitializer {
} }
File("$BASE_DIR/store_data.txt").also { File("$BASE_DIR/store_data.txt").also {
if (it.exists()) { it.delete() } if (it.exists()) {
it.delete()
}
}.writeText( }.writeText(
storeDataRows.joinToString("\n") storeDataRows.joinToString("\n")
) )
return File("$BASE_DIR/store_data.sql").also { return File("$BASE_DIR/store_data.sql").also {
if (it.exists()) { it.delete() } if (it.exists()) {
it.delete()
}
StringBuilder("INSERT INTO store (id, name, address, contact, business_reg_num, region_code, status, created_at, created_by, updated_at, updated_by) VALUES ") StringBuilder("INSERT INTO store (id, name, address, contact, business_reg_num, region_code, status, created_at, created_by, updated_at, updated_by) VALUES ")
.append(storeSqlRows.joinToString(",\n")) .append(storeSqlRows.joinToString(",\n"))

View File

@ -1,13 +1,6 @@
package com.sangdol.roomescape.auth package com.sangdol.roomescape.auth
import com.ninjasquad.springmockk.SpykBean import com.ninjasquad.springmockk.SpykBean
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.mockk.every
import io.restassured.response.ValidatableResponse
import org.hamcrest.CoreMatchers.equalTo
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.admin.exception.AdminErrorCode import com.sangdol.roomescape.admin.exception.AdminErrorCode
import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY import com.sangdol.roomescape.auth.business.CLAIM_ADMIN_TYPE_KEY
@ -24,6 +17,13 @@ import com.sangdol.roomescape.supports.UserFixture
import com.sangdol.roomescape.supports.runTest import com.sangdol.roomescape.supports.runTest
import com.sangdol.roomescape.user.exception.UserErrorCode import com.sangdol.roomescape.user.exception.UserErrorCode
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.mockk.every
import io.restassured.response.ValidatableResponse
import org.hamcrest.CoreMatchers.equalTo
class AuthApiTest( class AuthApiTest(
@SpykBean private val jwtUtils: JwtUtils, @SpykBean private val jwtUtils: JwtUtils,

View File

@ -1,8 +1,6 @@
package com.sangdol.roomescape.auth package com.sangdol.roomescape.auth
import com.ninjasquad.springmockk.MockkBean import com.ninjasquad.springmockk.MockkBean
import io.mockk.clearMocks
import io.mockk.every
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.auth.infrastructure.persistence.LoginHistoryRepository import com.sangdol.roomescape.auth.infrastructure.persistence.LoginHistoryRepository
import com.sangdol.roomescape.auth.web.LoginRequest import com.sangdol.roomescape.auth.web.LoginRequest
@ -11,6 +9,8 @@ import com.sangdol.roomescape.supports.AdminFixture
import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.UserFixture import com.sangdol.roomescape.supports.UserFixture
import com.sangdol.roomescape.supports.runTest import com.sangdol.roomescape.supports.runTest
import io.mockk.clearMocks
import io.mockk.every
class FailOnSaveLoginHistoryTest( class FailOnSaveLoginHistoryTest(
@MockkBean private val loginHistoryRepository: LoginHistoryRepository @MockkBean private val loginHistoryRepository: LoginHistoryRepository

View File

@ -1,10 +1,6 @@
package com.sangdol.roomescape.payment package com.sangdol.roomescape.payment
import com.ninjasquad.springmockk.MockkBean import com.ninjasquad.springmockk.MockkBean
import io.kotest.matchers.shouldBe
import io.mockk.every
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.auth.exception.AuthErrorCode import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.payment.business.PaymentService import com.sangdol.roomescape.payment.business.PaymentService
@ -18,6 +14,10 @@ import com.sangdol.roomescape.payment.infrastructure.persistence.*
import com.sangdol.roomescape.payment.web.PaymentConfirmRequest import com.sangdol.roomescape.payment.web.PaymentConfirmRequest
import com.sangdol.roomescape.payment.web.PaymentCreateResponse import com.sangdol.roomescape.payment.web.PaymentCreateResponse
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import io.kotest.matchers.shouldBe
import io.mockk.every
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
class PaymentAPITest( class PaymentAPITest(
@MockkBean @MockkBean

View File

@ -2,14 +2,7 @@ package com.sangdol.roomescape.payment
import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException import com.sangdol.roomescape.payment.exception.PaymentException
import com.sangdol.roomescape.payment.infrastructure.common.BankCode import com.sangdol.roomescape.payment.infrastructure.common.*
import com.sangdol.roomescape.payment.infrastructure.common.CardIssuerCode
import com.sangdol.roomescape.payment.infrastructure.common.CardOwnerType
import com.sangdol.roomescape.payment.infrastructure.common.CardType
import com.sangdol.roomescape.payment.infrastructure.common.EasyPayCompanyCode
import com.sangdol.roomescape.payment.infrastructure.common.PaymentMethod
import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus
import com.sangdol.roomescape.payment.infrastructure.common.PaymentType
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.core.spec.style.FunSpec import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe

View File

@ -1,7 +1,6 @@
package com.sangdol.roomescape.payment package com.sangdol.roomescape.payment
import com.sangdol.common.utils.KoreaDateTime import com.sangdol.common.utils.KoreaDateTime
import java.time.OffsetDateTime
object SampleTosspayConstant { object SampleTosspayConstant {
const val PAYMENT_KEY: String = "5EnNZRJGvaBX7zk2yd8ydw26XvwXkLrx9POLqKQjmAw4b0e1" const val PAYMENT_KEY: String = "5EnNZRJGvaBX7zk2yd8ydw26XvwXkLrx9POLqKQjmAw4b0e1"

View File

@ -1,6 +1,12 @@
package com.sangdol.roomescape.payment package com.sangdol.roomescape.payment
import com.ninjasquad.springmockk.MockkBean import com.ninjasquad.springmockk.MockkBean
import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException
import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientCancelResponse
import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirmResponse
import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient
import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.assertions.throwables.shouldThrow import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.FunSpec import io.kotest.core.spec.style.FunSpec
@ -9,19 +15,13 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.client.RestClientTest import org.springframework.boot.test.autoconfigure.web.client.RestClientTest
import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext import org.springframework.data.jpa.mapping.JpaMetamodelMappingContext
import org.springframework.http.HttpMethod import org.springframework.http.HttpMethod
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType import org.springframework.http.MediaType
import org.springframework.test.web.client.MockRestServiceServer import org.springframework.test.web.client.MockRestServiceServer
import org.springframework.test.web.client.ResponseActions import org.springframework.test.web.client.ResponseActions
import org.springframework.test.web.client.match.MockRestRequestMatchers.* import org.springframework.test.web.client.match.MockRestRequestMatchers.*
import org.springframework.test.web.client.response.MockRestResponseCreators.withStatus import org.springframework.test.web.client.response.MockRestResponseCreators.withStatus
import org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess import org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess
import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException
import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientCancelResponse
import com.sangdol.roomescape.payment.infrastructure.client.PaymentClientConfirmResponse
import com.sangdol.roomescape.payment.infrastructure.client.TosspayClient
import com.sangdol.roomescape.payment.infrastructure.common.PaymentStatus
import org.springframework.http.HttpStatus
@RestClientTest(TosspayClient::class) @RestClientTest(TosspayClient::class)
@MockkBean(JpaMetamodelMappingContext::class) @MockkBean(JpaMetamodelMappingContext::class)

View File

@ -1,12 +1,12 @@
package com.sangdol.roomescape.region package com.sangdol.roomescape.region
import com.ninjasquad.springmockk.MockkBean import com.ninjasquad.springmockk.MockkBean
import io.mockk.every
import org.springframework.http.HttpMethod
import com.sangdol.roomescape.region.exception.RegionErrorCode import com.sangdol.roomescape.region.exception.RegionErrorCode
import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository import com.sangdol.roomescape.region.infrastructure.persistence.RegionRepository
import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.runExceptionTest import com.sangdol.roomescape.supports.runExceptionTest
import io.mockk.every
import org.springframework.http.HttpMethod
class RegionApiFailTest( class RegionApiFailTest(
@MockkBean private val regionRepository: RegionRepository @MockkBean private val regionRepository: RegionRepository

View File

@ -1,9 +1,9 @@
package com.sangdol.roomescape.region package com.sangdol.roomescape.region
import io.kotest.matchers.shouldBe
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.runTest import com.sangdol.roomescape.supports.runTest
import io.kotest.matchers.shouldBe
class RegionApiSuccessTest : FunSpecSpringbootTest() { class RegionApiSuccessTest : FunSpecSpringbootTest() {
init { init {

View File

@ -1,13 +1,8 @@
package com.sangdol.roomescape.reservation package com.sangdol.roomescape.reservation
import io.kotest.matchers.shouldBe import com.sangdol.common.types.exception.CommonErrorCode
import io.kotest.matchers.shouldNotBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.auth.exception.AuthErrorCode import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.common.types.exception.CommonErrorCode
import com.sangdol.roomescape.payment.infrastructure.common.BankCode import com.sangdol.roomescape.payment.infrastructure.common.BankCode
import com.sangdol.roomescape.payment.infrastructure.common.CardIssuerCode import com.sangdol.roomescape.payment.infrastructure.common.CardIssuerCode
import com.sangdol.roomescape.payment.infrastructure.common.EasyPayCompanyCode import com.sangdol.roomescape.payment.infrastructure.common.EasyPayCompanyCode
@ -25,6 +20,11 @@ import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime
@ -574,7 +574,10 @@ class ReservationApiTest(
expect = { expect = {
statusCode(HttpStatus.OK.value()) statusCode(HttpStatus.OK.value())
assertProperties(props = setOf("id", "reserver", "user", "applicationDateTime", "payment")) assertProperties(props = setOf("id", "reserver", "user", "applicationDateTime", "payment"))
assertProperties(props = setOf("name", "contact", "participantCount", "requirement"), propsNameIfList = "reserver") assertProperties(
props = setOf("name", "contact", "participantCount", "requirement"),
propsNameIfList = "reserver"
)
assertProperties(props = setOf("id", "name", "phone"), propsNameIfList = "user") assertProperties(props = setOf("id", "name", "phone"), propsNameIfList = "user")
} }
).also { ).also {

View File

@ -99,7 +99,10 @@ class AdminScheduleApiTest(
}, },
expect = { expect = {
statusCode(HttpStatus.OK.value()) statusCode(HttpStatus.OK.value())
body("data.schedules.size()", equalTo(schedules.filter { it.date.isEqual(KoreaDate.today()) }.size)) body(
"data.schedules.size()",
equalTo(schedules.filter { it.date.isEqual(KoreaDate.today()) }.size)
)
assertProperties( assertProperties(
props = setOf("id", "themeName", "startFrom", "endAt", "status"), props = setOf("id", "themeName", "startFrom", "endAt", "status"),
propsNameIfList = "schedules" propsNameIfList = "schedules"

View File

@ -57,7 +57,15 @@ class ScheduleApiTest(
statusCode(HttpStatus.OK.value()) statusCode(HttpStatus.OK.value())
body("data.schedules.size()", equalTo(size)) body("data.schedules.size()", equalTo(size))
assertProperties( assertProperties(
props = setOf("id", "startFrom", "endAt", "themeId", "themeName", "themeDifficulty", "status"), props = setOf(
"id",
"startFrom",
"endAt",
"themeId",
"themeName",
"themeDifficulty",
"status"
),
propsNameIfList = "schedules" propsNameIfList = "schedules"
) )
} }

View File

@ -7,8 +7,6 @@ import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.runTest import com.sangdol.roomescape.supports.runTest
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.matchers.collections.shouldContainExactly
import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View File

@ -1,10 +1,5 @@
package com.sangdol.roomescape.store package com.sangdol.roomescape.store
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.date.shouldBeAfter
import io.kotest.matchers.shouldBe
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel
@ -16,6 +11,11 @@ import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus
import com.sangdol.roomescape.store.web.StoreUpdateRequest import com.sangdol.roomescape.store.web.StoreUpdateRequest
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.date.shouldBeAfter
import io.kotest.matchers.shouldBe
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
class AdminStoreApiTest( class AdminStoreApiTest(
private val storeRepository: StoreRepository, private val storeRepository: StoreRepository,

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.store package com.sangdol.roomescape.store
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.store.exception.StoreErrorCode import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.http.HttpMethod
class StoreApiTest : FunSpecSpringbootTest() { class StoreApiTest : FunSpecSpringbootTest() {

View File

@ -1,7 +1,7 @@
package com.sangdol.roomescape.supports package com.sangdol.roomescape.supports
import com.sangdol.common.web.config.JacksonConfig
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.web.config.JacksonConfig
import io.restassured.module.kotlin.extensions.Given import io.restassured.module.kotlin.extensions.Given
import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.Then
import io.restassured.module.kotlin.extensions.When import io.restassured.module.kotlin.extensions.When

View File

@ -1,12 +1,6 @@
package com.sangdol.roomescape.supports package com.sangdol.roomescape.supports
import io.restassured.module.kotlin.extensions.Extract
import io.restassured.module.kotlin.extensions.Given
import io.restassured.module.kotlin.extensions.Then
import io.restassured.module.kotlin.extensions.When
import org.springframework.data.repository.findByIdOrNull
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import org.springframework.http.MediaType
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity import com.sangdol.roomescape.admin.infrastructure.persistence.AdminEntity
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
@ -16,6 +10,12 @@ import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository import com.sangdol.roomescape.user.infrastructure.persistence.UserRepository
import com.sangdol.roomescape.user.web.UserCreateRequest import com.sangdol.roomescape.user.web.UserCreateRequest
import io.restassured.module.kotlin.extensions.Extract
import io.restassured.module.kotlin.extensions.Given
import io.restassured.module.kotlin.extensions.Then
import io.restassured.module.kotlin.extensions.When
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.MediaType
class TestAuthUtil( class TestAuthUtil(
private val userRepository: UserRepository, private val userRepository: UserRepository,

View File

@ -23,7 +23,8 @@ class TestDatabaseUtil(
} }
fun initializeRegion() { fun initializeRegion() {
jdbcTemplate.queryForObject("SELECT EXISTS (SELECT 1 FROM region LIMIT 1)", Boolean::class.java)!!.also { isRegionTableEmpty -> jdbcTemplate.queryForObject("SELECT EXISTS (SELECT 1 FROM region LIMIT 1)", Boolean::class.java)!!
.also { isRegionTableEmpty ->
if (!isRegionTableEmpty) { if (!isRegionTableEmpty) {
this::class.java.getResource("/schema/region-data.sql")?.readText()?.let { regionInsertSql -> this::class.java.getResource("/schema/region-data.sql")?.readText()?.let { regionInsertSql ->
jdbcTemplate.execute(regionInsertSql) jdbcTemplate.execute(regionInsertSql)

View File

@ -1,10 +1,5 @@
package com.sangdol.roomescape.theme package com.sangdol.roomescape.theme
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
@ -18,6 +13,11 @@ import com.sangdol.roomescape.theme.exception.ThemeErrorCode
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository
import com.sangdol.roomescape.theme.web.ThemeUpdateRequest import com.sangdol.roomescape.theme.web.ThemeUpdateRequest
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
class AdminThemeApiTest( class AdminThemeApiTest(
private val themeRepository: ThemeRepository private val themeRepository: ThemeRepository

View File

@ -1,6 +1,19 @@
package com.sangdol.roomescape.user package com.sangdol.roomescape.user
import com.ninjasquad.springmockk.SpykBean import com.ninjasquad.springmockk.SpykBean
import com.sangdol.common.types.exception.CommonErrorCode
import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.UserFixture
import com.sangdol.roomescape.supports.runExceptionTest
import com.sangdol.roomescape.supports.runTest
import com.sangdol.roomescape.user.business.SIGNUP
import com.sangdol.roomescape.user.exception.UserErrorCode
import com.sangdol.roomescape.user.infrastructure.persistence.*
import com.sangdol.roomescape.user.web.MIN_PASSWORD_LENGTH
import com.sangdol.roomescape.user.web.UserCreateRequest
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import io.mockk.every import io.mockk.every
@ -11,20 +24,7 @@ import io.restassured.module.kotlin.extensions.When
import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus
import org.springframework.http.MediaType import org.springframework.http.MediaType
import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.auth.infrastructure.jwt.JwtUtils
import com.sangdol.common.types.exception.CommonErrorCode
import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.UserFixture
import com.sangdol.roomescape.supports.runExceptionTest
import com.sangdol.roomescape.supports.runTest
import com.sangdol.roomescape.user.business.SIGNUP
import com.sangdol.roomescape.user.exception.UserErrorCode
import com.sangdol.roomescape.user.infrastructure.persistence.*
import com.sangdol.roomescape.user.web.MIN_PASSWORD_LENGTH
import com.sangdol.roomescape.user.web.UserCreateRequest
class UserApiTest( class UserApiTest(
private val userRepository: UserRepository, private val userRepository: UserRepository,

View File

@ -179,7 +179,6 @@ class Payment(
} }
} }
fun toResponse() = PaymentResponse( fun toResponse() = PaymentResponse(
mid = this.mid, mid = this.mid,
lastTransactionKey = this.lastTransactionKey, lastTransactionKey = this.lastTransactionKey,

View File

@ -38,7 +38,6 @@ class Card(
} }
} }
fun toResponse() = CardResponse( fun toResponse() = CardResponse(
issuerCode = this.issuerCode.code, issuerCode = this.issuerCode.code,
acquirerCode = this.acquirerCode.code, acquirerCode = this.acquirerCode.code,

View File

@ -25,14 +25,26 @@ enum class TosspayCancelErrorCode(
NOT_CANCELABLE_PAYMENT(HttpStatus.FORBIDDEN, "CO016", "취소 할 수 없는 결제 입니다."), NOT_CANCELABLE_PAYMENT(HttpStatus.FORBIDDEN, "CO016", "취소 할 수 없는 결제 입니다."),
EXCEED_MAX_REFUND_DUE(HttpStatus.FORBIDDEN, "CO017", "환불 가능한 기간이 지났습니다."), EXCEED_MAX_REFUND_DUE(HttpStatus.FORBIDDEN, "CO017", "환불 가능한 기간이 지났습니다."),
NOT_ALLOWED_PARTIAL_REFUND_WAITING_DEPOSIT(HttpStatus.FORBIDDEN, "CO018", "입금 대기중인 결제는 부분 환불이 불가합니다."), NOT_ALLOWED_PARTIAL_REFUND_WAITING_DEPOSIT(HttpStatus.FORBIDDEN, "CO018", "입금 대기중인 결제는 부분 환불이 불가합니다."),
NOT_ALLOWED_PARTIAL_REFUND(HttpStatus.FORBIDDEN, "CO019", "에스크로 주문, 현금 카드 결제일 때는 부분 환불이 불가합니다. 이외 다른 결제 수단에서 부분 취소가 되지 않을 때는 토스페이먼츠에 문의해 주세요."), NOT_ALLOWED_PARTIAL_REFUND(
HttpStatus.FORBIDDEN,
"CO019",
"에스크로 주문, 현금 카드 결제일 때는 부분 환불이 불가합니다. 이외 다른 결제 수단에서 부분 취소가 되지 않을 때는 토스페이먼츠에 문의해 주세요."
),
NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO020", "은행 서비스 시간이 아닙니다."), NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO020", "은행 서비스 시간이 아닙니다."),
INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO021", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO021", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."),
NOT_CANCELABLE_PAYMENT_FOR_DORMANT_USER(HttpStatus.FORBIDDEN, "CO022", "휴면 처리된 회원의 결제는 취소할 수 없습니다."), NOT_CANCELABLE_PAYMENT_FOR_DORMANT_USER(HttpStatus.FORBIDDEN, "CO022", "휴면 처리된 회원의 결제는 취소할 수 없습니다."),
NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO023", "존재하지 않는 결제 정보 입니다."), NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO023", "존재하지 않는 결제 정보 입니다."),
FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO024", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), FAILED_INTERNAL_SYSTEM_PROCESSING(
HttpStatus.INTERNAL_SERVER_ERROR,
"CO024",
"내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."
),
FAILED_REFUND_PROCESS(HttpStatus.INTERNAL_SERVER_ERROR, "CO025", "은행 응답시간 지연이나 일시적인 오류로 환불요청에 실패했습니다."), FAILED_REFUND_PROCESS(HttpStatus.INTERNAL_SERVER_ERROR, "CO025", "은행 응답시간 지연이나 일시적인 오류로 환불요청에 실패했습니다."),
FAILED_METHOD_HANDLING_CANCEL(HttpStatus.INTERNAL_SERVER_ERROR, "CO026", "취소 중 결제 시 사용한 결제 수단 처리과정에서 일시적인 오류가 발생했습니다."), FAILED_METHOD_HANDLING_CANCEL(
HttpStatus.INTERNAL_SERVER_ERROR,
"CO026",
"취소 중 결제 시 사용한 결제 수단 처리과정에서 일시적인 오류가 발생했습니다."
),
FAILED_PARTIAL_REFUND(HttpStatus.INTERNAL_SERVER_ERROR, "CO027", "은행 점검, 해약 계좌 등의 사유로 부분 환불이 실패했습니다."), FAILED_PARTIAL_REFUND(HttpStatus.INTERNAL_SERVER_ERROR, "CO027", "은행 점검, 해약 계좌 등의 사유로 부분 환불이 실패했습니다."),
COMMON_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO028", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."), COMMON_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO028", "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."),
FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO029", "결제가 완료되지 않았어요. 다시 시도해주세요."); FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO029", "결제가 완료되지 않았어요. 다시 시도해주세요.");

View File

@ -25,9 +25,17 @@ enum class TosspayConfirmErrorCode(
NOT_FOUND_TERMINAL_ID(HttpStatus.BAD_REQUEST, "CO016", "단말기번호(Terminal Id)가 없습니다. 토스페이먼츠로 문의 바랍니다."), NOT_FOUND_TERMINAL_ID(HttpStatus.BAD_REQUEST, "CO016", "단말기번호(Terminal Id)가 없습니다. 토스페이먼츠로 문의 바랍니다."),
INVALID_AUTHORIZE_AUTH(HttpStatus.BAD_REQUEST, "CO017", "유효하지 않은 인증 방식입니다."), INVALID_AUTHORIZE_AUTH(HttpStatus.BAD_REQUEST, "CO017", "유효하지 않은 인증 방식입니다."),
INVALID_CARD_LOST_OR_STOLEN(HttpStatus.BAD_REQUEST, "CO018", "분실 혹은 도난 카드입니다."), INVALID_CARD_LOST_OR_STOLEN(HttpStatus.BAD_REQUEST, "CO018", "분실 혹은 도난 카드입니다."),
RESTRICTED_TRANSFER_ACCOUNT(HttpStatus.BAD_REQUEST, "CO019", "계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요."), RESTRICTED_TRANSFER_ACCOUNT(
HttpStatus.BAD_REQUEST,
"CO019",
"계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요."
),
INVALID_CARD_NUMBER(HttpStatus.BAD_REQUEST, "CO020", "카드번호를 다시 확인해주세요."), INVALID_CARD_NUMBER(HttpStatus.BAD_REQUEST, "CO020", "카드번호를 다시 확인해주세요."),
INVALID_UNREGISTERED_SUBMALL(HttpStatus.BAD_REQUEST, "CO021", "등록되지 않은 서브몰입니다. 서브몰이 없는 가맹점이라면 안심클릭이나 ISP 결제가 필요합니다."), INVALID_UNREGISTERED_SUBMALL(
HttpStatus.BAD_REQUEST,
"CO021",
"등록되지 않은 서브몰입니다. 서브몰이 없는 가맹점이라면 안심클릭이나 ISP 결제가 필요합니다."
),
NOT_REGISTERED_BUSINESS(HttpStatus.BAD_REQUEST, "CO022", "등록되지 않은 사업자 번호입니다."), NOT_REGISTERED_BUSINESS(HttpStatus.BAD_REQUEST, "CO022", "등록되지 않은 사업자 번호입니다."),
EXCEED_MAX_ONE_DAY_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO023", "1일 출금 한도를 초과했습니다."), EXCEED_MAX_ONE_DAY_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO023", "1일 출금 한도를 초과했습니다."),
EXCEED_MAX_ONE_TIME_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO024", "1회 출금 한도를 초과했습니다."), EXCEED_MAX_ONE_TIME_WITHDRAW_AMOUNT(HttpStatus.BAD_REQUEST, "CO024", "1회 출금 한도를 초과했습니다."),
@ -48,10 +56,18 @@ enum class TosspayConfirmErrorCode(
NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO039", "은행 서비스 시간이 아닙니다."), NOT_AVAILABLE_BANK(HttpStatus.FORBIDDEN, "CO039", "은행 서비스 시간이 아닙니다."),
INVALID_PASSWORD(HttpStatus.FORBIDDEN, "CO040", "결제 비밀번호가 일치하지 않습니다."), INVALID_PASSWORD(HttpStatus.FORBIDDEN, "CO040", "결제 비밀번호가 일치하지 않습니다."),
INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO041", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."), INCORRECT_BASIC_AUTH_FORMAT(HttpStatus.FORBIDDEN, "CO041", "잘못된 요청입니다. ':' 를 포함해 인코딩해주세요."),
FDS_ERROR(HttpStatus.FORBIDDEN, "CO042", "[토스페이먼츠] 위험거래가 감지되어 결제가 제한됩니다. 발송된 문자에 포함된 링크를 통해 본인인증 후 결제가 가능합니다. (고객센터: 1644-8051)"), FDS_ERROR(
HttpStatus.FORBIDDEN,
"CO042",
"[토스페이먼츠] 위험거래가 감지되어 결제가 제한됩니다. 발송된 문자에 포함된 링크를 통해 본인인증 후 결제가 가능합니다. (고객센터: 1644-8051)"
),
NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO043", "존재하지 않는 결제 정보 입니다."), NOT_FOUND_PAYMENT(HttpStatus.NOT_FOUND, "CO043", "존재하지 않는 결제 정보 입니다."),
NOT_FOUND_PAYMENT_SESSION(HttpStatus.NOT_FOUND, "CO044", "결제 시간이 만료되어 결제 진행 데이터가 존재하지 않습니다."), NOT_FOUND_PAYMENT_SESSION(HttpStatus.NOT_FOUND, "CO044", "결제 시간이 만료되어 결제 진행 데이터가 존재하지 않습니다."),
FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO045", "결제가 완료되지 않았어요. 다시 시도해주세요."), FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO045", "결제가 완료되지 않았어요. 다시 시도해주세요."),
FAILED_INTERNAL_SYSTEM_PROCESSING(HttpStatus.INTERNAL_SERVER_ERROR, "CO046", "내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."), FAILED_INTERNAL_SYSTEM_PROCESSING(
HttpStatus.INTERNAL_SERVER_ERROR,
"CO046",
"내부 시스템 처리 작업이 실패했습니다. 잠시 후 다시 시도해주세요."
),
UNKNOWN_PAYMENT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO047", "결제에 실패했어요. 같은 문제가 반복된다면 은행이나 카드사로 문의해주세요."); UNKNOWN_PAYMENT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "CO047", "결제에 실패했어요. 같은 문제가 반복된다면 은행이나 카드사로 문의해주세요.");
} }

View File

@ -1,11 +1,6 @@
package com.sangdol.tosspaymock.web.dto package com.sangdol.tosspaymock.web.dto
import com.sangdol.tosspaymock.business.domain.Payment
import com.sangdol.tosspaymock.business.domain.PaymentType import com.sangdol.tosspaymock.business.domain.PaymentType
import com.sangdol.tosspaymock.business.domain.cancel.Cancellation
import com.sangdol.tosspaymock.business.domain.card.Card
import com.sangdol.tosspaymock.business.domain.easypay.Easypay
import com.sangdol.tosspaymock.business.domain.transfer.BankTransfer
import java.time.OffsetDateTime import java.time.OffsetDateTime
data class PaymentResponse( data class PaymentResponse(

View File

@ -82,7 +82,8 @@
<appender name="ASYNC_FILE_JSON" class="ch.qos.logback.classic.AsyncAppender"> <appender name="ASYNC_FILE_JSON" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE_JSON"/> <appender-ref ref="FILE_JSON"/>
<queueSize>512</queueSize> <queueSize>512</queueSize>
<discardingThreshold>0</discardingThreshold> <includeCallerData>false</includeCallerData> <discardingThreshold>0</discardingThreshold>
<includeCallerData>false</includeCallerData>
</appender> </appender>
<root level="INFO"> <root level="INFO">

View File

@ -1,10 +1,20 @@
create table if not exists order_amount ( create table if not exists order_amount
id bigint primary key, (
payment_key varchar(255) not null, id
bigint
primary
key,
payment_key
varchar
(
255
) not null,
approved_amount integer not null, approved_amount integer not null,
easypay_discount_amount integer not null, easypay_discount_amount integer not null,
card_discount_amount integer not null, card_discount_amount integer not null,
transfer_discount_amount integer not null, transfer_discount_amount integer not null,
constraint uk_order_amount__payment_key unique
constraint uk_order_amount__payment_key unique (payment_key) (
payment_key
)
); );

View File

@ -31,7 +31,8 @@ class TosspayErrorCodeParser: StringSpec() {
return regex.replace(text) { matchResult -> return regex.replace(text) { matchResult ->
val name = matchResult.groupValues[2] val name = matchResult.groupValues[2]
val httpStatus = "HttpStatus.${HttpStatus.entries.first {it.code == matchResult.groupValues[1].trim().toInt()}.name}" val httpStatus =
"HttpStatus.${HttpStatus.entries.first { it.code == matchResult.groupValues[1].trim().toInt() }.name}"
val errorCode = "CO${(idx).toString().padStart(3, '0')}" val errorCode = "CO${(idx).toString().padStart(3, '0')}"
val koreanMessage = matchResult.groupValues[3].split("\t")[0] val koreanMessage = matchResult.groupValues[3].split("\t")[0]