/**좋아요 등록*/
@Transactional
@PostMapping("/user/favorite/{id}")
public ResponseEntity<Void> addFavorite(@PathVariable Long id, HttpServletRequest request) {
productService.increaseFavorite(id);
boolean check = favoriteService.addFavorite((User) request.getAttribute("user"), id);
return (check) ?
ResponseEntity.status(HttpStatus.OK).body(null) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
특정 상품의 id와 함께 좋아요 등록 요청이 오면 해당 상품의 좋아요 개수를 1증가 시키고 요청을 보낸 유저의 좋아요 목록에 해당 상품을 추가하는 과정으로 동작
@Override
public void increaseFavorite(Long id) {
productRepository.increaseFavorite(id);
}
@Transactional
@Modifying(clearAutomatically = true)
@Query("update Product o set o.favorite=o.favorite+1 where o.id=:id")
void increaseFavorite(@Param("id") Long id);
@Query 어노테이션을 사용해 해당 상품의 favorite을 1 증가시키는 update 쿼리 실행
@Override
public boolean addFavorite(User user, Long productId) {
Product product = productRepository.findById(productId).orElse(null);
if (product == null){
return false;
}
Favorite favorite = Favorite.builder()
.id(null)
.user(user)
.product(product)
.build();
// DB에 이미 좋아요 등록이 되어있는지 확인
if (favoriteRepository.findByUserIdAndProductId(user.getId(), productId) != null) {
return false;
}
Favorite createdFavorite = favoriteRepository.save(favorite);
return !createdFavorite.getProduct().getName().isEmpty();
}
좋아요 목록에 해당 상품을 추가하는 함수
상품id를 사용해 Product Entity 조회해오고 Favorite Entity 생성
좋아요는 한번 등록되면 해제되기전까지는 또 등록 할 수 없도록 해야하므로 체크하는 과정 필요
Spring Data Jpa 문법에 맞게 findByUserIdAndProductId 함수 작성 후 사용
생성된 Favorite Entity 영속화하여 DB에 저장
/**좋아요 해제*/
@Transactional
@DeleteMapping("/user/favorite/{id}")
public ResponseEntity<Void> deleteFavorite(@PathVariable Long id, HttpServletRequest request) {
productService.decreaseFavorite(id);
boolean check = favoriteService.deleteFavorite((User) request.getAttribute("user"), id);
return (check) ?
ResponseEntity.status(HttpStatus.OK).body(null) :
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}
좋아요 해제기능의 Controller 부분은 좋아요 등록과 Http 메소드와 Service의 호출하는 함수만 다르고 나머지는 같은 로직