Skip to content

Commit 02514b7

Browse files
authored
Merge pull request #157 from GTable/refactor/#156-bookmark-response
refactor(Bookmark): Bookmark 응답 response 변경
2 parents 2eefa13 + a508982 commit 02514b7

4 files changed

Lines changed: 75 additions & 6 deletions

File tree

nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import org.springframework.transaction.annotation.Transactional;
88

99
import com.nowait.applicationuser.bookmark.dto.BookmarkCreateResponse;
10-
import com.nowait.applicationuser.bookmark.dto.BookmarkGetResponse;
10+
import com.nowait.applicationuser.store.dto.StorePageReadDto;
11+
import com.nowait.applicationuser.store.service.StoreService;
1112
import com.nowait.domaincorerdb.store.entity.Store;
1213
import com.nowait.domaincorerdb.store.repository.StoreRepository;
1314
import com.nowait.domaincorerdb.user.entity.User;
15+
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
1416
import com.nowait.domaincorerdb.user.repository.UserRepository;
1517
import com.nowait.domainuserrdb.bookmark.entity.Bookmark;
1618
import com.nowait.domainuserrdb.bookmark.repository.BookmarkRepository;
@@ -25,6 +27,8 @@ public class BookmarkService {
2527
private final BookmarkRepository bookmarkRepository;
2628
private final StoreRepository storeRepository;
2729
private final UserRepository userRepository;
30+
private final StoreService storeService;
31+
2832
@Transactional
2933
public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User customOAuth2User) {
3034
parameterValidation(storeId, customOAuth2User);
@@ -46,13 +50,17 @@ public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User cust
4650
}
4751

4852
@Transactional(readOnly = true)
49-
public List<BookmarkGetResponse> getBookmarks(CustomOAuth2User customOAuth2User) {
53+
public List<StorePageReadDto> getBookmarks(CustomOAuth2User customOAuth2User) {
5054
User user = userRepository.findById(customOAuth2User.getUserId())
51-
.orElseThrow(() -> new EntityNotFoundException("User not found"));
52-
return bookmarkRepository.findAllByUser(user)
55+
.orElseThrow(UserNotFoundException::new);
56+
57+
List<Long> storeIds = bookmarkRepository.findAllByUser(user)
5358
.stream()
54-
.map(BookmarkGetResponse::fromEntity)
59+
.map(Bookmark::getStore)
60+
.map(Store::getStoreId)
5561
.toList();
62+
63+
return storeService.getAllStoresByPageAndDeparments(storeIds);
5664
}
5765

5866
@Transactional

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ public interface StoreService {
2020

2121
List<StoreWaitingInfo> getStoresByWaitingCount(boolean desc);
2222

23+
List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds);
2324
}

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.util.Comparator;
66
import java.util.List;
77
import java.util.Map;
8-
import java.util.Set;
98
import java.util.function.Function;
109
import java.util.stream.Collectors;
1110

@@ -261,4 +260,63 @@ private RedisConnection getSafeConnection() {
261260
}
262261

263262

263+
@Override
264+
@Transactional(readOnly = true)
265+
public List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds) {
266+
// 1) 페이징된 Store 스냅샷 조회
267+
List<Store> stores = storeRepository.findAllByStoreIdInOrderByStoreIdAsc(storeIds);
268+
269+
// 2) 각 StoreId / Department ID 추출
270+
List<Long> deptIds = stores.stream()
271+
.map(Store::getDepartmentId)
272+
.distinct()
273+
.toList();
274+
275+
// 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회
276+
Map<Long, Long> waitingSizeMap = storeIds.stream()
277+
.collect(Collectors.toMap(
278+
Function.identity(),
279+
storeId -> {
280+
String key = "waiting:" + storeId;
281+
try {
282+
return redisTemplate.opsForZSet().zCard(key);
283+
} catch (Exception e) {
284+
return 0L; // Redis 접근 실패 시 0으로 처리
285+
}
286+
287+
}
288+
));
289+
290+
// 3) 각 StoreId에 해당하는 이미지 조회
291+
List<StoreImage> allImages = storeImageRepository.findByStore_StoreIdIn(storeIds);
292+
Map<Long, List<StoreImageUploadResponse>> imageMap = allImages.stream()
293+
.map(StoreImageUploadResponse::fromEntity)
294+
.collect(Collectors.groupingBy(
295+
StoreImageUploadResponse::getStoreId
296+
));
297+
298+
299+
// 4) 각 DepartmentId에 해당하는 이름 조회
300+
List<Department> allDepts = departmentRepository.findAllById(deptIds);
301+
Map<Long, String> deptNameMap = allDepts.stream()
302+
.collect(Collectors.toMap(
303+
Department::getId,
304+
Department::getName
305+
));
306+
307+
// 5) Dto 매핑
308+
List<StorePageReadDto> content = stores.stream()
309+
.map(store -> {
310+
List<StoreImageUploadResponse> imgs = imageMap
311+
.getOrDefault(store.getStoreId(), List.of());
312+
String departmentName = deptNameMap
313+
.getOrDefault(store.getDepartmentId(), "Unknown Department");
314+
Long waitingCount =
315+
waitingSizeMap.getOrDefault(store.getStoreId(), 0L);
316+
return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount);
317+
})
318+
.toList();
319+
320+
return content;
321+
}
264322
}

nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ OR MATCH(d.name) AGAINST(:kw)
3434
""",
3535
nativeQuery = true)
3636
List<Store> searchByKeywordNative(@Param("kw") String booleanKeyword);
37+
38+
List<Store> findAllByStoreIdInOrderByStoreIdAsc(List<Long> storeIds);
3739
}

0 commit comments

Comments
 (0)