From 3baea3c97638c629167fec9ccc7b66d425fd871a Mon Sep 17 00:00:00 2001 From: yeon015 Date: Sun, 20 Aug 2023 23:27:02 +0900 Subject: [PATCH] =?UTF-8?q?feat(#125)=20:=20=EB=A9=94=EC=9D=B8=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=B7=B0=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EC=8B=9C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/web/ProductController.java | 19 +++++- .../trothcam/dto/web/ProductPagingResDto.java | 25 +++++++ .../dto/web/ProductsPagingLikedResDto.java | 16 +++++ .../trothcam/exception/base/ErrorCode.java | 1 + .../trothcam/service/web/ProductService.java | 68 +++++++++++++++++-- 5 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 src/main/java/trothly/trothcam/dto/web/ProductPagingResDto.java create mode 100644 src/main/java/trothly/trothcam/dto/web/ProductsPagingLikedResDto.java diff --git a/src/main/java/trothly/trothcam/controller/web/ProductController.java b/src/main/java/trothly/trothcam/controller/web/ProductController.java index 679e545..030202c 100644 --- a/src/main/java/trothly/trothcam/controller/web/ProductController.java +++ b/src/main/java/trothly/trothcam/controller/web/ProductController.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; +import static trothly.trothcam.exception.base.ErrorCode.MEMBER_NOT_FOUND; import static trothly.trothcam.exception.base.ErrorCode.REQUEST_ERROR; @Slf4j @@ -83,7 +84,7 @@ public BaseResponse> findRanking(@PathVariable String ty return BaseResponse.onSuccess(result); } - /* 메인 화면 페이징 처리 */ + /* 메인 화면 페이징 처리 - 로그인x */ @GetMapping("/product-ranking/{type}/{page}") public BaseResponse getProducts(@PathVariable String type, @PathVariable int page) { if(type.equals("top") && page >= 0) { @@ -96,6 +97,22 @@ public BaseResponse getProducts(@PathVariable String t } + /* 메인 화면 페이징 처리 - 로그인0 */ + @GetMapping("/{webId}/product-ranking/{type}/{page}") + public BaseResponse getProducts(@PathVariable String webId, @PathVariable String type, @PathVariable int page, @AuthenticationPrincipal Member member) { + if(!member.getWebId().equals(webId)) { + throw new BaseException(MEMBER_NOT_FOUND); + } + + if(type.equals("top") && page >= 0) { + return BaseResponse.onSuccess(productService.getProductsLikedTop(page, member)); + } else if (type.equals("latest") && page >= 0) { + return BaseResponse.onSuccess(productService.getProductsLikedLatest(page, member)); + } else { + throw new BaseException(REQUEST_ERROR); + } + } + /* view all */ @GetMapping("/view-all/{type}") public BaseResponse> findViewAll(@PathVariable String type) { diff --git a/src/main/java/trothly/trothcam/dto/web/ProductPagingResDto.java b/src/main/java/trothly/trothcam/dto/web/ProductPagingResDto.java new file mode 100644 index 0000000..b6f57d1 --- /dev/null +++ b/src/main/java/trothly/trothcam/dto/web/ProductPagingResDto.java @@ -0,0 +1,25 @@ +package trothly.trothcam.dto.web; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +public class ProductPagingResDto { + private Long historyId; + private Long productId; + private String ownerToken; + private String ownerName; + private String authorshipToken; + private String title; + private int tags; + private String imageUrl; + private Long price; + private LocalDateTime soldAt; + private boolean liked; +} diff --git a/src/main/java/trothly/trothcam/dto/web/ProductsPagingLikedResDto.java b/src/main/java/trothly/trothcam/dto/web/ProductsPagingLikedResDto.java new file mode 100644 index 0000000..7258f94 --- /dev/null +++ b/src/main/java/trothly/trothcam/dto/web/ProductsPagingLikedResDto.java @@ -0,0 +1,16 @@ +package trothly.trothcam.dto.web; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +public class ProductsPagingLikedResDto { + private List getProductPagingResDto; + private int totalPages; +} diff --git a/src/main/java/trothly/trothcam/exception/base/ErrorCode.java b/src/main/java/trothly/trothcam/exception/base/ErrorCode.java index a25c96c..010c6cd 100644 --- a/src/main/java/trothly/trothcam/exception/base/ErrorCode.java +++ b/src/main/java/trothly/trothcam/exception/base/ErrorCode.java @@ -35,6 +35,7 @@ public enum ErrorCode { // BaseResponseStatus와 같은 역할 SAME_MEMBER(2017, "상품의 소유자와 현재 구매하려고 하는 사용자가 같습니다.", BAD_REQUEST), PRODUCT_IS_NOT_FOUND(2018, "존재하지 않는 상품입니다.", BAD_REQUEST), IMAGE_NOT_FOUND(2019, "존재하지 않는 이미지입니다.", BAD_REQUEST), + LIKED_NOT_FOUND(2020, "좋아요 정보를 찾을 수 없습니다.", BAD_REQUEST), /** * 3000 : Response 오류 diff --git a/src/main/java/trothly/trothcam/service/web/ProductService.java b/src/main/java/trothly/trothcam/service/web/ProductService.java index 5c584a4..c2fc811 100644 --- a/src/main/java/trothly/trothcam/service/web/ProductService.java +++ b/src/main/java/trothly/trothcam/service/web/ProductService.java @@ -218,7 +218,7 @@ public List findProductRankLatest() { return latestResDtos; } - /* 메인 페이징 처리 - top */ + /* 메인 페이징 처리 로그인x - top */ @Transactional public ProductsPagingListResDto getProductsTop(int page) { try { @@ -239,13 +239,13 @@ public ProductsPagingListResDto getProductsTop(int page) { } } - /* 메인 페이징 처리 - top */ + /* 메인 페이징 처리 로그인x - latest */ @Transactional public ProductsPagingListResDto getProductsLatest(int page) { try { PageRequest pageRequest = PageRequest.of(page, 8); - Page productLatests = productRepository.findLatestPagingDto(pageRequest); - List latestPagingDto = productLatests.stream() + Page productLatest = productRepository.findLatestPagingDto(pageRequest); + List latestPagingDto = productLatest.stream() .map(t -> { Optional owner = memberRepository.findById(t.getBuyerId()); Optional image = imageRepository.findById(t.getImageId()); @@ -254,7 +254,65 @@ public ProductsPagingListResDto getProductsLatest(int page) { image.get().getMember().getWebToken(), t.getTitle(), t.getTags(), image.get().getImageUrl(), t.getPrice(), t.getSoldAt()); }).collect(Collectors.toList()); - return new ProductsPagingListResDto(latestPagingDto, productLatests.getTotalPages()); + return new ProductsPagingListResDto(latestPagingDto, productLatest.getTotalPages()); + } catch (Exception e) { + throw new BaseException(ErrorCode.DATABASE_ERROR); + } + } + + /* 메인 페이징 처리 로그인0 - top */ + @Transactional + public ProductsPagingLikedResDto getProductsLikedTop(int page, Member member) { + try { + PageRequest pageRequest = PageRequest.of(page, 8); + Page productTops = productRepository.findRankPagingDto(pageRequest); + List topPagingLikedDto = productTops.stream() + .map(t -> { + Member owner = memberRepository.findById(t.getBuyerId()).orElseThrow(() -> new BaseException(MEMBER_NOT_FOUND)); + Image image = imageRepository.findById(t.getImageId()).orElseThrow(() -> new BaseException(IMAGE_NOT_FOUND)); + Optional like = likeProductRepository.findByProductIdAndMemberId(t.getProductId(), member.getId()); + + boolean liked = false; + if(like.isPresent()) { + liked = true; + } else { + liked = false; + } + + return new ProductPagingResDto(t.getHistoryId(), t.getProductId(), owner.getWebToken(), owner.getName(), + image.getMember().getWebToken(), t.getTitle(), t.getTags(), image.getImageUrl(), + t.getPrice(), t.getSoldAt(), liked); + }).collect(Collectors.toList()); + return new ProductsPagingLikedResDto(topPagingLikedDto, productTops.getTotalPages()); + } catch (Exception e) { + throw new BaseException(ErrorCode.DATABASE_ERROR); + } + } + + /* 메인 페이징 처리 로그인0 - latest */ + @Transactional + public ProductsPagingLikedResDto getProductsLikedLatest(int page, Member member) { + try { + PageRequest pageRequest = PageRequest.of(page, 8); + Page productLatest = productRepository.findLatestPagingDto(pageRequest); + List latestPagingLikedDto = productLatest.stream() + .map(t -> { + Optional owner = memberRepository.findById(t.getBuyerId()); + Optional image = imageRepository.findById(t.getImageId()); + Optional like = likeProductRepository.findByProductIdAndMemberId(t.getProductId(), member.getId()); + + boolean liked = false; + if(like.isPresent()) { + liked = true; + } else { + liked = false; + } + + return new ProductPagingResDto(t.getHistoryId(), t.getProductId(), owner.get().getWebToken(), owner.get().getName(), + image.get().getMember().getWebToken(), t.getTitle(), t.getTags(), image.get().getImageUrl(), + t.getPrice(), t.getSoldAt(), liked); + }).collect(Collectors.toList()); + return new ProductsPagingLikedResDto(latestPagingLikedDto, productLatest.getTotalPages()); } catch (Exception e) { throw new BaseException(ErrorCode.DATABASE_ERROR); }