From b8d4ba3751a3b4d1d5b668168806c32a310f220b Mon Sep 17 00:00:00 2001 From: inswal843 Date: Wed, 8 Jan 2025 17:52:41 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=ED=99=88=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20Best=EC=83=81=ED=92=88=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/controller/HomeController.java | 35 +++++++++++++ .../dto/response/ProductBestResponse.java | 40 +++++++++++++++ .../kw/zeropick/home/service/HomeService.java | 5 ++ .../home/service/HomeServiceImpl.java | 50 ++++++++++++++++++- .../kw/zeropick/product/domain/Product.java | 6 ++- .../review/service/ReviewServiceImpl.java | 8 +++ 6 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 src/main/java/kw/zeropick/home/dto/response/ProductBestResponse.java diff --git a/src/main/java/kw/zeropick/home/controller/HomeController.java b/src/main/java/kw/zeropick/home/controller/HomeController.java index 9a2dee7..46fcbb4 100644 --- a/src/main/java/kw/zeropick/home/controller/HomeController.java +++ b/src/main/java/kw/zeropick/home/controller/HomeController.java @@ -2,12 +2,23 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import kw.zeropick.common.LoginUser; +import kw.zeropick.home.dto.response.ProductBestResponse; +import kw.zeropick.home.service.HomeService; +import kw.zeropick.payload.ApiResponse; +import kw.zeropick.product.domain.Category; +import kw.zeropick.product.dto.ProductDto; import lombok.Builder; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -17,6 +28,8 @@ @RequestMapping("/home") @RequiredArgsConstructor public class HomeController { + private final HomeService homeService; + @Operation(summary = "홈 화면 조회", description = "홈 화면을 조회합니다.") @PostMapping public ResponseEntity home(@RequestHeader("Authorization") String token) { @@ -29,4 +42,26 @@ public ResponseEntity home(@RequestHeader("Authorization") String token) return ResponseEntity.ok("리뷰가 성공적으로 등록되었습니다."); } + + @Operation(summary = "홈 카테고리 베스트 조회", description = "카테고리 베스트를 조회합니다.") + @GetMapping("/category") + public ResponseEntity homeCategory(@RequestParam Category category) { + Long memberId = LoginUser.get().getId(); + try { + List productBestResponses = homeService.categoryBest(memberId, category); + return ResponseEntity.ok( + ApiResponse.builder() + .check(true) + .information(productBestResponses) + .build() + ); + } catch (Exception e) { + return ResponseEntity.internalServerError().body( + ApiResponse.builder() + .check(false) + .information(e.getMessage()) + .build() + ); + } + } } \ No newline at end of file diff --git a/src/main/java/kw/zeropick/home/dto/response/ProductBestResponse.java b/src/main/java/kw/zeropick/home/dto/response/ProductBestResponse.java new file mode 100644 index 0000000..fe7de5f --- /dev/null +++ b/src/main/java/kw/zeropick/home/dto/response/ProductBestResponse.java @@ -0,0 +1,40 @@ +package kw.zeropick.home.dto.response; + +import kw.zeropick.product.domain.Category; +import kw.zeropick.review.dto.response.ReviewResponse; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Setter; + +@Builder +@Data +@AllArgsConstructor +public class ProductBestResponse { + private Long id; + + private String productName; + + private Category category; + + private Boolean zeroSugar; + + private Boolean zeroKcal; + + private int price; + + private Double starRate; + + private String imageUrl; + + private int reviewCount; + + private ReviewResponse reviewResponse; + + // 좋아요 여부 + @Setter + private Boolean bookmarked; + // 비교함 여부 + @Setter + private Boolean compared; +} diff --git a/src/main/java/kw/zeropick/home/service/HomeService.java b/src/main/java/kw/zeropick/home/service/HomeService.java index c769a94..670df09 100644 --- a/src/main/java/kw/zeropick/home/service/HomeService.java +++ b/src/main/java/kw/zeropick/home/service/HomeService.java @@ -1,4 +1,9 @@ package kw.zeropick.home.service; +import java.util.List; +import kw.zeropick.home.dto.response.ProductBestResponse; +import kw.zeropick.product.domain.Category; + public interface HomeService { + List categoryBest(Long memberId, Category category); } diff --git a/src/main/java/kw/zeropick/home/service/HomeServiceImpl.java b/src/main/java/kw/zeropick/home/service/HomeServiceImpl.java index 34811f2..d4a318c 100644 --- a/src/main/java/kw/zeropick/home/service/HomeServiceImpl.java +++ b/src/main/java/kw/zeropick/home/service/HomeServiceImpl.java @@ -1,11 +1,59 @@ package kw.zeropick.home.service; +import java.util.List; +import kw.zeropick.home.dto.response.ProductBestResponse; +import kw.zeropick.product.domain.Category; +import kw.zeropick.product.domain.ProductSort; +import kw.zeropick.product.dto.ProductDto; +import kw.zeropick.product.dto.request.ProductSearchRequest; +import kw.zeropick.product.service.ProductService; +import kw.zeropick.review.dto.response.ReviewResponse; +import kw.zeropick.review.service.ReviewService; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @RequiredArgsConstructor -public class HomeServiceImpl { +public class HomeServiceImpl implements HomeService{ + private final ProductService productService; + private final ReviewService reviewService; + + @Override + public List categoryBest(Long memberId, Category category) { + ProductSearchRequest productSearchRequest = ProductSearchRequest.builder() + .category(category) + .sort(ProductSort.POPULARITY) + .build(); + + Page productDtos = productService.productSearch(memberId, 0, 3, productSearchRequest); + Pageable pageable = PageRequest.of(0, 1); + + List bestResponses = productDtos.getContent().stream().map(productDto -> { + Page reviews = reviewService.getReviews(productDto.getId(), null, "latest", pageable); + ReviewResponse latestReview = reviews.getContent().isEmpty() ? null : reviews.getContent().get(0); + + return ProductBestResponse.builder() + .id(productDto.getId()) + .productName(productDto.getProductName()) + .category(productDto.getCategory()) + .zeroSugar(productDto.getZeroSugar()) + .zeroKcal(productDto.getZeroKcal()) + .price(productDto.getPrice()) + .starRate(productDto.getStarRate()) + .imageUrl(productDto.getImageUrl()) + .reviewCount(productDto.getReviewCount()) + .reviewResponse(latestReview) + .bookmarked(productDto.getBookmarked()) + .compared(productDto.getCompared()) + .build(); + }).toList(); + + return bestResponses; + } + } diff --git a/src/main/java/kw/zeropick/product/domain/Product.java b/src/main/java/kw/zeropick/product/domain/Product.java index fab4dfd..cb1fe1a 100644 --- a/src/main/java/kw/zeropick/product/domain/Product.java +++ b/src/main/java/kw/zeropick/product/domain/Product.java @@ -95,11 +95,13 @@ public void setTags(List tags) { this.tags = tags; } - public void setPopularity(){ - this.popularity = this.viewCount*150 + this.bookmarkCount*250 + this.reviewCount*250 + Integer.parseInt(String.valueOf(this.starRate*20*350)); + public void setPopularity() { + int starRateScore = this.starRate != null ? (int) Math.round(this.starRate * 20 * 350) : 0; + this.popularity = this.viewCount * 150 + this.bookmarkCount * 250 + this.reviewCount * 250 + starRateScore; } + } diff --git a/src/main/java/kw/zeropick/review/service/ReviewServiceImpl.java b/src/main/java/kw/zeropick/review/service/ReviewServiceImpl.java index c2e63de..5cf11ec 100644 --- a/src/main/java/kw/zeropick/review/service/ReviewServiceImpl.java +++ b/src/main/java/kw/zeropick/review/service/ReviewServiceImpl.java @@ -229,6 +229,14 @@ public void deleteReview(Long reviewId) { Review review = reviewRepository.findById(reviewId) .orElseThrow(() -> new EntityNotFoundException("해당 리뷰를 찾을 수 없습니다.")); + // 이미지 삭제 추가 + List oldImageUrls = review.getImageUrls(); + if(!oldImageUrls.isEmpty()) { + for (String imageUrl : oldImageUrls) { + s3Util.deleteFile(imageUrl); + } + } + Product product = review.getProduct(); // 리뷰의 평점을 상품에서 제거