diff --git a/src/main/java/kr/bb/orderquery/domain/pickup/entity/Pickup.java b/src/main/java/kr/bb/orderquery/domain/pickup/entity/Pickup.java index 17ca06b..bd5030d 100644 --- a/src/main/java/kr/bb/orderquery/domain/pickup/entity/Pickup.java +++ b/src/main/java/kr/bb/orderquery/domain/pickup/entity/Pickup.java @@ -3,6 +3,7 @@ import com.amazonaws.services.dynamodbv2.datamodeling.*; import kr.bb.orderquery.config.DynamoDbConfig; import lombok.*; +import org.jetbrains.annotations.NotNull; import org.springframework.data.annotation.Id; import java.time.LocalDateTime; @@ -13,7 +14,7 @@ @NoArgsConstructor @AllArgsConstructor @DynamoDBTable(tableName="PickupReservation") -public class Pickup { +public class Pickup implements Comparable{ @Id @DynamoDBHashKey(attributeName = "pickup_reservation_id") private String pickupReservationId; @@ -92,4 +93,14 @@ public class Pickup { @DynamoDBAttribute(attributeName = "product_id") private String productId; + /** + * 픽업일이 동일하다면 픽업시간 내림차순 정렬 + * 그렇지 않다면 픽업일시 기준 정렬 + */ + @Override + public int compareTo(@NotNull Pickup o) { + return (this.getPickupDate().equals(o.getPickupDate())) ? + o.pickupTime.compareTo(this.pickupTime) : + this.getPickupDateTime().compareTo(o.getPickupDateTime()); + } } diff --git a/src/main/java/kr/bb/orderquery/domain/pickup/facade/PickupFacade.java b/src/main/java/kr/bb/orderquery/domain/pickup/facade/PickupFacade.java index 234f59f..f619dc1 100644 --- a/src/main/java/kr/bb/orderquery/domain/pickup/facade/PickupFacade.java +++ b/src/main/java/kr/bb/orderquery/domain/pickup/facade/PickupFacade.java @@ -23,6 +23,7 @@ import org.springframework.messaging.handler.annotation.Payload; import org.springframework.stereotype.Component; +import java.time.LocalDate; import java.util.List; @Component @@ -66,7 +67,8 @@ public void updateReviewStatus(@Payload String message, Acknowledgment ack) thro } public PickupsInMypageResponse getPickupsOfUser(Long userId, Pageable pageable) { - return PickupsInMypageResponse.from(pickupService.getPickupsForUser(userId, pageable)); + LocalDate now = LocalDate.now(); + return PickupsInMypageResponse.from(pickupService.getPickupsForUser(userId, pageable, now)); } public PickupsForDateResponse getPickupsForDate(Long storeId, String pickupDate) { diff --git a/src/main/java/kr/bb/orderquery/domain/pickup/handler/PickupCreator.java b/src/main/java/kr/bb/orderquery/domain/pickup/handler/PickupCreator.java index 91a43da..ce33bcc 100644 --- a/src/main/java/kr/bb/orderquery/domain/pickup/handler/PickupCreator.java +++ b/src/main/java/kr/bb/orderquery/domain/pickup/handler/PickupCreator.java @@ -43,6 +43,7 @@ public Pickup create(StoreNameAndAddressDto storeAddress, PickupCreateDto pickup .reservationStatus(pickupCreateDto.getReservationStatus()) .reviewStatus(pickupCreateDto.getReviewStatus()) .cardStatus(pickupCreateDto.getCardStatus()) + .productId(pickupCreateDto.getProductId()) .build(); return pickupRepository.save(pickup); diff --git a/src/main/java/kr/bb/orderquery/domain/pickup/service/PickupService.java b/src/main/java/kr/bb/orderquery/domain/pickup/service/PickupService.java index 7c6b69d..efd9b22 100644 --- a/src/main/java/kr/bb/orderquery/domain/pickup/service/PickupService.java +++ b/src/main/java/kr/bb/orderquery/domain/pickup/service/PickupService.java @@ -15,9 +15,12 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import java.util.Comparator; -import java.util.List; +import java.time.LocalDate; +import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.partitioningBy; @Service @RequiredArgsConstructor @@ -30,9 +33,14 @@ public Pickup createPickup(StoreNameAndAddressDto storeAddress, PickupCreateDto return pickupCreator.create(storeAddress, pickupCreateDto); } - public Page getPickupsForUser(Long userId, Pageable pageable) { + + + public Page getPickupsForUser(Long userId, Pageable pageable, LocalDate now) { Page pickups = pickupReader.readByUserId(userId, pageable); - List pickupsInMyPageDtos = pickups.stream() + List contents = pickups.getContent(); + List sortedPickups = sortAroundNow(contents, now); + + List pickupsInMyPageDtos = sortedPickups.stream() .map(PickupsInMypageDto::fromEntity) .collect(Collectors.toList()); return new PageImpl<>(pickupsInMyPageDtos, pickups.getPageable(), pickups.getTotalElements()); @@ -69,5 +77,21 @@ public void updateReservationStatus(String subscriptionId, String reservationSta pickupManager.changeReservationStatus(pickup, reservationStatus); } + /* + * now포함 이후의 값은 오름차순, now이전값은 내림차순으로 정렬 + * 오늘이 13일이고 데이터가 [11,12,13,14,15,16]이라면 + * [13,14,15,16,12,11]로 정렬됩니다 + */ + private List sortAroundNow(List pickups, LocalDate now) { + Map> collect = pickups.stream() + .collect(partitioningBy(pickup -> pickup.getPickupDateTime().toLocalDate().isBefore(now))); + List afterOrEqualFromNow = collect.get(false); + Collections.sort(afterOrEqualFromNow); + List beforeFromNow = collect.get(true); + Collections.sort(beforeFromNow,Collections.reverseOrder()); + return Stream.of(afterOrEqualFromNow, beforeFromNow) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + } } diff --git a/src/test/java/kr/bb/orderquery/domain/pickup/service/PickupServiceTest.java b/src/test/java/kr/bb/orderquery/domain/pickup/service/PickupServiceTest.java index d44e728..7d748c7 100644 --- a/src/test/java/kr/bb/orderquery/domain/pickup/service/PickupServiceTest.java +++ b/src/test/java/kr/bb/orderquery/domain/pickup/service/PickupServiceTest.java @@ -118,7 +118,7 @@ void getPickupsOfUser() { pickupRepository.saveAll(List.of(p1,p2,p3,p4)); // when - List pickupsForUser = pickupService.getPickupsForUser(userId, PageRequest.of(0,5)) + List pickupsForUser = pickupService.getPickupsForUser(userId, PageRequest.of(0,5), LocalDate.now()) .getContent(); // then @@ -126,26 +126,31 @@ void getPickupsOfUser() { } - @DisplayName("특정 유저의 픽업예약 목록은 픽업일 기준 내림차순으로 정렬되어 있다") + @DisplayName("특정 유저의 픽업예약 목록은 오늘 이후 예약들이 오름차순으로 먼저 등장한 뒤 오늘 이전 예약들이 내림차순으로 등장한다") @Test void pickupsInMypageAreSortedWithDesc() { // given Long userId = 1L; LocalDateTime now = LocalDateTime.of(LocalDate.of(2023,12,31), LocalTime.now()); - Pickup p1 = createPickupWithPickupDate(userId, now); - Pickup p2 = createPickupWithPickupDate(userId, now.plusDays(2)); - Pickup p3 = createPickupWithPickupDate(userId, now.minusDays(2)); - pickupRepository.saveAll(List.of(p1,p2,p3)); + Pickup p1 = createPickupWithPickupDate(userId, now.minusDays(2)); + Pickup p2 = createPickupWithPickupDate(userId, now.minusDays(1)); + Pickup p3 = createPickupWithPickupDate(userId, now); + Pickup p4 = createPickupWithPickupDate(userId, now.plusDays(1)); + Pickup p5 = createPickupWithPickupDate(userId, now.plusDays(2)); + pickupRepository.saveAll(List.of(p1,p2,p3,p4,p5)); // when - List pickupsForUser = pickupService.getPickupsForUser(userId, PageRequest.of(0,5)) + List pickupsForUser = pickupService.getPickupsForUser(userId, PageRequest.of(0,5),now.toLocalDate()) .getContent(); // then - assertThat(pickupsForUser).hasSize(3) + assertThat(pickupsForUser).hasSize(5) .extracting("pickupDate") - .containsExactly(now.toLocalDate().plusDays(2).toString(), + .containsExactly( now.toLocalDate().toString(), + now.toLocalDate().plusDays(1).toString(), + now.toLocalDate().plusDays(2).toString(), + now.toLocalDate().minusDays(1).toString(), now.toLocalDate().minusDays(2).toString() ); @@ -163,7 +168,7 @@ void pickupsForUserAreSortedWithPickupTimeDesc() { pickupRepository.saveAll(List.of(p1,p2,p3)); // when - List pickupsForUser = pickupService.getPickupsForUser(userId,PageRequest.of(0,5)) + List pickupsForUser = pickupService.getPickupsForUser(userId,PageRequest.of(0,5),LocalDate.now()) .getContent(); // then