From b848b7f52c058c372038edd1e53f898a0436ce0c Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Thu, 25 Aug 2022 22:25:59 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[#15]=20modify:=20=EC=B9=B4=ED=8E=98,=20?= =?UTF-8?q?=EC=B9=B4=ED=8E=98=EB=A9=94=EB=89=B4=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20=EB=8C=80=ED=95=9C=20dto=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Cafe, CafeMenu 관련 dto 클래스 이름 수정 - 패키지 구조 및 이름 수정 --- .../domain/cafe/controller/CafeController.kt | 15 +++++---- .../cafe/controller/CafeMenuController.kt | 4 +-- .../cafe/dto/cafe/CafeImageResponseDto.kt | 13 -------- .../cafe/dto/request/CafeInfoRequestDto.kt | 9 ------ .../dto/request/CafeMenuInfoRequestDto.kt | 9 ------ .../dto/request/MenuOptionInfoRequestDto.kt | 13 -------- .../dongnecafe/domain/cafe/entity/Cafe.kt | 4 +-- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 4 +-- .../domain/cafe/entity/MenuOption.kt | 4 +-- .../model/request/CafeMenuRegisterRequest.kt | 9 ++++++ .../cafe/model/request/CafeRegisterRequest.kt | 9 ++++++ .../cafe/model/request/CafeUpdateRequest.kt | 8 +++++ .../request/MenuOptionRegisterRequest.kt | 13 ++++++++ .../response/CafeDetailedInfo.kt} | 17 +++++----- .../cafe/model/response/CafeImageInfo.kt | 13 ++++++++ .../response/CafeMenuDetailedInfo.kt} | 12 +++---- .../response/CafeMenuInfo.kt} | 8 ++--- .../response/CafeSearchInfo.kt} | 12 +++---- .../response/MenuOptionInfo.kt} | 12 +++---- .../response/OptionDetailInfo.kt} | 8 ++--- .../domain/cafe/service/CafeMenuService.kt | 6 ++-- .../domain/cafe/service/CafeService.kt | 19 +++++------ .../domain/cafe/utils/CafeTestUtils.kt | 32 +++++++++---------- 23 files changed, 129 insertions(+), 124 deletions(-) delete mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeImageResponseDto.kt delete mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt delete mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt delete mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/cafe/CafeInfoResponseDto.kt => model/response/CafeDetailedInfo.kt} (51%) create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/menu/CafeMenuDetailResponseDto.kt => model/response/CafeMenuDetailedInfo.kt} (55%) rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/menu/CafeMenuResponseDto.kt => model/response/CafeMenuInfo.kt} (66%) rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/cafe/CafeSearchResponseDto.kt => model/response/CafeSearchInfo.kt} (54%) rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/menu/MenuOptionResponseDto.kt => model/response/MenuOptionInfo.kt} (51%) rename src/main/java/io/beaniejoy/dongnecafe/domain/cafe/{dto/menu/OptionDetailResponseDto.kt => model/response/OptionDetailInfo.kt} (64%) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index 21b2f2f..36d8cf4 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -1,8 +1,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.controller -import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeInfoResponseDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeSearchResponseDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.service.CafeService import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable @@ -16,7 +17,7 @@ class CafeController( private val cafeService: CafeService ) { @PostMapping - fun createCafe(@RequestBody resource: CafeInfoRequestDto): Long { + fun createCafe(@RequestBody resource: CafeRegisterRequest): Long { return cafeService.createCafe( name = resource.name!!, address = resource.address!!, @@ -29,12 +30,12 @@ class CafeController( @GetMapping fun searchCafe( @PageableDefault(sort = ["name"], direction = Sort.Direction.ASC, page = 0, size = 10) pageable: Pageable - ): Page { + ): Page { return cafeService.getCafeList(pageable) } @GetMapping("/{id}") - fun getCafeDetailedInfo(@PathVariable("id") id: Long): CafeInfoResponseDto { + fun getCafeDetailedInfo(@PathVariable("id") id: Long): CafeDetailedInfo { return cafeService.getCafeInfoByCafeId(id) } @@ -42,7 +43,7 @@ class CafeController( @PutMapping("/{id}") fun updateCafeInfo( @PathVariable("id") id: Long, - @RequestBody resource: CafeInfoRequestDto + @RequestBody resource: CafeUpdateRequest ): String { cafeService.updateCafe( id = id, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt index 1c700ae..cb84a8a 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.controller -import io.beaniejoy.dongnecafe.domain.cafe.dto.menu.CafeMenuDetailResponseDto +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.service.CafeMenuService import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable @@ -14,7 +14,7 @@ class CafeMenuController( fun getCafeMenuDetailedInfo( @PathVariable("cafeId") cafeId: Long, @PathVariable("menuId") menuId: Long - ): CafeMenuDetailResponseDto { + ): CafeMenuDetailedInfo { return cafeMenuService.getCafeMenuInfoByCafeIdAndMenuId( menuId = menuId, cafeId = cafeId diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeImageResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeImageResponseDto.kt deleted file mode 100644 index 0fdaaa5..0000000 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeImageResponseDto.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.cafe - -import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeImage - -data class CafeImageResponseDto( - val imgUrl: String? = null -) { - companion object { - fun of(cafeImage: CafeImage): CafeImageResponseDto { - return CafeImageResponseDto(cafeImage.imgUrl) - } - } -} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt deleted file mode 100644 index 70fa918..0000000 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeInfoRequestDto.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.request - -data class CafeInfoRequestDto( - val name: String? = null, - val address: String? = null, - val phoneNumber: String? = null, - val description: String? = null, - val cafeMenuList: List = arrayListOf() -) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt deleted file mode 100644 index 1621c4e..0000000 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/CafeMenuInfoRequestDto.kt +++ /dev/null @@ -1,9 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.request - -import java.math.BigDecimal - -data class CafeMenuInfoRequestDto( - val name: String? = null, - val price: BigDecimal = BigDecimal.ZERO, - val menuOptionList: List -) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt deleted file mode 100644 index f38d6d5..0000000 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/request/MenuOptionInfoRequestDto.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.request - -import java.math.BigDecimal - -data class MenuOptionInfoRequestDto( - val title: String, - val optionDetailList: List -) - -data class OptionDetailInfoRequestDto( - val name: String, - val extraPrice: BigDecimal -) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt index e43505b..c3a11b2 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/Cafe.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest import javax.persistence.* @Entity @@ -48,7 +48,7 @@ class Cafe protected constructor( address: String, phoneNumber: String, description: String, - cafeMenuRequestList: List, + cafeMenuRequestList: List, ): Cafe { val cafeMenuEntityList = cafeMenuRequestList.map { cafeMenuRequestDto -> CafeMenu.createCafeMenu( diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index fe4bfec..b689cdf 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.MenuOptionInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest import java.math.BigDecimal import javax.persistence.* @@ -31,7 +31,7 @@ class CafeMenu protected constructor( val menuOptionList: MutableList = arrayListOf() companion object { - fun createCafeMenu(name: String, price: BigDecimal, menuOptionRequestList: List): CafeMenu { + fun createCafeMenu(name: String, price: BigDecimal, menuOptionRequestList: List): CafeMenu { val menuOptionEntityList = menuOptionRequestList.map { menuOptionRequestDto -> MenuOption.createMenuOption( title = menuOptionRequestDto.title, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index 08dc7d3..364a46a 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.OptionDetailInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest import javax.persistence.* @Entity @@ -26,7 +26,7 @@ class MenuOption protected constructor( val optionDetailList: MutableList = arrayListOf() companion object { - fun createMenuOption(title: String, optionDetailRequestList: List): MenuOption { + fun createMenuOption(title: String, optionDetailRequestList: List): MenuOption { val optionDetailEntityList = optionDetailRequestList.map { optionDetailRequestDto -> OptionDetail.createOptionDetail( name = optionDetailRequestDto.name, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt new file mode 100644 index 0000000..156f8eb --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuRegisterRequest.kt @@ -0,0 +1,9 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +import java.math.BigDecimal + +data class CafeMenuRegisterRequest( + val name: String? = null, + val price: BigDecimal = BigDecimal.ZERO, + val menuOptionList: List = arrayListOf() +) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt new file mode 100644 index 0000000..bdc026b --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeRegisterRequest.kt @@ -0,0 +1,9 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +data class CafeRegisterRequest( + val name: String? = null, + val address: String? = null, + val phoneNumber: String? = null, + val description: String? = null, + val cafeMenuList: List = arrayListOf() +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt new file mode 100644 index 0000000..0b18d04 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeUpdateRequest.kt @@ -0,0 +1,8 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +data class CafeUpdateRequest( + val name: String? = null, + val address: String? = null, + val phoneNumber: String? = null, + val description: String? = null +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt new file mode 100644 index 0000000..7b70287 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionRegisterRequest.kt @@ -0,0 +1,13 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +import java.math.BigDecimal + +data class MenuOptionRegisterRequest( + val title: String, + val optionDetailList: List = arrayListOf() +) + +data class OptionDetailRegisterRequest( + val name: String, + val extraPrice: BigDecimal +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeInfoResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt similarity index 51% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeInfoResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt index dda6c08..3a67bb6 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeInfoResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt @@ -1,29 +1,28 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.cafe +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.dto.menu.CafeMenuResponseDto -data class CafeInfoResponseDto( +data class CafeDetailedInfo( val id: Long? = null, val name: String? = null, val address: String? = null, val phoneNumber: String? = null, val totalRate: Double? = null, val description: String? = null, - val menuList: List = emptyList(), - val imageList: List = emptyList() + val menuList: List = emptyList(), + val imageList: List = emptyList() ) { companion object { - fun of(cafe: Cafe): CafeInfoResponseDto { - return CafeInfoResponseDto( + fun of(cafe: Cafe): CafeDetailedInfo { + return CafeDetailedInfo( id = cafe.id, name = cafe.name, address = cafe.address, phoneNumber = cafe.phoneNumber, totalRate = cafe.totalRate, description = cafe.description, - menuList = cafe.cafeMenuList.map { CafeMenuResponseDto.of(it) }, - imageList = cafe.cafeImageList.map { CafeImageResponseDto.of(it) } + menuList = cafe.cafeMenuList.map { CafeMenuInfo.of(it) }, + imageList = cafe.cafeImageList.map { CafeImageInfo.of(it) } ) } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt new file mode 100644 index 0000000..02279e7 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt @@ -0,0 +1,13 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.response + +import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeImage + +data class CafeImageInfo( + val imgUrl: String? = null +) { + companion object { + fun of(cafeImage: CafeImage): CafeImageInfo { + return CafeImageInfo(cafeImage.imgUrl) + } + } +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuDetailResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt similarity index 55% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuDetailResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt index dbaa76d..aef98f8 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuDetailResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt @@ -1,19 +1,19 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.menu +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import java.math.BigDecimal -data class CafeMenuDetailResponseDto( +data class CafeMenuDetailedInfo( val name: String? = null, val price: BigDecimal = BigDecimal.ZERO, - val optionList: List = emptyList() + val optionList: List = emptyList() ) { companion object { - fun of(cafeMenu: CafeMenu): CafeMenuDetailResponseDto { - return CafeMenuDetailResponseDto( + fun of(cafeMenu: CafeMenu): CafeMenuDetailedInfo { + return CafeMenuDetailedInfo( name = cafeMenu.name, price = cafeMenu.price, - optionList = cafeMenu.menuOptionList.map { MenuOptionResponseDto.of(it) } + optionList = cafeMenu.menuOptionList.map { MenuOptionInfo.of(it) } ) } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt similarity index 66% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt index 6236478..c8f81c9 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/CafeMenuResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt @@ -1,16 +1,16 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.menu +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import java.math.BigDecimal -data class CafeMenuResponseDto( +data class CafeMenuInfo( val id: Long = 0L, val name: String? = null, val price: BigDecimal = BigDecimal.ZERO, ) { companion object { - fun of(cafeMenu: CafeMenu): CafeMenuResponseDto { - return CafeMenuResponseDto( + fun of(cafeMenu: CafeMenu): CafeMenuInfo { + return CafeMenuInfo( id = cafeMenu.id, name = cafeMenu.name, price = cafeMenu.price diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeSearchResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt similarity index 54% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeSearchResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt index a943bfd..10bfc02 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/cafe/CafeSearchResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt @@ -1,22 +1,22 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.cafe +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -data class CafeSearchResponseDto( +data class CafeSearchInfo( val id: Long = 0L, val name: String? = null, val address: String? = null, val totalRate: Double? = null, - val imageList: List = emptyList() + val imageList: List = emptyList() ) { companion object { - fun of(cafe: Cafe): CafeSearchResponseDto { - return CafeSearchResponseDto( + fun of(cafe: Cafe): CafeSearchInfo { + return CafeSearchInfo( id = cafe.id, name = cafe.name, address = cafe.address, totalRate = cafe.totalRate, - imageList = cafe.cafeImageList.map { CafeImageResponseDto.of(it) } + imageList = cafe.cafeImageList.map { CafeImageInfo.of(it) } ) } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/MenuOptionResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt similarity index 51% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/MenuOptionResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt index 3c7b6d4..9bff43b 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/MenuOptionResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt @@ -1,18 +1,18 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.menu +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption -data class MenuOptionResponseDto( +data class MenuOptionInfo( val id: Long = 0L, val title: String? = null, - val optionDetailList: List = emptyList() + val optionDetailList: List = emptyList() ) { companion object { - fun of(menuOption: MenuOption): MenuOptionResponseDto { - return MenuOptionResponseDto( + fun of(menuOption: MenuOption): MenuOptionInfo { + return MenuOptionInfo( id = menuOption.id, title = menuOption.title, - optionDetailList = menuOption.optionDetailList.map { OptionDetailResponseDto.of(it) } + optionDetailList = menuOption.optionDetailList.map { OptionDetailInfo.of(it) } ) } } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/OptionDetailResponseDto.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt similarity index 64% rename from src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/OptionDetailResponseDto.kt rename to src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt index 756db31..d5ff32e 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/dto/menu/OptionDetailResponseDto.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt @@ -1,16 +1,16 @@ -package io.beaniejoy.dongnecafe.domain.cafe.dto.menu +package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import java.math.BigDecimal -data class OptionDetailResponseDto( +data class OptionDetailInfo( val id: Long = 0L, val name: String? = null, val extra: BigDecimal = BigDecimal.ZERO ) { companion object { - fun of(optionDetail: OptionDetail): OptionDetailResponseDto { - return OptionDetailResponseDto( + fun of(optionDetail: OptionDetail): OptionDetailInfo { + return OptionDetailInfo( id = optionDetail.id, name = optionDetail.name, extra = optionDetail.extraPrice diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index e77555d..7671fe6 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.dto.menu.CafeMenuDetailResponseDto +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.error.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import org.springframework.data.repository.findByIdOrNull @@ -12,10 +12,10 @@ class CafeMenuService( private val cafeMenuRepository: CafeMenuRepository ) { @Transactional(readOnly = true) - fun getCafeMenuInfoByCafeIdAndMenuId(menuId: Long, cafeId: Long): CafeMenuDetailResponseDto { + fun getCafeMenuInfoByCafeIdAndMenuId(menuId: Long, cafeId: Long): CafeMenuDetailedInfo { val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) ?: throw CafeMenuNotFoundException(menuId, cafeId) - return CafeMenuDetailResponseDto.of(cafeMenu) + return CafeMenuDetailedInfo.of(cafeMenu) } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index c3563df..72d2a89 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -1,12 +1,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeInfoResponseDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.cafe.CafeSearchResponseDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu -import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption -import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository @@ -38,7 +35,7 @@ class CafeService( address: String, phoneNumber: String, description: String, - cafeMenuRequestList: List, + cafeMenuRequestList: List, ): Long { checkCafeExistedByName(name) @@ -62,17 +59,17 @@ class CafeService( } } - fun getCafeList(pageable: Pageable): Page { + fun getCafeList(pageable: Pageable): Page { val cafeList: Page = cafeRepository.findAll(pageable) - return cafeList.map { CafeSearchResponseDto.of(it) } + return cafeList.map { CafeSearchInfo.of(it) } } - fun getCafeInfoByCafeId(id: Long): CafeInfoResponseDto { + fun getCafeInfoByCafeId(id: Long): CafeDetailedInfo { val cafe = cafeRepository.findByIdOrNull(id) ?: throw CafeNotFoundException(id) - return CafeInfoResponseDto.of(cafe) + return CafeDetailedInfo.of(cafe) } /** diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index f16125a..e7c88af 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -1,9 +1,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.utils -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeInfoRequestDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.CafeMenuInfoRequestDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.MenuOptionInfoRequestDto -import io.beaniejoy.dongnecafe.domain.cafe.dto.request.OptionDetailInfoRequestDto +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption @@ -13,7 +13,7 @@ import java.math.BigDecimal class CafeTestUtils { companion object { - fun assertCafeEquals(request: CafeInfoRequestDto, entity: Cafe) { + fun assertCafeEquals(request: CafeRegisterRequest, entity: Cafe) { assertEquals(request.name, entity.name) assertEquals(request.address, entity.address) assertEquals(request.phoneNumber, entity.phoneNumber) @@ -23,7 +23,7 @@ class CafeTestUtils { } private fun assertCafeMenuListEquals( - cafeMenuRequestList: List, + cafeMenuRequestList: List, cafeMenuList: List, ) { for (index in cafeMenuRequestList.indices) { @@ -38,7 +38,7 @@ class CafeTestUtils { } private fun assertMenuOptionListEquals( - menuOptionRequestList: List, + menuOptionRequestList: List, menuOptionList: List, ) { for (index in menuOptionRequestList.indices) { @@ -52,7 +52,7 @@ class CafeTestUtils { } private fun assertOptionDetailListEquals( - optionDetailRequestList: List, + optionDetailRequestList: List, optionDetailList: MutableList, ) { for (index in optionDetailRequestList.indices) { @@ -61,36 +61,36 @@ class CafeTestUtils { } } - fun createCafeRequestDto(): CafeInfoRequestDto { + fun createCafeRequestDto(): CafeRegisterRequest { val cafeName = "beanie_cafe" val cafeAddress = "beanie_cafe_address" val phoneNumber = "01012345678" val description = "beanie_cafe_description" val sizeOptionDetailList = listOf( - OptionDetailInfoRequestDto(name = "medium", extraPrice = BigDecimal.ZERO), - OptionDetailInfoRequestDto(name = "large", extraPrice = BigDecimal.valueOf(200L)), - OptionDetailInfoRequestDto(name = "venti", extraPrice = BigDecimal.valueOf(700L)) + OptionDetailRegisterRequest(name = "medium", extraPrice = BigDecimal.ZERO), + OptionDetailRegisterRequest(name = "large", extraPrice = BigDecimal.valueOf(200L)), + OptionDetailRegisterRequest(name = "venti", extraPrice = BigDecimal.valueOf(700L)) ) - val sizeMenuOption = MenuOptionInfoRequestDto( + val sizeMenuOption = MenuOptionRegisterRequest( title = "size", optionDetailList = sizeOptionDetailList ) val cafeMenuList = listOf( - CafeMenuInfoRequestDto( + CafeMenuRegisterRequest( name = "menu1", price = BigDecimal.valueOf(2_800L), menuOptionList = listOf(sizeMenuOption) ), - CafeMenuInfoRequestDto( + CafeMenuRegisterRequest( name = "menu2", price = BigDecimal.valueOf(3_500L), menuOptionList = listOf(sizeMenuOption) ), ) - return CafeInfoRequestDto( + return CafeRegisterRequest( name = cafeName, address = cafeAddress, phoneNumber = phoneNumber, From 63f158a30bc59934cc5c5ca2142e736102ddf484 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Fri, 26 Aug 2022 19:31:17 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[#15]=20feat:=20flyway=20seed=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - menu_option, option_detail seed 데이터 추가 --- .../db/seed/R__Insert_Seed_cafe_image.sql | 9 ++++-- .../db/seed/R__Insert_Seed_cafe_menu.sql | 11 +++++-- .../db/seed/R__Insert_Seed_menu_option.sql | 25 ++++++++++++++++ .../db/seed/R__Insert_Seed_option_detail.sql | 29 +++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/db/seed/R__Insert_Seed_menu_option.sql create mode 100644 src/main/resources/db/seed/R__Insert_Seed_option_detail.sql diff --git a/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql b/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql index 460b7e2..c970c1c 100644 --- a/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql +++ b/src/main/resources/db/seed/R__Insert_Seed_cafe_image.sql @@ -6,18 +6,23 @@ BEGIN DECLARE i INT DEFAULT 0; DECLARE j INT; DECLARE idx_img INT DEFAULT 1; - DECLARE var_cafe_id binary(16); + DECLARE var_cafe_id INT; DECLARE count_cafe INT; + SET count_cafe = (SELECT COUNT(*) FROM `cafe`); - WHILE(i <= count_cafe) DO + + WHILE(i < count_cafe) DO SET j = 1; SET var_cafe_id = (SELECT cafe_id FROM `cafe` LIMIT i, 1); + WHILE(j <= 3) DO INSERT IGNORE INTO `cafe_image` (img_url, created_at, created_by, updated_at, updated_by, cafe_id) VALUES (CONCAT('test_img_url_', idx_img), now(), 'system', null, null, var_cafe_id); + SET j = j + 1; SET idx_img = idx_img + 1; END WHILE; + SET i = i + 1; END WHILE; END$$ diff --git a/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql b/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql index e5ee900..e3b3eea 100644 --- a/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql +++ b/src/main/resources/db/seed/R__Insert_Seed_cafe_menu.sql @@ -5,15 +5,20 @@ CREATE PROCEDURE insertCafeMenus() BEGIN DECLARE i INT DEFAULT 0; DECLARE j INT; - DECLARE var_cafe_id binary(16); - WHILE(i <= 4) DO + DECLARE var_cafe_id INT; + + WHILE(i < 5) DO SET j = 1; - SET var_cafe_id = (SELECT cafe_id FROM `cafe` LIMIT i, 1); + SET var_cafe_id = (SELECT cafe_id + FROM `cafe` + LIMIT i, 1); + WHILE(j <= 10) DO INSERT IGNORE INTO `cafe_menu` (name, price, created_at, created_by, updated_at, updated_by, cafe_id) VALUES (CONCAT('커피', j), FLOOR(RAND() * 10 + 1) * 1000, now(), 'system', null, null, var_cafe_id); SET j = j + 1; END WHILE; + SET i = i + 1; END WHILE; END$$ diff --git a/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql b/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql new file mode 100644 index 0000000..6f254d1 --- /dev/null +++ b/src/main/resources/db/seed/R__Insert_Seed_menu_option.sql @@ -0,0 +1,25 @@ +DROP PROCEDURE IF EXISTS insertMenuOptions; + +DELIMITER $$ +CREATE PROCEDURE insertMenuOptions() +BEGIN + DECLARE i INT DEFAULT 0; + DECLARE var_cafe_menu_id INT; + DECLARE count_cafe_menu INT; + + SET count_cafe_menu = (SELECT COUNT(*) FROM `cafe_menu`); + + WHILE(i < count_cafe_menu) DO + SET var_cafe_menu_id = (SELECT cafe_menu_id + FROM `cafe_menu` + LIMIT i, 1); + + INSERT IGNORE INTO `menu_option` (title, created_at, created_by, updated_at, updated_by, cafe_menu_id) + VALUES ('SIZE', now(), 'system', null, null, var_cafe_menu_id); + + SET i = i + 1; + END WHILE; +END$$ +DELIMITER ; + +CALL insertMenuOptions(); \ No newline at end of file diff --git a/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql b/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql new file mode 100644 index 0000000..b8d7f5b --- /dev/null +++ b/src/main/resources/db/seed/R__Insert_Seed_option_detail.sql @@ -0,0 +1,29 @@ +DROP PROCEDURE IF EXISTS insertOptionDetails; + +DELIMITER $$ +CREATE PROCEDURE insertOptionDetails() +BEGIN + DECLARE i INT DEFAULT 0; + DECLARE var_menu_option_id INT; + DECLARE count_menu_option INT; + + SET count_menu_option = (SELECT COUNT(*) FROM `menu_option`); + + WHILE(i < count_menu_option) DO + SET var_menu_option_id = (SELECT menu_option_id + FROM `menu_option` + LIMIT i, 1); + + INSERT IGNORE INTO `option_detail` (name, extra_price, created_at, created_by, updated_at, updated_by, menu_option_id) + VALUES ('MEDIUM', FLOOR(RAND() * 3 + 1) * 1000, now(), 'system', null, null, var_menu_option_id); + INSERT IGNORE INTO `option_detail` (name, extra_price, created_at, created_by, updated_at, updated_by, menu_option_id) + VALUES ('LARGE', FLOOR(RAND() * 3 + 1) * 1000, now(), 'system', null, null, var_menu_option_id); + INSERT IGNORE INTO `option_detail` (name, extra_price, created_at, created_by, updated_at, updated_by, menu_option_id) + VALUES ('VENTI', FLOOR(RAND() * 3 + 1) * 1000, now(), 'system', null, null, var_menu_option_id); + + SET i = i + 1; + END WHILE; +END$$ +DELIMITER ; + +CALL insertOptionDetails(); \ No newline at end of file From d9401930d8c81258207cc8c47d1d9d0c3fa1c7a4 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Mon, 29 Aug 2022 00:42:07 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[#15]=20feat:=20cafe=5Fmenu=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카페 메뉴 단일 데이터 정보 변경 기능 추가 - 카페 메뉴 단일 데이터 삭제 기능 추가 - 카페 메뉴 일괄 삭제 기능 추가 - dto 이름 변경에 대한 관련 코드 수정 - 메소드명 변경 --- .../domain/cafe/controller/CafeController.kt | 36 ++++++---- .../cafe/controller/CafeMenuController.kt | 66 ++++++++++++++++++- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 17 ++++- .../domain/cafe/entity/MenuOption.kt | 7 +- .../domain/cafe/entity/OptionDetail.kt | 11 +++- .../domain/cafe/error/CafeExceptionHandler.kt | 1 + .../domain/cafe/error/CafeExistedException.kt | 2 +- .../cafe/error/MenuOptionNotFoundException.kt | 3 + .../error/OptionDetailNotFoundException.kt | 3 + .../request/CafeMenuBulkDeleteRequest.kt | 5 ++ .../model/request/CafeMenuUpdateRequest.kt | 9 +++ .../model/request/MenuOptionUpdateRequest.kt | 17 +++++ .../cafe/model/response/CafeDetailedInfo.kt | 4 +- .../cafe/model/response/CafeImageInfo.kt | 3 +- .../model/response/CafeMenuDetailedInfo.kt | 2 + .../cafe/model/response/CafeMenuInfo.kt | 4 +- .../cafe/model/response/CafeSearchInfo.kt | 4 +- .../cafe/model/response/MenuOptionInfo.kt | 4 +- .../cafe/model/response/OptionDetailInfo.kt | 4 +- .../cafe/repository/MenuOptionRepository.kt | 6 ++ .../cafe/repository/OptionDetailRepository.kt | 6 ++ .../domain/cafe/service/CafeMenuService.kt | 35 ++++++++-- .../domain/cafe/service/CafeService.kt | 8 +-- .../domain/cafe/service/MenuOptionService.kt | 31 +++++++++ .../cafe/service/OptionDetailService.kt | 28 ++++++++ .../dongnecafe/domain/cafe/entity/CafeTest.kt | 2 +- .../cafe/repository/CafeRepositoryTest.kt | 15 ++++- .../cafe/service/CafeMenuServiceTest.kt | 57 ++++++++++++++++ .../domain/cafe/service/CafeServiceTest.kt | 14 ++-- .../domain/cafe/utils/CafeTestUtils.kt | 2 +- 30 files changed, 355 insertions(+), 51 deletions(-) create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt create mode 100644 src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt index 36d8cf4..8f12999 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeController.kt @@ -1,9 +1,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.controller -import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo -import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo +import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo import io.beaniejoy.dongnecafe.domain.cafe.service.CafeService import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable @@ -16,9 +16,12 @@ import org.springframework.web.bind.annotation.* class CafeController( private val cafeService: CafeService ) { + /** + * 신규 카페 생성 + */ @PostMapping - fun createCafe(@RequestBody resource: CafeRegisterRequest): Long { - return cafeService.createCafe( + fun createNewCafe(@RequestBody resource: CafeRegisterRequest): Long { + return cafeService.createNew( name = resource.name!!, address = resource.address!!, phoneNumber = resource.phoneNumber!!, @@ -27,25 +30,34 @@ class CafeController( ) } + /** + * 카페 리스트 조회(검색 기능) + */ @GetMapping - fun searchCafe( + fun searchCafeList( @PageableDefault(sort = ["name"], direction = Sort.Direction.ASC, page = 0, size = 10) pageable: Pageable ): Page { - return cafeService.getCafeList(pageable) + return cafeService.searchCafeList(pageable) } + /** + * 단일 카페 상세 조회 + */ @GetMapping("/{id}") - fun getCafeDetailedInfo(@PathVariable("id") id: Long): CafeDetailedInfo { - return cafeService.getCafeInfoByCafeId(id) + fun getDetailedInfo(@PathVariable("id") id: Long): CafeDetailedInfo { + return cafeService.getDetailedInfoByCafeId(id) } - // TODO spring boot validation 적용 필요 - @PutMapping("/{id}") - fun updateCafeInfo( + /** + * 단일 카페에 대한 정보 변경 + * - Cafe 기본 정보 데이터 변경 + */ + @PatchMapping("/{id}") + fun updateInfo( @PathVariable("id") id: Long, @RequestBody resource: CafeUpdateRequest ): String { - cafeService.updateCafe( + cafeService.updateInfo( id = id, name = resource.name!!, address = resource.address!!, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt index cb84a8a..7603af0 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/controller/CafeMenuController.kt @@ -1,23 +1,83 @@ package io.beaniejoy.dongnecafe.domain.cafe.controller +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuBulkDeleteRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.service.CafeMenuService +import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PatchMapping import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController +@RequestMapping("/cafes/{cafeId}/menus") class CafeMenuController( private val cafeMenuService: CafeMenuService ) { - @GetMapping("/cafes/{cafeId}/menus/{menuId}") - fun getCafeMenuDetailedInfo( + /** + * 단일 카페 메뉴 상세 조회 + */ + @GetMapping("/{menuId}") + fun getDetailedInfo( @PathVariable("cafeId") cafeId: Long, @PathVariable("menuId") menuId: Long ): CafeMenuDetailedInfo { - return cafeMenuService.getCafeMenuInfoByCafeIdAndMenuId( + return cafeMenuService.getDetailedInfoByMenuId( menuId = menuId, cafeId = cafeId ) } + + /** + * 단일 카페 메뉴에 대한 정보 변경 + * - CafeMenu 기본 정보 데이터 변경 + * - MenuOption List bulkUpdate (삭제, 변경) + * - OptionDetail List bulkUpdate (삭제, 변경) + */ + @PatchMapping("/{menuId}") + fun updateInfoAndBulkUpdateOptions( + @PathVariable("cafeId") cafeId: Long, + @PathVariable("menuId") menuId: Long, + @RequestBody cafeMenuUpdateRequest: CafeMenuUpdateRequest + ): String { + cafeMenuService.updateInfoAndBulkUpdate( + menuId = menuId, + cafeId = cafeId, + resource = cafeMenuUpdateRequest + ) + + return "Success Update Cafe[$cafeId]'s CafeMenu[$menuId]" + } + + /** + * 단일 카페 메뉴 삭제 + */ + @DeleteMapping("/{menuId}") + fun delete( + @PathVariable("cafeId") cafeId: Long, + @PathVariable("menuId") menuId: Long + ): String { + cafeMenuService.deleteByCafeMenuId( + menuId = menuId, + cafeId = cafeId + ) + + return "Success Delete Cafe[$cafeId]'s CafeMenu[$menuId]" + } + + /** + * 여러 카페 메뉴에 대한 bulk 삭제 + */ + @DeleteMapping("") + fun bulkDelete( + @PathVariable("cafeId") cafeId: Long, + @RequestBody resource: CafeMenuBulkDeleteRequest + ): String { + cafeMenuService.bulkDelete(cafeId, resource.cafeMenuIdList) + + return "Success Delete Cafe[$cafeId]'s CafeMenu List" + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index b689cdf..7c9c7e6 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -2,11 +2,14 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest +import org.hibernate.annotations.DynamicUpdate import java.math.BigDecimal import javax.persistence.* @Entity @Table(name = "cafe_menu") +@DynamicUpdate class CafeMenu protected constructor( name: String, price: BigDecimal, @@ -17,10 +20,12 @@ class CafeMenu protected constructor( val id: Long = 0L @Column(name = "name", nullable = false) - val name: String = name + var name: String = name + protected set @Column(name = "price", nullable = false) - val price: BigDecimal = price + var price: BigDecimal = price + protected set @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cafe_id", nullable = false) @@ -56,4 +61,12 @@ class CafeMenu protected constructor( this.menuOptionList.add(menuOption) menuOption.updateCafeMenu(this) } + + fun updateInfo( + name: String, + price: BigDecimal + ) { + this.name = name + this.price = price + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index 364a46a..e63795a 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -15,7 +15,8 @@ class MenuOption protected constructor( val id: Long = 0L @Column(name = "title", nullable = false) - val title: String = title + var title: String = title + protected set @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "cafe_menu_id", nullable = false) @@ -50,4 +51,8 @@ class MenuOption protected constructor( this.optionDetailList.add(optionDetail) optionDetail.updateMenuOption(this) } + + fun updateInfo(title: String) { + this.title = title + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index d19ba16..6bf8b70 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -16,10 +16,12 @@ class OptionDetail protected constructor( val id: Long = 0L @Column(name = "name", nullable = false) - val name: String = name + var name: String = name + protected set @Column(name = "extra_price", nullable = false) - val extraPrice: BigDecimal = extraPrice + var extraPrice: BigDecimal = extraPrice + protected set @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "menu_option_id", nullable = false) @@ -38,4 +40,9 @@ class OptionDetail protected constructor( fun updateMenuOption(menuOption: MenuOption) { this.menuOption = menuOption } + + fun updateInfo(name: String, extraPrice: BigDecimal) { + this.name = name + this.extraPrice = extraPrice + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt index d9657d6..7b1f1fd 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RestControllerAdvice @RestControllerAdvice class CafeExceptionHandler { + // TODO: error 규격화 @ExceptionHandler(CafeNotFoundException::class) fun handleNotFound(exception: CafeNotFoundException): ResponseEntity { return ResponseEntity.badRequest().body(exception.message) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt index 3775d57..ac08e0d 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt @@ -1,3 +1,3 @@ package io.beaniejoy.dongnecafe.domain.cafe.error -class CafeExistedException(name: String): RuntimeException("Cafe[$name] is already existed") \ No newline at end of file +class CafeExistedException(name: String) : RuntimeException("Cafe[$name] is already existed") \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt new file mode 100644 index 0000000..228fd9d --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt @@ -0,0 +1,3 @@ +package io.beaniejoy.dongnecafe.domain.cafe.error + +class MenuOptionNotFoundException(menuOptionId: Long) : RuntimeException("MenuOption[$menuOptionId] is not found") \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt new file mode 100644 index 0000000..59b5a88 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt @@ -0,0 +1,3 @@ +package io.beaniejoy.dongnecafe.domain.cafe.error + +class OptionDetailNotFoundException(optionDetailId: Long) : RuntimeException("OptionDetail[$optionDetailId] is not found") \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt new file mode 100644 index 0000000..ca21012 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuBulkDeleteRequest.kt @@ -0,0 +1,5 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +data class CafeMenuBulkDeleteRequest( + val cafeMenuIdList: List +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt new file mode 100644 index 0000000..9a58650 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/CafeMenuUpdateRequest.kt @@ -0,0 +1,9 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +import java.math.BigDecimal + +data class CafeMenuUpdateRequest( + val name: String? = null, + val price: BigDecimal = BigDecimal.ZERO, + val menuOptionList: List = arrayListOf() +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt new file mode 100644 index 0000000..9e9208b --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/request/MenuOptionUpdateRequest.kt @@ -0,0 +1,17 @@ +package io.beaniejoy.dongnecafe.domain.cafe.model.request + +import java.math.BigDecimal + +data class MenuOptionUpdateRequest( + val menuOptionId: Long, + val title: String, + val isDelete: Boolean = false, + val optionDetailList: List = arrayListOf() +) + +data class OptionDetailUpdateRequest( + val optionDetailId: Long, + val name: String, + val extraPrice: BigDecimal, + val isDelete: Boolean = false +) \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt index 3a67bb6..1854540 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeDetailedInfo.kt @@ -3,7 +3,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe data class CafeDetailedInfo( - val id: Long? = null, + val cafeId: Long = 0L, val name: String? = null, val address: String? = null, val phoneNumber: String? = null, @@ -15,7 +15,7 @@ data class CafeDetailedInfo( companion object { fun of(cafe: Cafe): CafeDetailedInfo { return CafeDetailedInfo( - id = cafe.id, + cafeId = cafe.id, name = cafe.name, address = cafe.address, phoneNumber = cafe.phoneNumber, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt index 02279e7..b5a6bde 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeImageInfo.kt @@ -3,11 +3,12 @@ package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeImage data class CafeImageInfo( + val cafeImageId: Long = 0L, val imgUrl: String? = null ) { companion object { fun of(cafeImage: CafeImage): CafeImageInfo { - return CafeImageInfo(cafeImage.imgUrl) + return CafeImageInfo(cafeImage.id, cafeImage.imgUrl) } } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt index aef98f8..03e5625 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuDetailedInfo.kt @@ -4,6 +4,7 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import java.math.BigDecimal data class CafeMenuDetailedInfo( + val cafeMenuId: Long = 0L, val name: String? = null, val price: BigDecimal = BigDecimal.ZERO, val optionList: List = emptyList() @@ -11,6 +12,7 @@ data class CafeMenuDetailedInfo( companion object { fun of(cafeMenu: CafeMenu): CafeMenuDetailedInfo { return CafeMenuDetailedInfo( + cafeMenuId = cafeMenu.id, name = cafeMenu.name, price = cafeMenu.price, optionList = cafeMenu.menuOptionList.map { MenuOptionInfo.of(it) } diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt index c8f81c9..f24e5ef 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeMenuInfo.kt @@ -4,14 +4,14 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu import java.math.BigDecimal data class CafeMenuInfo( - val id: Long = 0L, + val cafeMenuId: Long = 0L, val name: String? = null, val price: BigDecimal = BigDecimal.ZERO, ) { companion object { fun of(cafeMenu: CafeMenu): CafeMenuInfo { return CafeMenuInfo( - id = cafeMenu.id, + cafeMenuId = cafeMenu.id, name = cafeMenu.name, price = cafeMenu.price ) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt index 10bfc02..520191f 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/CafeSearchInfo.kt @@ -3,7 +3,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe data class CafeSearchInfo( - val id: Long = 0L, + val cafeId: Long = 0L, val name: String? = null, val address: String? = null, val totalRate: Double? = null, @@ -12,7 +12,7 @@ data class CafeSearchInfo( companion object { fun of(cafe: Cafe): CafeSearchInfo { return CafeSearchInfo( - id = cafe.id, + cafeId = cafe.id, name = cafe.name, address = cafe.address, totalRate = cafe.totalRate, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt index 9bff43b..4970b08 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/MenuOptionInfo.kt @@ -3,14 +3,14 @@ package io.beaniejoy.dongnecafe.domain.cafe.model.response import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption data class MenuOptionInfo( - val id: Long = 0L, + val menuOptionId: Long = 0L, val title: String? = null, val optionDetailList: List = emptyList() ) { companion object { fun of(menuOption: MenuOption): MenuOptionInfo { return MenuOptionInfo( - id = menuOption.id, + menuOptionId = menuOption.id, title = menuOption.title, optionDetailList = menuOption.optionDetailList.map { OptionDetailInfo.of(it) } ) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt index d5ff32e..b782f18 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/model/response/OptionDetailInfo.kt @@ -4,14 +4,14 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import java.math.BigDecimal data class OptionDetailInfo( - val id: Long = 0L, + val optionDetailId: Long = 0L, val name: String? = null, val extra: BigDecimal = BigDecimal.ZERO ) { companion object { fun of(optionDetail: OptionDetail): OptionDetailInfo { return OptionDetailInfo( - id = optionDetail.id, + optionDetailId = optionDetail.id, name = optionDetail.name, extra = optionDetail.extraPrice ) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt new file mode 100644 index 0000000..eac2d35 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/MenuOptionRepository.kt @@ -0,0 +1,6 @@ +package io.beaniejoy.dongnecafe.domain.cafe.repository + +import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption +import org.springframework.data.jpa.repository.JpaRepository + +interface MenuOptionRepository : JpaRepository \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt new file mode 100644 index 0000000..27fcd2c --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/repository/OptionDetailRepository.kt @@ -0,0 +1,6 @@ +package io.beaniejoy.dongnecafe.domain.cafe.repository + +import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail +import org.springframework.data.jpa.repository.JpaRepository + +interface OptionDetailRepository : JpaRepository \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index 7671fe6..37545cc 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -2,20 +2,47 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.error.CafeMenuNotFoundException +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service +@Transactional(readOnly = true) class CafeMenuService( - private val cafeMenuRepository: CafeMenuRepository + private val cafeMenuRepository: CafeMenuRepository, + private val menuOptionService: MenuOptionService ) { - @Transactional(readOnly = true) - fun getCafeMenuInfoByCafeIdAndMenuId(menuId: Long, cafeId: Long): CafeMenuDetailedInfo { + fun getDetailedInfoByMenuId(menuId: Long, cafeId: Long): CafeMenuDetailedInfo { val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) - ?: throw CafeMenuNotFoundException(menuId, cafeId) + ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) return CafeMenuDetailedInfo.of(cafeMenu) } + + @Transactional + fun updateInfoAndBulkUpdate(menuId: Long, cafeId: Long, resource: CafeMenuUpdateRequest) { + val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) + ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) + + cafeMenu.updateInfo(name = resource.name!!, price = resource.price) + + menuOptionService.bulkUpdate(resource.menuOptionList) + } + + @Transactional + fun deleteByCafeMenuId(menuId: Long, cafeId: Long) { + val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) + ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) + + cafeMenuRepository.delete(cafeMenu) + } + + @Transactional + fun bulkDelete(cafeId: Long, cafeMenuIdList: List) { + cafeMenuIdList.forEach { + deleteByCafeMenuId(menuId = it, cafeId = cafeId) + } + } } \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index 72d2a89..9452130 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -30,7 +30,7 @@ class CafeService( * - 옵션 상세 (상세 이름, 추가 금액 /ex. [(medium, 0), (large, 200), (venti, 700)]) */ @Transactional - fun createCafe( + fun createNew( name: String, address: String, phoneNumber: String, @@ -59,13 +59,13 @@ class CafeService( } } - fun getCafeList(pageable: Pageable): Page { + fun searchCafeList(pageable: Pageable): Page { val cafeList: Page = cafeRepository.findAll(pageable) return cafeList.map { CafeSearchInfo.of(it) } } - fun getCafeInfoByCafeId(id: Long): CafeDetailedInfo { + fun getDetailedInfoByCafeId(id: Long): CafeDetailedInfo { val cafe = cafeRepository.findByIdOrNull(id) ?: throw CafeNotFoundException(id) @@ -77,7 +77,7 @@ class CafeService( * - 카페 정보만 수정 (하위 엔티티에 대해서는 각 도메인 영역에서 수정) */ @Transactional - fun updateCafe( + fun updateInfo( id: Long, name: String, address: String, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt new file mode 100644 index 0000000..06236d8 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt @@ -0,0 +1,31 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import io.beaniejoy.dongnecafe.domain.cafe.error.MenuOptionNotFoundException +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional +class MenuOptionService( + private val menuOptionRepository: MenuOptionRepository, + private val optionDetailService: OptionDetailService +) { + fun bulkUpdate(resources: List) { + resources.forEach { + val menuOption = menuOptionRepository.findByIdOrNull(it.menuOptionId) + ?: throw MenuOptionNotFoundException(it.menuOptionId) + + if (it.isDelete) { + menuOptionRepository.delete(menuOption) + return@forEach + } + + menuOption.updateInfo(it.title) + + optionDetailService.bulkUpdate(it.optionDetailList) + } + } +} \ No newline at end of file diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt new file mode 100644 index 0000000..4cbe0b7 --- /dev/null +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt @@ -0,0 +1,28 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import io.beaniejoy.dongnecafe.domain.cafe.error.OptionDetailNotFoundException +import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +@Transactional +class OptionDetailService( + private val optionDetailRepository: OptionDetailRepository +) { + fun bulkUpdate(resources: List) { + resources.forEach { + val optionDetail = optionDetailRepository.findByIdOrNull(it.optionDetailId) + ?: throw OptionDetailNotFoundException(it.optionDetailId) + + if (it.isDelete) { + optionDetailRepository.delete(optionDetail) + return@forEach + } + + optionDetail.updateInfo(it.name, it.extraPrice) + } + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt index f3d6628..39b9228 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeTest.kt @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Test internal class CafeTest { @Test fun create_cafe_test() { - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt index 8e085fd..b1c90b2 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/repository/CafeRepositoryTest.kt @@ -4,6 +4,7 @@ import io.beaniejoy.dongnecafe.common.config.AuditingConfig import io.beaniejoy.dongnecafe.common.entity.BaseEntityAuditorAware import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils +import mu.KLogging import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test @@ -20,13 +21,15 @@ import org.springframework.data.repository.findByIdOrNull ] ) internal class CafeRepositoryTest { + companion object : KLogging() + @Autowired lateinit var cafeRepository: CafeRepository @Test @DisplayName("[JPA] 신규 Cafe save 테스트") fun save_cafe_test() { - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val cafe = cafeRequestDto.let { Cafe.createCafe( name = it.name!!, @@ -47,7 +50,7 @@ internal class CafeRepositoryTest { @DisplayName("[JPA] 기존 Cafe 정보 update 테스트") fun update_cafe_test() { // TODO 테스트용 카페 데이터 주입 구성하기 - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val cafe = cafeRequestDto.let { Cafe.createCafe( name = it.name!!, @@ -81,4 +84,12 @@ internal class CafeRepositoryTest { assertEquals(updatedPhoneNumber, updatedCafe.phoneNumber) assertEquals(updatedDescription, updatedCafe.description) } + + @Test + fun select_cafe_test_data() { + val cafes = cafeRepository.findAll() + cafes.forEach { + logger.info { "cafe id=[${it.id}], name=[${it.name}]" } + } + } } \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt new file mode 100644 index 0000000..2dea392 --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt @@ -0,0 +1,57 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository +import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository +import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.annotation.Rollback +import org.springframework.transaction.annotation.Transactional + +@SpringBootTest +internal class CafeMenuServiceTest { + @Autowired + lateinit var cafeMenuRepository: CafeMenuRepository + @Autowired + lateinit var cafeRepository: CafeRepository + @Autowired + lateinit var cafeMenuService: CafeMenuService + + @BeforeEach + fun setup() { + val cafeRegisterRequest = CafeTestUtils.createCafeRegisterRequest() + + cafeRepository.save( + Cafe.createCafe( + name = cafeRegisterRequest.name!!, + address = cafeRegisterRequest.address!!, + phoneNumber = cafeRegisterRequest.phoneNumber!!, + description = cafeRegisterRequest.description!!, + cafeMenuRequestList = cafeRegisterRequest.cafeMenuList + ) + ) + } + + @Test + @Transactional + @Rollback(false) + fun updateTest() { + val cafeMenu = cafeRepository.findByName("beanie_cafe")!!.cafeMenuList[0] + + cafeMenuService.updateInfoAndBulkUpdate( + menuId = cafeMenu.id, + cafeId = cafeMenu.cafe!!.id, + resource = CafeMenuUpdateRequest(name = "updated_name", price = cafeMenu.price) + ) + } + + @Test + @Transactional + fun deleteTest() { + cafeMenuRepository.deleteById(100L) + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 9cb91c7..d48b0c1 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -28,7 +28,7 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성 테스트") fun create_cafe_test() { // given - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val savedMockCafeId = 100L `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) @@ -37,7 +37,7 @@ internal class CafeServiceTest { } // when - val savedCafeId = mockCafeService.createCafe( + val savedCafeId = mockCafeService.createNew( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, phoneNumber = cafeRequestDto.phoneNumber!!, @@ -56,7 +56,7 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") fun fail_create_cafe_when_existed() { // given - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, @@ -70,7 +70,7 @@ internal class CafeServiceTest { // then assertThrows { // when - mockCafeService.createCafe( + mockCafeService.createNew( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, phoneNumber = cafeRequestDto.phoneNumber!!, @@ -86,7 +86,7 @@ internal class CafeServiceTest { @DisplayName("카페 정보 변경 테스트") fun update_cafe_test() { // given - val cafeRequestDto = CafeTestUtils.createCafeRequestDto() + val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() val cafe = Cafe.createCafe( name = cafeRequestDto.name!!, address = cafeRequestDto.address!!, @@ -100,7 +100,7 @@ internal class CafeServiceTest { `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) // then - mockCafeService.updateCafe( + mockCafeService.updateInfo( id = cafeId, name = "", address = "", @@ -122,7 +122,7 @@ internal class CafeServiceTest { `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.empty()) assertThrows { - mockCafeService.updateCafe( + mockCafeService.updateInfo( id = cafeId, name = "", address = "", diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index e7c88af..c01e7e3 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -61,7 +61,7 @@ class CafeTestUtils { } } - fun createCafeRequestDto(): CafeRegisterRequest { + fun createCafeRegisterRequest(): CafeRegisterRequest { val cafeName = "beanie_cafe" val cafeAddress = "beanie_cafe_address" val phoneNumber = "01012345678" From f798e278b8e40b9884ca394fce4cbba3e008cce1 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Sat, 24 Sep 2022 22:08:10 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[#15]=20feat:=20=EC=B9=B4=ED=8E=98=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카페 메뉴 관련 조회 로직 mock 테스트 작성(CafeMenuService) - CafeMenuSerivce 트랜잭션 선언 수정 - TODO 내용 추가 작성 --- .../domain/cafe/service/CafeMenuService.kt | 6 +- .../cafe/service/CafeMenuServiceTest.kt | 123 ++++++++++++------ .../domain/cafe/service/CafeServiceTest.kt | 105 ++++++++------- .../domain/cafe/utils/CafeMenuTestUtils.kt | 98 ++++++++++++++ .../domain/cafe/utils/CafeTestUtils.kt | 82 +++--------- 5 files changed, 251 insertions(+), 163 deletions(-) create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index 37545cc..ee4b91c 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -9,11 +9,12 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @Service -@Transactional(readOnly = true) +@Transactional class CafeMenuService( private val cafeMenuRepository: CafeMenuRepository, private val menuOptionService: MenuOptionService ) { + @Transactional(readOnly = true) fun getDetailedInfoByMenuId(menuId: Long, cafeId: Long): CafeMenuDetailedInfo { val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) @@ -21,7 +22,6 @@ class CafeMenuService( return CafeMenuDetailedInfo.of(cafeMenu) } - @Transactional fun updateInfoAndBulkUpdate(menuId: Long, cafeId: Long, resource: CafeMenuUpdateRequest) { val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) @@ -31,7 +31,6 @@ class CafeMenuService( menuOptionService.bulkUpdate(resource.menuOptionList) } - @Transactional fun deleteByCafeMenuId(menuId: Long, cafeId: Long) { val cafeMenu = cafeMenuRepository.findByIdOrNull(menuId) ?: throw CafeMenuNotFoundException(menuId = menuId, cafeId = cafeId) @@ -39,7 +38,6 @@ class CafeMenuService( cafeMenuRepository.delete(cafeMenu) } - @Transactional fun bulkDelete(cafeId: Long, cafeMenuIdList: List) { cafeMenuIdList.forEach { deleteByCafeMenuId(menuId = it, cafeId = cafeId) diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt index 2dea392..28281fe 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt @@ -1,57 +1,96 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest +import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu +import io.beaniejoy.dongnecafe.domain.cafe.error.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository -import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository -import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils -import org.junit.jupiter.api.BeforeEach +import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository +import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository +import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeMenuTestUtils +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.test.annotation.Rollback -import org.springframework.transaction.annotation.Transactional +import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.api.extension.ExtendWith +import org.mockito.InjectMocks +import org.mockito.Mock +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.junit.jupiter.MockitoExtension +import java.util.* -@SpringBootTest +@ExtendWith(MockitoExtension::class) internal class CafeMenuServiceTest { - @Autowired - lateinit var cafeMenuRepository: CafeMenuRepository - @Autowired - lateinit var cafeRepository: CafeRepository - @Autowired - lateinit var cafeMenuService: CafeMenuService + @Mock + lateinit var mockCafeMenuRepository: CafeMenuRepository - @BeforeEach - fun setup() { - val cafeRegisterRequest = CafeTestUtils.createCafeRegisterRequest() + @Mock + lateinit var mockMenuOptionRepository: MenuOptionRepository - cafeRepository.save( - Cafe.createCafe( - name = cafeRegisterRequest.name!!, - address = cafeRegisterRequest.address!!, - phoneNumber = cafeRegisterRequest.phoneNumber!!, - description = cafeRegisterRequest.description!!, - cafeMenuRequestList = cafeRegisterRequest.cafeMenuList - ) + @Mock + lateinit var mockOptionDetailRepository: OptionDetailRepository + + @Mock + lateinit var mockOptionDetailService: OptionDetailService + + @Mock + lateinit var mockMenuOptionService: MenuOptionService + + @InjectMocks + lateinit var mockCafeMenuService: CafeMenuService + + + + + @Test + @DisplayName("카페 메뉴 ID를 통한 카페 메뉴 상세 조회") + fun find_cafe_menu_by_cafe_menu_id() { + // given + val (name, price, menuOptionList) = CafeMenuTestUtils.createCafeMenuRegisterRequest() + val cafeMenu = CafeMenu.createCafeMenu( + name = name!!, + price = price, + menuOptionRequestList = menuOptionList ) + + val findCafeId = 100L + val findCafeMenuId = 1001L + + `when`(mockCafeMenuRepository.findById(findCafeMenuId)) + .thenReturn(Optional.of(cafeMenu.apply { + // cafe_menu_id Reflection 주입 + CafeMenuTestUtils.injectCafeMenuId(this, findCafeMenuId) + })) + + // when + val cafeMenuDetailedInfo = mockCafeMenuService.getDetailedInfoByMenuId(findCafeMenuId, findCafeId) + + // then + verify(mockCafeMenuRepository).findById(findCafeMenuId) + + cafeMenuDetailedInfo.also { + assertEquals(findCafeMenuId, it.cafeMenuId) + assertEquals(name, it.name) + assertEquals(price, it.price) + // TODO: MenuOption list도 비교 검증해야되는지 + } } @Test - @Transactional - @Rollback(false) - fun updateTest() { - val cafeMenu = cafeRepository.findByName("beanie_cafe")!!.cafeMenuList[0] + @DisplayName("존재하지 않는 카페 조회에 대한 예외 발생 테스트") + fun find_cafe_menu_by_cafe_menu_id_when_not_existed() { + // given + val findCafeId = 100L + val findCafeMenuId = 1001L + `when`(mockCafeMenuRepository.findById(findCafeMenuId)).thenReturn(Optional.empty()) - cafeMenuService.updateInfoAndBulkUpdate( - menuId = cafeMenu.id, - cafeId = cafeMenu.cafe!!.id, - resource = CafeMenuUpdateRequest(name = "updated_name", price = cafeMenu.price) - ) - } + // then + val exception = assertThrows { + // when + mockCafeMenuService.getDetailedInfoByMenuId(findCafeMenuId, findCafeId) + } - @Test - @Transactional - fun deleteTest() { - cafeMenuRepository.deleteById(100L) + assertEquals("Cafe[${findCafeId}]의 Menu[${findCafeMenuId}]는 존재하지 않는 메뉴입니다.", exception.message) + + verify(mockCafeMenuRepository).findById(findCafeMenuId) } -} \ No newline at end of file +} diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index d48b0c1..233af8d 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -15,6 +15,7 @@ import org.mockito.junit.jupiter.MockitoExtension import java.util.* import javax.persistence.GeneratedValue +// TODO: BDD 스타일로 리팩토링 해볼 것(추후 mockK도 사용해보자) @ExtendWith(MockitoExtension::class) @TestMethodOrder(MethodOrderer.DisplayName::class) internal class CafeServiceTest { @@ -28,25 +29,25 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성 테스트") fun create_cafe_test() { // given - val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() + val (name, address, phoneNumber, description, cafeMenuList) = CafeTestUtils.createCafeRegisterRequest() val savedMockCafeId = 100L - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(null) + `when`(mockCafeRepository.findByName(name!!)).thenReturn(null) `when`(mockCafeRepository.save(any(Cafe::class.java))).thenAnswer { - injectCafeId(it.getArgument(0), savedMockCafeId) + CafeTestUtils.injectCafeId(it.getArgument(0), savedMockCafeId) } // when val savedCafeId = mockCafeService.createNew( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList + name = name, + address = address!!, + phoneNumber = phoneNumber!!, + description = description!!, + cafeMenuRequestList = cafeMenuList ) // then - verify(mockCafeRepository).findByName(cafeRequestDto.name!!) // TODO eq 에러 발생 이유 + verify(mockCafeRepository).findByName(name) // TODO eq 에러 발생 이유 verify(mockCafeRepository).save(any(Cafe::class.java)) assertEquals(savedCafeId, savedMockCafeId) @@ -56,61 +57,74 @@ internal class CafeServiceTest { @DisplayName("카페 신규 생성시 이미 존재하는 카페 예외 발생 테스트") fun fail_create_cafe_when_existed() { // given - val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() + val (name, address, phoneNumber, description, cafeMenuList) = CafeTestUtils.createCafeRegisterRequest() val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList + name = name!!, + address = address!!, + phoneNumber = phoneNumber!!, + description = description!!, + cafeMenuRequestList = cafeMenuList ) - `when`(mockCafeRepository.findByName(cafeRequestDto.name!!)).thenReturn(cafe) + `when`(mockCafeRepository.findByName(name)).thenReturn(cafe) // then assertThrows { // when mockCafeService.createNew( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList + name = name, + address = address, + phoneNumber = phoneNumber, + description = description, + cafeMenuRequestList = cafeMenuList ) } - verify(mockCafeRepository).findByName(cafeRequestDto.name!!) + verify(mockCafeRepository).findByName(name) } @Test @DisplayName("카페 정보 변경 테스트") fun update_cafe_test() { // given - val cafeRequestDto = CafeTestUtils.createCafeRegisterRequest() + val (name, address, phoneNumber, description, cafeMenuList) = CafeTestUtils.createCafeRegisterRequest() val cafe = Cafe.createCafe( - name = cafeRequestDto.name!!, - address = cafeRequestDto.address!!, - phoneNumber = cafeRequestDto.phoneNumber!!, - description = cafeRequestDto.description!!, - cafeMenuRequestList = cafeRequestDto.cafeMenuList + name = name!!, + address = address!!, + phoneNumber = phoneNumber!!, + description = description!!, + cafeMenuRequestList = cafeMenuList ) val cafeId = 50L // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(cafe)) + val mockCafe = mock(Cafe::class.java) + `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(mockCafe)) - // then - mockCafeService.updateInfo( - id = cafeId, - name = "", - address = "", - phoneNumber = "", - description = "", + doNothing().`when`(mockCafe).updateInfo( + name = anyString(), + address = anyString(), + phoneNumber = anyString(), + description = anyString() ) - verify(mockCafeRepository).findById(eq(cafeId)) + // when + mockCafeService.updateInfo( + id = cafeId, + name = "updated_name", + address = "updated_address", + phoneNumber = "updated_phoneNumber", + description = "updated_desc" + ) - // TODO update TEST 방법? + // then + verify(mockCafeRepository).findById(eq(cafeId)) + verify(mockCafe).updateInfo( + name = "updated_name", + address = "updated_address", + phoneNumber = "updated_phoneNumber", + description = "updated_desc" + ) } @Test @@ -131,19 +145,4 @@ internal class CafeServiceTest { ) } } - - private fun injectCafeId( - cafe: Cafe, - newCafeId: Long, - ): Cafe { - val idField = cafe.javaClass.declaredFields - .find { f -> - f.getAnnotation(GeneratedValue::class.java) != null - } ?: return cafe - - idField.isAccessible = true - idField.set(cafe, newCafeId) - - return cafe - } } \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt new file mode 100644 index 0000000..7522c2b --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt @@ -0,0 +1,98 @@ +package io.beaniejoy.dongnecafe.domain.cafe.utils + +import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu +import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption +import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail +import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest +import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest +import org.junit.jupiter.api.Assertions +import java.math.BigDecimal +import javax.persistence.GeneratedValue + +class CafeMenuTestUtils { + companion object { + fun createCafeMenuRegisterRequest(): CafeMenuRegisterRequest { + return createCafeMenuRegisterRequestList()[0] + } + + fun createCafeMenuRegisterRequestList(): List { + val sizeOptionDetailList = listOf( + OptionDetailRegisterRequest(name = "medium", extraPrice = BigDecimal.ZERO), + OptionDetailRegisterRequest(name = "large", extraPrice = BigDecimal.valueOf(200L)), + OptionDetailRegisterRequest(name = "venti", extraPrice = BigDecimal.valueOf(700L)) + ) + val sizeMenuOption = MenuOptionRegisterRequest( + title = "size", + optionDetailList = sizeOptionDetailList + ) + + return listOf( + CafeMenuRegisterRequest( + name = "menu1", + price = BigDecimal.valueOf(2_800L), + menuOptionList = listOf(sizeMenuOption) + ), + CafeMenuRegisterRequest( + name = "menu2", + price = BigDecimal.valueOf(3_500L), + menuOptionList = listOf(sizeMenuOption) + ), + ) + } + + fun assertCafeMenuListEquals( + cafeMenuRequestList: List, + cafeMenuList: List, + ) { + for (index in cafeMenuRequestList.indices) { + Assertions.assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) + Assertions.assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) + + assertMenuOptionListEquals( + cafeMenuRequestList[index].menuOptionList, + cafeMenuList[index].menuOptionList + ) + } + } + + private fun assertMenuOptionListEquals( + menuOptionRequestList: List, + menuOptionList: List, + ) { + for (index in menuOptionRequestList.indices) { + Assertions.assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) + + assertOptionDetailListEquals( + menuOptionRequestList[index].optionDetailList, + menuOptionList[index].optionDetailList + ) + } + } + + private fun assertOptionDetailListEquals( + optionDetailRequestList: List, + optionDetailList: MutableList, + ) { + for (index in optionDetailRequestList.indices) { + Assertions.assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) + Assertions.assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) + } + } + + fun injectCafeMenuId( + cafeMenu: CafeMenu, + newCafeMenuId: Long, + ): CafeMenu { + val idField = cafeMenu.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return cafeMenu + + idField.isAccessible = true + idField.set(cafeMenu, newCafeMenuId) + + return cafeMenu + } + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt index c01e7e3..66d3d2a 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeTestUtils.kt @@ -10,6 +10,7 @@ import io.beaniejoy.dongnecafe.domain.cafe.entity.MenuOption import io.beaniejoy.dongnecafe.domain.cafe.entity.OptionDetail import org.junit.jupiter.api.Assertions.* import java.math.BigDecimal +import javax.persistence.GeneratedValue class CafeTestUtils { companion object { @@ -19,46 +20,7 @@ class CafeTestUtils { assertEquals(request.phoneNumber, entity.phoneNumber) assertEquals(request.description, entity.description) - assertCafeMenuListEquals(request.cafeMenuList, entity.cafeMenuList) - } - - private fun assertCafeMenuListEquals( - cafeMenuRequestList: List, - cafeMenuList: List, - ) { - for (index in cafeMenuRequestList.indices) { - assertEquals(cafeMenuRequestList[index].name, cafeMenuList[index].name) - assertEquals(cafeMenuRequestList[index].price, cafeMenuList[index].price) - - assertMenuOptionListEquals( - cafeMenuRequestList[index].menuOptionList, - cafeMenuList[index].menuOptionList - ) - } - } - - private fun assertMenuOptionListEquals( - menuOptionRequestList: List, - menuOptionList: List, - ) { - for (index in menuOptionRequestList.indices) { - assertEquals(menuOptionRequestList[index].title, menuOptionList[index].title) - - assertOptionDetailListEquals( - menuOptionRequestList[index].optionDetailList, - menuOptionList[index].optionDetailList - ) - } - } - - private fun assertOptionDetailListEquals( - optionDetailRequestList: List, - optionDetailList: MutableList, - ) { - for (index in optionDetailRequestList.indices) { - assertEquals(optionDetailRequestList[index].name, optionDetailList[index].name) - assertEquals(optionDetailRequestList[index].extraPrice, optionDetailList[index].extraPrice) - } + CafeMenuTestUtils.assertCafeMenuListEquals(request.cafeMenuList, entity.cafeMenuList) } fun createCafeRegisterRequest(): CafeRegisterRequest { @@ -67,36 +29,28 @@ class CafeTestUtils { val phoneNumber = "01012345678" val description = "beanie_cafe_description" - val sizeOptionDetailList = listOf( - OptionDetailRegisterRequest(name = "medium", extraPrice = BigDecimal.ZERO), - OptionDetailRegisterRequest(name = "large", extraPrice = BigDecimal.valueOf(200L)), - OptionDetailRegisterRequest(name = "venti", extraPrice = BigDecimal.valueOf(700L)) - ) - val sizeMenuOption = MenuOptionRegisterRequest( - title = "size", - optionDetailList = sizeOptionDetailList - ) - - val cafeMenuList = listOf( - CafeMenuRegisterRequest( - name = "menu1", - price = BigDecimal.valueOf(2_800L), - menuOptionList = listOf(sizeMenuOption) - ), - CafeMenuRegisterRequest( - name = "menu2", - price = BigDecimal.valueOf(3_500L), - menuOptionList = listOf(sizeMenuOption) - ), - ) - return CafeRegisterRequest( name = cafeName, address = cafeAddress, phoneNumber = phoneNumber, description = description, - cafeMenuList = cafeMenuList + cafeMenuList = CafeMenuTestUtils.createCafeMenuRegisterRequestList() ) } + + fun injectCafeId( + cafe: Cafe, + newCafeId: Long, + ): Cafe { + val idField = cafe.javaClass.declaredFields + .find { f -> + f.getAnnotation(GeneratedValue::class.java) != null + } ?: return cafe + + idField.isAccessible = true + idField.set(cafe, newCafeId) + + return cafe + } } } \ No newline at end of file From 5d5309669cc41db96ce69feaf33ebcdb356895be Mon Sep 17 00:00:00 2001 From: Hanbin Lee Date: Mon, 3 Oct 2022 14:15:35 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[#15]=20feat:=20=EC=B9=B4=ED=8E=98=20?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EA=B4=80=EB=A0=A8=20JPA=20=EC=88=98?= =?UTF-8?q?=ED=96=89=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카페 메뉴 관련 JPA 수행 테스트 - JPA update시 dynamic update 기능 적용 테스트(추후 변경) --- .../dongnecafe/domain/cafe/entity/CafeMenu.kt | 2 +- .../domain/cafe/entity/MenuOption.kt | 2 + .../domain/cafe/entity/OptionDetail.kt | 2 + .../service/CafeMenuServiceIntegratedTest.kt | 62 +++++++++++++++++++ .../cafe/service/CafeMenuServiceTest.kt | 3 - .../domain/cafe/service/CafeServiceTest.kt | 6 +- .../domain/cafe/utils/CafeMenuTestUtils.kt | 22 +++++-- 7 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index 7c9c7e6..faa84d4 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -7,9 +7,9 @@ import org.hibernate.annotations.DynamicUpdate import java.math.BigDecimal import javax.persistence.* +@DynamicUpdate @Entity @Table(name = "cafe_menu") -@DynamicUpdate class CafeMenu protected constructor( name: String, price: BigDecimal, diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index e63795a..b437837 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -2,8 +2,10 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest +import org.hibernate.annotations.DynamicUpdate import javax.persistence.* +@DynamicUpdate @Entity @Table(name = "menu_option") class MenuOption protected constructor( diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index 6bf8b70..998d149 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -1,9 +1,11 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity +import org.hibernate.annotations.DynamicUpdate import java.math.BigDecimal import javax.persistence.* +@DynamicUpdate @Entity @Table(name = "option_detail") class OptionDetail protected constructor( diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt new file mode 100644 index 0000000..59b9b89 --- /dev/null +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceIntegratedTest.kt @@ -0,0 +1,62 @@ +package io.beaniejoy.dongnecafe.domain.cafe.service + +import io.beaniejoy.dongnecafe.domain.cafe.model.request.* +import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import java.math.BigDecimal + +@SpringBootTest +class CafeMenuServiceIntegratedTest { + @Autowired + lateinit var cafeService: CafeService + + @Autowired + lateinit var cafeMenuService: CafeMenuService + + @Test + fun update_info_and_bulk_update_menu_options() { + val cafeRegisterRequest = CafeTestUtils.createCafeRegisterRequest() + + val savedCafeId = cafeService.createNew( + name = cafeRegisterRequest.name!!, + address = cafeRegisterRequest.address!!, + phoneNumber = cafeRegisterRequest.phoneNumber!!, + description = cafeRegisterRequest.description!!, + cafeMenuRequestList = cafeRegisterRequest.cafeMenuList + ) + + val cafeDetailedInfo = cafeService.getDetailedInfoByCafeId(savedCafeId) + + val cafeMenuUpdateRequest = cafeMenuService.getDetailedInfoByMenuId( + menuId = cafeDetailedInfo.menuList[0].cafeMenuId, + cafeId = cafeDetailedInfo.cafeId + ).let { + CafeMenuUpdateRequest( + name = "menu2 update", + price = it.price, + menuOptionList = listOf(it.optionList[1].let { menuOption -> + MenuOptionUpdateRequest( + menuOptionId = menuOption.menuOptionId, + title = "샷 update", + optionDetailList = menuOption.optionDetailList.mapIndexed { index, optionDetail -> + OptionDetailUpdateRequest( + optionDetailId = optionDetail.optionDetailId, + name = optionDetail.name!!, + extraPrice = BigDecimal("${index}000"), + isDelete = index == 0 + ) + } + ) + }) + ) + } + + cafeMenuService.updateInfoAndBulkUpdate( + menuId = cafeDetailedInfo.menuList[1].cafeMenuId, + cafeId = cafeDetailedInfo.cafeId, + resource = cafeMenuUpdateRequest + ) + } +} \ No newline at end of file diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt index 28281fe..361267a 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt @@ -38,9 +38,6 @@ internal class CafeMenuServiceTest { @InjectMocks lateinit var mockCafeMenuService: CafeMenuService - - - @Test @DisplayName("카페 메뉴 ID를 통한 카페 메뉴 상세 조회") fun find_cafe_menu_by_cafe_menu_id() { diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 233af8d..5779f9c 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -97,9 +97,9 @@ internal class CafeServiceTest { ) val cafeId = 50L - // TODO findByIdOrNull은 kotlin test 라이브러리 필요한 듯 + // TODO 'findByIdOrNull'은 kotlin test 라이브러리 필요한 듯 val mockCafe = mock(Cafe::class.java) - `when`(mockCafeRepository.findById(cafeId)).thenReturn(Optional.of(mockCafe)) + doReturn(Optional.of(cafe)).`when`(mockCafeRepository.findById(eq(cafeId))) doNothing().`when`(mockCafe).updateInfo( name = anyString(), @@ -110,7 +110,7 @@ internal class CafeServiceTest { // when mockCafeService.updateInfo( - id = cafeId, + id = eq(cafeId), name = "updated_name", address = "updated_address", phoneNumber = "updated_phoneNumber", diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt index 7522c2b..a700fde 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/utils/CafeMenuTestUtils.kt @@ -19,23 +19,33 @@ class CafeMenuTestUtils { fun createCafeMenuRegisterRequestList(): List { val sizeOptionDetailList = listOf( OptionDetailRegisterRequest(name = "medium", extraPrice = BigDecimal.ZERO), - OptionDetailRegisterRequest(name = "large", extraPrice = BigDecimal.valueOf(200L)), - OptionDetailRegisterRequest(name = "venti", extraPrice = BigDecimal.valueOf(700L)) + OptionDetailRegisterRequest(name = "large", extraPrice = BigDecimal("200")), + OptionDetailRegisterRequest(name = "venti", extraPrice = BigDecimal("700")) ) + val shotOptionDetailList = listOf( + OptionDetailRegisterRequest(name = "기본", extraPrice = BigDecimal.ZERO), + OptionDetailRegisterRequest(name = "샷 1 추가", extraPrice = BigDecimal("500")), + OptionDetailRegisterRequest(name = "샷 2 추가", extraPrice = BigDecimal("1000")), + ) + val sizeMenuOption = MenuOptionRegisterRequest( - title = "size", + title = "사이즈", optionDetailList = sizeOptionDetailList ) + val shotMenuOption = MenuOptionRegisterRequest( + title = "샷", + optionDetailList = shotOptionDetailList + ) return listOf( CafeMenuRegisterRequest( name = "menu1", - price = BigDecimal.valueOf(2_800L), - menuOptionList = listOf(sizeMenuOption) + price = BigDecimal("2800"), + menuOptionList = listOf(sizeMenuOption, shotMenuOption) ), CafeMenuRegisterRequest( name = "menu2", - price = BigDecimal.valueOf(3_500L), + price = BigDecimal("3500"), menuOptionList = listOf(sizeMenuOption) ), ) From 3cbf8c23ab327a11e5eea641a2af4aba25176f2d Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Mon, 3 Oct 2022 18:11:28 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[#15]=20modify:=20update=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20dynamic=20=EB=82=B4=EC=9A=A9=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dynamic update 기능 제거(성능 관련 추후 살펴보기) - Todo 주석 추가 --- .../io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt | 3 --- .../io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt | 2 -- .../io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt | 2 -- .../dongnecafe/domain/cafe/service/CafeMenuService.kt | 3 +++ .../dongnecafe/domain/cafe/service/CafeServiceTest.kt | 1 - 5 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt index faa84d4..92b8299 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/CafeMenu.kt @@ -2,12 +2,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionRegisterRequest -import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest -import org.hibernate.annotations.DynamicUpdate import java.math.BigDecimal import javax.persistence.* -@DynamicUpdate @Entity @Table(name = "cafe_menu") class CafeMenu protected constructor( diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt index b437837..e63795a 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/MenuOption.kt @@ -2,10 +2,8 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailRegisterRequest -import org.hibernate.annotations.DynamicUpdate import javax.persistence.* -@DynamicUpdate @Entity @Table(name = "menu_option") class MenuOption protected constructor( diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt index 998d149..6bf8b70 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/entity/OptionDetail.kt @@ -1,11 +1,9 @@ package io.beaniejoy.dongnecafe.domain.cafe.entity import io.beaniejoy.dongnecafe.common.entity.BaseTimeEntity -import org.hibernate.annotations.DynamicUpdate import java.math.BigDecimal import javax.persistence.* -@DynamicUpdate @Entity @Table(name = "option_detail") class OptionDetail protected constructor( diff --git a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index ee4b91c..bf40940 100644 --- a/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/src/main/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -8,6 +8,9 @@ import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +// TODO +// - cafeMenu에 대한 생성, 수정, 삭제를 단일 카페 상세 페이지 내에서 한꺼번에 수행할지 고민 +// - front 개발 후에 CafeMenu에 대한 전체적인 로직 수정이 필요해 보임 @Service @Transactional class CafeMenuService( diff --git a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 5779f9c..6855a8c 100644 --- a/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/src/test/java/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -13,7 +13,6 @@ import org.mockito.Mock import org.mockito.Mockito.* import org.mockito.junit.jupiter.MockitoExtension import java.util.* -import javax.persistence.GeneratedValue // TODO: BDD 스타일로 리팩토링 해볼 것(추후 mockK도 사용해보자) @ExtendWith(MockitoExtension::class)