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
@@ -1,7 +1,9 @@
package com.nowait.applicationuser.bookmark.service;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -60,7 +62,9 @@ public List<StorePageReadDto> getBookmarks(CustomOAuth2User customOAuth2User) {
.map(Store::getStoreId)
.toList();

return storeService.getAllStoresByPageAndDeparments(storeIds);
Set<Long> bookmarkedSet = new HashSet<>(storeIds);

return storeService.getAllStoresByPageAndDeparments(storeIds, bookmarkedSet);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
@Builder
public class StoreDepartmentReadResponse {

private List<StorePageReadDto> storePageReadDtos;
private List<StorePageReadResponse> storePageReadDtos;
private boolean hasNext;

public static StoreDepartmentReadResponse of(List<StorePageReadDto> storePageReadDtos, boolean hasNext) {
public static StoreDepartmentReadResponse of(List<StorePageReadResponse> storePageReadResponses, boolean hasNext) {
return StoreDepartmentReadResponse.builder()
.storePageReadDtos(storePageReadDtos)
.storePageReadDtos(storePageReadResponses)
.hasNext(hasNext)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
@Builder
public class StoreDetailReadResponse {
private Long storeId;
private Boolean isBookmark;
private Long waitingCount;
private Boolean isWaiting;
private Long departmentId;
Expand All @@ -29,9 +30,10 @@ public class StoreDetailReadResponse {
private Boolean isActive;
private Boolean deleted;
private LocalDateTime createdAt;
private Boolean isBookmarked;

public static StoreDetailReadResponse fromEntity(Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount, Boolean isWaiting) {
public static StoreDetailReadResponse fromEntity(
Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount, Boolean isBookmark, Boolean isWaiting
) {

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
Expand All @@ -43,8 +45,8 @@ public static StoreDetailReadResponse fromEntity(Store store, List<StoreImageUpl
.toList();

return StoreDetailReadResponse.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.isBookmark(isBookmark)
.waitingCount(waitingCount)
.isWaiting(isWaiting)
.departmentId(store.getDepartmentId())
Expand All @@ -54,44 +56,11 @@ public static StoreDetailReadResponse fromEntity(Store store, List<StoreImageUpl
.description(store.getDescription())
.notice(store.getNotice())
.openTime(store.getOpenTime())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.profileImage(profile)
.bannerImages(banners)
.isBookmarked(false)
.build();
}

public static StoreDetailReadResponse fromEntityWithBookmark(
Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount, Boolean isBookmarked, Boolean isWaiting
) {

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
.findFirst()
.orElse(null);

List<StoreImageUploadResponse> banners = allImages.stream()
.filter(image -> image.getImageType() == ImageType.BANNER)
.toList();

return StoreDetailReadResponse.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.waitingCount(waitingCount)
.isWaiting(isWaiting)
.departmentId(store.getDepartmentId())
.departmentName(departmentName)
.name(store.getName())
.location(store.getLocation())
.description(store.getDescription())
.notice(store.getNotice())
.openTime(store.getOpenTime())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.profileImage(profile)
.bannerImages(banners)
.isBookmarked(isBookmarked)
.createdAt(store.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
@Builder
public class StorePageReadDto {
private Long storeId;
private Boolean isBookmark;
private Long waitingCount;
private Long departmentId;
private String departmentName;
Expand All @@ -28,9 +29,8 @@ public class StorePageReadDto {
private Boolean isActive;
private Boolean deleted;
private LocalDateTime createdAt;
private Boolean isBookmarked;

public static StorePageReadDto fromEntity(Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount) {
public static StorePageReadDto fromEntity(Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount, Boolean isBookmark) {

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
Expand All @@ -42,8 +42,8 @@ public static StorePageReadDto fromEntity(Store store, List<StoreImageUploadResp
.toList();

return StorePageReadDto.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.isBookmark(isBookmark)
.waitingCount(waitingCount)
.departmentId(store.getDepartmentId())
.departmentName(departmentName)
Expand All @@ -52,43 +52,11 @@ public static StorePageReadDto fromEntity(Store store, List<StoreImageUploadResp
.description(store.getDescription())
.notice(store.getNotice())
.openTime(store.getOpenTime())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.profileImage(profile)
.bannerImages(banners)
.isBookmarked(false)
.build();
}

public static StorePageReadDto fromEntityWithBookmark(
Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount, Boolean isBookmarked
) {

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
.findFirst()
.orElse(null);

List<StoreImageUploadResponse> banners = allImages.stream()
.filter(image -> image.getImageType() == ImageType.BANNER)
.toList();

return StorePageReadDto.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.waitingCount(waitingCount)
.departmentId(store.getDepartmentId())
.departmentName(departmentName)
.name(store.getName())
.location(store.getLocation())
.description(store.getDescription())
.notice(store.getNotice())
.openTime(store.getOpenTime())
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.profileImage(profile)
.bannerImages(banners)
.isBookmarked(isBookmarked)
.createdAt(store.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.nowait.applicationuser.store.dto;

import java.time.LocalDateTime;
import java.util.List;

import com.nowait.domaincorerdb.store.entity.ImageType;
import com.nowait.domaincorerdb.store.entity.Store;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@AllArgsConstructor
@Builder
public class StorePageReadResponse {
private Long storeId;
private Long waitingCount;
private Long departmentId;
private String departmentName;
private String name;
private String location;
private String description;
private String notice;
private String openTime;
private StoreImageUploadResponse profileImage;
private List<StoreImageUploadResponse> bannerImages;
private Boolean isActive;
private Boolean deleted;
private LocalDateTime createdAt;

public static StorePageReadResponse fromEntity(Store store, List<StoreImageUploadResponse> allImages, String departmentName, Long waitingCount) {

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
.findFirst()
.orElse(null);

List<StoreImageUploadResponse> banners = allImages.stream()
.filter(image -> image.getImageType() == ImageType.BANNER)
.toList();

return StorePageReadResponse.builder()
.storeId(store.getStoreId())
.waitingCount(waitingCount)
.departmentId(store.getDepartmentId())
.departmentName(departmentName)
.name(store.getName())
.location(store.getLocation())
.description(store.getDescription())
.notice(store.getNotice())
.openTime(store.getOpenTime())
.profileImage(profile)
.bannerImages(banners)
.isActive(store.getIsActive())
.deleted(store.getDeleted())
.createdAt(store.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.nowait.applicationuser.store.service;

import java.util.List;
import java.util.Set;

import org.springframework.data.domain.Pageable;

import com.nowait.applicationuser.store.dto.StoreDepartmentReadResponse;
import com.nowait.applicationuser.store.dto.StoreDetailReadResponse;
import com.nowait.applicationuser.store.dto.StorePageReadDto;
import com.nowait.applicationuser.store.dto.StoreReadDto;
import com.nowait.applicationuser.store.dto.StoreReadResponse;
import com.nowait.applicationuser.store.dto.StorePageReadResponse;
import com.nowait.applicationuser.store.dto.StoreWaitingInfo;
import com.nowait.domainuserrdb.oauth.dto.CustomOAuth2User;

Expand All @@ -18,9 +18,9 @@ public interface StoreService {

StoreDetailReadResponse getStoreByStoreId(Long storeId, CustomOAuth2User customOAuth2User);

List<StorePageReadDto> searchByKeywordNative(String name);
List<StorePageReadResponse> searchByKeywordNative(String name);

List<StoreWaitingInfo> getStoresByWaitingCount(boolean desc);

List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds);
List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeIds, Set<Long> bookmarkedSet);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
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 All @@ -16,7 +17,6 @@
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -25,6 +25,7 @@
import com.nowait.applicationuser.store.dto.StoreDetailReadResponse;
import com.nowait.applicationuser.store.dto.StoreImageUploadResponse;
import com.nowait.applicationuser.store.dto.StorePageReadDto;
import com.nowait.applicationuser.store.dto.StorePageReadResponse;
import com.nowait.applicationuser.store.dto.StoreWaitingInfo;
import com.nowait.domaincorerdb.department.entity.Department;
import com.nowait.domaincorerdb.department.repository.DepartmentRepository;
Expand Down Expand Up @@ -105,15 +106,15 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page
));

// 5) Dto 매핑
List<StorePageReadDto> content = stores.stream()
List<StorePageReadResponse> 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);
return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount);
})
.toList();

Expand All @@ -136,6 +137,8 @@ public StoreDetailReadResponse getStoreByStoreId(Long storeId, CustomOAuth2User
.map(Department::getName)
.orElse("Unknown Department");

boolean isBookmark = bookmarkRepository.existsByUserAndStore(user, store);

// 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회
String key = "waiting:" + storeId;
long waitingSize = redisTemplate.opsForZSet().zCard(key);
Expand All @@ -146,22 +149,16 @@ public StoreDetailReadResponse getStoreByStoreId(Long storeId, CustomOAuth2User
.map(StoreImageUploadResponse::fromEntity)
.toList();

if (bookmarkRepository.existsByUserAndStore(user, store)) {
return StoreDetailReadResponse.fromEntityWithBookmark(store, imageDto, departmentName, waitingSize, true, userWaiting);
} else {
return StoreDetailReadResponse.fromEntity(store, imageDto, departmentName, waitingSize, userWaiting);
}
return StoreDetailReadResponse.fromEntity(store, imageDto, departmentName, waitingSize, isBookmark, userWaiting);
}

@Override
public List<StorePageReadDto> searchByKeywordNative(String keyword) {
public List<StorePageReadResponse> searchByKeywordNative(String keyword) {
if (keyword == null || keyword.isBlank()) {
throw new StoreParamEmptyException();
}

// 1) 페이징된 Store 스냅샷 조회
// Like 사용
// List<Store> stores = storeRepository.findByNameContainingIgnoreCaseAndDeletedFalse(keyword);
// 풀텍스트인덱스 사용
List<Store> stores = storeRepository.searchByKeywordNative(keyword);

Expand Down Expand Up @@ -213,7 +210,7 @@ public List<StorePageReadDto> searchByKeywordNative(String keyword) {
.getOrDefault(store.getDepartmentId(), "Unknown Department");
Long waitingCount =
waitingSizeMap.getOrDefault(store.getStoreId(), 0L);
return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount);
return StorePageReadResponse.fromEntity(store, imgs, departmentName, waitingCount);
})
.toList();
}
Expand Down Expand Up @@ -288,7 +285,7 @@ private RedisConnection getSafeConnection() {

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

Expand Down Expand Up @@ -339,7 +336,9 @@ public List<StorePageReadDto> getAllStoresByPageAndDeparments(List<Long> storeId
.getOrDefault(store.getDepartmentId(), "Unknown Department");
Long waitingCount =
waitingSizeMap.getOrDefault(store.getStoreId(), 0L);
return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount);
boolean isBookmark = bookmarkedSet.contains(store.getStoreId());

return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount, isBookmark);
})
.toList();

Expand Down