From b3f344cc9dbcd8bf7293816163be7a5746533a53 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 00:46:47 +0900 Subject: [PATCH 01/31] =?UTF-8?q?Feat=20:=20=EA=B2=BD=EB=A7=A4=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=EA=B0=80=20=EC=9E=84=EB=B0=95=ED=95=9C=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=EC=A4=91=EC=9D=B8=20=EA=B2=BD=EB=A7=A4=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 경매 종료가 임박한 진행중인 경매 목록 조회 추가 미흡 : 성능 개선 못함, /auction으로 엔드포인트 합쳐야 하는데 못했음, 테스트쪽 리뷰 받아야 함. --- .../api/auction/AuctionController.java | 28 +++++---- .../auction/repository/AuctionRepository.java | 3 + .../support/AuctionCriteriaRepository.java | 3 + .../AuctionCriteriaRepositoryImpl.java | 18 ++++++ .../auction/service/AuctionService.java | 3 + .../auction/service/AuctionServiceImpl.java | 29 +++++++++ .../auction/api/AuctionControllerTest.java | 10 +++ .../repository/AuctionRepositoryTest.java | 38 ++++++++++++ .../service/AuctionServiceImplTest.java | 61 +++++++++++++++++++ 9 files changed, 182 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 206c94a1..23115c84 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -82,17 +82,23 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc // } // return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, allAuctions)); // } -@GetMapping -@Operation(summary = "Get all auctions", description = "Retrieves all auctions.") -@ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") -public ResponseEntity>> getAllAuctions( - @RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, - @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory -) { - List auctions = auctionService.getAuctionsByFilter(productCategory,auctionCategory); - return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); -} - + @GetMapping + @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") + @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") + public ResponseEntity>> getAllAuctions( + @RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, + @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory + ) { + List auctions = auctionService.getAuctionsByFilter(productCategory,auctionCategory); + return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); + } + @GetMapping("/ending-soon") + @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") + @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") + public ResponseEntity>> getAllAuctionsEndingSoon() { + List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); + } @GetMapping("/{auctionId}") @Operation(summary = "Get auction by ID", description = "Retrieves auction details by its ID.") @ApiResponse(responseCode = "200", description = "Auction retrieved successfully") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java index 712534d9..bf9db4e6 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java @@ -5,10 +5,12 @@ import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository; import com.tasksprints.auction.domain.product.model.ProductCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -23,5 +25,6 @@ public interface AuctionRepository extends JpaRepository, Auction List findAuctionsByAuctionCategory(AuctionCategory auctionCategory); List findAuctionByProduct_Category(ProductCategory productCategory); + List findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index a4bc26f4..f54991f1 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -2,12 +2,15 @@ import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.product.model.ProductCategory; +import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { public List getAuctionsByFilters(ProductCategory productCategory, AuctionCategory category); + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index ed513409..82ceb16f 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -1,14 +1,17 @@ package com.tasksprints.auction.domain.auction.repository.support; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.model.QAuction; import com.tasksprints.auction.domain.product.model.ProductCategory; import com.tasksprints.auction.domain.product.model.QProduct; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; @RequiredArgsConstructor @@ -27,4 +30,19 @@ public List getAuctionsByFilters( ProductCategory productCategory, .fetch(); } + @Override + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { + QAuction auction = QAuction.auction; + + BooleanExpression endTimeBetween = auction.endTime.between(now, next24Hours); + BooleanExpression statusEquals = auction.auctionStatus.eq(auctionStatus); + + return queryFactory + .selectFrom(auction) + .where(endTimeBetween.and(statusEquals)) + .orderBy(auction.endTime.asc()) + .fetch(); + } + + } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index b3af75e7..72dc15e9 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -19,4 +19,7 @@ public interface AuctionService { AuctionResponse getAuctionById(Long auctionId); List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param); List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); + + List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + List getAuctionsEndWith24Hours(); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index dcba6772..c6e07c0c 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -135,4 +136,32 @@ public List getAuctionsByFilter(AuctionRequest.ProductCategoryP .map(AuctionResponse::of) .toList(); } + + @Override + public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 + List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); + + return foundAuctions.stream() + .map(AuctionResponse::of) + .toList(); + } + + @Override + public List getAuctionsEndWith24Hours() { + // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 + List foundAuctions = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + + return foundAuctions.stream() + .map(AuctionResponse::of) + .toList(); + } } \ No newline at end of file diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index e99c80e8..d7db3905 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -132,6 +132,16 @@ public void testFindAuctionByUsingWrongAuctionCategory_Success() throws Exceptio .andExpect(status().isOk()) .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); } + @Test + @DisplayName("마감 기한이 24시간 이하로 남은 경매 목록 조회") + public void testFindAuctionsEndWithin24Hours_Success() throws Exception { + + /* + 테스트 코드 추가 + * */ + + } + @Test @DisplayName("입찰 제출 성공") public void testSubmitBid_Success() throws Exception { diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 546cc4ee..961e141a 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -122,6 +122,34 @@ public void testFindAllUsingFilter() { } + @Test + @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") + public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + //given + Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + + auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = LocalDateTime.now().plusHours(24); + // when + List result = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + //then + assertThat(result).hasSize(3); + // 오름차순 정렬 되었는지 확인 + LocalDateTime previousEndTime = null; + for (Auction auction : result) { + if (previousEndTime != null) { + assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + } + previousEndTime = auction.getEndTime(); + } + } + private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( LocalDateTime.now(), @@ -132,4 +160,14 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat seller ); } + private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 8c5c204a..f4ac3a27 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -23,6 +23,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -351,6 +352,56 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { assertThat(actualAuctions).isEmpty(); } } + @Nested + @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") + class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { + @Test + @DisplayName("경매 마감 임박 목록 조회 : 성공") + public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { + //given + Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); + Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + + LocalDateTime now = LocalDateTime.now(); + LocalDateTime next24Hours = now.plusHours(24); + + List unsortedAuctions = List.of(auction1, auction2, auction3); + List expectedAuctions = unsortedAuctions.stream() + .sorted(Comparator.comparing(Auction::getEndTime)) + .toList(); + + List expectedResponses = expectedAuctions.stream() + .map(AuctionResponse::of) + .toList(); + //when +// when(auctionRepository.getAuctionsEndWith24Hours( +// now, +// next24Hours, +// AuctionStatus.ACTIVE) +// ).thenReturn(expectedAuctions); + + /* + 위의 코드를 아래 부분으로 작성했는데, LocalDateTime.now()를 사용하기 때문에, + stub 하기 전 LocalDateTime.now와 service메서드 안에서 넣은 인자 LocalDateTime.now 간에 시간 차이가 생겨, 인자 매칭 에러가 생겨 fail됐음 + 그래서 getAuctionsEndWith24Hours의 인자를 now에서 +- 1초 정도 오차이면 expectedAuction을 리턴하는 것을 의도했으나.. + 검색으로 알아본 것이라 확신이 없어 리뷰 필요.. + * */ + when(auctionRepository.getAuctionsEndWith24Hours( + argThat(current -> current.isAfter(now.minusSeconds(1)) && current.isBefore(now.plusSeconds(1))), + argThat(nextHours -> nextHours.isAfter(next24Hours.minusSeconds(1)) && nextHours.isBefore(next24Hours.plusSeconds(1)) ) , + eq(AuctionStatus.ACTIVE))).thenReturn(expectedAuctions); + + + List actualResponses = auctionService.getAuctionsEndWith24Hours(); + + //then + assertThat(actualResponses).isEqualTo(expectedResponses); + + } + } private Auction createAuction(Long auctionId, User seller, AuctionStatus status) { return Auction.builder() @@ -363,4 +414,14 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } + private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } } From 1edfd44b4cec0fb16550996b72185f51d17362e7 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 01:12:15 +0900 Subject: [PATCH 02/31] =?UTF-8?q?style=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=ED=84=B0=20=EB=B9=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 코드 포맷터 빌드 --- .../api/auction/AuctionController.java | 3 +- .../repository/AuctionRepositoryTest.java | 48 +++++++++---------- .../service/AuctionServiceImplTest.java | 33 +++++-------- 3 files changed, 36 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 8bc22903..5ea89c88 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -80,7 +80,8 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc @GetMapping @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { + public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, + @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { List auctions = auctionService.getAuctionsByFilter(productCategory, auctionCategory); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index e920679d..8e40921a 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -46,6 +46,28 @@ public void setUp() { userRepository.save(seller); } + private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + LocalDateTime.now().plusDays(7), + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } + + private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } + @Test @DisplayName("사용자 ID로 경매 목록 조회") public void testFindAuctionsByUserId() { @@ -153,30 +175,4 @@ public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { } } - private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } - private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index b3eb44db..be01a99e 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -69,6 +69,16 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } + private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + return Auction.create( + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + category, + status, + seller + ); + } @Nested @DisplayName("경매 생성 테스트") @@ -418,25 +428,6 @@ public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Suc } } - private Auction createAuction(Long auctionId, User seller, AuctionStatus status) { - return Auction.builder() - .id(auctionId) - .auctionCategory(AuctionCategory.PUBLIC_PAID) - .auctionStatus(status) - .startTime(LocalDateTime.now()) - .endTime(LocalDateTime.now().plusDays(7)) - .startingBid(BigDecimal.valueOf(100.00)) - .seller(seller) - .build(); - } - private Auction createAuction(User seller,LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } + + } From f3f95cc462628114b046edbacac9c8567fd60129 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:45:37 +0900 Subject: [PATCH 03/31] =?UTF-8?q?Refactor=20:=20=EB=A7=88=EA=B0=90?= =?UTF-8?q?=EC=9D=B4=20=EC=96=BC=EB=A7=88=20=EC=95=88=EB=82=A8=EC=9D=80=20?= =?UTF-8?q?=EA=B2=BD=EB=A7=A4=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 마감이 얼마 안 남은 경매 목록 조회 메서드의 파라미터가 없던 것에서 now, next24Hours 추가 --- .../auction/api/auction/AuctionController.java | 5 +++-- .../domain/auction/service/AuctionService.java | 5 +++-- .../domain/auction/service/AuctionServiceImpl.java | 12 ++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 5ea89c88..b4282ad8 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; @RestController @@ -89,8 +90,8 @@ public ResponseEntity>> getAllAuctions(@RequestP @GetMapping("/ending-soon") @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctionsEndingSoon() { - List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); + public ResponseEntity>> getAllAuctionsEndingSoon(@RequestParam("now") LocalDateTime now, @RequestParam("nextHours") LocalDateTime next24Hours) { + List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(now, next24Hours); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } @GetMapping("/{auctionId}") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index 03a6bff7..d923a19b 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -3,6 +3,7 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; +import java.time.LocalDateTime; import java.util.List; /** @@ -27,6 +28,6 @@ public interface AuctionService { List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); - List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(); - List getAuctionsEndWith24Hours(); + List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); + List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 864e387e..776f96c2 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -139,10 +139,10 @@ public List getAuctionsByFilter(AuctionRequest.ProductCategoryP } @Override - public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { + public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + //LocalDateTime now = LocalDateTime.now(); + //LocalDateTime next24Hours = now.plusHours(24); //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); @@ -153,10 +153,10 @@ public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc() { } @Override - public List getAuctionsEndWith24Hours() { + public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + // LocalDateTime now = LocalDateTime.now(); + // LocalDateTime next24Hours = now.plusHours(24); //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 List foundAuctions = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); From 066a43d3461bb463bdfb5c78ec44d8a8b9f28c40 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:48:00 +0900 Subject: [PATCH 04/31] =?UTF-8?q?Test:=20=EB=A7=88=EA=B0=90=20=EA=B8=B0?= =?UTF-8?q?=ED=95=9C=20=EC=96=BC=EB=A7=88=20=EC=95=88=20=EB=82=A8=EC=9D=80?= =?UTF-8?q?=20=EA=B2=BD=EB=A7=A4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 테스트 케이스의 LocalDateTime을 고정 2. 테스트 대상이 아닌 파라미터는 테스트 픽스처에 넣음 3. assertAll로 컬렉션인 경우 끝까지 assertion하고 결과를 보여주도록 함 --- .../repository/AuctionRepositoryTest.java | 61 +++++++++-------- .../service/AuctionServiceImplTest.java | 68 +++++++------------ 2 files changed, 60 insertions(+), 69 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 8e40921a..f5eaa4dc 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -20,6 +20,7 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest @@ -48,23 +49,23 @@ public void setUp() { private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), - BigDecimal.valueOf(100.00), - category, - status, - seller + LocalDateTime.now(), + LocalDateTime.now().plusDays(7), + BigDecimal.valueOf(100.00), + category, + status, + seller ); } - private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { + private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller + LocalDateTime.now(), + endTime, + BigDecimal.valueOf(100.00), + AuctionCategory.PUBLIC_PAID, + status, + seller ); } @@ -151,28 +152,34 @@ public void testFindAllUsingFilter() { @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { //given - Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); + LocalDateTime next24Hours = fixedNow.plusHours(24); + + Auction auction1 = createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE); + Auction auction2 = createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE); + Auction auction3 = createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE); + Auction auction4 = createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE); + Auction auction5 = createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING); auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = LocalDateTime.now().plusHours(24); // when - List result = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); + List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); + //then assertThat(result).hasSize(3); - // 오름차순 정렬 되었는지 확인 - LocalDateTime previousEndTime = null; - for (Auction auction : result) { - if (previousEndTime != null) { - assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + + assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", + () -> { + LocalDateTime previousEndTime = null; + for (Auction auction : result) { + if (previousEndTime != null) { + assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); + } + previousEndTime = auction.getEndTime(); } - previousEndTime = auction.getEndTime(); } + ); } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index be01a99e..3e96e3d6 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -69,16 +69,18 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .seller(seller) .build(); } - private Auction createAuction(User seller, LocalDateTime endTime, AuctionCategory category, AuctionStatus status) { - return Auction.create( - LocalDateTime.now(), - endTime, - BigDecimal.valueOf(100.00), - category, - status, - seller - ); - } + + private Auction createAuction(Long auctionId, LocalDateTime endTime, AuctionStatus status) { + return Auction.builder() + .id(auctionId) + .auctionCategory(AuctionCategory.PUBLIC_PAID) + .auctionStatus(status) + .startTime(LocalDateTime.now()) + .endTime(endTime) + .startingBid(BigDecimal.valueOf(100.00)) + .seller(seller) + .build(); + } @Nested @DisplayName("경매 생성 테스트") @@ -377,6 +379,7 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { assertThat(actualAuctions).isEmpty(); } } + @Nested @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { @@ -384,50 +387,31 @@ class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { @DisplayName("경매 마감 임박 목록 조회 : 성공") public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { //given - Auction auction1 = createAuction(seller, LocalDateTime.now().plusHours(23), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, LocalDateTime.now().plusHours(22), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction3 = createAuction(seller, LocalDateTime.now().plusHours(21), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction4 = createAuction(seller, LocalDateTime.now().plusHours(48), AuctionCategory.PUBLIC_PAID, AuctionStatus.ACTIVE); - Auction auction5 = createAuction(seller, LocalDateTime.now().plusHours(20), AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); + LocalDateTime next24Hours = fixedNow.plusHours(24); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime next24Hours = now.plusHours(24); + Auction auction1 = createAuction(1L, fixedNow.plusHours(23), AuctionStatus.ACTIVE); + Auction auction2 = createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE); + Auction auction3 = createAuction(3L, fixedNow.plusHours(21), AuctionStatus.ACTIVE); List unsortedAuctions = List.of(auction1, auction2, auction3); List expectedAuctions = unsortedAuctions.stream() - .sorted(Comparator.comparing(Auction::getEndTime)) - .toList(); + .sorted(Comparator.comparing(Auction::getEndTime)) + .toList(); List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .toList(); - //when -// when(auctionRepository.getAuctionsEndWith24Hours( -// now, -// next24Hours, -// AuctionStatus.ACTIVE) -// ).thenReturn(expectedAuctions); - - /* - 위의 코드를 아래 부분으로 작성했는데, LocalDateTime.now()를 사용하기 때문에, - stub 하기 전 LocalDateTime.now와 service메서드 안에서 넣은 인자 LocalDateTime.now 간에 시간 차이가 생겨, 인자 매칭 에러가 생겨 fail됐음 - 그래서 getAuctionsEndWith24Hours의 인자를 now에서 +- 1초 정도 오차이면 expectedAuction을 리턴하는 것을 의도했으나.. - 검색으로 알아본 것이라 확신이 없어 리뷰 필요.. - * */ - when(auctionRepository.getAuctionsEndWith24Hours( - argThat(current -> current.isAfter(now.minusSeconds(1)) && current.isBefore(now.plusSeconds(1))), - argThat(nextHours -> nextHours.isAfter(next24Hours.minusSeconds(1)) && nextHours.isBefore(next24Hours.plusSeconds(1)) ) , - eq(AuctionStatus.ACTIVE))).thenReturn(expectedAuctions); - - - List actualResponses = auctionService.getAuctionsEndWith24Hours(); + .map(AuctionResponse::of) + .toList(); + + when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); + List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); //then assertThat(actualResponses).isEqualTo(expectedResponses); + } } - } From 2499cc324a3861b2e248df611aa0ec90739727de Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Mon, 9 Sep 2024 00:45:29 +0900 Subject: [PATCH 05/31] =?UTF-8?q?test=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. createAuction 중복 코드 리스트로 수정 2. LocalDateTime.now()를 고정 시간으로 수정 3. AuctionServiceImplTest 중복 코드 삭제 --- .../repository/AuctionRepositoryTest.java | 20 ++++++++++--------- .../service/AuctionServiceImplTest.java | 18 +++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index f5eaa4dc..953e3d4b 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -49,8 +49,8 @@ public void setUp() { private Auction createAuction(User seller, AuctionCategory category, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), - LocalDateTime.now().plusDays(7), + LocalDateTime.of(2024, 8, 1, 10, 0), + LocalDateTime.of(2024, 9, 1, 10, 0), BigDecimal.valueOf(100.00), category, status, @@ -60,7 +60,7 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { return Auction.create( - LocalDateTime.now(), + LocalDateTime.of(2024, 8, 1, 10, 0), endTime, BigDecimal.valueOf(100.00), AuctionCategory.PUBLIC_PAID, @@ -155,13 +155,15 @@ public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); LocalDateTime next24Hours = fixedNow.plusHours(24); - Auction auction1 = createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE); - Auction auction2 = createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE); - Auction auction3 = createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE); - Auction auction4 = createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE); - Auction auction5 = createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING); + List auctions = List.of( + createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), + createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) + ); - auctionRepository.saveAll(List.of(auction1, auction2, auction3, auction4, auction5)); + auctionRepository.saveAll(auctions); // when List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 3e96e3d6..4bbbad41 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -63,8 +63,8 @@ private Auction createAuction(Long auctionId, User seller, AuctionStatus status) .id(auctionId) .auctionCategory(AuctionCategory.PUBLIC_PAID) .auctionStatus(status) - .startTime(LocalDateTime.now()) - .endTime(LocalDateTime.now().plusDays(7)) + .startTime(LocalDateTime.of(2024, 8, 1, 10, 0)) + .endTime(LocalDateTime.of(2024, 9, 1, 10, 0)) .startingBid(BigDecimal.valueOf(100.00)) .seller(seller) .build(); @@ -75,7 +75,7 @@ private Auction createAuction(Long auctionId, LocalDateTime endTime, AuctionStat .id(auctionId) .auctionCategory(AuctionCategory.PUBLIC_PAID) .auctionStatus(status) - .startTime(LocalDateTime.now()) + .startTime(LocalDateTime.of(2024, 8, 1, 10, 0)) .endTime(endTime) .startingBid(BigDecimal.valueOf(100.00)) .seller(seller) @@ -390,14 +390,10 @@ public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Suc LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); LocalDateTime next24Hours = fixedNow.plusHours(24); - Auction auction1 = createAuction(1L, fixedNow.plusHours(23), AuctionStatus.ACTIVE); - Auction auction2 = createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE); - Auction auction3 = createAuction(3L, fixedNow.plusHours(21), AuctionStatus.ACTIVE); - - List unsortedAuctions = List.of(auction1, auction2, auction3); - List expectedAuctions = unsortedAuctions.stream() - .sorted(Comparator.comparing(Auction::getEndTime)) - .toList(); + List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), + createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), + createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) + ); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) From a70040ef1440945b4ec9e411078c08bb12bf5d22 Mon Sep 17 00:00:00 2001 From: na0th <105775683+na0th@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:07:02 +0900 Subject: [PATCH 06/31] =?UTF-8?q?refactor=20:=20endingSoon=20->=20/auction?= =?UTF-8?q?=20=EA=B2=80=EC=83=89=20=ED=95=84=ED=84=B0=EB=A1=9C=20=EC=97=94?= =?UTF-8?q?=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=ED=95=A9=EC=B9=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1: /auction에서 검색 조건별로 경매 목록을 조회한다. 미흡 : 파라미터를 SearchCondition이라는 DTO로 받아서 기존 테스트 다 깨져서 수정해야 함, 변경점에 대한 테스트 코드 없음. --- .../api/auction/AuctionController.java | 13 +- .../auction/dto/request/AuctionRequest.java | 20 +++ .../domain/auction/model/AuctionStatus.java | 10 +- .../support/AuctionCriteriaRepository.java | 7 +- .../AuctionCriteriaRepositoryImpl.java | 10 +- .../auction/service/AuctionService.java | 4 +- .../auction/service/AuctionServiceImpl.java | 21 ++- .../repository/AuctionRepositoryTest.java | 130 +++++++++--------- .../service/AuctionServiceImplTest.java | 90 ++++++------ 9 files changed, 177 insertions(+), 128 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index b4282ad8..04db8c8d 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; @RestController @@ -81,19 +80,11 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc @GetMapping @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctions(@RequestParam(required = false) AuctionRequest.AuctionCategoryParam auctionCategory, - @RequestParam(required = false) AuctionRequest.ProductCategoryParam productCategory) { - List auctions = auctionService.getAuctionsByFilter(productCategory, auctionCategory); + public ResponseEntity>> getAllAuctions(@RequestBody AuctionRequest.SearchCondition searchCondition) { + List auctions = auctionService.getAuctionsByFilter(searchCondition); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } - @GetMapping("/ending-soon") - @Operation(summary = "Get all auctions ending Soon", description = "Retrieves all auctions.") - @ApiResponse(responseCode = "200",description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctionsEndingSoon(@RequestParam("now") LocalDateTime now, @RequestParam("nextHours") LocalDateTime next24Hours) { - List auctions = auctionService.getAuctionsByEndTimeBetweenOrderByEndTimeAsc(now, next24Hours); - return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); - } @GetMapping("/{auctionId}") @Operation(summary = "Get auction by ID", description = "Retrieves auction details by its ID.") @ApiResponse(responseCode = "200", description = "Auction retrieved successfully") diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index 4b262095..a2020db4 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -43,4 +43,24 @@ public ProductCategoryParam(String productCategory) { this.productCategory = ProductCategory.fromDisplayName(productCategory); } } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class AuctionStatusParam { + AuctionStatus auctionStatus; + + public AuctionStatusParam(String auctionStatus) { + this.auctionStatus = AuctionStatus.fromDisplayName(auctionStatus); + } + + } + @Getter + @AllArgsConstructor + public static class SearchCondition{ + String auctionCategory; + String productCategory; + LocalDateTime endTime; + String auctionStatus; + } } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java index 8401f93b..7b9cda2d 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java @@ -4,5 +4,13 @@ public enum AuctionStatus { PENDING, ACTIVE, CLOSED, - CANCELED + CANCELED; + + public static AuctionStatus fromDisplayName(String auctionStatus) { + try { + return AuctionStatus.valueOf(auctionStatus.toUpperCase()); // 대문자로 변환하여 비교 + } catch (IllegalArgumentException e) { + return AuctionStatus.ACTIVE; // 유효하지 않은 값일 경우 기본값으로 ACTIVE 반환 + } + } } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index f54991f1..2458d84f 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -6,11 +6,16 @@ import com.tasksprints.auction.domain.product.model.ProductCategory; +import java.time.Duration; import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category); + AuctionCategory category, + LocalDateTime now, + LocalDateTime endTime, + AuctionStatus status); + //삭제해야 함 public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 9c899715..75ecd309 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -20,7 +20,10 @@ public class AuctionCriteriaRepositoryImpl implements AuctionCriteriaRepository private final JPAQueryFactory queryFactory; public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category + AuctionCategory category, + LocalDateTime now, + LocalDateTime endTime, + AuctionStatus status ) { QAuction auction = QAuction.auction; QProduct product = QProduct.product; @@ -28,10 +31,15 @@ public List getAuctionsByFilters(ProductCategory productCategory, .leftJoin(auction.product, product) // Auction과 Product 조인 .where(category != null ? auction.auctionCategory.eq(category) : null) .where(productCategory != null ? product.category.eq(productCategory) : null) // ProductCategory 필터 + .where((now != null && endTime != null) ? auction.endTime.between(now, endTime) : null) + .where(status != null ? auction.auctionStatus.eq(status) : null) + // orderBy는 성능 이슈로 일단 보류 +// .orderBy(auction.endTime.asc()) .fetch(); } + @Deprecated @Override public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { QAuction auction = QAuction.auction; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index d923a19b..35d63fd5 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -26,8 +26,10 @@ public interface AuctionService { List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param); - List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam); + List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition); + @Deprecated List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); + @Deprecated List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 776f96c2..64187cff 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -6,6 +6,7 @@ import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; import com.tasksprints.auction.domain.auction.model.Auction; +import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.repository.AuctionRepository; import com.tasksprints.auction.domain.user.exception.UserNotFoundException; @@ -128,16 +129,29 @@ public List getAuctionsByAuctionCategory(AuctionRequest.Auction * NULL 안정성 보장을 해줬음 **/ @Override - public List getAuctionsByFilter(AuctionRequest.ProductCategoryParam productCategoryParam, AuctionRequest.AuctionCategoryParam auctionCategoryParam) { + public List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition) { + LocalDateTime now = null; + //now는 endTime이 SeachCondition에 들어왔을 때만 값이 있어야 한다. (현재 시각 ~ User가 정한 시각까지 경매 목록 조회) + if (searchCondition.getEndTime() != null) { + now = LocalDateTime.now(); + } + List foundAuctions = auctionRepository.getAuctionsByFilters( - productCategoryParam != null ? productCategoryParam.getProductCategory() : null, - auctionCategoryParam != null ? auctionCategoryParam.getAuctionCategory() : null); +// productCategoryParam != null ? productCategoryParam.getProductCategory() : null, +// auctionCategoryParam != null ? auctionCategoryParam.getAuctionCategory() : null, + searchCondition.getProductCategory() !=null ? new AuctionRequest.ProductCategoryParam(searchCondition.getProductCategory()).getProductCategory() : null, + searchCondition.getAuctionCategory() != null ? new AuctionRequest.AuctionCategoryParam(searchCondition.getAuctionCategory()).getAuctionCategory() : null, + now, + searchCondition.getEndTime() != null ? searchCondition.getEndTime(): null, + searchCondition.getAuctionStatus() != null ? new AuctionRequest.AuctionStatusParam(searchCondition.getAuctionStatus()).getAuctionStatus() : null + ); return foundAuctions.stream() .map(AuctionResponse::of) .toList(); } + @Deprecated @Override public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 @@ -152,6 +166,7 @@ public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalD .toList(); } + @Deprecated @Override public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours) { // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 953e3d4b..7f59b917 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -58,16 +58,16 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat ); } - private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { - return Auction.create( - LocalDateTime.of(2024, 8, 1, 10, 0), - endTime, - BigDecimal.valueOf(100.00), - AuctionCategory.PUBLIC_PAID, - status, - seller - ); - } +// private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { +// return Auction.create( +// LocalDateTime.of(2024, 8, 1, 10, 0), +// endTime, +// BigDecimal.valueOf(100.00), +// AuctionCategory.PUBLIC_PAID, +// status, +// seller +// ); +// } @Test @DisplayName("사용자 ID로 경매 목록 조회") @@ -109,25 +109,25 @@ public void testFindAll() { } - @Test - @DisplayName("경매 유형이 []인 경매 목록 조회") - public void testFindAuctionsByAuctionCategory() { - //given - Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); - Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - - auctionRepository.save(auction1); - auctionRepository.save(auction2); - auctionRepository.save(auction3); - - //when - List auctions = auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID); - - //then - assertThat(auctions).hasSize(2); - assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); - } +// @Test +// @DisplayName("경매 유형이 []인 경매 목록 조회") +// public void testFindAuctionsByAuctionCategory() { +// //given +// Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); +// Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); +// Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); +// +// auctionRepository.save(auction1); +// auctionRepository.save(auction2); +// auctionRepository.save(auction3); +// +// //when +// List auctions = auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID); +// +// //then +// assertThat(auctions).hasSize(2); +// assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); +// } @Test @DisplayName("QueryDSL 필터를 통해서 경매 목록 조회") @@ -138,7 +138,7 @@ public void testFindAllUsingFilter() { auctionRepository.save(auction1); auctionRepository.save(auction2); - List auctions = auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE); + List auctions = auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE, null, null, null); log.info(auctions.toString()); assertThat(auctions).hasSize(1); @@ -148,40 +148,40 @@ public void testFindAllUsingFilter() { } - @Test - @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") - public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { - //given - LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); - LocalDateTime next24Hours = fixedNow.plusHours(24); - - List auctions = List.of( - createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), - createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) - ); - - auctionRepository.saveAll(auctions); - - // when - List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); - - //then - assertThat(result).hasSize(3); - - assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", - () -> { - LocalDateTime previousEndTime = null; - for (Auction auction : result) { - if (previousEndTime != null) { - assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); - } - previousEndTime = auction.getEndTime(); - } - } - ); - } +// @Test +// @DisplayName("경매 마감 시간까지 24시간 이하로 남은 경매 목록 조회") +// public void testFindAuctionsByEndTimeBetweenOrderByEndTimeAsc() { +// //given +// LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); +// LocalDateTime next24Hours = fixedNow.plusHours(24); +// +// List auctions = List.of( +// createAuction(fixedNow.plusHours(23), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(22), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(21), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(48), AuctionStatus.ACTIVE), +// createAuction(fixedNow.plusHours(20), AuctionStatus.PENDING) +// ); +// +// auctionRepository.saveAll(auctions); +// +// // when +// List result = auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE); +// +// //then +// assertThat(result).hasSize(3); +// +// assertAll("endTime을 기준으로 오름차순 정렬이 되었는지 확인", +// () -> { +// LocalDateTime previousEndTime = null; +// for (Auction auction : result) { +// if (previousEndTime != null) { +// assertThat(auction.getEndTime()).isAfterOrEqualTo(previousEndTime); +// } +// previousEndTime = auction.getEndTime(); +// } +// } +// ); +// } } diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 4bbbad41..3f828c89 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -317,22 +317,22 @@ void testGetAuctionById_AuctionNotFound() { @Nested @DisplayName("경매 유형이 []인 경매 목록 조회") class GetAuctionsByAuctionCategoryTests { - @Test - @DisplayName("경매 유형 조회 : [성공]") - public void testGetAuctionsByAuctionCategory_Success() { - Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); - Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); - List expectedAuctions = List.of(auction1, auction2); - - when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); - List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .collect(Collectors.toList()); - - List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); - assertThat(actualAuctions).isEqualTo(expectedResponses); - } +// @Test +// @DisplayName("경매 유형 조회 : [성공]") +// public void testGetAuctionsByAuctionCategory_Success() { +// Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); +// Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); +// AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); +// List expectedAuctions = List.of(auction1, auction2); +// +// when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); +// List expectedResponses = expectedAuctions.stream() +// .map(AuctionResponse::of) +// .collect(Collectors.toList()); +// +// List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); +// assertThat(actualAuctions).isEqualTo(expectedResponses); +// } @Test @DisplayName("경매 유형 조회 : [성공] -Criteria 사용") @@ -342,7 +342,7 @@ public void testGetAuctionsByAuctionCategory_Success_Criteria() { AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); List expectedAuctions = List.of(auction1, auction2); - when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); + when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_PAID, null, null, null)).thenReturn(expectedAuctions); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) .toList(); @@ -380,34 +380,34 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { } } - @Nested - @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") - class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { - @Test - @DisplayName("경매 마감 임박 목록 조회 : 성공") - public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { - //given - LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); - LocalDateTime next24Hours = fixedNow.plusHours(24); - - List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), - createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), - createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) - ); - - List expectedResponses = expectedAuctions.stream() - .map(AuctionResponse::of) - .toList(); - - when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); - List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); - - //then - assertThat(actualResponses).isEqualTo(expectedResponses); - - - } - } +// @Nested +// @DisplayName("경매 마감 시간이 24시간 이하인 경매 목록 조회") +// class GetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAscTests { +// @Test +// @DisplayName("경매 마감 임박 목록 조회 : 성공") +// public void testGetAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc_Success() { +// //given +// LocalDateTime fixedNow = LocalDateTime.of(2024, 9, 1, 10, 0); +// LocalDateTime next24Hours = fixedNow.plusHours(24); +// +// List expectedAuctions = List.of(createAuction(1L, fixedNow.plusHours(21), AuctionStatus.ACTIVE), +// createAuction(2L, fixedNow.plusHours(22), AuctionStatus.ACTIVE), +// createAuction(3L, fixedNow.plusHours(23), AuctionStatus.ACTIVE) +// ); +// +// List expectedResponses = expectedAuctions.stream() +// .map(AuctionResponse::of) +// .toList(); +// +// when(auctionRepository.getAuctionsEndWith24Hours(fixedNow, next24Hours, AuctionStatus.ACTIVE)).thenReturn(expectedAuctions); +// List actualResponses = auctionService.getAuctionsEndWith24Hours(fixedNow, next24Hours); +// +// //then +// assertThat(actualResponses).isEqualTo(expectedResponses); +// +// +// } +// } } From 7e4e4cf992b841830f45676c17072201eae22cf2 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Tue, 10 Sep 2024 23:17:31 +0900 Subject: [PATCH 07/31] =?UTF-8?q?fix=20:=20startTime=20=EC=9D=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EC=95=84=EC=84=9C=20=EC=A7=84?= =?UTF-8?q?=ED=96=89,=20=EB=82=B4=EB=B6=80=EC=97=90=EC=84=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=ED=95=98=EB=8A=94=20=EA=B2=83=EB=B3=B4=EB=8B=A4=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=EC=84=B1=EC=9D=B4=20=EB=84=93=EC=9D=84=20?= =?UTF-8?q?=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EA=B3=A0=EB=A0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auction/dto/request/AuctionRequest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index a2020db4..d8e41f3f 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -58,9 +58,11 @@ public AuctionStatusParam(String auctionStatus) { @Getter @AllArgsConstructor public static class SearchCondition{ - String auctionCategory; - String productCategory; + AuctionCategory auctionCategory; + ProductCategory productCategory; + LocalDateTime startTime; LocalDateTime endTime; - String auctionStatus; + AuctionStatus auctionStatus; + } } From 98c1fffb88d4c4da1179bcb18ad45fce4d4825b0 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Tue, 10 Sep 2024 23:19:00 +0900 Subject: [PATCH 08/31] =?UTF-8?q?refactor=20:=20Condition=EC=97=90?= =?UTF-8?q?=EC=84=9C=20StartTime=EB=8F=84=20=EB=B0=9B=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EA=B5=AC=EC=84=B1=20-=20?= =?UTF-8?q?=EA=B3=A0=EC=A0=95=20Clock=20=EC=9D=B4=20=EC=95=84=EB=8B=8C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20TZ=EB=A1=9C=20=EC=9D=B8=ED=95=B4=EC=84=9C?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EB=B0=9C=EC=83=9D=20=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auction/service/AuctionServiceImpl.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 64187cff..0f6f0678 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -130,20 +130,8 @@ public List getAuctionsByAuctionCategory(AuctionRequest.Auction **/ @Override public List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition) { - LocalDateTime now = null; - //now는 endTime이 SeachCondition에 들어왔을 때만 값이 있어야 한다. (현재 시각 ~ User가 정한 시각까지 경매 목록 조회) - if (searchCondition.getEndTime() != null) { - now = LocalDateTime.now(); - } - List foundAuctions = auctionRepository.getAuctionsByFilters( -// productCategoryParam != null ? productCategoryParam.getProductCategory() : null, -// auctionCategoryParam != null ? auctionCategoryParam.getAuctionCategory() : null, - searchCondition.getProductCategory() !=null ? new AuctionRequest.ProductCategoryParam(searchCondition.getProductCategory()).getProductCategory() : null, - searchCondition.getAuctionCategory() != null ? new AuctionRequest.AuctionCategoryParam(searchCondition.getAuctionCategory()).getAuctionCategory() : null, - now, - searchCondition.getEndTime() != null ? searchCondition.getEndTime(): null, - searchCondition.getAuctionStatus() != null ? new AuctionRequest.AuctionStatusParam(searchCondition.getAuctionStatus()).getAuctionStatus() : null + searchCondition ); return foundAuctions.stream() From 612079eb1f172e5f0ed8fbec34f1dd4bdd2391d1 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Tue, 10 Sep 2024 23:20:07 +0900 Subject: [PATCH 09/31] =?UTF-8?q?refactor=20:=20AuctionCriteriaRepository?= =?UTF-8?q?=20BooleanBuilder=20=EB=A5=BC=20=ED=99=9C=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=BF=BC=EB=A6=AC=EC=9D=98=20null=20=EC=95=88?= =?UTF-8?q?=EC=A0=95=EC=84=B1=20=ED=99=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/AuctionCriteriaRepository.java | 7 +--- .../AuctionCriteriaRepositoryImpl.java | 40 +++++++++++++------ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index 2458d84f..606af878 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -1,5 +1,6 @@ package com.tasksprints.auction.domain.auction.repository.support; +import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; @@ -11,11 +12,7 @@ import java.util.List; public interface AuctionCriteriaRepository { - public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category, - LocalDateTime now, - LocalDateTime endTime, - AuctionStatus status); + public List getAuctionsByFilters(AuctionRequest.SearchCondition searchCondition); //삭제해야 함 public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 75ecd309..81fcb46d 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -1,7 +1,9 @@ package com.tasksprints.auction.domain.auction.repository.support; +import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; @@ -19,26 +21,40 @@ public class AuctionCriteriaRepositoryImpl implements AuctionCriteriaRepository { private final JPAQueryFactory queryFactory; - public List getAuctionsByFilters(ProductCategory productCategory, - AuctionCategory category, - LocalDateTime now, - LocalDateTime endTime, - AuctionStatus status - ) { + public List getAuctionsByFilters(AuctionRequest.SearchCondition condition) { QAuction auction = QAuction.auction; QProduct product = QProduct.product; + + BooleanBuilder builder = new BooleanBuilder(); + + // AuctionCategory 필터 + if (condition.getAuctionCategory() != null) { + builder.and(auction.auctionCategory.eq(condition.getAuctionCategory())); + } + + // ProductCategory 필터 + if (condition.getProductCategory() != null) { + builder.and(product.category.eq(condition.getProductCategory())); + } + + // StartTime ~ EndTime 필터 + if (condition.getStartTime() != null && condition.getEndTime() != null) { + builder.and(auction.endTime.between(condition.getStartTime(), condition.getEndTime())); + } + + // AuctionStatus 필터 + if (condition.getAuctionStatus() != null) { + builder.and(auction.auctionStatus.eq(condition.getAuctionStatus())); + } + return queryFactory.selectFrom(auction) .leftJoin(auction.product, product) // Auction과 Product 조인 - .where(category != null ? auction.auctionCategory.eq(category) : null) - .where(productCategory != null ? product.category.eq(productCategory) : null) // ProductCategory 필터 - .where((now != null && endTime != null) ? auction.endTime.between(now, endTime) : null) - .where(status != null ? auction.auctionStatus.eq(status) : null) + .where(builder) // orderBy는 성능 이슈로 일단 보류 -// .orderBy(auction.endTime.asc()) + // .orderBy(auction.endTime.asc()) .fetch(); } - @Deprecated @Override public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { From 9ce20ec25a5bb575e6d70fb9ff7bc7650ea4eab4 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Tue, 10 Sep 2024 23:20:56 +0900 Subject: [PATCH 10/31] =?UTF-8?q?test=20:=20auction=20test=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(=20=ED=98=84=EC=9E=AC=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=9D=B4=20=ED=95=84=EC=9A=94=ED=95=9C=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B2=98=EB=A6=AC=20=EB=90=98=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/api/AuctionControllerTest.java | 42 +++++++++---------- .../repository/AuctionRepositoryTest.java | 5 ++- .../service/AuctionServiceImplTest.java | 12 +++--- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index 1a26de33..93223fca 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -108,32 +108,32 @@ public void testGetAuctionStatus_Success() throws Exception { .andExpect(jsonPath("$.data").value(auctionStatus)); } - @Test - @DisplayName("경매 유형을 통한 경매목록 조회") - public void testFindAuctionByUsingAuctionCategory_Success() throws Exception { - List auctionResponseList = new ArrayList<>(); - when(auctionService.getAuctionsByFilter(any(), any())).thenReturn(auctionResponseList); - mockMvc.perform(get("/api/v1/auction") - .param("auctionCategory", String.valueOf(AuctionCategory.PRIVATE_FREE))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); - } +// @Test +// @DisplayName("경매 유형을 통한 경매목록 조회") +// public void testFindAuctionByUsingAuctionCategory_Success() throws Exception { +// List auctionResponseList = new ArrayList<>(); +// when(auctionService.getAuctionsByFilter(any(), any())).thenReturn(auctionResponseList); +// mockMvc.perform(get("/api/v1/auction") +// .param("auctionCategory", String.valueOf(AuctionCategory.PRIVATE_FREE))) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); +// } /** * 해당 기저 처리 해야함. * 기본값으로 대응 PUBLIC_FREE로 */ - @Test - @DisplayName("잘못된 유형을 통한 경매목록 조회(기본값으로 대응)") - public void testFindAuctionByUsingWrongAuctionCategory_Success() throws Exception { - List auctionResponseList = new ArrayList<>(); - when(auctionService.getAuctionsByFilter(any(), any())).thenReturn(auctionResponseList); - - mockMvc.perform(get("/api/v1/auction") - .param("auctionCategory", "NON")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); - } +// @Test +// @DisplayName("잘못된 유형을 통한 경매목록 조회(기본값으로 대응)") +// public void testFindAuctionByUsingWrongAuctionCategory_Success() throws Exception { +// List auctionResponseList = new ArrayList<>(); +// when(auctionService.getAuctionsByFilter(any(), any())).thenReturn(auctionResponseList); +// +// mockMvc.perform(get("/api/v1/auction") +// .param("auctionCategory", "NON")) +// .andExpect(status().isOk()) +// .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); +// } @Test @DisplayName("마감 기한이 24시간 이하로 남은 경매 목록 조회") diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 7f59b917..c9045ace 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -1,6 +1,7 @@ package com.tasksprints.auction.domain.auction.repository; import com.tasksprints.auction.common.config.QueryDslConfig; +import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; @@ -134,11 +135,11 @@ public void testFindAll() { public void testFindAllUsingFilter() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); - List auctions = auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE, null, null, null); + List auctions = auctionRepository.getAuctionsByFilters(condition); log.info(auctions.toString()); assertThat(auctions).hasSize(1); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 3f828c89..3ce4059c 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -339,15 +339,15 @@ class GetAuctionsByAuctionCategoryTests { public void testGetAuctionsByAuctionCategory_Success_Criteria() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null); List expectedAuctions = List.of(auction1, auction2); - when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_PAID, null, null, null)).thenReturn(expectedAuctions); + when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) .toList(); - List actualAuctions = auctionService.getAuctionsByFilter(null, param); + List actualAuctions = auctionService.getAuctionsByFilter(condition); assertThat(actualAuctions).isEqualTo(expectedResponses); } @@ -369,12 +369,12 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound() { @DisplayName("경매 유형 조회 : [결과 없음] - Criteria 사용") public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { List emptyAuctionList = List.of(); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_FREE); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null); - when(auctionRepository.getAuctionsByFilters(null, AuctionCategory.PUBLIC_FREE)) + when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); - List actualAuctions = auctionService.getAuctionsByFilter(null, param); + List actualAuctions = auctionService.getAuctionsByFilter(condition); assertThat(actualAuctions).isEmpty(); } From 41ef16bf6ea9a787067c1cd90c8d37732cd55e93 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 13:27:57 +0900 Subject: [PATCH 11/31] =?UTF-8?q?fix=20:=20price=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=95=84=ED=84=B0=20=EC=B6=94=EA=B0=80,=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/domain/auction/dto/request/AuctionRequest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index d8e41f3f..5984c2ac 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -3,6 +3,7 @@ import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.product.model.ProductCategory; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -57,12 +58,14 @@ public AuctionStatusParam(String auctionStatus) { } @Getter @AllArgsConstructor + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class SearchCondition{ AuctionCategory auctionCategory; ProductCategory productCategory; LocalDateTime startTime; LocalDateTime endTime; + BigDecimal minPrice; + BigDecimal maxPrice; AuctionStatus auctionStatus; - } } From 0350d5e6cdd8ad75da3e09cb3b05eae85449107e Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 13:28:41 +0900 Subject: [PATCH 12/31] =?UTF-8?q?fix=20:=20AuctionCriteriaRepository?= =?UTF-8?q?=EC=97=90=20price=20=EA=B4=80=EB=A0=A8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/AuctionCriteriaRepositoryImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 81fcb46d..199303cc 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -27,22 +27,21 @@ public List getAuctionsByFilters(AuctionRequest.SearchCondition conditi BooleanBuilder builder = new BooleanBuilder(); - // AuctionCategory 필터 if (condition.getAuctionCategory() != null) { builder.and(auction.auctionCategory.eq(condition.getAuctionCategory())); } - // ProductCategory 필터 if (condition.getProductCategory() != null) { builder.and(product.category.eq(condition.getProductCategory())); } - - // StartTime ~ EndTime 필터 + // 현재 입찰가를 알 수 있게 변경해야함 + if (condition.getMinPrice() != null && condition.getMaxPrice() != null) { + builder.and(auction.startingBid.between(condition.getMinPrice(), condition.getMaxPrice())); + } if (condition.getStartTime() != null && condition.getEndTime() != null) { builder.and(auction.endTime.between(condition.getStartTime(), condition.getEndTime())); } - // AuctionStatus 필터 if (condition.getAuctionStatus() != null) { builder.and(auction.auctionStatus.eq(condition.getAuctionStatus())); } From fea9dddbf32b6bc685d0340b129fc88e0ec5dd9d Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 13:29:41 +0900 Subject: [PATCH 13/31] =?UTF-8?q?test=20:=20=ED=95=84=ED=84=B0=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/AuctionRepositoryTest.java | 51 ++++++++----------- .../service/AuctionServiceImplTest.java | 36 ++++++------- 2 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index c9045ace..5489fad4 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -59,17 +59,6 @@ private Auction createAuction(User seller, AuctionCategory category, AuctionStat ); } -// private Auction createAuction(LocalDateTime endTime, AuctionStatus status) { -// return Auction.create( -// LocalDateTime.of(2024, 8, 1, 10, 0), -// endTime, -// BigDecimal.valueOf(100.00), -// AuctionCategory.PUBLIC_PAID, -// status, -// seller -// ); -// } - @Test @DisplayName("사용자 ID로 경매 목록 조회") public void testFindAuctionsByUserId() { @@ -110,32 +99,32 @@ public void testFindAll() { } -// @Test -// @DisplayName("경매 유형이 []인 경매 목록 조회") -// public void testFindAuctionsByAuctionCategory() { -// //given -// Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); -// Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); -// Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); -// -// auctionRepository.save(auction1); -// auctionRepository.save(auction2); -// auctionRepository.save(auction3); -// -// //when -// List auctions = auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID); -// -// //then -// assertThat(auctions).hasSize(2); -// assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); -// } + @Test + @DisplayName("경매 유형이 []인 경매 목록 조회") + public void testFindAuctionsByAuctionCategory() { + //given + Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); + Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); + auctionRepository.save(auction1); + auctionRepository.save(auction2); + auctionRepository.save(auction3); + + //when + List auctions = auctionRepository.getAuctionsByFilters(condition); + + //then + assertThat(auctions).hasSize(2); + assertThat(auctions).allMatch(auction -> auction.getAuctionCategory() == AuctionCategory.PUBLIC_PAID); + } @Test @DisplayName("QueryDSL 필터를 통해서 경매 목록 조회") public void testFindAllUsingFilter() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null,null,null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 3ce4059c..e46e6f34 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -317,29 +317,29 @@ void testGetAuctionById_AuctionNotFound() { @Nested @DisplayName("경매 유형이 []인 경매 목록 조회") class GetAuctionsByAuctionCategoryTests { -// @Test -// @DisplayName("경매 유형 조회 : [성공]") -// public void testGetAuctionsByAuctionCategory_Success() { -// Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); -// Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); -// AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); -// List expectedAuctions = List.of(auction1, auction2); -// -// when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); -// List expectedResponses = expectedAuctions.stream() -// .map(AuctionResponse::of) -// .collect(Collectors.toList()); -// -// List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); -// assertThat(actualAuctions).isEqualTo(expectedResponses); -// } + @Test + @DisplayName("경매 유형 조회 : [성공]") + public void testGetAuctionsByAuctionCategory_Success() { + Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); + Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); + AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); + List expectedAuctions = List.of(auction1, auction2); + + when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); + List expectedResponses = expectedAuctions.stream() + .map(AuctionResponse::of) + .toList(); + + List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); + assertThat(actualAuctions).isEqualTo(expectedResponses); + } @Test @DisplayName("경매 유형 조회 : [성공] -Criteria 사용") public void testGetAuctionsByAuctionCategory_Success_Criteria() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); List expectedAuctions = List.of(auction1, auction2); when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); @@ -369,7 +369,7 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound() { @DisplayName("경매 유형 조회 : [결과 없음] - Criteria 사용") public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { List emptyAuctionList = List.of(); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); From e0fedd3561e3ec979a093fa588409541c9881daf Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 14:33:09 +0900 Subject: [PATCH 14/31] =?UTF-8?q?feat:=20Resolver=20=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20Controller=EC=97=90=EC=84=9C=20QueryString?= =?UTF-8?q?=20=ED=98=95=EC=8B=9D=EC=9D=B4=20SearchCondition=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20Wrapping=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/SearchConditionResolver.java | 58 +++++++++++++++++++ .../auction/common/config/WebConfig.java | 22 +++++++ 2 files changed, 80 insertions(+) create mode 100644 src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java create mode 100644 src/main/java/com/tasksprints/auction/common/config/WebConfig.java diff --git a/src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java b/src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java new file mode 100644 index 00000000..a5bb2446 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java @@ -0,0 +1,58 @@ +package com.tasksprints.auction.common; + +import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; +import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; +import com.tasksprints.auction.domain.product.model.ProductCategory; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Component +public class SearchConditionResolver implements HandlerMethodArgumentResolver { + @Override + public boolean supportsParameter(MethodParameter parameter) { + // 메서드 파라미터 타입이 AuctionRequest.SearchCondition일 때 처리 + return parameter.getParameterType().equals(AuctionRequest.SearchCondition.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + + // QueryString에서 값을 추출 + String auctionCategory = webRequest.getParameter("auctionCategory"); + String productCategory = webRequest.getParameter("productCategory"); + String startTime = webRequest.getParameter("startTime"); + String endTime = webRequest.getParameter("endTime"); + String minPrice = webRequest.getParameter("minPrice"); + String maxPrice = webRequest.getParameter("maxPrice"); + String auctionStatus = webRequest.getParameter("auctionStatus"); + // 파싱 및 변환 + AuctionCategory parsedAuctionCategory = auctionCategory != null ? AuctionCategory.fromDisplayName(auctionCategory) : null; + ProductCategory parsedProductCategory = productCategory != null ? ProductCategory.fromDisplayName(productCategory) : null; + LocalDateTime parsedStartTime = startTime != null ? LocalDateTime.parse(startTime, DateTimeFormatter.ISO_DATE_TIME) : null; + LocalDateTime parsedEndTime = endTime != null ? LocalDateTime.parse(endTime, DateTimeFormatter.ISO_DATE_TIME) : null; + BigDecimal parsedMinPrice = minPrice != null ? new BigDecimal(minPrice) : null; + BigDecimal parsedMaxPrice = maxPrice != null ? new BigDecimal(maxPrice) : null; + AuctionStatus parsedAuctionStatus = auctionStatus != null ? AuctionStatus.fromDisplayName(auctionStatus) : null; + + // SearchCondition 객체 생성 및 반환 + return new AuctionRequest.SearchCondition( + parsedAuctionCategory, + parsedProductCategory, + parsedStartTime, + parsedEndTime, + parsedMinPrice, + parsedMaxPrice, + parsedAuctionStatus + ); + } +} diff --git a/src/main/java/com/tasksprints/auction/common/config/WebConfig.java b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java new file mode 100644 index 00000000..850dd8b4 --- /dev/null +++ b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java @@ -0,0 +1,22 @@ +package com.tasksprints.auction.common.config; + +import com.tasksprints.auction.common.SearchConditionResolver; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + private final SearchConditionResolver searchConditionResolver; + + public WebConfig(SearchConditionResolver searchConditionResolver) { + this.searchConditionResolver = searchConditionResolver; + } + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(searchConditionResolver); + } +} From ca472bb7f8aefdf7cdb4d49d4c7cfb55a7e13f9f Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 14:33:51 +0900 Subject: [PATCH 15/31] =?UTF-8?q?refactor=20:=20AuctionController=20GetMap?= =?UTF-8?q?ping=20=EC=97=90=EC=84=9C=20RequestBody=20=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=8C=20QueryString=EC=9C=BC=EB=A1=9C=20=ED=95=84=ED=84=B0?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/tasksprints/auction/api/auction/AuctionController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java index 04db8c8d..2136a4f8 100644 --- a/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java +++ b/src/main/java/com/tasksprints/auction/api/auction/AuctionController.java @@ -80,7 +80,7 @@ public ResponseEntity> getAuctionStatus(@PathVariable Long auc @GetMapping @Operation(summary = "Get all auctions", description = "Retrieves all auctions.") @ApiResponse(responseCode = "200", description = "All auctions retrieved successfully") - public ResponseEntity>> getAllAuctions(@RequestBody AuctionRequest.SearchCondition searchCondition) { + public ResponseEntity>> getAllAuctions(AuctionRequest.SearchCondition searchCondition) { List auctions = auctionService.getAuctionsByFilter(searchCondition); return ResponseEntity.ok(ApiResult.success(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED, auctions)); } From 87a95ff2aea5215355c2b464b0a9c6829cc89e6d Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 14:34:15 +0900 Subject: [PATCH 16/31] =?UTF-8?q?fix=20:=20ProductCategory=20enum=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20exception=20=EA=B8=B0=EC=A0=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/product/model/ProductCategory.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java index db4d2de4..0acbf057 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java +++ b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java @@ -1,5 +1,7 @@ package com.tasksprints.auction.domain.product.model; +import com.tasksprints.auction.domain.auction.model.AuctionCategory; + public enum ProductCategory { WOMENS_CLOTHING("여성의류"), UNDERWEAR_SLEEPWEAR("언더웨어/잠옷"), @@ -52,12 +54,15 @@ public enum ProductCategory { * 한정된 갯수의 Category 이기에 따로 Over-head는 발생하지 않을 것으로 판단 ***/ public static ProductCategory fromDisplayName(String displayName) { - for (ProductCategory category : values()) { - if (category.displayName.equals(displayName)) { - return category; - } + if (displayName == null || displayName.trim().isEmpty()) { + throw new IllegalArgumentException("Display name cannot be null or empty."); + } + + try { + return ProductCategory.valueOf(displayName.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid product category: " + displayName); } - throw new IllegalArgumentException("Unknown category: " + displayName); } public String getDisplayName() { From 6b372d159deb54a7a520c579349d7b2e0374a354 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 14:34:44 +0900 Subject: [PATCH 17/31] =?UTF-8?q?test=20:=20AuctionControllerTest=20?= =?UTF-8?q?=EC=97=90=20QueryString=EC=9D=84=20=ED=86=B5=ED=95=B4=EC=84=9C?= =?UTF-8?q?=20=ED=95=84=ED=84=B0=EA=B8=B0=EB=B0=98=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/api/AuctionControllerTest.java | 55 +++++++++++-------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index 93223fca..55b4e0f8 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -6,9 +6,11 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.service.AuctionService; import com.tasksprints.auction.domain.bid.dto.BidResponse; import com.tasksprints.auction.domain.bid.service.BidService; +import com.tasksprints.auction.domain.product.model.ProductCategory; import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; import com.tasksprints.auction.domain.review.service.ReviewService; @@ -22,6 +24,7 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -108,21 +111,27 @@ public void testGetAuctionStatus_Success() throws Exception { .andExpect(jsonPath("$.data").value(auctionStatus)); } -// @Test -// @DisplayName("경매 유형을 통한 경매목록 조회") -// public void testFindAuctionByUsingAuctionCategory_Success() throws Exception { -// List auctionResponseList = new ArrayList<>(); -// when(auctionService.getAuctionsByFilter(any(), any())).thenReturn(auctionResponseList); -// mockMvc.perform(get("/api/v1/auction") -// .param("auctionCategory", String.valueOf(AuctionCategory.PRIVATE_FREE))) -// .andExpect(status().isOk()) -// .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); -// } + @Test + @DisplayName("QueryString을 통한 경매 목록 조회") + public void testFindAuctionByUsingQueryString_Success() throws Exception { + // Given + List auctionResponseList = new ArrayList<>(); + when(auctionService.getAuctionsByFilter(any())).thenReturn(auctionResponseList); + + // When & Then + mockMvc.perform(get("/api/v1/auction") + .param("auctionCategory", AuctionCategory.PRIVATE_FREE.name()) + .param("productCategory", ProductCategory.BEAUTY.name()) + .param("startTime", LocalDateTime.now().minusDays(1).toString()) + .param("endTime", LocalDateTime.now().toString()) + .param("minPrice", "100") + .param("maxPrice", "500") + .param("auctionStatus", AuctionStatus.ACTIVE.name()) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); + } - /** - * 해당 기저 처리 해야함. - * 기본값으로 대응 PUBLIC_FREE로 - */ // @Test // @DisplayName("잘못된 유형을 통한 경매목록 조회(기본값으로 대응)") // public void testFindAuctionByUsingWrongAuctionCategory_Success() throws Exception { @@ -135,15 +144,15 @@ public void testGetAuctionStatus_Success() throws Exception { // .andExpect(jsonPath("$.message").value(ApiResponseMessages.ALL_AUCTIONS_RETRIEVED)); // } - @Test - @DisplayName("마감 기한이 24시간 이하로 남은 경매 목록 조회") - public void testFindAuctionsEndWithin24Hours_Success() throws Exception { - - /* - 테스트 코드 추가 - * */ - - } +// @Test +// @DisplayName("마감 기한이 24시간 이하로 남은 경매 목록 조회") +// public void testFindAuctionsEndWithin24Hours_Success() throws Exception { +// +// /* +// 테스트 코드 추가 +// * */ +// +// } @Test @DisplayName("입찰 제출 성공") From b5139cbc6be69eb87385137316c40503cbb0a29d Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 14:37:35 +0900 Subject: [PATCH 18/31] =?UTF-8?q?chore=20:=20=ED=8F=B4=EB=8D=94=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EB=B0=8F=20lint=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasksprints/auction/common/config/WebConfig.java | 2 +- .../common/{ => resolver}/SearchConditionResolver.java | 2 +- .../domain/auction/dto/request/AuctionRequest.java | 3 ++- .../auction/domain/auction/model/AuctionStatus.java | 10 +++++----- .../domain/auction/repository/AuctionRepository.java | 3 ++- .../repository/support/AuctionCriteriaRepository.java | 9 +++------ .../support/AuctionCriteriaRepositoryImpl.java | 10 ++++------ .../auction/domain/auction/service/AuctionService.java | 1 + .../domain/auction/service/AuctionServiceImpl.java | 9 ++++----- .../auction/domain/product/model/ProductCategory.java | 2 -- 10 files changed, 23 insertions(+), 28 deletions(-) rename src/main/java/com/tasksprints/auction/common/{ => resolver}/SearchConditionResolver.java (98%) diff --git a/src/main/java/com/tasksprints/auction/common/config/WebConfig.java b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java index 850dd8b4..c64b94eb 100644 --- a/src/main/java/com/tasksprints/auction/common/config/WebConfig.java +++ b/src/main/java/com/tasksprints/auction/common/config/WebConfig.java @@ -1,6 +1,6 @@ package com.tasksprints.auction.common.config; -import com.tasksprints.auction.common.SearchConditionResolver; +import com.tasksprints.auction.common.resolver.SearchConditionResolver; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; diff --git a/src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java b/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java similarity index 98% rename from src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java rename to src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java index a5bb2446..ba0f8130 100644 --- a/src/main/java/com/tasksprints/auction/common/SearchConditionResolver.java +++ b/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java @@ -1,4 +1,4 @@ -package com.tasksprints.auction.common; +package com.tasksprints.auction.common.resolver; import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.AuctionCategory; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index 5984c2ac..56eb288e 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -56,10 +56,11 @@ public AuctionStatusParam(String auctionStatus) { } } + @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class SearchCondition{ + public static class SearchCondition { AuctionCategory auctionCategory; ProductCategory productCategory; LocalDateTime startTime; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java index 7b9cda2d..2f69867d 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/model/AuctionStatus.java @@ -7,10 +7,10 @@ public enum AuctionStatus { CANCELED; public static AuctionStatus fromDisplayName(String auctionStatus) { - try { - return AuctionStatus.valueOf(auctionStatus.toUpperCase()); // 대문자로 변환하여 비교 - } catch (IllegalArgumentException e) { - return AuctionStatus.ACTIVE; // 유효하지 않은 값일 경우 기본값으로 ACTIVE 반환 - } + try { + return AuctionStatus.valueOf(auctionStatus.toUpperCase()); // 대문자로 변환하여 비교 + } catch (IllegalArgumentException e) { + return AuctionStatus.ACTIVE; // 유효하지 않은 값일 경우 기본값으로 ACTIVE 반환 } + } } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java index a848286b..060042dd 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java @@ -3,9 +3,9 @@ import com.tasksprints.auction.domain.auction.model.Auction; import com.tasksprints.auction.domain.auction.model.AuctionCategory; +import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository; import com.tasksprints.auction.domain.product.model.ProductCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -26,6 +26,7 @@ public interface AuctionRepository extends JpaRepository, Auction List findAuctionsByAuctionCategory(AuctionCategory auctionCategory); List findAuctionByProduct_Category(ProductCategory productCategory); + List findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index 606af878..e5bf9672 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -2,17 +2,14 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import com.tasksprints.auction.domain.product.model.ProductCategory; - -import java.time.Duration; import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { - public List getAuctionsByFilters(AuctionRequest.SearchCondition searchCondition); + List getAuctionsByFilters(AuctionRequest.SearchCondition searchCondition); + //삭제해야 함 - public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); + List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 199303cc..5d2085df 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -5,10 +5,8 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.model.QAuction; -import com.tasksprints.auction.domain.product.model.ProductCategory; import com.tasksprints.auction.domain.product.model.QProduct; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -63,10 +61,10 @@ public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime BooleanExpression statusEquals = auction.auctionStatus.eq(auctionStatus); return queryFactory - .selectFrom(auction) - .where(endTimeBetween.and(statusEquals)) - .orderBy(auction.endTime.asc()) - .fetch(); + .selectFrom(auction) + .where(endTimeBetween.and(statusEquals)) + .orderBy(auction.endTime.asc()) + .fetch(); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index 35d63fd5..353d04c7 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -30,6 +30,7 @@ public interface AuctionService { @Deprecated List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); + @Deprecated List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 0f6f0678..8d3d2fb2 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -6,7 +6,6 @@ import com.tasksprints.auction.domain.auction.exception.AuctionNotFoundException; import com.tasksprints.auction.domain.auction.exception.InvalidAuctionTimeException; import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.repository.AuctionRepository; import com.tasksprints.auction.domain.user.exception.UserNotFoundException; @@ -135,8 +134,8 @@ public List getAuctionsByFilter(AuctionRequest.SearchCondition ); return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); + .map(AuctionResponse::of) + .toList(); } @Deprecated @@ -150,8 +149,8 @@ public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalD List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); + .map(AuctionResponse::of) + .toList(); } @Deprecated diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java index 0acbf057..1679795e 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java +++ b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java @@ -1,7 +1,5 @@ package com.tasksprints.auction.domain.product.model; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; - public enum ProductCategory { WOMENS_CLOTHING("여성의류"), UNDERWEAR_SLEEPWEAR("언더웨어/잠옷"), From 3da4324b9e4e7b4eb25e00f51083bf6b4279f1d5 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:01:00 +0900 Subject: [PATCH 19/31] =?UTF-8?q?fix=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20DTO=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/dto/request/AuctionRequest.java | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index 56eb288e..2a868ca3 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -22,41 +22,6 @@ public static class Create { AuctionCategory auctionCategory; AuctionStatus auctionStatus; } - - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class AuctionCategoryParam { - AuctionCategory auctionCategory; - - public AuctionCategoryParam(String auctionCategory) { - this.auctionCategory = AuctionCategory.fromDisplayName(auctionCategory); - } - } - - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class ProductCategoryParam { - ProductCategory productCategory; - - public ProductCategoryParam(String productCategory) { - this.productCategory = ProductCategory.fromDisplayName(productCategory); - } - } - - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class AuctionStatusParam { - AuctionStatus auctionStatus; - - public AuctionStatusParam(String auctionStatus) { - this.auctionStatus = AuctionStatus.fromDisplayName(auctionStatus); - } - - } - @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) From 41828cb4f0b2000b6fcb7352f2f62ad4745e195d Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:01:34 +0900 Subject: [PATCH 20/31] =?UTF-8?q?fix=20:=20AuctionRepository=20=EB=82=B4?= =?UTF-8?q?=EC=97=90=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20Repository?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auction/repository/AuctionRepository.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java index 060042dd..a8cbbd96 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java @@ -16,17 +16,11 @@ public interface AuctionRepository extends JpaRepository, AuctionCriteriaRepository { - @Query("SELECT a FROM auction a WHERE a.seller.id = :userId") List findAuctionsByUserId(@Param("userId") Long userId); @Query("SELECT a FROM auction a WHERE a.id = :auctionId") Optional findAuctionById(@Param("auctionId") Long auctionId); - List findAuctionsByAuctionCategory(AuctionCategory auctionCategory); - - List findAuctionByProduct_Category(ProductCategory productCategory); - - List findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } From 65588137d7e714d01dab14e7ab7b616c065de015 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:02:17 +0900 Subject: [PATCH 21/31] =?UTF-8?q?refactor=20:=20=EC=97=AC=EC=84=B1?= =?UTF-8?q?=EC=9D=98=EB=A5=98,=20~~=20=EC=B2=98=EB=9F=BC=20enum=EC=9D=98?= =?UTF-8?q?=20name=EC=9D=B4=20=EC=95=84=EB=8B=88=EB=9D=BC=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EC=9D=98=20=EA=B3=A0=EC=9C=A0=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20enum=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/product/model/ProductCategory.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java index 1679795e..32d3f423 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java +++ b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java @@ -52,17 +52,13 @@ public enum ProductCategory { * 한정된 갯수의 Category 이기에 따로 Over-head는 발생하지 않을 것으로 판단 ***/ public static ProductCategory fromDisplayName(String displayName) { - if (displayName == null || displayName.trim().isEmpty()) { - throw new IllegalArgumentException("Display name cannot be null or empty."); - } - - try { - return ProductCategory.valueOf(displayName.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Invalid product category: " + displayName); + for (ProductCategory category : values()) { + if (category.displayName.equals(displayName)) { + return category; + } } + throw new IllegalArgumentException("Unknown category: " + displayName); } - public String getDisplayName() { return displayName; } From 713818952592a905d54457248693e65cca138114 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:02:59 +0900 Subject: [PATCH 22/31] =?UTF-8?q?fix=20:=20@Deprecated=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=A0=84=EC=B2=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 함수 제거 --- .../auction/service/AuctionService.java | 9 ---- .../auction/service/AuctionServiceImpl.java | 51 ------------------- 2 files changed, 60 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index 353d04c7..e7428ce6 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -18,19 +18,10 @@ public interface AuctionService { List getAuctionsByUser(Long userId); - List getAuctionsByProductCategory(AuctionRequest.ProductCategoryParam param); - List getAllAuctions(); AuctionResponse getAuctionById(Long auctionId); - List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param); - List getAuctionsByFilter(AuctionRequest.SearchCondition searchCondition); - @Deprecated - List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours); - - @Deprecated - List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 8d3d2fb2..884a35b5 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -102,27 +102,6 @@ public AuctionResponse getAuctionById(Long auctionId) { return AuctionResponse.of(foundAuction); } - @Deprecated - @Override - public List getAuctionsByProductCategory(AuctionRequest.ProductCategoryParam param) { - List foundAuctions = auctionRepository.findAuctionByProduct_Category(param.getProductCategory()); - - return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); - - } - - @Deprecated - @Override - public List getAuctionsByAuctionCategory(AuctionRequest.AuctionCategoryParam param) { - List foundAuctions = auctionRepository.findAuctionsByAuctionCategory(param.getAuctionCategory()); - - return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); - } - /** * NULL POINTER EXCEPTION 발생 * NULL 안정성 보장을 해줬음 @@ -137,34 +116,4 @@ public List getAuctionsByFilter(AuctionRequest.SearchCondition .map(AuctionResponse::of) .toList(); } - - @Deprecated - @Override - public List getAuctionsByEndTimeBetweenOrderByEndTimeAsc(LocalDateTime now, LocalDateTime next24Hours) { - // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - //LocalDateTime now = LocalDateTime.now(); - //LocalDateTime next24Hours = now.plusHours(24); - - //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 - List foundAuctions = auctionRepository.findAuctionsByEndTimeBetweenAndAuctionStatusOrderByEndTimeAsc(now, next24Hours, AuctionStatus.ACTIVE); - - return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); - } - - @Deprecated - @Override - public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours) { - // auction의 endTime까지 24시간 이하로 남은 진행중인 경매 목록 조회 - // LocalDateTime now = LocalDateTime.now(); - // LocalDateTime next24Hours = now.plusHours(24); - - //endTime이 now ~ now + 24hour에 포함되는 진행 상태인 경매 목록 조회 - List foundAuctions = auctionRepository.getAuctionsEndWith24Hours(now, next24Hours, AuctionStatus.ACTIVE); - - return foundAuctions.stream() - .map(AuctionResponse::of) - .toList(); - } } From ca3a1973bd2b911d191473067dbe4fb484539187 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:03:59 +0900 Subject: [PATCH 23/31] =?UTF-8?q?test=20:=20getAuctionsFilter=EC=9D=84=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EC=A0=91=EA=B7=BC=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 재사용성 증가 --- .../auction/api/AuctionControllerTest.java | 2 +- .../auction/service/AuctionServiceImplTest.java | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index 55b4e0f8..508d0777 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -121,7 +121,7 @@ public void testFindAuctionByUsingQueryString_Success() throws Exception { // When & Then mockMvc.perform(get("/api/v1/auction") .param("auctionCategory", AuctionCategory.PRIVATE_FREE.name()) - .param("productCategory", ProductCategory.BEAUTY.name()) + .param("productCategory", "여성의류") .param("startTime", LocalDateTime.now().minusDays(1).toString()) .param("endTime", LocalDateTime.now().toString()) .param("minPrice", "100") diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index e46e6f34..3e48062b 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -23,11 +23,8 @@ import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -322,15 +319,15 @@ class GetAuctionsByAuctionCategoryTests { public void testGetAuctionsByAuctionCategory_Success() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_PAID); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); List expectedAuctions = List.of(auction1, auction2); - when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_PAID)).thenReturn(expectedAuctions); + when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); List expectedResponses = expectedAuctions.stream() .map(AuctionResponse::of) .toList(); - List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); + List actualAuctions = auctionService.getAuctionsByFilter(condition); assertThat(actualAuctions).isEqualTo(expectedResponses); } @@ -355,12 +352,12 @@ public void testGetAuctionsByAuctionCategory_Success_Criteria() { @DisplayName("경매 유형 조회 : [결과 없음]") public void testGetAuctionsByAuctionCategory_AuctionNotFound() { List emptyAuctionList = List.of(); - AuctionRequest.AuctionCategoryParam param = new AuctionRequest.AuctionCategoryParam(AuctionCategory.PUBLIC_FREE); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null,null,null,null,null,null); - when(auctionRepository.findAuctionsByAuctionCategory(AuctionCategory.PUBLIC_FREE)) + when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); - List actualAuctions = auctionService.getAuctionsByAuctionCategory(param); + List actualAuctions = auctionService.getAuctionsByFilter(condition); assertThat(actualAuctions).isEmpty(); } From f989092d27e555452bd5ce239bfedd470114c42b Mon Sep 17 00:00:00 2001 From: KNU-K Date: Wed, 11 Sep 2024 15:05:27 +0900 Subject: [PATCH 24/31] =?UTF-8?q?chore=20:=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=82=B4=EC=97=90=20formatter=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 추 후, 자동화 및 강제화 할 것임. --- .../domain/auction/dto/request/AuctionRequest.java | 1 + .../domain/auction/repository/AuctionRepository.java | 4 ---- .../auction/domain/auction/service/AuctionService.java | 1 - .../domain/auction/service/AuctionServiceImpl.java | 1 - .../auction/domain/product/model/ProductCategory.java | 1 + .../tasksprints/auction/api/AuctionControllerTest.java | 1 - .../domain/auction/repository/AuctionRepositoryTest.java | 5 ++--- .../domain/auction/service/AuctionServiceImplTest.java | 9 +++++---- .../auction/domain/product/ProductServiceImplTest.java | 4 ++-- 9 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index 2a868ca3..e1411705 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -22,6 +22,7 @@ public static class Create { AuctionCategory auctionCategory; AuctionStatus auctionStatus; } + @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java index a8cbbd96..24f95a20 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/AuctionRepository.java @@ -2,15 +2,11 @@ import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.repository.support.AuctionCriteriaRepository; -import com.tasksprints.auction.domain.product.model.ProductCategory; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java index e7428ce6..788d1ddb 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionService.java @@ -3,7 +3,6 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.dto.response.AuctionResponse; -import java.time.LocalDateTime; import java.util.List; /** diff --git a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java index 884a35b5..8cfef088 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImpl.java @@ -15,7 +15,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.time.LocalDateTime; import java.util.List; @Service diff --git a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java index 32d3f423..db4d2de4 100644 --- a/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java +++ b/src/main/java/com/tasksprints/auction/domain/product/model/ProductCategory.java @@ -59,6 +59,7 @@ public static ProductCategory fromDisplayName(String displayName) { } throw new IllegalArgumentException("Unknown category: " + displayName); } + public String getDisplayName() { return displayName; } diff --git a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java index 508d0777..e6456531 100644 --- a/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java +++ b/src/test/java/com/tasksprints/auction/api/AuctionControllerTest.java @@ -10,7 +10,6 @@ import com.tasksprints.auction.domain.auction.service.AuctionService; import com.tasksprints.auction.domain.bid.dto.BidResponse; import com.tasksprints.auction.domain.bid.service.BidService; -import com.tasksprints.auction.domain.product.model.ProductCategory; import com.tasksprints.auction.domain.review.dto.request.ReviewRequest; import com.tasksprints.auction.domain.review.dto.response.ReviewResponse; import com.tasksprints.auction.domain.review.service.ReviewService; diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 5489fad4..82dcafcf 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -21,7 +21,6 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest @@ -106,7 +105,7 @@ public void testFindAuctionsByAuctionCategory() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); auctionRepository.save(auction3); @@ -124,7 +123,7 @@ public void testFindAuctionsByAuctionCategory() { public void testFindAllUsingFilter() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null,null,null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 3e48062b..26fd1d94 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -25,6 +25,7 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Optional; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -319,7 +320,7 @@ class GetAuctionsByAuctionCategoryTests { public void testGetAuctionsByAuctionCategory_Success() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); List expectedAuctions = List.of(auction1, auction2); when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); @@ -336,7 +337,7 @@ public void testGetAuctionsByAuctionCategory_Success() { public void testGetAuctionsByAuctionCategory_Success_Criteria() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); List expectedAuctions = List.of(auction1, auction2); when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); @@ -352,7 +353,7 @@ public void testGetAuctionsByAuctionCategory_Success_Criteria() { @DisplayName("경매 유형 조회 : [결과 없음]") public void testGetAuctionsByAuctionCategory_AuctionNotFound() { List emptyAuctionList = List.of(); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE,null,null,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null); when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); @@ -366,7 +367,7 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound() { @DisplayName("경매 유형 조회 : [결과 없음] - Criteria 사용") public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { List emptyAuctionList = List.of(); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID,null,null,null,null,null,null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); diff --git a/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java index 1e80f143..b751f060 100644 --- a/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/product/ProductServiceImplTest.java @@ -99,9 +99,9 @@ private void deleteAllImagesInDirectory(String directoryPath) throws IOException .forEach(filePath -> { try { Files.delete(filePath); // 파일 삭제 - System.out.println("Deleted: " + filePath.toString()); // 삭제된 파일 로그 출력 + System.out.println("Deleted: " + filePath); // 삭제된 파일 로그 출력 } catch (IOException e) { - System.err.println("Error deleting file: " + filePath.toString() + " - " + e.getMessage()); // 삭제 실패 로그 출력 + System.err.println("Error deleting file: " + filePath + " - " + e.getMessage()); // 삭제 실패 로그 출력 } }); } From 0b8f970703be2e5bde077426564780275c7f10e7 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:23:34 +0900 Subject: [PATCH 25/31] =?UTF-8?q?refactor=20:=20bid=20=EC=9A=94=EC=86=8C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(=EC=9E=85=EC=B0=B0=20=EC=88=98?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=EC=9D=84=20=EC=9C=84=ED=95=B4=EC=84=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasksprints/auction/domain/auction/model/Auction.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java b/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java index df228ef1..320b5078 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/model/Auction.java @@ -1,6 +1,7 @@ package com.tasksprints.auction.domain.auction.model; import com.tasksprints.auction.common.entity.BaseEntity; +import com.tasksprints.auction.domain.bid.model.Bid; import com.tasksprints.auction.domain.product.model.Product; import com.tasksprints.auction.domain.user.model.User; import jakarta.persistence.*; @@ -8,6 +9,8 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Builder @NoArgsConstructor @@ -47,6 +50,11 @@ public class Auction extends BaseEntity { @Builder.Default private Product product = null; + + @OneToMany + @Builder.Default + private List bids = new ArrayList<>(); + public static Auction create(LocalDateTime startTime, LocalDateTime endTime, BigDecimal startingBid, AuctionCategory auctionCategory, AuctionStatus auctionStatus, User seller) { Auction newAuction = Auction.builder() .startTime(startTime) From ae1e6a161914dddae749939802fd1fd71e2acfbd Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:24:27 +0900 Subject: [PATCH 26/31] =?UTF-8?q?refactor=20:=20SearchCondition=20SortBy?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20-=20=EC=B6=94=EA=B0=80=20enum=EC=9D=84?= =?UTF-8?q?=20=ED=86=B5=ED=95=B4=20=EC=95=88=EC=A0=95=EC=84=B1=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/dto/request/AuctionRequest.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java index e1411705..927f297e 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/dto/request/AuctionRequest.java @@ -16,23 +16,25 @@ public class AuctionRequest { @NoArgsConstructor @AllArgsConstructor public static class Create { - LocalDateTime startTime; - LocalDateTime endTime; - BigDecimal startingBid; - AuctionCategory auctionCategory; - AuctionStatus auctionStatus; + private LocalDateTime startTime; + private LocalDateTime endTime; + private BigDecimal startingBid; + private AuctionCategory auctionCategory; + private AuctionStatus auctionStatus; } @Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class SearchCondition { - AuctionCategory auctionCategory; - ProductCategory productCategory; - LocalDateTime startTime; - LocalDateTime endTime; - BigDecimal minPrice; - BigDecimal maxPrice; - AuctionStatus auctionStatus; + private AuctionCategory auctionCategory; + private ProductCategory productCategory; + private LocalDateTime startTime; + private LocalDateTime endTime; + private BigDecimal minPrice; + private BigDecimal maxPrice; + private AuctionStatus auctionStatus; + private String sortBy; + } } From 9ec54b77c1054d9ce4acc64d983706b4158763c9 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:24:40 +0900 Subject: [PATCH 27/31] =?UTF-8?q?refactor=20:=20SearchCondition=20SortBy?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20-=20=EC=B6=94=EA=B0=80=20enum=EC=9D=84?= =?UTF-8?q?=20=ED=86=B5=ED=95=B4=20=EC=95=88=EC=A0=95=EC=84=B1=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auction/common/resolver/SearchConditionResolver.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java b/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java index ba0f8130..ab9dacb6 100644 --- a/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java +++ b/src/main/java/com/tasksprints/auction/common/resolver/SearchConditionResolver.java @@ -35,6 +35,7 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m String minPrice = webRequest.getParameter("minPrice"); String maxPrice = webRequest.getParameter("maxPrice"); String auctionStatus = webRequest.getParameter("auctionStatus"); + String sortBy = webRequest.getParameter("sortBy"); // 파싱 및 변환 AuctionCategory parsedAuctionCategory = auctionCategory != null ? AuctionCategory.fromDisplayName(auctionCategory) : null; ProductCategory parsedProductCategory = productCategory != null ? ProductCategory.fromDisplayName(productCategory) : null; @@ -52,7 +53,8 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m parsedEndTime, parsedMinPrice, parsedMaxPrice, - parsedAuctionStatus + parsedAuctionStatus, + sortBy ); } } From 0af0a45e98e3e6bc9a01075d462b25b1605b7286 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:24:51 +0900 Subject: [PATCH 28/31] =?UTF-8?q?remove=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20Repository=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/CustomAuctionRepositoryV1.java | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/main/java/com/tasksprints/auction/domain/auction/repository/CustomAuctionRepositoryV1.java diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/CustomAuctionRepositoryV1.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/CustomAuctionRepositoryV1.java deleted file mode 100644 index b0694286..00000000 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/CustomAuctionRepositoryV1.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tasksprints.auction.domain.auction.repository; - -import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionCategory; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public class CustomAuctionRepositoryV1 { - - @PersistenceContext - private EntityManager entityManager; - - public List findByCategoryUsingEntityManager(AuctionCategory auctionCategoryName) { - String jpql = "SELECT a FROM auction a WHERE a.auctionCategory = :category"; - return entityManager.createQuery(jpql, Auction.class) - .setParameter("category", auctionCategoryName) - .getResultList(); - } -} From bd3959d11c0e59066bb2d200d38bf783d11b1905 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:25:18 +0900 Subject: [PATCH 29/31] =?UTF-8?q?refactor=20:=20sortBy=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20OrderSpecifier=20=EB=A1=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=EC=9D=B4=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support/AuctionCriteriaRepository.java | 5 -- .../AuctionCriteriaRepositoryImpl.java | 54 +++++++++---------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java index e5bf9672..3999b874 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepository.java @@ -2,14 +2,9 @@ import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; -import java.time.LocalDateTime; import java.util.List; public interface AuctionCriteriaRepository { List getAuctionsByFilters(AuctionRequest.SearchCondition searchCondition); - - //삭제해야 함 - List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus); } diff --git a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java index 5d2085df..9db471af 100644 --- a/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java +++ b/src/main/java/com/tasksprints/auction/domain/auction/repository/support/AuctionCriteriaRepositoryImpl.java @@ -1,17 +1,15 @@ package com.tasksprints.auction.domain.auction.repository.support; import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import com.tasksprints.auction.domain.auction.dto.request.AuctionRequest; import com.tasksprints.auction.domain.auction.model.Auction; -import com.tasksprints.auction.domain.auction.model.AuctionStatus; import com.tasksprints.auction.domain.auction.model.QAuction; import com.tasksprints.auction.domain.product.model.QProduct; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.time.LocalDateTime; import java.util.List; @RequiredArgsConstructor @@ -23,49 +21,51 @@ public List getAuctionsByFilters(AuctionRequest.SearchCondition conditi QAuction auction = QAuction.auction; QProduct product = QProduct.product; + BooleanBuilder builder = buildSearchCondition(condition, auction, product); + + var query = queryFactory.selectFrom(auction) + .leftJoin(auction.product, product) + .where(builder); + + OrderSpecifier sortOrder = getSortOrder(condition, auction); + if (sortOrder != null) { + query = query.orderBy(sortOrder); + } + + return query.fetch(); + } + + private BooleanBuilder buildSearchCondition(AuctionRequest.SearchCondition condition, QAuction auction, QProduct product) { BooleanBuilder builder = new BooleanBuilder(); if (condition.getAuctionCategory() != null) { builder.and(auction.auctionCategory.eq(condition.getAuctionCategory())); } - if (condition.getProductCategory() != null) { builder.and(product.category.eq(condition.getProductCategory())); } - // 현재 입찰가를 알 수 있게 변경해야함 if (condition.getMinPrice() != null && condition.getMaxPrice() != null) { builder.and(auction.startingBid.between(condition.getMinPrice(), condition.getMaxPrice())); } if (condition.getStartTime() != null && condition.getEndTime() != null) { builder.and(auction.endTime.between(condition.getStartTime(), condition.getEndTime())); } - if (condition.getAuctionStatus() != null) { builder.and(auction.auctionStatus.eq(condition.getAuctionStatus())); } - return queryFactory.selectFrom(auction) - .leftJoin(auction.product, product) // Auction과 Product 조인 - .where(builder) - // orderBy는 성능 이슈로 일단 보류 - // .orderBy(auction.endTime.asc()) - .fetch(); + return builder; } - @Deprecated - @Override - public List getAuctionsEndWith24Hours(LocalDateTime now, LocalDateTime next24Hours, AuctionStatus auctionStatus) { - QAuction auction = QAuction.auction; - - BooleanExpression endTimeBetween = auction.endTime.between(now, next24Hours); - BooleanExpression statusEquals = auction.auctionStatus.eq(auctionStatus); - - return queryFactory - .selectFrom(auction) - .where(endTimeBetween.and(statusEquals)) - .orderBy(auction.endTime.asc()) - .fetch(); + private OrderSpecifier getSortOrder(AuctionRequest.SearchCondition condition, QAuction auction) { + if (condition.getSortBy() != null) { + return switch (condition.getSortBy()) { + case "bidsAsc" -> auction.bids.size().asc(); + case "bidsDesc" -> auction.bids.size().desc(); + case "endingSoon" -> auction.endTime.asc(); + default -> null; + }; + } + return null; } - - } From 9878732b4cd50b8405c67b8cafef2acd8bc86275 Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 01:25:41 +0900 Subject: [PATCH 30/31] =?UTF-8?q?test=20:=20Auction=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20sortBy=20=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EC=97=AC=20Test=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auction/repository/AuctionRepositoryTest.java | 4 ++-- .../domain/auction/service/AuctionServiceImplTest.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java index 82dcafcf..1455d8b5 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/repository/AuctionRepositoryTest.java @@ -105,7 +105,7 @@ public void testFindAuctionsByAuctionCategory() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); Auction auction3 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); auctionRepository.save(auction3); @@ -123,7 +123,7 @@ public void testFindAuctionsByAuctionCategory() { public void testFindAllUsingFilter() { Auction auction1 = createAuction(seller, AuctionCategory.PUBLIC_FREE, AuctionStatus.ACTIVE); Auction auction2 = createAuction(seller, AuctionCategory.PUBLIC_PAID, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null, null); auctionRepository.save(auction1); auctionRepository.save(auction2); diff --git a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java index 26fd1d94..224ac20c 100644 --- a/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java +++ b/src/test/java/com/tasksprints/auction/domain/auction/service/AuctionServiceImplTest.java @@ -320,7 +320,7 @@ class GetAuctionsByAuctionCategoryTests { public void testGetAuctionsByAuctionCategory_Success() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null, null); List expectedAuctions = List.of(auction1, auction2); when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); @@ -337,7 +337,7 @@ public void testGetAuctionsByAuctionCategory_Success() { public void testGetAuctionsByAuctionCategory_Success_Criteria() { Auction auction1 = createAuction(1L, seller, AuctionStatus.PENDING); Auction auction2 = createAuction(2L, seller, AuctionStatus.PENDING); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null, null); List expectedAuctions = List.of(auction1, auction2); when(auctionRepository.getAuctionsByFilters(condition)).thenReturn(expectedAuctions); @@ -353,7 +353,7 @@ public void testGetAuctionsByAuctionCategory_Success_Criteria() { @DisplayName("경매 유형 조회 : [결과 없음]") public void testGetAuctionsByAuctionCategory_AuctionNotFound() { List emptyAuctionList = List.of(); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_FREE, null, null, null, null, null, null, null); when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); @@ -367,7 +367,7 @@ public void testGetAuctionsByAuctionCategory_AuctionNotFound() { @DisplayName("경매 유형 조회 : [결과 없음] - Criteria 사용") public void testGetAuctionsByAuctionCategory_AuctionNotFound_Criteria() { List emptyAuctionList = List.of(); - AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null); + AuctionRequest.SearchCondition condition = new AuctionRequest.SearchCondition(AuctionCategory.PUBLIC_PAID, null, null, null, null, null, null, null); when(auctionRepository.getAuctionsByFilters(condition)) .thenReturn(emptyAuctionList); From d9f899e2273b7c1695d7975ca2b8f9550426693a Mon Sep 17 00:00:00 2001 From: KNU-K Date: Fri, 13 Sep 2024 11:25:26 +0900 Subject: [PATCH 31/31] =?UTF-8?q?chore=20:=20ci&cd=20pipeline=20(ssh=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-cd.yml | 53 +++++++++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 33 ----------------------- 2 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/ci-cd.yml delete mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 00000000..57d31821 --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,53 @@ +name: Java CI/CD with Gradle + +on: + push: + branches: + - 'develop' + - 'main' # main 브랜치에 병합될 때 트리거 + +jobs: + ci-pipeline: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'adopt' + java-version: '21' + + - name: Grant execute permission for Gradle Wrapper + run: chmod +x ./gradlew + + - name: Lint and format code + run: ./gradlew editorconfigFormat + + - name: Build with Gradle + run: ./gradlew build + + - name: Test with Gradle + run: ./gradlew test + + cd-pipeline: + if: github.ref == 'refs/heads/main' # main 브랜치에만 배포 실행 + runs-on: ubuntu-latest + steps: + - name: SSH로 NCP 접속하기 + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.NCP_HOST }} + username: ${{ secrets.NCP_USERNAME }} + password: ${{ secrets.NCP_SSH_PASSWORD }} + port: ${{ secrets.NCP_SSH_PORT }} + script_stop: true + script: | + cd auction + git pull knuk ttest + chmod 777 ./gradlew + ./gradlew build + kill -9 $(lsof -t -i:8080) || echo "No process on 8080" + nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2>&1 & diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index ca2080cb..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Java CI with Gradle - -on: - push: - branches: - - 'main' - - 'develop' - -jobs: - ci-pipeline: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set up JDK 21 - uses: actions/setup-java@v4 - with: - distribution: 'adopt' - java-version: '21' - - - name: Grant execute permission for Gradle Wrapper - run: chmod +x ./gradlew - - - name: Lint and format code - run: ./gradlew editorconfigFormat - - - name: Build with Gradle - run: ./gradlew build - - - name: Test with Gradle - run: ./gradlew test