diff --git a/cakey-api/src/main/java/com/cakey/store/dto/StoreInfoListBylikesRes.java b/cakey-api/src/main/java/com/cakey/store/dto/StoreInfoListBylikesRes.java index a4f1e54..0722f2b 100644 --- a/cakey-api/src/main/java/com/cakey/store/dto/StoreInfoListBylikesRes.java +++ b/cakey-api/src/main/java/com/cakey/store/dto/StoreInfoListBylikesRes.java @@ -1,11 +1,7 @@ package com.cakey.store.dto; -import lombok.AccessLevel; -import lombok.Builder; - import java.util.List; -@Builder(access = AccessLevel.PRIVATE) public record StoreInfoListBylikesRes( int nextLikesCursor, Long lastStoreId, diff --git a/cakey-api/src/main/java/com/cakey/store/service/StoreService.java b/cakey-api/src/main/java/com/cakey/store/service/StoreService.java index 6932a5b..82975b8 100644 --- a/cakey-api/src/main/java/com/cakey/store/service/StoreService.java +++ b/cakey-api/src/main/java/com/cakey/store/service/StoreService.java @@ -41,20 +41,20 @@ public StoreInfoListBylikesRes getStoreInfoListByStationAndLikes(final Long user final List storeInfoDtos = storeFacade.findStoreInfoByStationAndLikes(userId, station, likesCursor, lastStoreId, size); // 조회한 store들의 ID 추출 - final List storeIds = getStoreIds(storeInfoDtos); + final List storeIds = storeFacade.getStoreIds(storeInfoDtos); //메인 이미지 map - final Map> mainImageMap = getMainImageMap(storeIds); + final Map> mainImageMap = cakeFacade.getMainImageMap(storeIds); //storInfo 생성 final List storeInfos = getStoreInfo(storeInfoDtos, mainImageMap); //스토어 개수 조회 - final int storeCount = getStoreCount(station); + final int storeCount = storeFacade.getStoreCountByStation(station); final int nextLikesCursor = calculateNextCursor(storeInfoDtos); - final Long LastStoreId = calculateLastStoreId(storeInfoDtos); + final Long LastStoreId = storeFacade.calculateLastStoreId(storeInfoDtos); // StoreInfoListRes 반환 return StoreInfoListBylikesRes.of(nextLikesCursor, LastStoreId, storeCount, storeInfos); @@ -70,19 +70,19 @@ public StoreInfoListByLatest getStoreInfoListByStationAndLatest(final Long userI final List storeInfoDtos = storeFacade.findStoreInfoByStationAndLatest(userId, station, storeIdCursor, size); // 조회한 store들의 ID 추출 - final List storeIds = getStoreIds(storeInfoDtos); + final List storeIds = storeFacade.getStoreIds(storeInfoDtos); //메인 이미지 map - final Map> mainImageMap = getMainImageMap(storeIds); + final Map> mainImageMap = cakeFacade.getMainImageMap(storeIds); //storInfo 생성 final List storeInfos = getStoreInfo(storeInfoDtos, mainImageMap); //스토어 개수 조회 - final int storeCount = getStoreCount(station); + final int storeCount = storeFacade.getStoreCountByStation(station); //마지막 storeID 조회 - final Long LastStoreId = calculateLastStoreId(storeInfoDtos); + final Long LastStoreId = storeFacade.calculateLastStoreId(storeInfoDtos); return StoreInfoListByLatest.of(LastStoreId, storeCount, storeInfos); } @@ -102,10 +102,6 @@ private int calculateNextCursor(final List storeInfoDtos) { return storeInfoDtos.isEmpty() ? -1 : storeInfoDtos.get(storeInfoDtos.size() - 1).getStoreLikesCount(); } - private Long calculateLastStoreId(final List storeInfoDtos) { - return storeInfoDtos.isEmpty() ? null : storeInfoDtos.get(storeInfoDtos.size() - 1).getStoreId(); - } - //스토어 id들 조회 private List getStoreIds(final List storeInfoDtos) { return storeInfoDtos.stream() @@ -113,16 +109,6 @@ private List getStoreIds(final List storeInfoDtos) { .toList(); } - //메인이미지 매핑 - private Map> getMainImageMap(final List storeIds) { - //스토어 대표 이미지 조회 - final List cakeMainImageDtos1 = cakeFacade.findMainImageByStoreIds(storeIds); - - // 이미지를 storeId 기준으로 그룹화 - return cakeMainImageDtos1.stream() - .collect(Collectors.groupingBy(CakeMainImageDto::getStoreId)); - } - //storeInfo 생성 private List getStoreInfo(final List storeInfoDtos, final Map> imageMap) { return storeInfoDtos.stream() @@ -146,11 +132,4 @@ private List getStoreInfo(final List storeInfoDtos, fin }) .toList(); } - - //스토어 개수 조회 - private int getStoreCount(final Station station) { - return (station == Station.ALL) - ? storeFacade.countAllStores() - : storeFacade.countStoresByStation(station); - } } diff --git a/cakey-api/src/main/java/com/cakey/storelikes/controller/StoreLikesController.java b/cakey-api/src/main/java/com/cakey/storelikes/controller/StoreLikesController.java new file mode 100644 index 0000000..45c9764 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/storelikes/controller/StoreLikesController.java @@ -0,0 +1,29 @@ +package com.cakey.storelikes.controller; + +import com.cakey.common.response.ApiResponseUtil; +import com.cakey.common.response.BaseResponse; +import com.cakey.common.response.SuccessCode; +import com.cakey.storelikes.service.StoreLikesService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/v1/store/likes") +@RequiredArgsConstructor +public class StoreLikesController { + private final StoreLikesService storeLikesService; + + @GetMapping("/latest") + public ResponseEntity> getLatestStoreByUserLikes( + @RequestHeader(value = "userId", required = true) final long userId, + @RequestParam(value = "storeIdCursor", defaultValue = "0", required = false) final Long storeIdCursor, + @RequestParam(value = "size", defaultValue = "10", required = false) final int size + ) { + return ApiResponseUtil.success( + SuccessCode.OK, + storeLikesService.getLatestStoreLikesByUser(userId, storeIdCursor, size)); + + } + +} diff --git a/cakey-api/src/main/java/com/cakey/storelikes/dto/StoreLatestLikedByUser.java b/cakey-api/src/main/java/com/cakey/storelikes/dto/StoreLatestLikedByUser.java new file mode 100644 index 0000000..78be290 --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/storelikes/dto/StoreLatestLikedByUser.java @@ -0,0 +1,17 @@ +package com.cakey.storelikes.dto; + +import com.cakey.store.dto.StoreInfo; + +import java.util.List; + +public record StoreLatestLikedByUser( + Long lastStoreId, + long storeCount, + List stores +) { + public static StoreLatestLikedByUser fromStoreInfo(final Long lastStoreId, + final long storeCount, + final List stores) { + return new StoreLatestLikedByUser(lastStoreId, storeCount, stores); + } +} diff --git a/cakey-api/src/main/java/com/cakey/storelikes/service/StoreLikesService.java b/cakey-api/src/main/java/com/cakey/storelikes/service/StoreLikesService.java new file mode 100644 index 0000000..06b3e2f --- /dev/null +++ b/cakey-api/src/main/java/com/cakey/storelikes/service/StoreLikesService.java @@ -0,0 +1,73 @@ +package com.cakey.storelikes.service; + +import com.cakey.cake.dto.CakeMainImageDto; +import com.cakey.cake.facade.CakeFacade; +import com.cakey.store.domain.Station; +import com.cakey.store.dto.StoreInfo; +import com.cakey.store.dto.StoreInfoDto; +import com.cakey.store.facade.StoreFacade; +import com.cakey.storelikes.dto.StoreLatestLikedByUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class StoreLikesService { + + private final StoreFacade storeFacade; + private final CakeFacade cakeFacade; + + public StoreLatestLikedByUser getLatestStoreLikesByUser(final long userId, + final Long storeIdCursor, + final int size) { + + //페이지네이션으로 스토어 조회 + final List storeInfoDtos = storeFacade.findLatestStoresLikedByUser(userId, storeIdCursor, size); + + //조회한 store들의 id 추출 + final List storeIds = storeFacade.getStoreIds(storeInfoDtos); + + //메인 이미지 매핑 + final Map> mainImageMap = cakeFacade.getMainImageMap(storeIds); + + //storeInfo 생성 + final List storeInfos = getStoreInfo(storeInfoDtos, mainImageMap); + + //스토어 개수 조회 + final int storeCount = storeInfos.size(); + + //마지막 스토어 아이디 + final Long lastStoreId = storeFacade.calculateLastStoreId(storeInfoDtos); + + return StoreLatestLikedByUser.fromStoreInfo(lastStoreId, storeCount, storeInfos); + } + + + //storeInfo 생성 + private List getStoreInfo(final List storeInfoDtos, final Map> imageMap) { + return storeInfoDtos.stream() + .map(storeInfoDto -> { + // storeId에 해당하는 이미지 리스트 가져오기 + final List images = imageMap.getOrDefault(storeInfoDto.getStoreId(), List.of()) + .stream() + .map(image -> StoreInfo.StoreMainImage.of(image.getImageId(), image.getImageUrl())) + .toList(); + + // StoreInfo 생성 + return StoreInfo.of( + storeInfoDto.getStoreId(), + storeInfoDto.getName(), + Station.valueOf(String.valueOf(storeInfoDto.getStation())), + storeInfoDto.getAddress(), + storeInfoDto.getStoreLikesCount(), + storeInfoDto.isLiked(), + images + ); + }) + .toList(); + } + +} diff --git a/cakey-domain/src/main/java/com/cakey/cake/facade/CakeFacade.java b/cakey-domain/src/main/java/com/cakey/cake/facade/CakeFacade.java index 16503e8..c739c0e 100644 --- a/cakey-domain/src/main/java/com/cakey/cake/facade/CakeFacade.java +++ b/cakey-domain/src/main/java/com/cakey/cake/facade/CakeFacade.java @@ -5,13 +5,26 @@ import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Component @RequiredArgsConstructor public class CakeFacade { private final CakeRetriever cakeRetriever; - public List findMainImageByStoreIds(List storeIds) { + //스토어 대표 이미지 조회 + public List findMainImageByStoreIds(final List storeIds) { return cakeRetriever.findMainImageByStoreIds(storeIds); } + + //메인이미지 매핑 + public Map> getMainImageMap(final List storeIds) { + //스토어 대표 이미지 조회 + final List cakeMainImageDtos = findMainImageByStoreIds(storeIds); + + // 이미지를 storeId 기준으로 그룹화 + return cakeMainImageDtos.stream() + .collect(Collectors.groupingBy(CakeMainImageDto::getStoreId)); + } } diff --git a/cakey-domain/src/main/java/com/cakey/cake/facade/CakeRetriever.java b/cakey-domain/src/main/java/com/cakey/cake/facade/CakeRetriever.java index 1bfb95e..fec7239 100644 --- a/cakey-domain/src/main/java/com/cakey/cake/facade/CakeRetriever.java +++ b/cakey-domain/src/main/java/com/cakey/cake/facade/CakeRetriever.java @@ -12,7 +12,7 @@ public class CakeRetriever { private final CakeRepository cakeRepository; - public List findMainImageByStoreIds(List storeIds) { + public List findMainImageByStoreIds(final List storeIds) { return cakeRepository.findMainImageByStoreIds(storeIds); } diff --git a/cakey-domain/src/main/java/com/cakey/cake/repository/CakeRepositoryCustom.java b/cakey-domain/src/main/java/com/cakey/cake/repository/CakeRepositoryCustom.java index bbdd53f..7164b3d 100644 --- a/cakey-domain/src/main/java/com/cakey/cake/repository/CakeRepositoryCustom.java +++ b/cakey-domain/src/main/java/com/cakey/cake/repository/CakeRepositoryCustom.java @@ -5,6 +5,6 @@ import java.util.List; public interface CakeRepositoryCustom { - List findMainImageByStoreIds(List storeIds); + List findMainImageByStoreIds(final List storeIds); }