diff --git a/src/main/java/umc/spring/post/controller/PostController.java b/src/main/java/umc/spring/post/controller/PostController.java index 6a06b5c996e9cc194aab1eaf4852b6f87b0ec448..00357386f21587771a8252beb9e32a433b08eb29 100644 --- a/src/main/java/umc/spring/post/controller/PostController.java +++ b/src/main/java/umc/spring/post/controller/PostController.java @@ -58,12 +58,23 @@ public class PostController { @PostMapping("/post/likes") @ResponseStatus(HttpStatus.OK) public void likeCrew(@RequestParam Long id){ - postService.likeCrew(id); + + try { + postService.likeCrew(id); + } + catch (Exception e){ + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "token not found"); + } } @DeleteMapping ("/post/likes") @ResponseStatus(HttpStatus.OK) public void dislikeCrew(@RequestParam Long id){ - postService.dislikeCrew(id); + try{ + postService.dislikeCrew(id); + } + catch (Exception e){ + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "token not found"); + } } @PostMapping("/post/search") diff --git a/src/main/java/umc/spring/post/data/dto/PostResDto.java b/src/main/java/umc/spring/post/data/dto/PostResDto.java index 48ef01fa89f5083de0cd0f76cf00652ae58d77e6..ec280370808475eca4d715ef868045053ffed55a 100644 --- a/src/main/java/umc/spring/post/data/dto/PostResDto.java +++ b/src/main/java/umc/spring/post/data/dto/PostResDto.java @@ -35,7 +35,7 @@ public class PostResDto { .author(post.getAuthor()) .body(post.getBody()) .image(post.getImage()) - .likeCount(post.getLikeCount()) + .likeCount(post.getLikes().size()) .createdTime(post.getCreatedTime()) .modifiedTime(post.getModifiedTime()) .comments(resDtos).build(); diff --git a/src/main/java/umc/spring/post/data/entity/Like.java b/src/main/java/umc/spring/post/data/entity/Like.java deleted file mode 100644 index 46d312a4b2dd6d40dbd97d7dccc0ba91241f3433..0000000000000000000000000000000000000000 --- a/src/main/java/umc/spring/post/data/entity/Like.java +++ /dev/null @@ -1,15 +0,0 @@ -package umc.spring.post.data.entity; - -import jakarta.persistence.*; - -public class Like { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - @ManyToOne - @JoinColumn(name = "user_id") - private Long userId; - @ManyToOne - @JoinColumn(name = "post_id") - private Long postId; -} diff --git a/src/main/java/umc/spring/post/data/entity/LikeData.java b/src/main/java/umc/spring/post/data/entity/LikeData.java new file mode 100644 index 0000000000000000000000000000000000000000..dfe8dc5ac9ced7ed8dfb6548ed4ce5893ecd32b6 --- /dev/null +++ b/src/main/java/umc/spring/post/data/entity/LikeData.java @@ -0,0 +1,25 @@ +package umc.spring.post.data.entity; + +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Data +@Getter +@NoArgsConstructor +public class LikeData { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + + @ManyToOne(fetch=FetchType.EAGER) + @JoinColumn(name = "postId",nullable = false) + Post post; + + @ManyToOne(fetch=FetchType.EAGER) + @JoinColumn(name = "userId",nullable = false) + User user; +} diff --git a/src/main/java/umc/spring/post/data/entity/Post.java b/src/main/java/umc/spring/post/data/entity/Post.java index 5fb5452a3f2059e18b996a47edcea589cfec75ed..323344dfbbcdfdfe147d42cb9fb9f260b4975063 100644 --- a/src/main/java/umc/spring/post/data/entity/Post.java +++ b/src/main/java/umc/spring/post/data/entity/Post.java @@ -46,6 +46,10 @@ public class Post{ orphanRemoval = true) private List<Comment> comments = new ArrayList<>(); + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL,fetch = FetchType.EAGER, + orphanRemoval = true) + private List<LikeData> likes = new ArrayList<>(); + } diff --git a/src/main/java/umc/spring/post/data/entity/User.java b/src/main/java/umc/spring/post/data/entity/User.java index 18d753b28f8b151dac244b71655443287466742b..06b3d16ff78fd19e008a4136b24a6344562401df 100644 --- a/src/main/java/umc/spring/post/data/entity/User.java +++ b/src/main/java/umc/spring/post/data/entity/User.java @@ -11,13 +11,14 @@ import umc.spring.post.config.security.Role; import java.util.ArrayList; import java.util.Collection; +import java.util.List; //@Builder @NoArgsConstructor @AllArgsConstructor @Entity @Data -@Table(name="user") +@Table(name="User") public class User implements UserDetails { @Id @@ -37,6 +38,10 @@ public class User implements UserDetails { @Enumerated(EnumType.STRING) private Role role = Role.USER; + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL,fetch = FetchType.EAGER, + orphanRemoval = true) + private List<LikeData> likes = new ArrayList<>(); + @Override public Collection<? extends GrantedAuthority> getAuthorities() { Collection<GrantedAuthority> authorities = new ArrayList<>(); diff --git a/src/main/java/umc/spring/post/repository/LikeRepository.java b/src/main/java/umc/spring/post/repository/LikeRepository.java index fca6e211738475803940d8163dcea386b1a8ef38..94af2a98100a5bd848de7f3b5be0e7c472f57d15 100644 --- a/src/main/java/umc/spring/post/repository/LikeRepository.java +++ b/src/main/java/umc/spring/post/repository/LikeRepository.java @@ -1,7 +1,16 @@ package umc.spring.post.repository; import org.springframework.data.jpa.repository.JpaRepository; -import umc.spring.post.data.entity.Like; +import umc.spring.post.data.entity.LikeData; +import umc.spring.post.data.entity.Post; +import umc.spring.post.data.entity.User; -public interface LikeRepository extends JpaRepository<Like,Long> { +import java.util.List; +import java.util.Optional; + +public interface LikeRepository extends JpaRepository<LikeData, Long> { + + Optional<LikeData> findByPostAndUser(Post post, User user); + + List<LikeData> findLikeByPost(Post post); } diff --git a/src/main/java/umc/spring/post/service/PostServiceImpl.java b/src/main/java/umc/spring/post/service/PostServiceImpl.java index 4e8a47f4222685353e602647e1c497deac09cbfe..2046e97ecd83c41131d5a3578b66eb8f787015e8 100644 --- a/src/main/java/umc/spring/post/service/PostServiceImpl.java +++ b/src/main/java/umc/spring/post/service/PostServiceImpl.java @@ -10,9 +10,11 @@ import umc.spring.post.data.dto.PostDto; import umc.spring.post.data.dto.PostResDto; import umc.spring.post.data.dto.UserInfoDto; import umc.spring.post.data.entity.Comment; +import umc.spring.post.data.entity.LikeData; import umc.spring.post.data.entity.Post; import umc.spring.post.data.entity.User; import umc.spring.post.repository.CommentRepository; +import umc.spring.post.repository.LikeRepository; import umc.spring.post.repository.PostRepository; import umc.spring.post.repository.UserRepository; @@ -31,11 +33,14 @@ public class PostServiceImpl implements PostService{ @Autowired private final UserRepository userRepository; + @Autowired + private final LikeRepository likeRepository; - public PostServiceImpl(PostRepository postRepository, CommentRepository commentRepository, UserRepository userRepository) { + public PostServiceImpl(PostRepository postRepository, CommentRepository commentRepository, UserRepository userRepository, LikeRepository likeRepository) { this.postRepository = postRepository; this.commentRepository = commentRepository; this.userRepository = userRepository; + this.likeRepository = likeRepository; } @Override @@ -120,24 +125,45 @@ public class PostServiceImpl implements PostService{ @Override public void likeCrew(Long id) { UserInfoDto userInfoDto = getCurrentMemberId(); - + // 내가 좋아요를 누른적이 있는지? 있으면 반영안됨 Post post = postRepository.findById(id).orElseThrow(() -> new RuntimeException("id가 존재하지 않습니다.")); - int likeCount = post.getLikeCount(); - post.setLikeCount(++likeCount); - postRepository.save(post); + User user = userRepository.findByLoginId(userInfoDto.getLoginId()).orElseThrow(); + Optional<LikeData> byPostAndUser = likeRepository.findByPostAndUser(post, user); + if(byPostAndUser.isEmpty()){ + LikeData likeData = new LikeData(); + post.getLikes().add(likeData); + user.getLikes().add(likeData); + likeData.setUser(user); + likeData.setPost(post); + likeRepository.save(likeData); + } + else{ + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "이미 좋아요를 눌렀습니다."); + } } @Override public void dislikeCrew(Long id) { + UserInfoDto userInfoDto = getCurrentMemberId(); Post post = postRepository.findById(id).orElseThrow(() -> new RuntimeException("id가 존재하지 않습니다.")); - int likeCount = post.getLikeCount(); - if(likeCount!=0){ - post.setLikeCount(--likeCount); + User user = userRepository.findByLoginId(userInfoDto.getLoginId()).orElseThrow(); + Optional<LikeData> byPostAndUser = likeRepository.findByPostAndUser(post, user); + if(byPostAndUser.isPresent()){ + post.getLikes().removeIf(data -> + data.getPost().equals(post) + ); postRepository.save(post); - } - } + user.getLikes().removeIf(data -> + data.getUser().equals(user) + ); + userRepository.save(user); + } + else{ + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "좋아요를 누른 적이 없습니다"); + } + } @Override public List<PostResDto> search(String title) { @@ -206,7 +232,7 @@ public class PostServiceImpl implements PostService{ private static void setPost(PostDto postDto, Post post) { post.setTitle(postDto.getTitle()); post.setBody(postDto.getBody()); - post.setLikeCount(postDto.getLikeCount()); + post.setLikeCount(0); post.setImage(postDto.getImage()); } }