From d743a364070cdd627f041328118f4a28fab26c82 Mon Sep 17 00:00:00 2001 From: joonghyun Date: Mon, 18 Sep 2023 00:56:11 +0900 Subject: [PATCH] =?UTF-8?q?#3=20feat:=20=EC=A5=AC=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qna/answer/service/AnswerService.java | 2 +- .../comment/repository/CommentRepository.java | 4 ++ .../qna/comment/service/CommentService.java | 2 +- .../com/ewhatever/qna/common/Constant.java | 13 +++- .../qna/post/controller/PostController.java | 16 ++++- .../ewhatever/qna/post/dto/GetPostRes.java | 35 +++++++++++ .../ewhatever/qna/post/dto/PostResponse.java | 4 -- .../qna/post/service/PostService.java | 63 ++++++++++++++++++- .../qna/question/service/QuestionService.java | 2 +- .../qna/scrap/repository/ScrapRepository.java | 3 + 10 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/ewhatever/qna/post/dto/GetPostRes.java delete mode 100644 src/main/java/com/ewhatever/qna/post/dto/PostResponse.java diff --git a/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java b/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java index a7b8b4b..6d0e633 100644 --- a/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java +++ b/src/main/java/com/ewhatever/qna/answer/service/AnswerService.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; import static com.ewhatever.qna.common.Base.BaseResponseStatus.*; -import static com.ewhatever.qna.common.Constant.ACTIVE; +import static com.ewhatever.qna.common.Constant.Status.ACTIVE; @Service public class AnswerService { diff --git a/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java b/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java index 3a59a7d..c35cf7b 100644 --- a/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java +++ b/src/main/java/com/ewhatever/qna/comment/repository/CommentRepository.java @@ -1,11 +1,15 @@ package com.ewhatever.qna.comment.repository; import com.ewhatever.qna.comment.entity.Comment; +import com.ewhatever.qna.post.entity.Post; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface CommentRepository extends JpaRepository { Long countByWriter_UserIdxAndStatusEquals(Long userIdx, String status); Page findByWriter_UserIdxAndStatusEquals(Long userIdx, String status, Pageable pageable); + List findAllByPost(Post post); } diff --git a/src/main/java/com/ewhatever/qna/comment/service/CommentService.java b/src/main/java/com/ewhatever/qna/comment/service/CommentService.java index 72523b7..ecb2a4f 100644 --- a/src/main/java/com/ewhatever/qna/comment/service/CommentService.java +++ b/src/main/java/com/ewhatever/qna/comment/service/CommentService.java @@ -11,7 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import static com.ewhatever.qna.common.Base.BaseResponseStatus.*; -import static com.ewhatever.qna.common.Constant.INACTIVE; +import static com.ewhatever.qna.common.Constant.Status.INACTIVE; @Service @RequiredArgsConstructor diff --git a/src/main/java/com/ewhatever/qna/common/Constant.java b/src/main/java/com/ewhatever/qna/common/Constant.java index 58c9a9f..88b82da 100644 --- a/src/main/java/com/ewhatever/qna/common/Constant.java +++ b/src/main/java/com/ewhatever/qna/common/Constant.java @@ -1,7 +1,14 @@ package com.ewhatever.qna.common; public class Constant { - public static final String ACTIVE = "active"; - public static final String INACTIVE = "inactive"; - public static final String LOGOUT = "logout"; + public static class Status { + public static final String ACTIVE = "active"; + public static final String INACTIVE = "inactive"; + public static final String LOGOUT = "logout"; + } + + public static class Role { + public static final String SENIOR = "senior"; + public static final String JUNIOR = "junior"; + } } \ No newline at end of file diff --git a/src/main/java/com/ewhatever/qna/post/controller/PostController.java b/src/main/java/com/ewhatever/qna/post/controller/PostController.java index 11e3948..12c82e7 100644 --- a/src/main/java/com/ewhatever/qna/post/controller/PostController.java +++ b/src/main/java/com/ewhatever/qna/post/controller/PostController.java @@ -2,6 +2,7 @@ import com.ewhatever.qna.common.Base.BaseException; import com.ewhatever.qna.common.Base.BaseResponse; +import com.ewhatever.qna.post.dto.GetPostRes; import com.ewhatever.qna.post.dto.GetPostsRes; import com.ewhatever.qna.post.service.PostService; import lombok.RequiredArgsConstructor; @@ -17,7 +18,7 @@ public class PostController { private final PostService postService; /** - * [GET] 주씨글 목록 조회 + * [GET] 쥬시글 목록 조회 */ @ResponseBody @GetMapping("") @@ -31,4 +32,17 @@ public BaseResponse> getPosts(@PageableDefault(size = 10) Page return new BaseResponse<>(e.getStatus()); } } + + /** + * [GET] 쥬시글 상세 조회 + */ + @ResponseBody + @GetMapping("/{postIdx}") + public BaseResponse getPost(@PathVariable Long postIdx, Long userIdx) { // TODO: 추후 getUserIdx로 수정 + try { + return new BaseResponse<>(postService.getPost(postIdx, userIdx)); + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/ewhatever/qna/post/dto/GetPostRes.java b/src/main/java/com/ewhatever/qna/post/dto/GetPostRes.java new file mode 100644 index 0000000..d1c56fd --- /dev/null +++ b/src/main/java/com/ewhatever/qna/post/dto/GetPostRes.java @@ -0,0 +1,35 @@ +package com.ewhatever.qna.post.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GetPostRes { + private String category; + private List cardList; // 질문 제목, 질문 상세, 답변(0-3개) + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd", timezone = "Asia/Seoul") + private LocalDateTime date; + private Long commentCount; + private Long scrapCount; + private Boolean isScrap; + private List commentList; + + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class CommentDto { + private String writer; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy.MM.dd HH:mm", timezone = "Asia/Seoul") + private LocalDateTime date; + private String content; + private Boolean isWriter; + } +} diff --git a/src/main/java/com/ewhatever/qna/post/dto/PostResponse.java b/src/main/java/com/ewhatever/qna/post/dto/PostResponse.java deleted file mode 100644 index 253bbf3..0000000 --- a/src/main/java/com/ewhatever/qna/post/dto/PostResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.ewhatever.qna.post.dto; - -public class PostResponse { -} diff --git a/src/main/java/com/ewhatever/qna/post/service/PostService.java b/src/main/java/com/ewhatever/qna/post/service/PostService.java index 5639345..ba58aa8 100644 --- a/src/main/java/com/ewhatever/qna/post/service/PostService.java +++ b/src/main/java/com/ewhatever/qna/post/service/PostService.java @@ -2,11 +2,18 @@ import com.ewhatever.qna.answer.entity.Answer; import com.ewhatever.qna.answer.repository.AnswerRepository; +import com.ewhatever.qna.comment.entity.Comment; +import com.ewhatever.qna.comment.repository.CommentRepository; import com.ewhatever.qna.common.Base.BaseException; import com.ewhatever.qna.common.enums.Category; +import com.ewhatever.qna.common.enums.Role; +import com.ewhatever.qna.post.dto.GetPostRes; import com.ewhatever.qna.post.dto.GetPostsRes; import com.ewhatever.qna.post.entity.Post; import com.ewhatever.qna.post.repository.PostRepository; +import com.ewhatever.qna.scrap.repository.ScrapRepository; +import com.ewhatever.qna.user.entity.User; +import com.ewhatever.qna.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -16,15 +23,20 @@ import java.util.List; import static com.ewhatever.qna.common.Base.BaseResponseStatus.*; +import static com.ewhatever.qna.common.Constant.Role.SENIOR; +import static com.ewhatever.qna.common.Constant.Status.ACTIVE; @Service @RequiredArgsConstructor public class PostService { private final PostRepository postRepository; private final AnswerRepository answerRepository; + private final UserRepository userRepository; + private final ScrapRepository scrapRepository; + private final CommentRepository commentRepository; /** - * 주씨글 전체 목록 조회 + * 쥬시글 전체 목록 조회 */ public Page getPosts(Pageable page) throws BaseException { try { @@ -54,7 +66,7 @@ private List getCardList(Post post) { } /** - * 주씨글 카테고리 기반 목록 조회 + * 쥬시글 카테고리 기반 목록 조회 */ public Page getPostsByCategory(String category, Pageable page) throws BaseException { try { @@ -78,4 +90,51 @@ public Page getPostsByCategory(String category, Pageable page) thro throw new BaseException(DATABASE_ERROR); } } + + /** + * 쥬시글 상세 조회 + */ + public GetPostRes getPost(Long postIdx, Long userIdx) throws BaseException { + try { + Post post = postRepository.findById(postIdx).orElseThrow(() -> new BaseException(INVALID_POST_IDX)); + User user = userRepository.findByUserIdxAndStatusEquals(userIdx, ACTIVE); + return new GetPostRes(post.getCategory().toString(), getCardList(post), post.getLastModifiedDate(), + post.getCommentCount(), post.getScrapCount(), isScrap(user, post), getCommentList(post, user)); + + } catch (BaseException e) { + throw e; + } catch (Exception e) { + throw new BaseException(DATABASE_ERROR); + } + } + + // 스크랩 여부 + private Boolean isScrap(User user, Post post) { + return scrapRepository.existsByPostAndUserAndStatusEquals(post, user, ACTIVE); + } + + // 댓글 list 조회 + private List getCommentList(Post post, User user) { + List commentList = new ArrayList<>(); + List comments = commentRepository.findAllByPost(post); + + for (Comment comment : comments) { + GetPostRes.CommentDto commentDto = new GetPostRes.CommentDto(getWriter(comment.getWriter().getRole()), comment.getCreatedDate(), + comment.getContent(), isWriter(user, comment)); + commentList.add(commentDto); + } + return commentList; + } + + // 댓글 작성자 여부 + private Boolean isWriter(User user, Comment comment) { + if (comment.getWriter().equals(user)) return true; + else return false; + } + + // 댓글 작성자 + private String getWriter(Role role) { + if (role.equals(SENIOR)) return "익명의 시니"; + else return "익명의 쥬니"; + } } diff --git a/src/main/java/com/ewhatever/qna/question/service/QuestionService.java b/src/main/java/com/ewhatever/qna/question/service/QuestionService.java index 46444b4..8bf1544 100644 --- a/src/main/java/com/ewhatever/qna/question/service/QuestionService.java +++ b/src/main/java/com/ewhatever/qna/question/service/QuestionService.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; import static com.ewhatever.qna.common.Base.BaseResponseStatus.*; -import static com.ewhatever.qna.common.Constant.ACTIVE; +import static com.ewhatever.qna.common.Constant.Status.ACTIVE; import static com.ewhatever.qna.common.enums.Role.SINY; @Service diff --git a/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java index 35bfef8..44aef0e 100644 --- a/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java +++ b/src/main/java/com/ewhatever/qna/scrap/repository/ScrapRepository.java @@ -1,6 +1,8 @@ package com.ewhatever.qna.scrap.repository; +import com.ewhatever.qna.post.entity.Post; import com.ewhatever.qna.scrap.entity.Scrap; +import com.ewhatever.qna.user.entity.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,4 +10,5 @@ public interface ScrapRepository extends JpaRepository { Long countByUser_UserIdxAndStatusEquals(Long userIdx, String status); Page findByUser_UserIdxAndStatusEquals(Long userIdx, String status, Pageable pageable); + Boolean existsByPostAndUserAndStatusEquals(Post post, User user, String status); }