From 4f46e2a359d9886ebcbd9311696e7c292a703aae Mon Sep 17 00:00:00 2001 From: Kim So Yeon Date: Sat, 1 Feb 2025 01:36:47 +0900 Subject: [PATCH] =?UTF-8?q?:sparkles:=20feat:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=88=84?= =?UTF-8?q?=EB=A5=B8=20=EC=83=81=ED=92=88=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/likes/api/LikeController.java | 12 ++++++ .../domain/likes/converter/LikeConverter.java | 42 +++++++++++++++++++ .../domain/likes/dto/LikeResponseDTO.java | 1 + .../likes/repository/LikeRepository.java | 3 ++ .../domain/likes/service/LikeService.java | 4 ++ .../domain/likes/service/LikeServiceImpl.java | 18 +++++++- .../dto/response/BasicProductInfo.java | 1 + .../pricewagon/global/config/FCMConfig.java | 2 +- src/main/resources/application-dev.yml | 3 ++ 9 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/pricewagon/pricewagon/domain/likes/converter/LikeConverter.java diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/api/LikeController.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/api/LikeController.java index 4c9cc92..926eae4 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/likes/api/LikeController.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/api/LikeController.java @@ -1,7 +1,10 @@ package com.pricewagon.pricewagon.domain.likes.api; +import java.util.List; + import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; +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.RequestMapping; @@ -9,6 +12,7 @@ import com.pricewagon.pricewagon.domain.likes.dto.LikeResponseDTO; import com.pricewagon.pricewagon.domain.likes.service.LikeService; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; import com.pricewagon.pricewagon.global.config.security.CustomUserDetails; import io.swagger.v3.oas.annotations.Operation; @@ -31,4 +35,12 @@ public ResponseEntity registerLike( return ResponseEntity.ok(result); } + @Operation(summary = "좋아요 목록 조회", description = "좋아요 목록 조회하는 기능(토큰 필요)") + @GetMapping("/list") + public List getLikeList( + @AuthenticationPrincipal CustomUserDetails userDetails) { + return likeService.getLikeList(userDetails.getUsername()); + + } + } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/converter/LikeConverter.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/converter/LikeConverter.java new file mode 100644 index 0000000..84a1760 --- /dev/null +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/converter/LikeConverter.java @@ -0,0 +1,42 @@ +package com.pricewagon.pricewagon.domain.likes.converter; + +import java.util.List; + +import org.springframework.stereotype.Component; + +import com.pricewagon.pricewagon.domain.history.service.ProductHistoryService; +import com.pricewagon.pricewagon.domain.likes.entity.Likes; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; +import com.pricewagon.pricewagon.domain.product.entity.Product; + +import lombok.RequiredArgsConstructor; + +@Component +@RequiredArgsConstructor +public class LikeConverter { + + private final ProductHistoryService productHistoryService; + + public List convertToBasicProductInfo(List likes) { + return likes.stream() + .map(like -> { + Product product = like.getProduct(); + Integer previousPrice = productHistoryService.getDifferentLatestPriceByProductId(product); + + return new BasicProductInfo( + product.getProductNumber(), + product.getName(), + product.getBrand(), + product.getStarScore(), + product.getReviewCount(), + product.getUserLikeCount(), + product.getImgUrl(), + product.getShopType(), + product.getCurrentPrice(), + previousPrice, + true + ); + }) + .toList(); + } +} diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/dto/LikeResponseDTO.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/dto/LikeResponseDTO.java index 537d01d..3514853 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/likes/dto/LikeResponseDTO.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/dto/LikeResponseDTO.java @@ -15,4 +15,5 @@ public static class registerLikeDTO { Long userId; String action; // 좋아요 등록, 좋아요 삭제 } + } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/repository/LikeRepository.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/repository/LikeRepository.java index 4214764..4d0163b 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/likes/repository/LikeRepository.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/repository/LikeRepository.java @@ -1,5 +1,6 @@ package com.pricewagon.pricewagon.domain.likes.repository; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -12,4 +13,6 @@ public interface LikeRepository extends JpaRepository { boolean existsByUserAndProduct(User user, Product product); Optional findByUserAndProduct(User user, Product product); + + List findByUserId(Long userId); } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeService.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeService.java index d1f0839..2697b76 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeService.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeService.java @@ -1,8 +1,12 @@ package com.pricewagon.pricewagon.domain.likes.service; +import java.util.List; + import com.pricewagon.pricewagon.domain.likes.dto.LikeResponseDTO; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; public interface LikeService { LikeResponseDTO.registerLikeDTO registerLike(Integer productNumber, String username); + List getLikeList(String username); } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeServiceImpl.java b/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeServiceImpl.java index 3518415..78d0b32 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeServiceImpl.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/likes/service/LikeServiceImpl.java @@ -1,13 +1,17 @@ package com.pricewagon.pricewagon.domain.likes.service; import java.time.LocalDateTime; +import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.pricewagon.pricewagon.domain.likes.converter.LikeConverter; import com.pricewagon.pricewagon.domain.likes.dto.LikeResponseDTO; import com.pricewagon.pricewagon.domain.likes.entity.Likes; import com.pricewagon.pricewagon.domain.likes.repository.LikeRepository; +import com.pricewagon.pricewagon.domain.product.dto.response.BasicProductInfo; import com.pricewagon.pricewagon.domain.product.entity.Product; import com.pricewagon.pricewagon.domain.product.repository.ProductRepository; import com.pricewagon.pricewagon.domain.user.entity.User; @@ -25,6 +29,7 @@ public class LikeServiceImpl implements LikeService { private final LikeRepository likeRepository; private final UserRepository userRepository; private final ProductRepository productRepository; + private final LikeConverter likeConverter; @Override public LikeResponseDTO.registerLikeDTO registerLike(Integer productNumber, String username) { @@ -35,7 +40,7 @@ public LikeResponseDTO.registerLikeDTO registerLike(Integer productNumber, Strin .orElseThrow(() -> new CustomException(ErrorCode.PRODUCT_NOT_FOUND)); Optional like = likeRepository.findByUserAndProduct(user, product); - if (like.isPresent()) { // 좋아요 삭제 + if (like.isPresent()) { likeRepository.delete(like.get()); product.updateLikeCount(product.getLikeCount() - 1); return LikeResponseDTO.registerLikeDTO.builder() @@ -60,4 +65,15 @@ public LikeResponseDTO.registerLikeDTO registerLike(Integer productNumber, Strin } + @Transactional(readOnly = true) + @Override + public List getLikeList(String username) { + User user = userRepository.findByAccount(username) + .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND)); + + List likes = likeRepository.findByUserId(user.getId()); + + return likeConverter.convertToBasicProductInfo(likes); + } + } diff --git a/src/main/java/com/pricewagon/pricewagon/domain/product/dto/response/BasicProductInfo.java b/src/main/java/com/pricewagon/pricewagon/domain/product/dto/response/BasicProductInfo.java index e12ab04..741ac3d 100644 --- a/src/main/java/com/pricewagon/pricewagon/domain/product/dto/response/BasicProductInfo.java +++ b/src/main/java/com/pricewagon/pricewagon/domain/product/dto/response/BasicProductInfo.java @@ -50,4 +50,5 @@ public static BasicProductInfo createWithLikeStatus(Product product, Integer pre isLiked ); } + } diff --git a/src/main/java/com/pricewagon/pricewagon/global/config/FCMConfig.java b/src/main/java/com/pricewagon/pricewagon/global/config/FCMConfig.java index d175996..f56ff14 100644 --- a/src/main/java/com/pricewagon/pricewagon/global/config/FCMConfig.java +++ b/src/main/java/com/pricewagon/pricewagon/global/config/FCMConfig.java @@ -21,7 +21,7 @@ public class FCMConfig { @Bean public FirebaseMessaging firebaseMessaging() throws IOException { - // 경로 수정: "resources/" 생략 + ClassPathResource resource = new ClassPathResource( "firebase/fcm.json"); InputStream refreshToken = resource.getInputStream(); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 0642cb8..aec7473 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -24,6 +24,9 @@ spring: username: ${LOCAL_MYSQL_USERNAME} password: ${LOCAL_MYSQL_PASSWORD} + + + # 로깅 설정 logging: level: