Merge branch 'master' into 버그픽스_상범
This commit is contained in:
@@ -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']
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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<FavoriteStore,Long> {
|
||||
|
||||
Optional<FavoriteStore> findByUserIdAndStore(Long userId, Store store);
|
||||
}
|
||||
|
||||
@@ -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<FavoriteStore> byUserIdAndStore = favoriteStoreRepository
|
||||
.findByUserIdAndStore(userId, store);
|
||||
|
||||
if(byUserIdAndStore.isPresent()){
|
||||
return new GetFavoriteStoreByStoreIdDto(userId,storeId, true);
|
||||
}else {
|
||||
return new GetFavoriteStoreByStoreIdDto(userId,storeId, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -48,24 +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)
|
||||
)
|
||||
.limit(pageable.getPageSize())
|
||||
.offset(pageable.getOffset())
|
||||
.fetchOne();
|
||||
|
||||
//List 가져오기
|
||||
List<Item> 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())
|
||||
|
||||
@@ -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));
|
||||
});
|
||||
|
||||
@@ -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("매장 고유 번호")
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user