Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -46,13 +50,17 @@ public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User cust
}

@Transactional(readOnly = true)
public List<BookmarkGetResponse> getBookmarks(CustomOAuth2User customOAuth2User) {
public List<StorePageReadDto> getBookmarks(CustomOAuth2User customOAuth2User) {
User user = userRepository.findById(customOAuth2User.getUserId())
.orElseThrow(() -> new EntityNotFoundException("User not found"));
return bookmarkRepository.findAllByUser(user)
.orElseThrow(UserNotFoundException::new);

List<Long> storeIds = bookmarkRepository.findAllByUser(user)
.stream()
.map(BookmarkGetResponse::fromEntity)
.map(Bookmark::getStore)
.map(Store::getStoreId)
.toList();

return storeService.getAllStoresByPageAndDeparments(storeIds);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@ public interface StoreService {

List<StoreWaitingInfo> getStoresByWaitingCount(boolean desc);

List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -261,4 +260,63 @@ private RedisConnection getSafeConnection() {
}


@Override
@Transactional(readOnly = true)
public List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds) {
// 1) 페이징된 Store 스냅샷 조회
List<Store> stores = storeRepository.findAllByStoreIdInOrderByStoreIdAsc(storeIds);

// 2) 각 StoreId / Department ID 추출
List<Long> deptIds = stores.stream()
.map(Store::getDepartmentId)
.distinct()
.toList();

// 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회
Map<Long, Long> 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<StoreImage> allImages = storeImageRepository.findByStore_StoreIdIn(storeIds);
Map<Long, List<StoreImageUploadResponse>> imageMap = allImages.stream()
.map(StoreImageUploadResponse::fromEntity)
.collect(Collectors.groupingBy(
StoreImageUploadResponse::getStoreId
));


// 4) 각 DepartmentId에 해당하는 이름 조회
List<Department> allDepts = departmentRepository.findAllById(deptIds);
Map<Long, String> deptNameMap = allDepts.stream()
.collect(Collectors.toMap(
Department::getId,
Department::getName
));

// 5) Dto 매핑
List<StorePageReadDto> content = stores.stream()
.map(store -> {
List<StoreImageUploadResponse> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,6 @@ OR MATCH(d.name) AGAINST(:kw)
""",
nativeQuery = true)
List<Store> searchByKeywordNative(@Param("kw") String booleanKeyword);

List<Store> findAllByStoreIdInOrderByStoreIdAsc(List<Long> storeIds);
}