diff --git a/src/main/java/com/kt/controller/wishlist/WishlistController.java b/src/main/java/com/kt/controller/wishlist/WishlistController.java index 2c0eaa5b..6bfaf8bb 100644 --- a/src/main/java/com/kt/controller/wishlist/WishlistController.java +++ b/src/main/java/com/kt/controller/wishlist/WishlistController.java @@ -1,13 +1,19 @@ package com.kt.controller.wishlist; +import java.util.List; + +import org.springframework.http.HttpStatus; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; +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; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.kt.common.response.ApiResult; +import com.kt.dto.wishlist.WishlistResponse; import com.kt.security.CustomUserDetails; import com.kt.service.wishlist.WishlistService; @@ -24,12 +30,12 @@ public class WishlistController { @PostMapping("/{productId}") @Operation(summary = "찜 추가") - public ApiResult addWishlist( + public ApiResult addWishlist( @AuthenticationPrincipal CustomUserDetails currentUser, @PathVariable Long productId ) { - wishlistService.addWishlist(currentUser.getId(), productId); - return ApiResult.ok(); + Long wishlistId = wishlistService.addWishlist(currentUser.getId(), productId); + return ApiResult.ok(wishlistId); } @DeleteMapping("/{productId}") @@ -51,6 +57,18 @@ public ApiResult removeAllWishlist( return ApiResult.ok(); } + @GetMapping + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "찜 목록 조회") + public ApiResult> getWishlists( + @AuthenticationPrincipal CustomUserDetails currentUser + ) { + List wishlists = wishlistService.getWishlists(currentUser.getId()); + return ApiResult.ok(wishlists); + } + + + } \ No newline at end of file diff --git a/src/main/java/com/kt/dto/wishlist/WishlistResponse.java b/src/main/java/com/kt/dto/wishlist/WishlistResponse.java new file mode 100644 index 00000000..d61a195e --- /dev/null +++ b/src/main/java/com/kt/dto/wishlist/WishlistResponse.java @@ -0,0 +1,30 @@ +package com.kt.dto.wishlist; + +import java.time.LocalDateTime; + +import com.kt.domain.wishlist.Wishlist; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class WishlistResponse { + private Long id; + private Long productId; + private String productName; + private Long price; + private LocalDateTime createdAt; + + public static WishlistResponse from(Wishlist wishlist){ + return new WishlistResponse( + wishlist.getId(), + wishlist.getProduct().getId(), + wishlist.getProduct().getName(), + wishlist.getProduct().getPrice(), + wishlist.getCreatedAt() + ); + } +} diff --git a/src/main/java/com/kt/repository/wishlist/WishlistRepository.java b/src/main/java/com/kt/repository/wishlist/WishlistRepository.java index 258924ae..fcfe0857 100644 --- a/src/main/java/com/kt/repository/wishlist/WishlistRepository.java +++ b/src/main/java/com/kt/repository/wishlist/WishlistRepository.java @@ -2,30 +2,23 @@ import java.util.List; +import org.springframework.data.domain.Page; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.kt.domain.wishlist.Wishlist; @Repository -public interface WishlistRepository extends JpaRepository { - boolean existsByUserIdAndProductId(Long userId, Long productId); - List findByUserId(Long userId); - List findByProductId(Long productId); - - void deleteByUserIdAndProductId(Long userId, Long productId); - - void deleteByUserId(Long userId); - - //상품을 찜한 유저 이메일만 뽑는 쿼리, jpa는 비효율적이라 사용x - @Query(""" - select distinct u.email - from Wishlist w - join w.user u - where w.product.id = :productId - and u.isDeleted = false - and u.email is not null - """) - List findDistinctEmailsByProductId(Long productId); +public interface WishlistRepository extends JpaRepository { + boolean existsByUserIdAndProductId(Long userId, Long productId); + + List findByUserId(Long userId); + + List findByProductId(Long productId); + + void deleteByUserIdAndProductId(Long userId, Long productId); + + void deleteByUserId(Long userId); + } diff --git a/src/main/java/com/kt/service/paymenttype/PaymentTypeService.java b/src/main/java/com/kt/service/paymenttype/PaymentTypeService.java index f5cfd49b..06a50851 100644 --- a/src/main/java/com/kt/service/paymenttype/PaymentTypeService.java +++ b/src/main/java/com/kt/service/paymenttype/PaymentTypeService.java @@ -20,7 +20,6 @@ public class PaymentTypeService { private final PaymentTypeRepository paymentTypeRepository; - private final UserRepository userRepository; public void create(PaymentTypeCreateRequest request) { PaymentType paymentType = new PaymentType( diff --git a/src/main/java/com/kt/service/wishlist/WishlistService.java b/src/main/java/com/kt/service/wishlist/WishlistService.java index 609b9d00..69a11ea2 100644 --- a/src/main/java/com/kt/service/wishlist/WishlistService.java +++ b/src/main/java/com/kt/service/wishlist/WishlistService.java @@ -1,5 +1,9 @@ package com.kt.service.wishlist; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -8,6 +12,7 @@ import com.kt.domain.product.Product; import com.kt.domain.user.User; import com.kt.domain.wishlist.Wishlist; +import com.kt.dto.wishlist.WishlistResponse; import com.kt.event.WishlistAddedEvent; import com.kt.repository.wishlist.WishlistRepository; import com.kt.repository.product.ProductRepository; @@ -27,7 +32,7 @@ public class WishlistService { private final ProductRepository productRepository; private final ApplicationEventPublisher eventPublisher; - public void addWishlist(Long userId, Long productId) { + public Long addWishlist(Long userId, Long productId) { User user = userRepository.findById(userId) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER)); @@ -39,11 +44,12 @@ public void addWishlist(Long userId, Long productId) { } Wishlist wishlist = new Wishlist(user, product); - wishlistRepository.save(wishlist); + Wishlist saveWishlist = wishlistRepository.save(wishlist); eventPublisher.publishEvent( new WishlistAddedEvent(userId, productId) ); + return saveWishlist.getId(); } @Transactional @@ -58,4 +64,20 @@ public void removeWishlist(Long userId, Long productId) { public void removeAllWishlist(Long userId) { wishlistRepository.deleteByUserId(userId); } + + @Transactional(readOnly = true) + public List getWishlists(Long userId) { + var wishlists = wishlistRepository.findByUserId(userId); + + return wishlists.stream() + .map(wishlist -> new WishlistResponse( + wishlist.getId(), + wishlist.getProduct().getId(), + wishlist.getProduct().getName(), + wishlist.getProduct().getPrice(), + wishlist.getCreatedAt() + )).toList(); + } } + +