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 @@ -28,20 +28,8 @@ public class StoreController {

private final StoreService storeService;

@GetMapping("/all-stores")
@Operation(summary = "모든 주점 조회", description = "모든 주점을 조회합니다.")
@ApiResponse(responseCode = "200", description = "모든 주점 조회 성공")
public ResponseEntity<?> getAllStores() {
return ResponseEntity
.status(HttpStatus.OK)
.body(
ApiUtils.success(
storeService.getAllStores()
)
);
}

@GetMapping("/all-stores/infinite-scroll")
@GetMapping("/all-stores")
@Operation(
summary = "모든 주점 페이지네이션 조회",
description = "모든 주점을 페이지네이션으로 조회합니다."
Expand All @@ -57,22 +45,6 @@ public ResponseEntity<?> getAllStoresByPageAndDeparments(Pageable pageable) {
);
}

@GetMapping("/low-wait/infinite-scroll")
@Operation(
summary = "모든 주점 페이지네이션 조회",
description = "모든 주점을 페이지네이션으로 조회합니다."
)
@ApiResponse(responseCode = "200", description = "모든 주점 페이지네이션 조회 성공")
public ResponseEntity<?> getAllStores(Pageable pageable) {
return ResponseEntity
.ok()
.body(
ApiUtils.success(
storeService.getAllStoresByPage(pageable)
)
);
}

@GetMapping("/{storeId}")
@Operation(summary = "주점 ID로 주점 상세 조회", description = "특정 주점을 ID로 조회합니다.")
@ApiResponse(responseCode = "200", description = "주점 상세 조회 성공")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
@Builder
public class StorePageReadDto {
private Long storeId;
private Long waitingCount;
private Long departmentId;
private String departmentName;
private String name;
Expand All @@ -26,7 +27,7 @@ public class StorePageReadDto {
private Boolean deleted;
private LocalDateTime createdAt;

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

StoreImageUploadResponse profile = allImages.stream()
.filter(image -> image.getImageType() == ImageType.PROFILE)
Expand All @@ -40,6 +41,7 @@ public static StorePageReadDto fromEntity(Store store, List<StoreImageUploadResp
return StorePageReadDto.builder()
.createdAt(store.getCreatedAt())
.storeId(store.getStoreId())
.waitingCount(waitingCount)
.departmentId(store.getDepartmentId())
.departmentName(departmentName)
.name(store.getName())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@

public interface StoreService {

StoreReadResponse getAllStores();

StoreReadResponse getAllStoresByPage(Pageable pageable);

StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable);

StorePageReadDto getStoreByStoreId(Long storeId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.springframework.data.domain.Pageable;
Expand All @@ -14,8 +15,6 @@
import com.nowait.applicationuser.store.dto.StoreDepartmentReadResponse;
import com.nowait.applicationuser.store.dto.StoreImageUploadResponse;
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.StoreWaitingInfo;
import com.nowait.domaincorerdb.department.entity.Department;
import com.nowait.domaincorerdb.department.repository.DepartmentRepository;
Expand All @@ -38,46 +37,6 @@ public class StoreServiceImpl implements StoreService {
private final StringRedisTemplate redisTemplate;


@Override
@Transactional(readOnly = true)
public StoreReadResponse getAllStores() {
List<Store> stores = storeRepository.findAllByDeletedFalse();

List<StoreReadDto> storeRead = stores.stream()
.map(store -> {
List<StoreImage> images = storeImageRepository.findByStore(store);
List<StoreImageUploadResponse> imageDto = images.stream()
.map(StoreImageUploadResponse::fromEntity)
.toList();
return StoreReadDto.fromEntity(store, imageDto);
})
.toList();

boolean hasNext = false;

return StoreReadResponse.of(storeRead, hasNext);
}

@Override
@Transactional(readOnly = true)
public StoreReadResponse getAllStoresByPage(Pageable pageable) {
Slice<Store> stores = storeRepository.findAllByDeletedFalseOrderByStoreIdAsc(pageable);

List<StoreReadDto> storeRead = stores.getContent().stream()
.map(store -> {
List<StoreImage> images = storeImageRepository.findByStore(store);
List<StoreImageUploadResponse> imageDto = images.stream()
.map(StoreImageUploadResponse::fromEntity)
.toList();
return StoreReadDto.fromEntity(store, imageDto);
})
.toList();

boolean hasNext = stores.hasNext();

return StoreReadResponse.of(storeRead, hasNext);
}

@Override
@Transactional(readOnly = true)
public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable pageable) {
Expand All @@ -94,6 +53,21 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page
.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()
Expand All @@ -118,7 +92,9 @@ public StoreDepartmentReadResponse getAllStoresByPageAndDeparments(Pageable page
.getOrDefault(store.getStoreId(), List.of());
String departmentName = deptNameMap
.getOrDefault(store.getDepartmentId(), "Unknown Department");
return StorePageReadDto.fromEntity(store, imgs, departmentName);
Long waitingCount =
waitingSizeMap.getOrDefault(store.getStoreId(), 0L);
return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount);
})
.toList();

Expand All @@ -139,12 +115,21 @@ public StorePageReadDto getStoreByStoreId(Long storeId) {
.map(Department::getName)
.orElse("Unknown Department");

// 2-1) Redis에서 각 Store의 웨이팅 사이즈 조회
String key = "waiting:" + storeId;
Long waitingSize = 0L;
try {
redisTemplate.opsForZSet().zCard(key);
} catch (Exception e) {
waitingSize = 0L; // Redis 접근 실패 시 0으로 처리
}

List<StoreImage> images = storeImageRepository.findByStore(store);
List<StoreImageUploadResponse> imageDto = images.stream()
.map(StoreImageUploadResponse::fromEntity)
.toList();

return StorePageReadDto.fromEntity(store, imageDto, departmentName);
return StorePageReadDto.fromEntity(store, imageDto, departmentName, waitingSize);
}

@Override
Expand All @@ -154,7 +139,9 @@ public List<StorePageReadDto> searchByKeywordNative(String keyword) {
}

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

// 2) 각 StoreId / Department ID 추출
Expand All @@ -166,6 +153,20 @@ public List<StorePageReadDto> searchByKeywordNative(String keyword) {
.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()
Expand All @@ -189,7 +190,9 @@ public List<StorePageReadDto> searchByKeywordNative(String keyword) {
.getOrDefault(store.getStoreId(), List.of());
String departmentName = deptNameMap
.getOrDefault(store.getDepartmentId(), "Unknown Department");
return StorePageReadDto.fromEntity(store, imgs, departmentName);
Long waitingCount =
waitingSizeMap.getOrDefault(store.getStoreId(), 0L);
return StorePageReadDto.fromEntity(store, imgs, departmentName, waitingCount);
})
.toList();
}
Expand Down