Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 좋아요 기능 구현 #39

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
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
41 changes: 41 additions & 0 deletions src/main/java/com/wap/cano_be/controller/LikeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.wap.cano_be.controller;

import com.wap.cano_be.domain.PrincipalDetail;
import com.wap.cano_be.service.impl.LikeService;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class LikeController {
private final LikeService likeService;

public LikeController(LikeService likeService) {
this.likeService = likeService;
}

// 좋아요 등록
@PostMapping("/menus/{menu_id}/like")
public ResponseEntity<?> like(
@PathVariable("menu_id") long menuId,
@AuthenticationPrincipal PrincipalDetail principalDetail){
return likeService.insert(principalDetail.getMember().getId(), menuId);
}

// [TEST] 좋아요 한 메뉴 조회
@GetMapping("/likes/me")
public ResponseEntity<?> getLikes(
@AuthenticationPrincipal PrincipalDetail principalDetail
) {
return likeService.getLikedMenus(principalDetail.getMember().getId());
}

// 좋아요 취소
@DeleteMapping("/menus/{menu_id}/like")
public ResponseEntity<?> unlike(
@PathVariable("menu_id") long menuId,
@AuthenticationPrincipal PrincipalDetail principalDetail){
return likeService.delete(principalDetail.getMember().getId(), menuId);
}
}
24 changes: 0 additions & 24 deletions src/main/java/com/wap/cano_be/controller/MenuController.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,28 +128,4 @@ public ResponseEntity<?> reportMenu(@RequestBody MenuReportDto menuReportDto){
log.info("menuReportDto: {}", menuReportDto);
return getSuccessResponse();
}

// 좋아요
// @PostMapping("/{menu_id}/like")
// public ResponseEntity<?> setLike(
// @PathVariable("menu_id") long id,
// @RequestBody MenuLikeDto menuLikeDto,
// @AuthenticationPrincipal PrincipalDetail principalDetail){
//
// if(menuLikeDto == null){
// Map<String, String> response = new HashMap<>();
// response.put("error", "잘못된 요청 양식 입니다.");
// return ResponseEntity.badRequest().body(response);
// }
//
// Long memberId = principalDetail.getMember().getId();
// if(memberId == null){
// Map<String, String> response = new HashMap<>();
// response.put("error", "유효하지 않은 사용자입니다.");
// return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(response);
// }
//
// likeService.updateLike(memberId, id, menuLikeDto.like());
// return getSuccessResponse();
// }
}
8 changes: 6 additions & 2 deletions src/main/java/com/wap/cano_be/domain/Like.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,27 @@
package com.wap.cano_be.domain;

import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;

@Entity
@Getter
@Table(name = "menu_like")
public class Like {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(targetEntity = Member.class, fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;

@ManyToOne(targetEntity = Menu.class, fetch = FetchType.LAZY)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "menu_id")
private Menu menu;

public Like() {}

@Builder
public Like(Member member, Menu menu) {
this.member = member;
this.menu = menu;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/wap/cano_be/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import jakarta.persistence.*;
import lombok.*;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Setter
Expand All @@ -32,4 +35,6 @@ public class Member {
private MemberRole role;
@Enumerated(EnumType.STRING)
private Gender gender;
@OneToMany(mappedBy = "member", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<Like> likes = new ArrayList<>();
}
6 changes: 0 additions & 6 deletions src/main/java/com/wap/cano_be/dto/menu/MenuLikeDto.java

This file was deleted.

67 changes: 47 additions & 20 deletions src/main/java/com/wap/cano_be/service/impl/LikeService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,15 @@
import com.wap.cano_be.repository.MenuRepository;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
@Transactional
public class LikeService {
private final LikeRepository likeRepository;
private final MemberRepository memberRepository;
Expand All @@ -23,24 +29,45 @@ public LikeService(LikeRepository likeRepository, MemberRepository memberReposit
this.menuRepository = menuRepository;
}

// @Transactional
// public void updateLike(long memberId, long menuId, boolean like){
// Member member = memberRepository.findBySocialId(memberId).orElseThrow(()->new IllegalArgumentException("Member not found"));
// Menu menu = menuRepository.findById(menuId);
//
// // 좋아요 했다면
// if(like){
// // member - menu 간 join이 없다면
// if(!likeRepository.existsByMemberAndMenu(member, menu)){
// menu.increaseLikeCount();
// menuRepository.save(menu); // transactional 고려해 이후 제거할 수도 있음
// likeRepository.save(new Like(member, menu));
// }
// } else {
// // 좋아요 해제
// menu.decreaseLikeCount();
// menuRepository.save(menu);
// likeRepository.deleteByMemberAndMenu(member, menu);
// }
// }
public ResponseEntity<?> insert(long memberId, long menuId){
Member member = memberRepository.findById(memberId).orElseThrow(()->new IllegalArgumentException("Member not found"));
Menu menu = menuRepository.findById(menuId);

// 이미 좋아요라면 409 에러 반환
if(likeRepository.existsByMemberAndMenu(member, menu)){
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

// 좋아요 반영
Like like = Like.builder()
.member(member)
.menu(menu)
.build();
likeRepository.save(like);
return ResponseEntity.noContent().build();
}

public ResponseEntity<?> delete(long memberId, long menuId){
Member member = memberRepository.findById(memberId).orElseThrow(()->new IllegalArgumentException("Member not found"));
Menu menu = menuRepository.findById(menuId);

// 좋아요가 있다면 좋아요 해제
if(likeRepository.existsByMemberAndMenu(member, menu)){
likeRepository.deleteByMemberAndMenu(member, menu);
return ResponseEntity.noContent().build();
}

// 없으면 409 에러 반환
return ResponseEntity.status(HttpStatus.CONFLICT).build();
}

// [TEST] 좋아요한 메뉴 찾기
public ResponseEntity<List<Menu>> getLikedMenus(long memberId){
Member member = memberRepository.findById(memberId).orElseThrow(()->new IllegalArgumentException("Member not found"));
return ResponseEntity.ok().body(
member.getLikes().stream()
.map(Like::getMenu)
.collect(Collectors.toList()));
}

}