diff --git a/back/src/main/java/com/back/domain/post/comment/dto/CommentAllResponse.java b/back/src/main/java/com/back/domain/post/comment/dto/CommentAllResponse.java index 562601bb..9fcf8aa7 100644 --- a/back/src/main/java/com/back/domain/post/comment/dto/CommentAllResponse.java +++ b/back/src/main/java/com/back/domain/post/comment/dto/CommentAllResponse.java @@ -16,7 +16,7 @@ public static CommentAllResponse from(PostComment comment) { CommentAllResponse response = new CommentAllResponse(); response.setId(comment.getId()); response.setContent(comment.getContent()); - response.setAuthorName(comment.getMember().getName()); // Member에서 이름 가져오기 + response.setAuthorName(comment.getAuthorName()); // Member에서 이름 가져오기 response.setCreatedAt(comment.getCreateDate()); return response; } diff --git a/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java b/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java index 208e1210..6fa43572 100644 --- a/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java +++ b/back/src/main/java/com/back/domain/post/comment/entity/PostComment.java @@ -9,6 +9,8 @@ import lombok.Getter; import lombok.Setter; +import java.util.Objects; + @Entity @Getter @Setter @@ -23,4 +25,14 @@ public class PostComment extends BaseEntity { private String role; + public Boolean isAuthor( Member member) { + return Objects.equals(this.member.getId(), member.getId()); + } + + public String getAuthorName() { + return member.getName(); + } + + + } diff --git a/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java b/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java index 1c2ab975..d4c5ecc0 100644 --- a/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java +++ b/back/src/main/java/com/back/domain/post/comment/repository/PostCommentRepository.java @@ -2,8 +2,15 @@ import com.back.domain.post.comment.entity.PostComment; 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 java.util.List; + @Repository public interface PostCommentRepository extends JpaRepository { + + @Query("SELECT c FROM PostComment c JOIN FETCH c.member WHERE c.post.id = :postId") + List findCommentsWithMemberByPostId(@Param("postId") Long postId); } diff --git a/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java b/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java index 424fa485..30270e55 100644 --- a/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java +++ b/back/src/main/java/com/back/domain/post/comment/service/PostCommentService.java @@ -39,21 +39,22 @@ public void createComment(Member member, Long postId, CommentCreateRequest comme } + @Transactional public List getAllPostCommentResponse(Long postId) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - - List listPostComment = post.getComments(); + validatePostExists(postId); + List listPostComment = postCommentRepository.findCommentsWithMemberByPostId(postId); return listPostComment.stream() .map(CommentAllResponse::from) .toList(); } + @Transactional public void removePostComment(Long postId, CommentDeleteRequest commentDeleteRequest, Member member) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + validatePostExists(postId); - PostComment postComment = postCommentRepository.findById(commentDeleteRequest.getCommentId()).orElseThrow(() -> new ServiceException("400", "해당 Id의 댓글이 없습니다.")); + PostComment postComment = getPostCommentById(commentDeleteRequest.getCommentId()); Member author = postComment.getMember(); @@ -67,9 +68,9 @@ public void removePostComment(Long postId, CommentDeleteRequest commentDeleteReq @Transactional public void updatePostComment(Long postId, CommentModifyRequest commentModifyRequest, Member member) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + validatePostExists(postId); - PostComment postComment = postCommentRepository.findById(commentModifyRequest.getCommentId()).orElseThrow(() -> new ServiceException("400", "해당 Id의 댓글이 없습니다.")); + PostComment postComment = getPostCommentById(commentModifyRequest.getCommentId()); Member author = postComment.getMember(); @@ -79,4 +80,19 @@ public void updatePostComment(Long postId, CommentModifyRequest commentModifyReq postComment.setContent(commentModifyRequest.getContent()); } + + + + private void validatePostExists(Long postId) { + if (!postRepository.existsById(postId)) { + throw new ServiceException("400", "해당 Id의 게시글이 없습니다."); + } + } + + private PostComment getPostCommentById(Long commentId) { + return postCommentRepository.findById(commentId).orElseThrow(() -> new ServiceException("400", "해당 Id의 댓글이 없습니다.")); + } + + + } diff --git a/back/src/main/java/com/back/domain/post/like/entity/PostLike.java b/back/src/main/java/com/back/domain/post/like/entity/PostLike.java new file mode 100644 index 00000000..08b0181d --- /dev/null +++ b/back/src/main/java/com/back/domain/post/like/entity/PostLike.java @@ -0,0 +1,66 @@ +package com.back.domain.post.like.entity; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.post.entity.Post; +import com.back.global.jpa.BaseEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "post_like", uniqueConstraints = { + @UniqueConstraint(columnNames = {"member_id", "post_id"}) +}) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PostLike extends BaseEntity { + + @ManyToOne(fetch = FetchType.LAZY) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + private Post post; + + @Enumerated(EnumType.STRING) + private LikeStatus status; + + public enum LikeStatus { + LIKE, DISLIKE + } + + @Builder(access = AccessLevel.PRIVATE) + private PostLike(Member member, Post post, LikeStatus status) { + this.member = member; + this.post = post; + this.status = status; + } + + public static PostLike create(Member member, Post post, LikeStatus status) { + if (member == null) { + throw new IllegalArgumentException("Member cannot be null"); + } + if (post == null) { + throw new IllegalArgumentException("Post cannot be null"); + } + if (status == null) { + throw new IllegalArgumentException("Status cannot be null"); + } + return PostLike.builder() + .member(member) + .post(post) + .status(status) + .build(); + } + + public void updateStatus(LikeStatus status) { + this.status = status; + } +} diff --git a/back/src/main/java/com/back/domain/post/like/repository/PostLikeRepository.java b/back/src/main/java/com/back/domain/post/like/repository/PostLikeRepository.java new file mode 100644 index 00000000..309560ac --- /dev/null +++ b/back/src/main/java/com/back/domain/post/like/repository/PostLikeRepository.java @@ -0,0 +1,25 @@ +package com.back.domain.post.like.repository; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.like.entity.PostLike; +import com.back.domain.post.post.entity.Post; +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 java.util.Optional; + +@Repository +public interface PostLikeRepository extends JpaRepository { + + Optional findByMemberAndPost(Member member, Post post); + + @Query("SELECT COUNT(pl) FROM PostLike pl WHERE pl.post.id = :postId AND pl.status = 'LIKE'") + int countLikesByPostId(@Param("postId") Long postId); + + @Query("SELECT COUNT(pl) FROM PostLike pl WHERE pl.post.id = :postId AND pl.status = 'DISLIKE'") + int countDislikesByPostId(@Param("postId") Long postId); + + boolean existsByMemberAndPost(Member member, Post post); +} \ No newline at end of file diff --git a/back/src/main/java/com/back/domain/post/like/service/PostLikeService.java b/back/src/main/java/com/back/domain/post/like/service/PostLikeService.java new file mode 100644 index 00000000..5c26bf41 --- /dev/null +++ b/back/src/main/java/com/back/domain/post/like/service/PostLikeService.java @@ -0,0 +1,80 @@ +package com.back.domain.post.like.service; + +import com.back.domain.member.member.entity.Member; +import com.back.domain.post.like.entity.PostLike; +import com.back.domain.post.like.repository.PostLikeRepository; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.service.PostService; +import com.back.global.rq.Rq; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; +@Service +@RequiredArgsConstructor +public class PostLikeService { + private final Rq rq; + private final PostLikeRepository postLikeRepository; + private final PostService postService; + + + @Transactional + public void likePost(long postId) { + Member member = rq.getActor(); + Post post = postService.findById(postId); + + // 기존 좋아요/싫어요 기록 조회 + Optional existingLike = postLikeRepository.findByMemberAndPost(member, post); + + if (existingLike.isPresent()) { + PostLike postLike = existingLike.get(); + + if (postLike.getStatus() == PostLike.LikeStatus.LIKE) { + // 이미 좋아요 상태 -> 좋아요 취소 + postLikeRepository.delete(postLike); + } else { + // 싫어요 상태 -> 좋아요로 변경 + postLike.updateStatus(PostLike.LikeStatus.LIKE); + } + } else { + // 처음 좋아요 + PostLike newLike = PostLike.create(member, post, PostLike.LikeStatus.LIKE); + postLikeRepository.save(newLike); + + } + } + + @Transactional + public void disLikePost(long postId) { + Member member = rq.getActor(); + Post post = postService.findById(postId); + + // 기존 좋아요/싫어요 기록 조회 + Optional existingLike = postLikeRepository.findByMemberAndPost(member, post); + + if (existingLike.isPresent()) { + PostLike postLike = existingLike.get(); + + if (postLike.getStatus() == PostLike.LikeStatus.DISLIKE) { + // 이미 싫어요 상태 -> 싫어요 취소 + postLikeRepository.delete(postLike); + } else { + // 좋아요 상태 -> 싫어요로 변경 + postLike.updateStatus(PostLike.LikeStatus.DISLIKE); + } + } else { + // 처음 싫어요 + PostLike newDislike = PostLike.create(member, post, PostLike.LikeStatus.DISLIKE); + postLikeRepository.save(newDislike); + } + } + + public int showDisLikeCount(Long postId) { + return postLikeRepository.countDislikesByPostId(postId); + } + + public int showLikeCount(Long postId) { + return postLikeRepository.countLikesByPostId(postId); + } +} diff --git a/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java b/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java index 47415bf9..74bbb12a 100644 --- a/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java +++ b/back/src/main/java/com/back/domain/post/post/controller/InformationPostController.java @@ -1,6 +1,7 @@ package com.back.domain.post.post.controller; import com.back.domain.member.member.entity.Member; +import com.back.domain.post.like.service.PostLikeService; import com.back.domain.post.post.dto.*; import com.back.domain.post.post.entity.Post; import com.back.domain.post.post.service.PostService; @@ -22,6 +23,7 @@ @RequestMapping("post/infor") @RequiredArgsConstructor public class InformationPostController { + private final PostLikeService postLikeService; private final PostService postService; private final Rq rq; @@ -90,27 +92,36 @@ public RsData updatePost(@PathVariable Long post_id return new RsData<>("200", "게시글 수정 성공", null); } - @Operation(summary = "게시글 좋아요 + ") + @Operation(summary = "게시글 좋아요") @PostMapping("/{post_id}/liked") public RsData likePost(@PathVariable Long post_id) { - postService.likePost(post_id); + postLikeService.likePost(post_id); return new RsData<>("200", "게시글 좋아요 성공", null); } @Operation(summary = "게시글 좋아요 (Show)") @GetMapping("/{post_id}/liked") - public RsData getlike(@PathVariable Long post_id) { - int likeCount = postService.showLikeCount(post_id); + public RsData getLike(@PathVariable Long post_id) { + int likeCount = postLikeService.showLikeCount(post_id); PostLikedResponse postLikedResponse = new PostLikedResponse(likeCount); return new RsData<>("200", "게시글 좋아요 조회 성공", postLikedResponse); } + @Operation(summary = "게시글 싫어요 (Show)") + @GetMapping("/{post_id}/Disliked") + public RsData getDisLike(@PathVariable Long post_id) { + int likeCount = postLikeService.showDisLikeCount(post_id); + PostLikedResponse postLikedResponse = new PostLikedResponse(likeCount); + + return new RsData<>("200", "게시글 싫어요 조회 성공", postLikedResponse); + } + @Operation(summary = "게시글 싫어요") @PostMapping("/{post_id}/disliked") public RsData disLikePost(@PathVariable Long post_id) { - postService.disLikePost(post_id); + postLikeService.disLikePost(post_id); return new RsData<>("200", "게시글 싫어요 성공", null); } diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java index ca25dcce..67f42276 100644 --- a/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostAllResponse.java @@ -12,7 +12,6 @@ public class PostAllResponse { private String authorName; private LocalDateTime createdAt; private int viewCount; - private int like; public PostAllResponse(Post post) { this.id = post.getId(); @@ -20,7 +19,6 @@ public PostAllResponse(Post post) { this.authorName = post.getAuthorName(); this.createdAt = post.getCreateDate(); this.viewCount = post.getViewCount(); - this.like = post.getLiked(); } } diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java index 95ac2847..037dbb57 100644 --- a/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostLikedResponse.java @@ -1,9 +1,12 @@ package com.back.domain.post.post.dto; +import lombok.Data; + +@Data public class PostLikedResponse { - int liked; + private int likeCount; - public PostLikedResponse(int liked) { - this.liked= liked; + public PostLikedResponse(int likeCount) { + this.likeCount = likeCount; } } diff --git a/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java b/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java index 6c079709..6183ad2e 100644 --- a/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java +++ b/back/src/main/java/com/back/domain/post/post/dto/PostSingleResponse.java @@ -12,7 +12,6 @@ public class PostSingleResponse { private String authorName; private LocalDateTime createdAt; private int viewCount; - private int like; public PostSingleResponse(Post post) { this.id = post.getId(); @@ -20,6 +19,5 @@ public PostSingleResponse(Post post) { this.authorName = post.getAuthorName(); this.createdAt = post.getCreateDate(); this.viewCount = post.getViewCount(); - this.like = post.getLiked(); } } diff --git a/back/src/main/java/com/back/domain/post/post/entity/Post.java b/back/src/main/java/com/back/domain/post/post/entity/Post.java index 8370f49f..a34bce7a 100644 --- a/back/src/main/java/com/back/domain/post/post/entity/Post.java +++ b/back/src/main/java/com/back/domain/post/post/entity/Post.java @@ -2,6 +2,7 @@ import com.back.domain.member.member.entity.Member; import com.back.domain.post.comment.entity.PostComment; +import com.back.global.exception.ServiceException; import com.back.global.jpa.BaseEntity; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; @@ -11,6 +12,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Entity @NoArgsConstructor @@ -21,8 +23,6 @@ public class Post extends BaseEntity { private String title; @NotNull private String content; - @NotNull - private String authorName; @ManyToOne(fetch = FetchType.LAZY) private Member member; @@ -41,8 +41,6 @@ public enum PostType { private int viewCount; - private int liked; - private Boolean isMento; private String carrer; @@ -59,4 +57,22 @@ public void removeComment(PostComment comment) { comments.remove(comment); comment.setPost(null); } + + + public Boolean isAuthor( Member member) { + return Objects.equals(this.member.getId(), member.getId()); + } + + public String getAuthorName() { + return member.getName(); + } + + + public static void validPostType(String postTypeStr) { + try { + Post.PostType.valueOf(postTypeStr); + } catch (IllegalArgumentException e) { + throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); + } + } } diff --git a/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java b/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java index cb6f9cfe..da7e8fda 100644 --- a/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java +++ b/back/src/main/java/com/back/domain/post/post/repository/PostRepository.java @@ -4,9 +4,13 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface PostRepository extends JpaRepository , PostRepositoryCustom{ - + @Query("SELECT p FROM Post p JOIN FETCH p.member") + List findAllWithMember(); } diff --git a/back/src/main/java/com/back/domain/post/post/repository/PostRepositoryImpl.java b/back/src/main/java/com/back/domain/post/post/repository/PostRepositoryImpl.java index 0ac4506c..77101a69 100644 --- a/back/src/main/java/com/back/domain/post/post/repository/PostRepositoryImpl.java +++ b/back/src/main/java/com/back/domain/post/post/repository/PostRepositoryImpl.java @@ -26,7 +26,7 @@ public Page searchPosts(String keyword, Pageable pageable) { if(keyword != null && !keyword.isBlank()) { builder.and( post.title.containsIgnoreCase(keyword) - .or(post.authorName.containsIgnoreCase(keyword)) + .or(post.member.name.containsIgnoreCase(keyword)) ); } diff --git a/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java b/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java deleted file mode 100644 index 7af57293..00000000 --- a/back/src/main/java/com/back/domain/post/post/rq/ApiResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.back.domain.post.post.rq; - -import lombok.Getter; - -@Getter -public class ApiResponse { - private String msg; - private T data; - - - public ApiResponse(String msg, T data) { - this.msg = msg; - this.data = data; - } -} diff --git a/back/src/main/java/com/back/domain/post/post/service/PostService.java b/back/src/main/java/com/back/domain/post/post/service/PostService.java index b924cd53..f89a27a9 100644 --- a/back/src/main/java/com/back/domain/post/post/service/PostService.java +++ b/back/src/main/java/com/back/domain/post/post/service/PostService.java @@ -1,14 +1,14 @@ package com.back.domain.post.post.service; import com.back.domain.member.member.entity.Member; -import com.back.domain.mentoring.mentoring.dto.MentoringDto; +import com.back.domain.post.like.repository.PostLikeRepository; import com.back.domain.post.post.dto.PostAllResponse; import com.back.domain.post.post.dto.PostCreateRequest; import com.back.domain.post.post.dto.PostDto; import com.back.domain.post.post.entity.Post; import com.back.domain.post.post.repository.PostRepository; -import com.back.domain.post.post.repository.PostRepositoryCustom; import com.back.global.exception.ServiceException; +import com.back.global.rq.Rq; import jakarta.transaction.Transactional; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -34,17 +34,12 @@ public List getAllPosts() { @Transactional public Post createPost(PostCreateRequest postCreateRequest, Member member) { String postTypeStr = postCreateRequest.getPostType(); - - validPostType(postTypeStr); - - - + Post.validPostType(postTypeStr); Post.PostType postType = Post.PostType.valueOf(postTypeStr); Post post = new Post(); post.setTitle(postCreateRequest.getTitle()); post.setContent(postCreateRequest.getContent()); - post.setAuthorName(member.getName()); post.setMember(member); post.setPostType(postType); @@ -53,69 +48,42 @@ public Post createPost(PostCreateRequest postCreateRequest, Member member) { return post; } - private void validPostType(String postTypeStr) { - try { - Post.PostType.valueOf(postTypeStr); - } catch (IllegalArgumentException e) { - throw new ServiceException("400-2", "유효하지 않은 PostType입니다."); - } - } - - - public Post findById(Long postId) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - return post; - } - - public List getAllPostResponse() { - return postRepository.findAll().stream() - .map(PostAllResponse::new) - .toList(); - } @Transactional public void removePost(Long postId, Member member) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - Long authorId = post.getMember().getId(); - if(authorId != member.getId()) throw new ServiceException("400", "삭제 권한이 없습니다."); + Post post = findById(postId); + if (!post.isAuthor(member)) throw new ServiceException("400", "삭제 권한이 없습니다."); postRepository.delete(post); } + @Transactional public void updatePost(long postId, Member member, @Valid PostCreateRequest postCreateRequest) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - Long authorId = post.getMember().getId(); - if(authorId != member.getId()) throw new ServiceException("400", "수정 권한이 없습니다."); + Post post = findById(postId); + if (!post.isAuthor(member)) throw new ServiceException("400", "수정 권한이 없습니다."); post.setTitle(postCreateRequest.getTitle()); post.setContent(postCreateRequest.getContent()); postRepository.save(post); } - @Transactional - public void likePost(long postId) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - post.setLiked(post.getLiked()+1); - } - @Transactional - public void disLikePost(long postId) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); - post.setLiked(post.getLiked()-1); - } - @Transactional() - public int showLikeCount(long postId) { - Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + public Page getPosts(String keyword, int page, int size) { + Pageable pageable = PageRequest.of(page, size); - int count = post.getLiked(); - return count; + return postRepository.searchPosts(keyword, pageable).map(PostDto::from); } + public Post findById(Long postId) { + Post post = postRepository.findById(postId).orElseThrow(() -> new ServiceException("400", "해당 Id의 게시글이 없습니다.")); + return post; + } - public Page getPosts(String keyword, int page, int size) { - Pageable pageable = PageRequest.of(page,size); - return postRepository.searchPosts(keyword, pageable).map(PostDto::from); + public List getAllPostResponse() { + return postRepository.findAllWithMember().stream() + .map(PostAllResponse::new) + .toList(); } } diff --git a/back/src/main/java/com/back/global/init/PostInitData.java b/back/src/main/java/com/back/global/init/PostInitData.java index 3aa680de..c94de8db 100644 --- a/back/src/main/java/com/back/global/init/PostInitData.java +++ b/back/src/main/java/com/back/global/init/PostInitData.java @@ -67,7 +67,6 @@ private void createPost(String title, String content, Member member, Post.PostTy Post post = new Post(); post.setTitle(title); post.setContent(content); - post.setAuthorName("테스트유저"); post.setPostType(type); post.setMember(member); diff --git a/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java b/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java index e4d82433..16f8ad14 100644 --- a/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java +++ b/back/src/test/java/com/back/domain/post/post/controller/InformationPostControllerTest.java @@ -2,6 +2,7 @@ import com.back.domain.member.member.entity.Member; import com.back.domain.member.member.service.MemberService; +import com.back.domain.post.like.service.PostLikeService; import com.back.domain.post.post.entity.Post; import com.back.domain.post.post.service.PostService; import com.back.global.security.SecurityUser; @@ -40,6 +41,9 @@ public class InformationPostControllerTest { @Autowired private MemberService memberService; + @Autowired + private PostLikeService postLikeService; + @Autowired private MockMvc mvc; @@ -418,4 +422,112 @@ void t11() throws Exception { .andExpect(jsonPath("$.msg").value("title-NotBlank-제목은 null 혹은 공백일 수 없습니다.")); } + @Test + @DisplayName("게시글 좋아요 성공") + void t12() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor/{post_id}/liked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("likePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 좋아요 성공")); + } + + @Test + @DisplayName("게시글 좋아요 조회") + void t13() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor/{post_id}/liked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getLike")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 좋아요 조회 성공")) + .andExpect(jsonPath("$.data.likeCount").exists()); + } + + @Test + @DisplayName("게시글 싫어요 성공") + void t14() throws Exception { + ResultActions resultActions = mvc + .perform( + post("/post/infor/{post_id}/disliked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("disLikePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 싫어요 성공")); + } + + @Test + @DisplayName("게시글 싫어요 조회") + void t15() throws Exception { + ResultActions resultActions = mvc + .perform( + get("/post/infor/{post_id}/Disliked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("getDisLike")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 싫어요 조회 성공")) + .andExpect(jsonPath("$.data.likeCount").exists()); + } + + @Test + @DisplayName("좋아요 -> 싫어요 토글 테스트") + void t16() throws Exception { + // 먼저 좋아요 + mvc.perform(post("/post/infor/{post_id}/liked", 1L)) + .andExpect(jsonPath("$.msg").value("게시글 좋아요 성공")); + + // 싫어요로 변경 + ResultActions resultActions = mvc + .perform( + post("/post/infor/{post_id}/disliked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("disLikePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 싫어요 성공")); + } + + @Test + @DisplayName("좋아요 중복 클릭 - 좋아요 취소") + void t17() throws Exception { + // 첫 번째 좋아요 + mvc.perform(post("/post/infor/{post_id}/liked", 1L)) + .andExpect(jsonPath("$.msg").value("게시글 좋아요 성공")); + + // 두 번째 좋아요 (취소) + ResultActions resultActions = mvc + .perform( + post("/post/infor/{post_id}/liked", 1L) + ) + .andDo(print()); + + resultActions + .andExpect(handler().handlerType(InformationPostController.class)) + .andExpect(handler().methodName("likePost")) + .andExpect(jsonPath("$.resultCode").value("200")) + .andExpect(jsonPath("$.msg").value("게시글 좋아요 성공")); + } + }