From 2e2526305eaca9bfd7427e0becdbcdf1dd3d1166 Mon Sep 17 00:00:00 2001 From: hoon7566 Date: Fri, 18 Mar 2022 17:05:30 +0900 Subject: [PATCH] =?UTF-8?q?feat(customer=20vue=20,=20store=20service):=20f?= =?UTF-8?q?avorite=20store=20=EB=93=B1=EB=A1=9D=20=EB=B0=8F=20=EC=B7=A8?= =?UTF-8?q?=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()); + } +}