From 2dadf5da7d361f5797586aa3eade6aaa2bc6996b Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 17 Mar 2022 15:31:16 +0900 Subject: [PATCH 01/11] =?UTF-8?q?fix(store-service):=20menu=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - count 조회시 잘못된 코드 수정 --- .../domain/item/repository/ItemRepositoryCustom.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java index 300a870..c5b5b7e 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java @@ -54,8 +54,6 @@ public class ItemRepositoryCustom { QItem.item.name.contains(word) .or(QItem.item.category.name.contains(word)) ) - .limit(pageable.getPageSize()) - .offset(pageable.getOffset()) .fetchOne(); //List 가져오기 From 19188537918e951ea0f80ec26e6b7851f7d32838 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 17 Mar 2022 15:56:04 +0900 Subject: [PATCH 02/11] =?UTF-8?q?fix(store-service):=20item=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=8B=9C=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - item 수정시 버그 수정 --- owner-vue/src/api/store.js | 2 +- owner-vue/src/components/MenuItem.vue | 1 + .../storeservice/domain/item/service/ItemServiceImpl.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/owner-vue/src/api/store.js b/owner-vue/src/api/store.js index 5318ec1..ccdbb0b 100644 --- a/owner-vue/src/api/store.js +++ b/owner-vue/src/api/store.js @@ -20,7 +20,7 @@ export default { return axios.get(process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/api/owner/item/'+itemId) }, saveItem(method, itemData){ - const _url = process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/api/owner/item'+(method==='put'?+"/"+itemData.itemId:'') + const _url = process.env.VUE_APP_OWNER_SERVICE_BASEURL+'/store-service/api/owner/item'+(method==='put'? "/"+itemData.itemId:'') console.log(_url) return axios({ method:method, diff --git a/owner-vue/src/components/MenuItem.vue b/owner-vue/src/components/MenuItem.vue index 72a8b89..3afd27f 100644 --- a/owner-vue/src/components/MenuItem.vue +++ b/owner-vue/src/components/MenuItem.vue @@ -163,6 +163,7 @@ export default { }, methods:{ save : function () { + this.dialog =false this.$emit('save') }, addItemOption : function (itemOptionValue,optionType){ diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java index 98db5a1..f7ec48c 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/service/ItemServiceImpl.java @@ -91,7 +91,7 @@ public class ItemServiceImpl implements ItemService { itemOptionDtos .forEach(itemOptionDto -> { - if(itemOptionDto.getId()==null) return; + if(itemOptionDto.getId()!=null) return; if (itemOptionRepository.existsById(itemOptionDto.getId())) itemOptionRepository.save(ItemOptionDto.createItemOption(itemOptionDto, item)); }); From 2186fed25a4601841bc2e0ecc24a49da4c20ab9f Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 17 Mar 2022 16:29:31 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix(store-service):=20menu=20item=20list?= =?UTF-8?q?=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - menu item list 얻어올 시 storeId가 없는것 까지 outer 조인으로 얻어오는 로직 수정 --- .../domain/item/repository/ItemRepositoryCustom.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java index c5b5b7e..78796bf 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/item/repository/ItemRepositoryCustom.java @@ -48,22 +48,22 @@ public class ItemRepositoryCustom { Long count = queryFactory.select(QItem.item.count()) .from(QItem.item) .join(QItem.item.category) - .leftJoin(QItem.item.store) - .on(QItem.item.store.userId.eq(userId)) + .join(QItem.item.store) .where( QItem.item.name.contains(word) - .or(QItem.item.category.name.contains(word)) + .or(QItem.item.category.name.contains(word)), + QItem.item.store.userId.eq(userId) ) .fetchOne(); //List 가져오기 List itemList = queryFactory.selectFrom(QItem.item) .join(QItem.item.category).fetchJoin() - .leftJoin(QItem.item.store) - .on(QItem.item.store.id.eq(userId)) + .join(QItem.item.store) .where( QItem.item.name.contains(word) - .or(QItem.item.category.name.contains(word)) + .or(QItem.item.category.name.contains(word)), + QItem.item.store.userId.eq(userId) ) .limit(pageable.getPageSize()) .offset(pageable.getOffset()) From f85e23f374ef68851fff4433782500fb8268819d Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 17 Mar 2022 16:52:41 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat(owner-vue):=20side-bar=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - side bar menu이동 개발 --- owner-vue/src/views/Layout/Sidebar.vue | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/owner-vue/src/views/Layout/Sidebar.vue b/owner-vue/src/views/Layout/Sidebar.vue index 384062f..7607baa 100644 --- a/owner-vue/src/views/Layout/Sidebar.vue +++ b/owner-vue/src/views/Layout/Sidebar.vue @@ -5,20 +5,9 @@ app> -
- - - -

Web Burden

-
-
+ class="px-7 mx-7" + :src="require('@/assets/just-logo.png')" + contain/> @@ -41,10 +30,10 @@ export default { data() { return { links: [ - {name: "지난 주문", url: "/prev-order", icon: "mdi-home-outline"}, - {name: "카테고리", url: "/category", icon: "mdi-magnify"}, - {name: "주문", url: "/order", icon: "mdi-cards-heart-outline"}, - {name: "메뉴 관리", url: "/menu", icon: "mdi-cards-heart-outline"}, + {name: "지난 주문", url: "/prev-order", icon: "mdi-clipboard-check-outline"}, + {name: "카테고리", url: "/category", icon: "mdi-shape-outline"}, + {name: "주문", url: "/order", icon: "mdi-order-numeric-ascending"}, + {name: "메뉴 관리", url: "/menu", icon: "mdi-cog-outline"}, ], }; }, From 0fe7f368119942182ad555b04c5927586b939708 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Thu, 17 Mar 2022 17:08:32 +0900 Subject: [PATCH 05/11] =?UTF-8?q?feat(owner-vue):=20side-bar=20=ED=96=84?= =?UTF-8?q?=EB=B2=84=EA=B1=B0=20=EB=B2=84=ED=8A=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 햄버거 버튼 클릭시 side bar 열리는 이벤트 --- owner-vue/src/views/Layout/DashboardLayout.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owner-vue/src/views/Layout/DashboardLayout.vue b/owner-vue/src/views/Layout/DashboardLayout.vue index ea79710..f43f1d6 100644 --- a/owner-vue/src/views/Layout/DashboardLayout.vue +++ b/owner-vue/src/views/Layout/DashboardLayout.vue @@ -1,7 +1,7 @@ From 2e2526305eaca9bfd7427e0becdbcdf1dd3d1166 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Fri, 18 Mar 2022 17:05:30 +0900 Subject: [PATCH 10/11] =?UTF-8?q?feat(customer=20vue=20,=20store=20service?= =?UTF-8?q?):=20favorite=20store=20=EB=93=B1=EB=A1=9D=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - favorite store 등록 및 취소 로직 추가 --- customer-vue/src/api/store.js | 7 +++ .../src/components/StoreNavigation.vue | 57 ++++++++++++++++++- customer-vue/src/views/ItemDetail.vue | 17 +++++- customer-vue/src/views/OrderPage.vue | 6 +- .../dto/GetFavoriteStoreByStoreIdDto.java | 14 +++++ .../repository/FavoriteStoreRepository.java | 5 ++ .../service/FavoriteStoreService.java | 55 ++++++++++++++++++ .../FavoriteStoreCustomerApiController.java | 40 +++++++++++++ 8 files changed, 192 insertions(+), 9 deletions(-) create mode 100644 store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/dto/GetFavoriteStoreByStoreIdDto.java create mode 100644 store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/service/FavoriteStoreService.java create mode 100644 store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiController.java diff --git a/customer-vue/src/api/store.js b/customer-vue/src/api/store.js index 90062da..e67e52f 100644 --- a/customer-vue/src/api/store.js +++ b/customer-vue/src/api/store.js @@ -41,5 +41,12 @@ export default { }, requestStore(storeId) { return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL + "/store-service/store/" + storeId); + }, + getFavoriteStoreByStoreId(storeId) { + return axios.get(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL + "/store-service/api/customer/favoriteStore/" + storeId); + }, + markStar(storeId) { + return axios.patch(process.env.VUE_APP_CUSTOMER_SERVICE_BASEURL + "/store-service/api/customer/favoriteStore/" + storeId); } + } \ No newline at end of file diff --git a/customer-vue/src/components/StoreNavigation.vue b/customer-vue/src/components/StoreNavigation.vue index b6e22a7..62f9164 100644 --- a/customer-vue/src/components/StoreNavigation.vue +++ b/customer-vue/src/components/StoreNavigation.vue @@ -15,16 +15,69 @@ {{store.name}} - - mdi-magnify + + {{ favoriteStore.icon }} diff --git a/customer-vue/src/views/ItemDetail.vue b/customer-vue/src/views/ItemDetail.vue index 440397c..1bd15b1 100644 --- a/customer-vue/src/views/ItemDetail.vue +++ b/customer-vue/src/views/ItemDetail.vue @@ -36,6 +36,7 @@ =0? this.setItem.count+v: 0; + this.setItem.count+v >=1? this.setItem.count+v: 1; }, addItem: function(){ + if(!this.validItem()) + return; + orderApi.addItemToBasket(this.setItem) .then(response=>{ console.log(response) @@ -156,7 +160,16 @@ export default { .catch(error=>{ console.log(error.response) }) + }, + validItem(){ + if(this.setItem.count <= 0 || isNaN(this.setItem.count)){ + alert("수량이 잘못되었습니다.") + this.setItem.count =1 + return false + } + } + }, } diff --git a/customer-vue/src/views/OrderPage.vue b/customer-vue/src/views/OrderPage.vue index be4fc9c..b756c9c 100644 --- a/customer-vue/src/views/OrderPage.vue +++ b/customer-vue/src/views/OrderPage.vue @@ -56,11 +56,6 @@ @click="saveOrder" color="primary" >주문하기 - - - - - @@ -90,6 +85,7 @@ export default { orderApi.saveOrder() .then(()=>{ + this.$emit('plusCount') alert('주문되었습니다.') this.$router.push("/history") }) diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/dto/GetFavoriteStoreByStoreIdDto.java b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/dto/GetFavoriteStoreByStoreIdDto.java new file mode 100644 index 0000000..c3b1290 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/dto/GetFavoriteStoreByStoreIdDto.java @@ -0,0 +1,14 @@ +package com.justpickup.storeservice.domain.favoritestore.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class GetFavoriteStoreByStoreIdDto { + + private Long userId; + private Long storeId; + private boolean isExist; + +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/repository/FavoriteStoreRepository.java b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/repository/FavoriteStoreRepository.java index 1fe08b7..845fe30 100644 --- a/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/repository/FavoriteStoreRepository.java +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/repository/FavoriteStoreRepository.java @@ -1,7 +1,12 @@ package com.justpickup.storeservice.domain.favoritestore.repository; import com.justpickup.storeservice.domain.favoritestore.entity.FavoriteStore; +import com.justpickup.storeservice.domain.store.entity.Store; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface FavoriteStoreRepository extends JpaRepository { + + Optional findByUserIdAndStore(Long userId, Store store); } diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/service/FavoriteStoreService.java b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/service/FavoriteStoreService.java new file mode 100644 index 0000000..51ec173 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/service/FavoriteStoreService.java @@ -0,0 +1,55 @@ +package com.justpickup.storeservice.domain.favoritestore.service; + +import com.justpickup.storeservice.domain.favoritestore.dto.GetFavoriteStoreByStoreIdDto; +import com.justpickup.storeservice.domain.favoritestore.entity.FavoriteStore; +import com.justpickup.storeservice.domain.favoritestore.repository.FavoriteStoreRepository; +import com.justpickup.storeservice.domain.store.entity.Store; +import com.justpickup.storeservice.domain.store.exception.NotExistStoreException; +import com.justpickup.storeservice.domain.store.repository.StoreRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; + +@Slf4j +@RequiredArgsConstructor +@Service +public class FavoriteStoreService { + + private final FavoriteStoreRepository favoriteStoreRepository; + private final StoreRepository storeRepository; + + @Transactional + public void patchFavoriteStore(Long userId, Long storeId){ + Store store = storeRepository.findById(storeId) + .orElseThrow(()-> new NotExistStoreException("매장이 존재하지않습니다.")); + + favoriteStoreRepository + .findByUserIdAndStore(userId, store) + .ifPresentOrElse( + favoriteStoreRepository::delete, + ()->favoriteStoreRepository.save(FavoriteStore.of(userId, store)) + ); + + } + + @Transactional + public GetFavoriteStoreByStoreIdDto getFavoriteStoreByStoreId(Long userId, Long storeId){ + Store store = storeRepository.findById(storeId) + .orElseThrow(()-> new NotExistStoreException("매장이 존재하지않습니다.")); + + Optional byUserIdAndStore = favoriteStoreRepository + .findByUserIdAndStore(userId, store); + + if(byUserIdAndStore.isPresent()){ + return new GetFavoriteStoreByStoreIdDto(userId,storeId, true); + }else { + return new GetFavoriteStoreByStoreIdDto(userId,storeId, false); + } + + } + +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiController.java b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiController.java new file mode 100644 index 0000000..f9b1918 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiController.java @@ -0,0 +1,40 @@ +package com.justpickup.storeservice.domain.favoritestore.web; + +import com.justpickup.storeservice.domain.favoritestore.dto.GetFavoriteStoreByStoreIdDto; +import com.justpickup.storeservice.domain.favoritestore.service.FavoriteStoreService; +import com.justpickup.storeservice.global.dto.Result; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@Slf4j +@RequiredArgsConstructor +@RequestMapping("/api/customer/favoriteStore") +public class FavoriteStoreCustomerApiController { + + private final FavoriteStoreService favoriteStoreService; + + @GetMapping("/{storeId}") + public ResponseEntity getFavoriteStoreByStoreId(@RequestHeader(value = "user-id") String userId, @PathVariable Long storeId){ + + GetFavoriteStoreByStoreIdDto favoriteStoreByStoreId = favoriteStoreService.getFavoriteStoreByStoreId(Long.parseLong(userId), storeId); + + return ResponseEntity + .status(HttpStatus.OK) + .body(Result.createSuccessResult(favoriteStoreByStoreId)); + } + + + @PatchMapping("/{storeId}") + public ResponseEntity patchFavoriteStore(@RequestHeader(value = "user-id") String userId, @PathVariable Long storeId){ + + favoriteStoreService.patchFavoriteStore(Long.parseLong(userId),storeId); + + return ResponseEntity + .status(HttpStatus.NO_CONTENT) + .body(Result.success()); + } +} From fe08e1df944d969fdb6865b2cacba672283aa6d9 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Fri, 18 Mar 2022 17:52:49 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat(storeservice):=20favorite=20store?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - favorite store 등록 및 취소 테스트 추가 - favorite store 조회 테스트 추가 --- .../src/components/StoreNavigation.vue | 6 +- store-service/src/docs/asciidoc/api-docs.adoc | 7 +- ...avoriteStoreCustomerApiControllerTest.java | 111 ++++++++++++++++++ 3 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 store-service/src/test/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiControllerTest.java diff --git a/customer-vue/src/components/StoreNavigation.vue b/customer-vue/src/components/StoreNavigation.vue index 62f9164..f772ca6 100644 --- a/customer-vue/src/components/StoreNavigation.vue +++ b/customer-vue/src/components/StoreNavigation.vue @@ -38,7 +38,7 @@ export default { favoriteStore:{ status:true, color:null, - icon: 'mdi-star-outline' + icon: 'mdi-heart-outline' } } }, @@ -64,10 +64,10 @@ export default { if(this.favoriteStore.status){ this.favoriteStore.color = "rgb(255, 152, 0)" - this.favoriteStore.icon = "mdi-star" + this.favoriteStore.icon = "mdi-heart" }else{ this.favoriteStore.color = null - this.favoriteStore.icon = "mdi-star-outline" + this.favoriteStore.icon = "mdi-heart-outline" } this.favoriteStore.status= !this.favoriteStore.status diff --git a/store-service/src/docs/asciidoc/api-docs.adoc b/store-service/src/docs/asciidoc/api-docs.adoc index f080c60..d3fb013 100644 --- a/store-service/src/docs/asciidoc/api-docs.adoc +++ b/store-service/src/docs/asciidoc/api-docs.adoc @@ -75,7 +75,6 @@ operation::items-get[snippets='curl-request,http-request,http-response,path-para == 상품 (판매자) === 상품 조회 -======= === 상품 리스트 조회(구매자) operation::customer-itemList-get[snippets='curl-request,http-request,http-response,path-parameters,response-fields'] @@ -109,3 +108,9 @@ operation::store-get[snippets='curl-request,http-request,http-response,path-para operation::api-get-store-byUserId[snippets='curl-request,http-request,http-response,request-headers,response-fields'] === 매장 리스트 조회 operation::stores-get[snippets='curl-request,http-request,http-response,path-parameters,response-fields'] + +== 즐겨찾는 매장 +=== 즐겨찾는 매장 조회 +operation::get-favoritestore-by-storeid[snippets='curl-request,http-request,http-response,request-headers,path-parameters,response-fields'] +=== 즐겨찾는 매장 추가/삭제 +operation::patch-FavoriteStore[snippets='curl-request,http-request,http-response,request-headers,path-parameters'] \ No newline at end of file diff --git a/store-service/src/test/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiControllerTest.java b/store-service/src/test/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiControllerTest.java new file mode 100644 index 0000000..713f89c --- /dev/null +++ b/store-service/src/test/java/com/justpickup/storeservice/domain/favoritestore/web/FavoriteStoreCustomerApiControllerTest.java @@ -0,0 +1,111 @@ +package com.justpickup.storeservice.domain.favoritestore.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.justpickup.storeservice.config.TestConfig; +import com.justpickup.storeservice.domain.favoritestore.dto.GetFavoriteStoreByStoreIdDto; +import com.justpickup.storeservice.domain.favoritestore.service.FavoriteStoreService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName; +import static org.springframework.restdocs.headers.HeaderDocumentation.requestHeaders; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.patch; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields; +import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; +import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(FavoriteStoreCustomerApiController.class) +@Import(TestConfig.class) +@AutoConfigureRestDocs(uriHost = "just-pickup.com", uriPort = 8000) +class FavoriteStoreCustomerApiControllerTest { + + @Autowired + ObjectMapper objectMapper; + + @Autowired + MockMvc mockMvc; + + @MockBean + FavoriteStoreService favoriteStoreService; + + + @Test + @DisplayName("Get_즐겨찾는 매장") + void getFavoriteStoreByStoreId() throws Exception { + //given + Long userId=1L; + Long storeId=1L; + + BDDMockito.given(favoriteStoreService + .getFavoriteStoreByStoreId(userId,storeId)) + .willReturn( + new GetFavoriteStoreByStoreIdDto(userId,storeId,true)); + + + //when + ResultActions resultActions = mockMvc.perform( + get("/api/customer/favoriteStore/{storeId}",storeId) + .header("user-id", userId)); + + //then + + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andDo(document("get-favoritestore-by-storeid", + requestHeaders( + headerWithName("user-id").description("로그인한 유저 id") + ), + pathParameters( + parameterWithName("storeId").description("매장 고유 번호") + ), + responseFields( + fieldWithPath("code").description("결과 코드 SUCCESS/ERROR"), + fieldWithPath("message").description("메시지"), + fieldWithPath("data.userId").description("유저 고유번호"), + fieldWithPath("data.storeId").description("매장 고유 번호"), + fieldWithPath("data.exist").description("즐겨찾기 매장 존재여부") + )) + ); + } + + @Test + @DisplayName("즐겨찾는 매장 추가 or 제거") + void patchFavoriteStore() throws Exception { + //given + Long userId=1L; + Long storeId=1L; + + //when + ResultActions resultActions = mockMvc.perform( + patch("/api/customer/favoriteStore/{storeId}",storeId) + .header("user-id", userId)); + + //then + + resultActions.andExpect(status().isNoContent()) + .andDo(print()) + .andDo(document("patch-FavoriteStore", + requestHeaders( + headerWithName("user-id").description("로그인한 유저 id") + ), + pathParameters( + parameterWithName("storeId").description("매장 고유 번호") + ) + ) + ); + } + +} \ No newline at end of file