generated from pricelees/issue-pr-template
[#54] 애플리케이션 배포 #55
@ -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()}"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository
|
|||||||
class TestAuditingBaseEntity(
|
class TestAuditingBaseEntity(
|
||||||
id: Long,
|
id: Long,
|
||||||
val name: String
|
val name: String
|
||||||
): AuditingBaseEntity(id)
|
) : AuditingBaseEntity(id)
|
||||||
|
|
||||||
interface TestAuditingBaseEntityRepository: JpaRepository<TestAuditingBaseEntity, Long>
|
interface TestAuditingBaseEntityRepository : JpaRepository<TestAuditingBaseEntity, Long>
|
||||||
@ -7,6 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository
|
|||||||
class TestPersistableBaseEntity(
|
class TestPersistableBaseEntity(
|
||||||
id: Long,
|
id: Long,
|
||||||
val name: String
|
val name: String
|
||||||
): PersistableBaseEntity(id)
|
) : PersistableBaseEntity(id)
|
||||||
|
|
||||||
interface TestPersistableBaseEntityRepository: JpaRepository<TestPersistableBaseEntity, Long>
|
interface TestPersistableBaseEntityRepository : JpaRepository<TestPersistableBaseEntity, Long>
|
||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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? {
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
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"),
|
||||||
objectMapper = JacksonConfig().objectMapper()
|
objectMapper = JacksonConfig().objectMapper()
|
||||||
)
|
)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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> {
|
||||||
|
|||||||
@ -55,7 +55,7 @@ class UserService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findContactById(id: Long) : UserContactResponse {
|
fun findContactById(id: Long): UserContactResponse {
|
||||||
log.info { "[findContactById] 회원 연락 정보 조회 시작: id=${id}" }
|
log.info { "[findContactById] 회원 연락 정보 조회 시작: id=${id}" }
|
||||||
|
|
||||||
val user = findOrThrow(id)
|
val user = findOrThrow(id)
|
||||||
|
|||||||
@ -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 {}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -22,7 +22,7 @@ class UserEntity(
|
|||||||
|
|
||||||
@Enumerated(value = EnumType.STRING)
|
@Enumerated(value = EnumType.STRING)
|
||||||
var status: UserStatus
|
var status: UserStatus
|
||||||
): AuditingBaseEntity(id)
|
) : AuditingBaseEntity(id)
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "user_status_history")
|
@Table(name = "user_status_history")
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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"))
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -1,16 +1,16 @@
|
|||||||
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
|
||||||
): FunSpecSpringbootTest() {
|
) : FunSpecSpringbootTest() {
|
||||||
init {
|
init {
|
||||||
context("조회 실패") {
|
context("조회 실패") {
|
||||||
test("시/도") {
|
test("시/도") {
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
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 {
|
||||||
context("시/도 -> 시/군/구 -> 지역 코드 순으로 조회한다.") {
|
context("시/도 -> 시/군/구 -> 지역 코드 순으로 조회한다.") {
|
||||||
test("정상 응답") {
|
test("정상 응답") {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
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() {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
context("모든 매장의 id / 이름을 조회한다.") {
|
context("모든 매장의 id / 이름을 조회한다.") {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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)
|
||||||
@ -51,7 +52,7 @@ enum class CleanerMode {
|
|||||||
ALL
|
ALL
|
||||||
}
|
}
|
||||||
|
|
||||||
class DatabaseCleanerExtension: BeforeSpecListener, AfterTestListener, AfterSpecListener {
|
class DatabaseCleanerExtension : BeforeSpecListener, AfterTestListener, AfterSpecListener {
|
||||||
|
|
||||||
override suspend fun beforeSpec(spec: Spec) {
|
override suspend fun beforeSpec(spec: Spec) {
|
||||||
super.beforeSpec(spec)
|
super.beforeSpec(spec)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -9,7 +9,7 @@ class DateUtilsTest : StringSpec({
|
|||||||
"입력된 날짜의 이전 주 일요일을 찾는다." {
|
"입력된 날짜의 이전 주 일요일을 찾는다." {
|
||||||
val expected = LocalDate.of(2025, 8, 31)
|
val expected = LocalDate.of(2025, 8, 31)
|
||||||
|
|
||||||
for (i in 7..13){
|
for (i in 7..13) {
|
||||||
DateUtils.getSundayOfPreviousWeek(LocalDate.of(2025, 9, i)) shouldBe expected
|
DateUtils.getSundayOfPreviousWeek(LocalDate.of(2025, 9, i)) shouldBe expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -179,7 +179,6 @@ class Payment(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun toResponse() = PaymentResponse(
|
fun toResponse() = PaymentResponse(
|
||||||
mid = this.mid,
|
mid = this.mid,
|
||||||
lastTransactionKey = this.lastTransactionKey,
|
lastTransactionKey = this.lastTransactionKey,
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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", "결제가 완료되지 않았어요. 다시 시도해주세요.");
|
||||||
|
|||||||
@ -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", "결제에 실패했어요. 같은 문제가 반복된다면 은행이나 카드사로 문의해주세요.");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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">
|
||||||
|
|||||||
@ -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
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import com.sangdol.common.types.web.HttpStatus
|
|||||||
import io.kotest.core.spec.style.StringSpec
|
import io.kotest.core.spec.style.StringSpec
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class TosspayErrorCodeParser: StringSpec() {
|
class TosspayErrorCodeParser : StringSpec() {
|
||||||
init {
|
init {
|
||||||
"Tosspay API 문서에 있는 결제 승인 에러 코드 항목을 enum의 형태로 변환한다." {
|
"Tosspay API 문서에 있는 결제 승인 에러 코드 항목을 enum의 형태로 변환한다." {
|
||||||
val basePath = "${File("").absolutePath}/src/test/resources"
|
val basePath = "${File("").absolutePath}/src/test/resources"
|
||||||
@ -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]
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user