Skip to content

Commit

Permalink
refactor: 이미 봉달 목록에 존재하는 상품에 대한 처리 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
TaeyeonRoyce committed Jan 31, 2024
1 parent b53c1f4 commit 096a109
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 7 deletions.
15 changes: 13 additions & 2 deletions src/main/kotlin/com/petqua/application/cart/CartProductService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import com.petqua.common.domain.existByIdOrThrow
import com.petqua.domain.cart.CartProductRepository
import com.petqua.domain.member.MemberRepository
import com.petqua.domain.product.ProductRepository
import com.petqua.exception.cart.CartProductException
import com.petqua.exception.cart.CartProductExceptionType.DUPLICATED_PRODUCT
import com.petqua.exception.member.MemberException
import com.petqua.exception.member.MemberExceptionType.NOT_FOUND_MEMBER
import com.petqua.exception.product.ProductException
Expand All @@ -23,7 +25,16 @@ class CartProductService(
fun save(command: SaveCartProductCommand): Long {
memberRepository.existByIdOrThrow(command.memberId, MemberException(NOT_FOUND_MEMBER))
productRepository.existByIdOrThrow(command.productId, ProductException(NOT_FOUND_PRODUCT))
val savedCartProduct = cartProductRepository.save(command.toCartProduct())
return savedCartProduct.id
validateDuplicatedProduct(command)
return cartProductRepository.save(command.toCartProduct()).id
}

private fun validateDuplicatedProduct(command: SaveCartProductCommand) {
cartProductRepository.findByMemberIdAndProductIdAndMaleAndDeliveryMethod(
memberId = command.memberId,
productId = command.productId,
isMale = command.isMale,
deliveryMethod = command.deliveryMethod
)?.also { throw CartProductException(DUPLICATED_PRODUCT) }
}
}
6 changes: 3 additions & 3 deletions src/main/kotlin/com/petqua/domain/cart/CartProductQuantity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ private const val MAX_QUANTITY = 99
@Embeddable
class CartProductQuantity(
@Column(nullable = false)
val quantity: Int = 1,
val value: Int = 1,
) {

init {
throwExceptionWhen(quantity < MIN_QUANTITY) { CartProductException(PRODUCT_QUANTITY_UNDER_MINIMUM) }
throwExceptionWhen(quantity > MAX_QUANTITY) { CartProductException(PRODUCT_QUANTITY_OVER_MAXIMUM) }
throwExceptionWhen(value < MIN_QUANTITY) { CartProductException(PRODUCT_QUANTITY_UNDER_MINIMUM) }
throwExceptionWhen(value > MAX_QUANTITY) { CartProductException(PRODUCT_QUANTITY_OVER_MAXIMUM) }
}
}
10 changes: 9 additions & 1 deletion src/main/kotlin/com/petqua/domain/cart/CartProductRepository.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,12 @@ package com.petqua.domain.cart

import org.springframework.data.jpa.repository.JpaRepository

interface CartProductRepository : JpaRepository<CartProduct, Long>
interface CartProductRepository : JpaRepository<CartProduct, Long> {

fun findByMemberIdAndProductIdAndMaleAndDeliveryMethod(
memberId: Long,
productId: Long,
isMale: Boolean,
deliveryMethod: DeliveryMethod
): CartProduct?
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ enum class CartProductExceptionType(
INVALID_DELIVERY_METHOD(httpStatus = BAD_REQUEST, errorMessage = "유효하지 않는 배송 방법입니다."),
PRODUCT_QUANTITY_UNDER_MINIMUM(httpStatus = BAD_REQUEST, errorMessage = "최소 1개 이상의 상품을 담을 수 있습니다."),
PRODUCT_QUANTITY_OVER_MAXIMUM(httpStatus = BAD_REQUEST, errorMessage = "최대 99개까지 구매할 수 있습니다."),
DUPLICATED_PRODUCT(httpStatus = BAD_REQUEST, errorMessage = "이미 장바구니에 담긴 상품입니다.")
;

override fun httpStatus(): HttpStatus {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@ import com.petqua.domain.cart.CartProductRepository
import com.petqua.domain.cart.DeliveryMethod
import com.petqua.domain.member.MemberRepository
import com.petqua.domain.product.ProductRepository
import com.petqua.exception.cart.CartProductExceptionType.DUPLICATED_PRODUCT
import com.petqua.exception.member.MemberException
import com.petqua.exception.member.MemberExceptionType.NOT_FOUND_MEMBER
import com.petqua.exception.product.ProductException
import com.petqua.exception.product.ProductExceptionType.NOT_FOUND_PRODUCT
import com.petqua.test.DataCleaner
import com.petqua.test.fixture.member
import com.petqua.test.fixture.product
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe
import org.springframework.boot.test.context.SpringBootTest
Expand Down Expand Up @@ -42,6 +48,57 @@ class CartProductServiceTest(
}
}

Given("봉달 상품 저장시") {
val productId = productRepository.save(product(id = 1L)).id
val memberId = memberRepository.save(member(id = 1L)).id

When("존재 하지 않는 회원이 요청 하는 경우") {
val command = SaveCartProductCommand(
memberId = 999L,
productId = productId,
quantity = 1,
isMale = true,
deliveryMethod = DeliveryMethod.COMMON,
)
Then("예외가 발생 한다") {
shouldThrow<MemberException> {
cartProductService.save(command)
}.exceptionType() shouldBe NOT_FOUND_MEMBER
}
}

When("존재 하지 않는 상품이 요청 하는 경우") {
val command = SaveCartProductCommand(
memberId = memberId,
productId = 999L,
quantity = 1,
isMale = true,
deliveryMethod = DeliveryMethod.COMMON,
)
Then("예외가 발생 한다") {
shouldThrow<ProductException> {
cartProductService.save(command)
}.exceptionType() shouldBe NOT_FOUND_PRODUCT
}
}

When("중복 상품이 요청 하는 경우") {
val command = SaveCartProductCommand(
memberId = memberId,
productId = productId,
quantity = 1,
isMale = true,
deliveryMethod = DeliveryMethod.COMMON,
)
cartProductService.save(command)
Then("예외가 발생 한다") {
shouldThrow<MemberException> {
cartProductService.save(command)
}.exceptionType() shouldBe DUPLICATED_PRODUCT
}
}
}

afterContainer {
dataCleaner.clean()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.assertj.core.api.Assertions.assertThatThrownBy
class CartProductQuantityTest : StringSpec({
"상품 수량 값객체 생성" {
val quantity = CartProductQuantity(5)
assertThat(quantity.quantity).isEqualTo(5)
assertThat(quantity.value).isEqualTo(5)
}

"최소 수량 미만인 경우 생성 실패" {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ class CartProductControllerTest(
}
}
}
// TODO When("중복 상품을 담으면") {
}
}
}

0 comments on commit 096a109

Please sign in to comment.