Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions src/main/java/com/kt/controller/wishlist/WishlistController.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -24,12 +30,12 @@ public class WishlistController {

@PostMapping("/{productId}")
@Operation(summary = "찜 추가")
public ApiResult<Void> addWishlist(
public ApiResult<Long> 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}")
Expand All @@ -51,6 +57,18 @@ public ApiResult<Void> removeAllWishlist(
return ApiResult.ok();
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
@Operation(summary = "찜 목록 조회")
public ApiResult<List<WishlistResponse>> getWishlists(
@AuthenticationPrincipal CustomUserDetails currentUser
) {
List<WishlistResponse> wishlists = wishlistService.getWishlists(currentUser.getId());
return ApiResult.ok(wishlists);
}





}
30 changes: 30 additions & 0 deletions src/main/java/com/kt/dto/wishlist/WishlistResponse.java
Original file line number Diff line number Diff line change
@@ -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()
);
}
}
20 changes: 11 additions & 9 deletions src/main/java/com/kt/repository/wishlist/WishlistRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,32 @@

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<Wishlist,Long> {
boolean existsByUserIdAndProductId(Long userId, Long productId);
List<Wishlist> findByUserId(Long userId);
List<Wishlist> findByProductId(Long productId);
boolean existsByUserIdAndProductId(Long userId, Long productId);
List<Wishlist> findByUserId(Long userId);
List<Wishlist> findByProductId(Long productId);

void deleteByUserIdAndProductId(Long userId, Long productId);
void deleteByUserIdAndProductId(Long userId, Long productId);

void deleteByUserId(Long userId);
void deleteByUserId(Long userId);

//상품을 찜한 유저 이메일만 뽑는 쿼리, jpa는 비효율적이라 사용x
@Query("""
//상품을 찜한 유저 이메일만 뽑는 쿼리, 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<String> findDistinctEmailsByProductId(Long productId);
}
List<String> findDistinctEmailsByProductId(Long productId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
public class PaymentTypeService {

private final PaymentTypeRepository paymentTypeRepository;
private final UserRepository userRepository;

public void create(PaymentTypeCreateRequest request) {
PaymentType paymentType = new PaymentType(
Expand Down
26 changes: 24 additions & 2 deletions src/main/java/com/kt/service/wishlist/WishlistService.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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;
Expand All @@ -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));

Expand All @@ -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
Expand All @@ -58,4 +64,20 @@ public void removeWishlist(Long userId, Long productId) {
public void removeAllWishlist(Long userId) {
wishlistRepository.deleteByUserId(userId);
}

@Transactional(readOnly = true)
public List<WishlistResponse> 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();
}
}


Loading