From 479b3eff505091e0a0a7670216e3f63ef2303c35 Mon Sep 17 00:00:00 2001 From: kkj6235 <kkj6235@ajou.ac.kr> Date: Thu, 23 Nov 2023 05:39:13 +0900 Subject: [PATCH] refactor: Create LikeData entity, repository, and update related entities and controllers. --- .../post/controller/PostController.java | 15 +++++- .../umc/spring/post/data/dto/PostResDto.java | 2 +- .../umc/spring/post/data/entity/Like.java | 15 ------ .../umc/spring/post/data/entity/LikeData.java | 25 ++++++++++ .../umc/spring/post/data/entity/Post.java | 4 ++ .../umc/spring/post/data/entity/User.java | 7 ++- .../post/repository/LikeRepository.java | 13 ++++- .../spring/post/service/PostServiceImpl.java | 48 ++++++++++++++----- 8 files changed, 97 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/umc/spring/post/data/entity/Like.java create mode 100644 src/main/java/umc/spring/post/data/entity/LikeData.java diff --git a/src/main/java/umc/spring/post/controller/PostController.java b/src/main/java/umc/spring/post/controller/PostController.java index 6a06b5c..0035738 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 48ef01f..ec28037 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 46d312a..0000000 --- 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 0000000..dfe8dc5 --- /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 5fb5452..323344d 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 18d753b..06b3d16 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 fca6e21..94af2a9 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 4e8a47f..2046e97 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()); } } -- GitLab