diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java index 615bf00b..63436967 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java @@ -7,10 +7,12 @@ import org.springframework.transaction.annotation.Transactional; import com.nowait.applicationuser.bookmark.dto.BookmarkCreateResponse; -import com.nowait.applicationuser.bookmark.dto.BookmarkGetResponse; +import com.nowait.applicationuser.store.dto.StorePageReadDto; +import com.nowait.applicationuser.store.service.StoreService; import com.nowait.domaincorerdb.store.entity.Store; import com.nowait.domaincorerdb.store.repository.StoreRepository; import com.nowait.domaincorerdb.user.entity.User; +import com.nowait.domaincorerdb.user.exception.UserNotFoundException; import com.nowait.domaincorerdb.user.repository.UserRepository; import com.nowait.domainuserrdb.bookmark.entity.Bookmark; import com.nowait.domainuserrdb.bookmark.repository.BookmarkRepository; @@ -25,6 +27,8 @@ public class BookmarkService { private final BookmarkRepository bookmarkRepository; private final StoreRepository storeRepository; private final UserRepository userRepository; + private final StoreService storeService; + @Transactional public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User customOAuth2User) { parameterValidation(storeId, customOAuth2User); @@ -46,13 +50,17 @@ public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User cust } @Transactional(readOnly = true) - public List getBookmarks(CustomOAuth2User customOAuth2User) { + public List getBookmarks(CustomOAuth2User customOAuth2User) { User user = userRepository.findById(customOAuth2User.getUserId()) - .orElseThrow(() -> new EntityNotFoundException("User not found")); - return bookmarkRepository.findAllByUser(user) + .orElseThrow(UserNotFoundException::new); + + List storeIds = bookmarkRepository.findAllByUser(user) .stream() - .map(BookmarkGetResponse::fromEntity) + .map(Bookmark::getStore) + .map(Store::getStoreId) .toList(); + + return storeService.getAllStoresByPageAndDeparments(storeIds); } @Transactional diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java index 35588fce..e9f79e3b 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java @@ -20,4 +20,5 @@ public interface StoreService { List getStoresByWaitingCount(boolean desc); + List getAllStoresByPageAndDeparments(List storeIds); } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java index 2144e860..937d706b 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java @@ -5,7 +5,6 @@ import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -261,4 +260,63 @@ private RedisConnection getSafeConnection() { } + @Override + @Transactional(readOnly = true) + public List getAllStoresByPageAndDeparments(List storeIds) { + // 1) 페이징된 Store 스냅샷 조회 + List stores = storeRepository.findAllByStoreIdInOrderByStoreIdAsc(storeIds); + + // 2) 각 StoreId / Department ID 추출 + List deptIds = stores.stream() + .map(Store::getDepartmentId) + .distinct() + .toList(); + + // 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회 + Map waitingSizeMap = storeIds.stream() + .collect(Collectors.toMap( + Function.identity(), + storeId -> { + String key = "waiting:" + storeId; + try { + return redisTemplate.opsForZSet().zCard(key); + } catch (Exception e) { + return 0L; // Redis 접근 실패 시 0으로 처리 + } + + } + )); + + // 3) 각 StoreId에 해당하는 이미지 조회 + List allImages = storeImageRepository.findByStore_StoreIdIn(storeIds); + Map> imageMap = allImages.stream() + .map(StoreImageUploadResponse::fromEntity) + .collect(Collectors.groupingBy( + StoreImageUploadResponse::getStoreId + )); + + + // 4) 각 DepartmentId에 해당하는 이름 조회 + List allDepts = departmentRepository.findAllById(deptIds); + Map deptNameMap = allDepts.stream() + .collect(Collectors.toMap( + Department::getId, + Department::getName + )); + + // 5) Dto 매핑 + List content = stores.stream() + .map(store -> { + List imgs = imageMap + .getOrDefault(store.getStoreId(), List.of()); + String departmentName = deptNameMap + .getOrDefault(store.getDepartmentId(), "Unknown Department"); + Long waitingCount = + waitingSizeMap.getOrDefault(store.getStoreId(), 0L); + return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount); + }) + .toList(); + + return content; + } } diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java index 283a1a0e..b5fe61d0 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java @@ -34,4 +34,6 @@ OR MATCH(d.name) AGAINST(:kw) """, nativeQuery = true) List searchByKeywordNative(@Param("kw") String booleanKeyword); + + List findAllByStoreIdInOrderByStoreIdAsc(List storeIds); }