From ace08c4a0a10d3276f0e87faf5aa552f89954619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=9C=EC=A7=84?= <109809242+PicturePark1101@users.noreply.github.com> Date: Sun, 11 Aug 2024 16:26:02 +0900 Subject: [PATCH] =?UTF-8?q?[fix]=20=EC=A1=B1=EB=B3=B4=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=A0=95=EB=A0=AC=20fix=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [refac] add query for store sort * [refac] add Finder function * [refac] refactor responseDTO * [refac] optimize the query * [refac] optimize the function * [refac] refac function name --- .../api/favorite/service/FavoriteFinder.java | 4 ++++ .../service/FavoriteQueryService.java | 21 ++++++++++++++++--- .../service/response/FavoriteGetResponse.java | 5 +++-- .../api/store/service/StoreFinder.java | 6 +++++- .../repository/FavoriteRepository.java | 5 ++++- .../store/repository/StoreRepository.java | 7 ++++++- 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteFinder.java b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteFinder.java index a61f1cbb..328eaa27 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteFinder.java +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteFinder.java @@ -29,4 +29,8 @@ public List findAllByUserId(final Long userId) { protected Favorite findByIdWithUser(final Long id) { return favoriteRepository.findByIdWithUser(id).orElseThrow(() -> new NotFoundException(FavoriteErrorCode.FAVORITE_NOT_FOUND)); } + + protected Favorite findByIdWithFavoriteStore(final Long id) { + return favoriteRepository.findByIdWithFavoriteStore(id).orElseThrow(() -> new NotFoundException(FavoriteErrorCode.FAVORITE_NOT_FOUND)); + } } \ No newline at end of file diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteQueryService.java b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteQueryService.java index fdf6feae..dffbeb60 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteQueryService.java +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteQueryService.java @@ -1,5 +1,6 @@ package org.hankki.hankkiserver.api.favorite.service; +import java.util.ArrayList; import lombok.RequiredArgsConstructor; import org.hankki.hankkiserver.api.favorite.service.command.FavoritesGetCommand; import org.hankki.hankkiserver.api.favorite.service.command.FavoritesWithStatusGetCommand; @@ -7,6 +8,8 @@ import org.hankki.hankkiserver.api.favorite.service.response.FavoritesWithStatusGetResponse; import org.hankki.hankkiserver.domain.favorite.model.Favorite; import org.hankki.hankkiserver.domain.favoritestore.model.FavoriteStore; +import org.hankki.hankkiserver.api.store.service.StoreFinder; +import org.hankki.hankkiserver.domain.store.model.Store; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,11 +22,12 @@ public class FavoriteQueryService { private final FavoriteFinder favoriteFinder; + private final StoreFinder storeFinder; @Transactional(readOnly = true) public FavoriteGetResponse findFavorite(final FavoritesGetCommand command) { - Favorite favorite = favoriteFinder.findById(command.favoriteId()); - return FavoriteGetResponse.of(favorite); + Favorite favorite = favoriteFinder.findByIdWithFavoriteStore(command.favoriteId()); + return FavoriteGetResponse.of(favorite, findStoresInFavorite(favorite)); } @Transactional(readOnly = true) @@ -41,4 +45,15 @@ private boolean isStoreAlreadyAdded(final List favoriteStore, fin return favoriteStore.stream() .anyMatch(f -> f.getStore().getId().equals(commandStoreId)); } -} + + private List findStoresInFavorite(final Favorite favorite){ + if (favoriteHasNoStore(favorite)) { + return new ArrayList<>(); + } + return storeFinder.findAllByIdsWhereDeletedIsFalseOrderByCreatedAtDes(favorite.getFavoriteStores().stream().map(fs -> fs.getStore().getId()).toList()); + } + + private boolean favoriteHasNoStore(final Favorite favorite) { + return favorite.getFavoriteStores().isEmpty(); + } +} \ No newline at end of file diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/service/response/FavoriteGetResponse.java b/src/main/java/org/hankki/hankkiserver/api/favorite/service/response/FavoriteGetResponse.java index 1dc18df5..a856fedf 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favorite/service/response/FavoriteGetResponse.java +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/service/response/FavoriteGetResponse.java @@ -3,6 +3,7 @@ import org.hankki.hankkiserver.domain.favorite.model.Favorite; import java.util.List; +import org.hankki.hankkiserver.domain.store.model.Store; import static org.hankki.hankkiserver.api.favorite.service.response.util.FavoriteResponseUtil.transformDetail; @@ -11,10 +12,10 @@ public record FavoriteGetResponse( List details, List stores ) { - public static FavoriteGetResponse of(final Favorite favorite) { + public static FavoriteGetResponse of(final Favorite favorite, final List stores) { return new FavoriteGetResponse( favorite.getName(), transformDetail(favorite.getDetail()), - favorite.getFavoriteStores().stream().map(favoriteStore -> FavoriteStoreResponse.of(favoriteStore.getStore())).toList()); + stores.stream().map(FavoriteStoreResponse::of).toList()); } } diff --git a/src/main/java/org/hankki/hankkiserver/api/store/service/StoreFinder.java b/src/main/java/org/hankki/hankkiserver/api/store/service/StoreFinder.java index 26b73104..d5f7b174 100644 --- a/src/main/java/org/hankki/hankkiserver/api/store/service/StoreFinder.java +++ b/src/main/java/org/hankki/hankkiserver/api/store/service/StoreFinder.java @@ -44,4 +44,8 @@ protected boolean existsByLatitudeAndLongitude(final double latitude, final doub public List findAllDynamicQuery(final Long universityId, final StoreCategory storeCategory, final PriceCategory priceCategory, final SortOption sortOption) { return storeRepository.findStoreByCategoryAndLowestPriceAndUniversityIdAndIsDeletedFalseOrderBySortOptions(storeCategory, priceCategory, universityId, sortOption); } -} + + public List findAllByIdsWhereDeletedIsFalseOrderByCreatedAtDes(final List ids) { + return storeRepository.findAllByIdsAndIsDeletedIsFalseOrderByCreatedAtDesc(ids); + } +} \ No newline at end of file diff --git a/src/main/java/org/hankki/hankkiserver/domain/favorite/repository/FavoriteRepository.java b/src/main/java/org/hankki/hankkiserver/domain/favorite/repository/FavoriteRepository.java index 8225d394..1a7c925c 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/favorite/repository/FavoriteRepository.java +++ b/src/main/java/org/hankki/hankkiserver/domain/favorite/repository/FavoriteRepository.java @@ -20,4 +20,7 @@ public interface FavoriteRepository extends JpaRepository { @Query("select f from Favorite f where f.id = :favoriteId") Optional findByIdWithUser(@Param("favoriteId") Long favoriteId); -} + + @Query("select f from Favorite f left join fetch f.favoriteStores where f.id = :favoriteId") + Optional findByIdWithFavoriteStore(@Param("favoriteId") Long favoriteId); +} \ No newline at end of file diff --git a/src/main/java/org/hankki/hankkiserver/domain/store/repository/StoreRepository.java b/src/main/java/org/hankki/hankkiserver/domain/store/repository/StoreRepository.java index 4faf5ec1..23bce28d 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/store/repository/StoreRepository.java +++ b/src/main/java/org/hankki/hankkiserver/domain/store/repository/StoreRepository.java @@ -1,10 +1,12 @@ package org.hankki.hankkiserver.domain.store.repository; +import java.util.List; import org.hankki.hankkiserver.domain.store.model.Store; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.Optional; +import org.springframework.data.repository.query.Param; public interface StoreRepository extends JpaRepository, CustomStoreRepository { @Query("select s from Store s where s.id = :id and s.isDeleted = false") @@ -17,4 +19,7 @@ public interface StoreRepository extends JpaRepository, CustomStore Optional findByPoint_LatitudeAndPoint_Longitude(double latitude, double longitude); boolean existsByPoint_LatitudeAndPoint_Longitude(double latitude, double longitude); -} + + @Query("select s from Store s where s.id in :ids and s.isDeleted = false order by s.createdAt desc") + List findAllByIdsAndIsDeletedIsFalseOrderByCreatedAtDesc(@Param("ids") List ids); +} \ No newline at end of file