From ee3c3154a85507594f187ff03502cba2a7385aa0 Mon Sep 17 00:00:00 2001 From: jjunjji Date: Thu, 10 Aug 2023 20:01:22 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/controller/PostController.java | 6 ++ .../backend/community/domain/Comment.java | 37 ++++++++++++ .../backend/community/dto/CommentResDto.java | 33 +++++++++++ .../backend/community/dto/PostResDto.java | 30 ++++++++++ .../repository/CommentRepository.java | 11 ++++ .../community/service/PostService.java | 57 ++++++++++++++++--- 6 files changed, 165 insertions(+), 9 deletions(-) create mode 100644 src/main/java/porori/backend/community/domain/Comment.java create mode 100644 src/main/java/porori/backend/community/dto/CommentResDto.java create mode 100644 src/main/java/porori/backend/community/repository/CommentRepository.java diff --git a/src/main/java/porori/backend/community/controller/PostController.java b/src/main/java/porori/backend/community/controller/PostController.java index 30a6bed..7ca5be9 100644 --- a/src/main/java/porori/backend/community/controller/PostController.java +++ b/src/main/java/porori/backend/community/controller/PostController.java @@ -45,4 +45,10 @@ public BaseResponse> getPostsOnSwipe(@RequestHeade return new BaseResponse<>(postService.getPostsOnSwipe(token, postIdList.getPostIdList())); } + @Operation(summary = "게시글 상세 보기", description = "postId로 게시글을 조회합니다. (댓글 조회 주후 추가될 예정)") + @PostMapping("/post/{postId}") + public BaseResponse getPostDetail(@RequestHeader("Authorization") String token, @PathVariable Long postId){ + return new BaseResponse<>(postService.getPostDetail(token, postId)); + } + } diff --git a/src/main/java/porori/backend/community/domain/Comment.java b/src/main/java/porori/backend/community/domain/Comment.java new file mode 100644 index 0000000..643d7e8 --- /dev/null +++ b/src/main/java/porori/backend/community/domain/Comment.java @@ -0,0 +1,37 @@ +package porori.backend.community.domain; + +import lombok.*; +import org.hibernate.annotations.DynamicInsert; +import porori.backend.community.domain.core.BaseTimeEntity; + +import javax.persistence.*; + +@Entity +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "comment") +@DynamicInsert +public class Comment extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "comment_id") + private Long commentId; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "post_id") + private Post postId; + + @Column(nullable = false, name = "user_id") + private Long userId; + + @Column(nullable = false, columnDefinition = "TEXT") + private String content; + + @Builder + public Comment(Post postId, Long userId, String content) { + this.postId = postId; + this.userId = userId; + this.content = content; + } +} diff --git a/src/main/java/porori/backend/community/dto/CommentResDto.java b/src/main/java/porori/backend/community/dto/CommentResDto.java new file mode 100644 index 0000000..7eeefad --- /dev/null +++ b/src/main/java/porori/backend/community/dto/CommentResDto.java @@ -0,0 +1,33 @@ +package porori.backend.community.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import porori.backend.community.domain.Comment; + +import java.time.LocalDateTime; + +@NoArgsConstructor +public class CommentResDto { + + @Getter + @AllArgsConstructor + @NoArgsConstructor + public static class CommentDetailRes{ + private String content; + private LocalDateTime createdAt; + private String nickname; + private String image; + private String backgroundColor; + + @Builder + public CommentDetailRes(Comment comment, UserResDto.CommunityUserInfo userInfo){ + this.content = comment.getContent(); + this.createdAt = comment.getCreatedAt(); + this.nickname = userInfo.getNickname(); + this.image = userInfo.getImage(); + this.backgroundColor = userInfo.getBackgroundColor(); + } + } +} diff --git a/src/main/java/porori/backend/community/dto/PostResDto.java b/src/main/java/porori/backend/community/dto/PostResDto.java index ea6dc43..6140077 100644 --- a/src/main/java/porori/backend/community/dto/PostResDto.java +++ b/src/main/java/porori/backend/community/dto/PostResDto.java @@ -76,4 +76,34 @@ public PostSwipeRes(Post post, CommunityUserInfo user) { } } + @Getter + public static class PostDetailRes { + private String title; + private String content; + private Double latitude; + private Double longitude; + private List tagList; + private List imageList; + private LocalDateTime createdAt; + private String nickName; + private String imageUrl; + private String backgroundColor; + private List commentList; + + @Builder + public PostDetailRes(Post post, CommunityUserInfo user, List commentList) { + this.title = post.getTitle(); + this.content = post.getContent(); + this.latitude = post.getLatitude(); + this.longitude = post.getLongitude(); + this.tagList = post.getTagList().stream().map((postTag) -> postTag.getTagId().getName()).collect(Collectors.toList()); + this.imageList = post.getImageList().stream().map(PostAttach::getImageName).collect(Collectors.toList()); + this.createdAt = post.getCreatedAt(); + this.nickName = user.getNickname(); + this.imageUrl = user.getImage(); + this.backgroundColor = user.getBackgroundColor(); + this.commentList = commentList; + } + } + } diff --git a/src/main/java/porori/backend/community/repository/CommentRepository.java b/src/main/java/porori/backend/community/repository/CommentRepository.java new file mode 100644 index 0000000..cc22c1c --- /dev/null +++ b/src/main/java/porori/backend/community/repository/CommentRepository.java @@ -0,0 +1,11 @@ +package porori.backend.community.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import porori.backend.community.domain.Comment; +import porori.backend.community.domain.Post; + +import java.util.List; + +public interface CommentRepository extends JpaRepository { + List findAllByPostIdOrderByCreatedAt(Post post); +} diff --git a/src/main/java/porori/backend/community/service/PostService.java b/src/main/java/porori/backend/community/service/PostService.java index 44496bb..ef34156 100644 --- a/src/main/java/porori/backend/community/service/PostService.java +++ b/src/main/java/porori/backend/community/service/PostService.java @@ -3,10 +3,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import porori.backend.community.domain.Post; -import porori.backend.community.domain.PostAttach; -import porori.backend.community.domain.PostTag; -import porori.backend.community.domain.Tag; +import porori.backend.community.domain.*; +import porori.backend.community.dto.CommentResDto; import porori.backend.community.dto.PostReqDto; import porori.backend.community.dto.PostResDto; import porori.backend.community.dto.UserReqDto; @@ -30,6 +28,7 @@ @Transactional public class PostService { private final PostRepository postRepository; + private final CommentRepository commentRepository; private final PostAttachService postAttachService; private final TagService tagService; @@ -76,13 +75,15 @@ public List getPostsOnMap(String token, PostReqDto.Curr LocalDateTime yesterday = LocalDateTime.now().minusDays(1); //주변 게시글 목록 가져오기 - List nearByPosts = postRepository.findNearByPosts(currentLocation.getLatitude(), currentLocation.getLongitude(), yesterday); + List nearByPosts = postRepository.findNearByPosts(currentLocation.getLatitude(), + currentLocation.getLongitude(), yesterday); //주변 게시글 목록에서 userId 추출 List userIdList = nearByPosts.stream().map(Post::getUserId).collect(Collectors.toList()); //userId로 communityUser 정보 가져오기 - List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); + List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, + UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); HashMap communityUserInfoHashMap = new HashMap<>(); userInfoBlocks.forEach(communityUserInfo -> { @@ -109,15 +110,19 @@ public List getPostsOnSwipe(String token, List po //postId로 게시글 목록 가져오기 List postsOnSwipe = new ArrayList<>(); - postIdList.forEach(postId->{ - postsOnSwipe.add(postRepository.findByPostIdAndStatusWithImageList(postId).orElseThrow(NotFoundPostIdException::new)); + postIdList.forEach(postId -> { + postsOnSwipe.add + (postRepository.findByPostIdAndStatusWithImageList(postId) + .orElseThrow(NotFoundPostIdException::new) + ); }); //게시글 목록에서 userId 추출 List userIdList = postsOnSwipe.stream().map(Post::getUserId).collect(Collectors.toList()); //userId로 communityUser 정보 가져오기 - List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); + List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, + UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); HashMap communityUserInfoHashMap = new HashMap<>(); userInfoBlocks.forEach(communityUserInfo -> { @@ -132,4 +137,38 @@ public List getPostsOnSwipe(String token, List po .collect(Collectors.toList()); } + //게시글 상세보기 + public PostResDto.PostDetailRes getPostDetail(String token, Long postId) { + Post post = postRepository.findByPostIdAndStatus(postId, "ACTIVE") + .orElseThrow(NotFoundPostIdException::new); + + List userInfoBlock = userService.sendCommunitiesInfoRequest(token, + UserReqDto.UserIdListReq.builder().userIdList(Collections.singletonList(post.getUserId())).build()); + + List commentList = commentRepository.findAllByPostIdOrderByCreatedAt(post); + + List userIdList = commentList.stream().map(Comment::getUserId).collect(Collectors.toList()); + + List commentUserInfoBlocks = userService.sendCommunitiesInfoRequest(token, + UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); + + HashMap commentUserInfoHashMap = new HashMap<>(); + commentUserInfoBlocks.forEach(communityUserInfo -> { + commentUserInfoHashMap.put(communityUserInfo.getUserId(), communityUserInfo); + }); + + List commentDetailList = commentList.stream().map(comment -> + CommentResDto.CommentDetailRes.builder() + .comment(comment) + .userInfo(commentUserInfoHashMap.get(comment.getUserId())) + .build()) + .collect(Collectors.toList()); + + return PostResDto.PostDetailRes.builder() + .post(post) + .user(userInfoBlock.get(0)) + .commentList(commentDetailList) + .build(); + } + } From 7986bb8fc4974054aeaa08f1cfae79a1100454e3 Mon Sep 17 00:00:00 2001 From: jiyoon <95969941+jjunjji@users.noreply.github.com> Date: Tue, 5 Sep 2023 18:45:41 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20User=20=EC=84=9C=EB=B2=84=20request?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/service/UserService.java | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/src/main/java/porori/backend/community/service/UserService.java b/src/main/java/porori/backend/community/service/UserService.java index b0d136a..d8a76cf 100644 --- a/src/main/java/porori/backend/community/service/UserService.java +++ b/src/main/java/porori/backend/community/service/UserService.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import porori.backend.community.config.BaseResponse; @@ -11,10 +12,11 @@ import porori.backend.community.dto.UserReqDto.UserIdListReq; import porori.backend.community.dto.UserResDto.UserInfo; import porori.backend.community.dto.UserResDto.CommunityUserInfo; -import porori.backend.community.dto.UserReqDto.AccessTokenReq; +import reactor.core.publisher.Mono; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Slf4j @Service @@ -24,30 +26,19 @@ public class UserService { private static final String LOG_FORMAT = "Method : {}"; public Long getUserId(String token) { - String[] splitToken = token.split(" "); - - AccessTokenReq accessTokenReq = AccessTokenReq.builder() - .accessToken(splitToken[1]) - .build(); - - return sendTokenMeRequest(token, accessTokenReq).getUserId(); + return sendTokenMeRequest(token).getUserId(); } - private UserInfo sendTokenMeRequest(String token, AccessTokenReq accessTokenReq) { - return webClient.post() + private UserInfo sendTokenMeRequest(String token) { + return webClient.get() .uri("/token/me") .header("Authorization", token) - .bodyValue(accessTokenReq) .retrieve() + .onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new TokenException())) + .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new UserBadGateWayException())) .bodyToMono((new ParameterizedTypeReference>() { })) - .map(response->{ - if (response.getStatusCode() == 200) { - return response.getData(); - } else { - throw new UserBadGateWayException(); - } - }) + .map(BaseResponse::getData) .block(); } @@ -67,21 +58,20 @@ public void sendTestJwtRequest(String token) { } public List sendCommunitiesInfoRequest(String token, UserIdListReq userIdList) { - return webClient.post() - .uri("/communities/info") + String param = userIdList.getUserIdList().stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + log.warn(LOG_FORMAT, param); + + return webClient.get() + .uri(uriBuilder -> uriBuilder.path("/communities/info").queryParam("userIdList", param).build()) .header("Authorization", token) - .bodyValue(userIdList) .retrieve() + .onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new TokenException())) + .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new UserBadGateWayException())) .bodyToMono((new ParameterizedTypeReference>>>() { })) - .map(response->{ - if (response.getStatusCode() == 200) { - log.warn("communityUserInfoBlocks : {}", "완"); - return response.getData().get("communityUserInfoBlocks"); - } else { - throw new UserBadGateWayException(); - } - }) + .map(response->response.getData().get("communityUserInfoBlocks")) .block(); } From 52b0f7ee1ab6a374afd1b0517424eebb20596f30 Mon Sep 17 00:00:00 2001 From: jiyoon <95969941+jjunjji@users.noreply.github.com> Date: Tue, 5 Sep 2023 19:15:34 +0900 Subject: [PATCH 3/5] =?UTF-8?q?update,=20feat:=20UserReqDto=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C,=20dto=20import=20=EA=B2=BD=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=EA=B2=8C=EC=8B=9C=EA=B8=80=EC=97=90=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=9E=91=EC=84=B1=20&=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EA=B8=80=EC=97=90=20=EB=8C=93=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BookmarkController.java | 4 +- .../controller/CommentController.java | 34 ++++++++ .../community/controller/PostController.java | 4 +- .../backend/community/dto/CommentReqDto.java | 12 +++ .../backend/community/dto/PostResDto.java | 5 +- .../backend/community/dto/UserReqDto.java | 23 ----- .../community/service/BookmarkService.java | 6 +- .../community/service/CommentService.java | 58 +++++++++++++ .../community/service/PostService.java | 83 ++++++------------- .../community/service/UserService.java | 29 ++++--- 10 files changed, 151 insertions(+), 107 deletions(-) create mode 100644 src/main/java/porori/backend/community/controller/CommentController.java create mode 100644 src/main/java/porori/backend/community/dto/CommentReqDto.java delete mode 100644 src/main/java/porori/backend/community/dto/UserReqDto.java create mode 100644 src/main/java/porori/backend/community/service/CommentService.java diff --git a/src/main/java/porori/backend/community/controller/BookmarkController.java b/src/main/java/porori/backend/community/controller/BookmarkController.java index 37b52f6..557b234 100644 --- a/src/main/java/porori/backend/community/controller/BookmarkController.java +++ b/src/main/java/porori/backend/community/controller/BookmarkController.java @@ -5,7 +5,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import porori.backend.community.config.BaseResponse; -import porori.backend.community.dto.PostResDto; +import porori.backend.community.dto.PostResDto.*; import porori.backend.community.service.BookmarkService; @RequiredArgsConstructor @@ -18,7 +18,7 @@ public class BookmarkController { //북마크 생성하기 @Operation(summary = "북마크 생성", description = "해당 postId에 북마크를 생성합니다.") @PostMapping("/bookmark/{postId}") - public BaseResponse createBookmark(@RequestHeader("Authorization") String token, @PathVariable("postId") Long postId){ + public BaseResponse createBookmark(@RequestHeader("Authorization") String token, @PathVariable("postId") Long postId){ return new BaseResponse<>(bookmarkService.createBookmark(token, postId)); } } diff --git a/src/main/java/porori/backend/community/controller/CommentController.java b/src/main/java/porori/backend/community/controller/CommentController.java new file mode 100644 index 0000000..0e0e5cb --- /dev/null +++ b/src/main/java/porori/backend/community/controller/CommentController.java @@ -0,0 +1,34 @@ +package porori.backend.community.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import porori.backend.community.config.BaseResponse; +import porori.backend.community.dto.CommentReqDto.*; +import porori.backend.community.dto.CommentResDto.*; +import porori.backend.community.service.CommentService; + +import java.util.List; + +@RequiredArgsConstructor +@RequestMapping("/api/communities") +@RestController +@Tag(name = "Comment API", description = "댓글 API") +public class CommentController { + private final CommentService commentService; + + @Operation(summary = "게시글에 댓글 작성", description = "postId로 게시글의 댓글을 작성합니다.") + @PostMapping("/comments/{postId}") + public BaseResponse createComments(@RequestHeader("Authorization") String token, @PathVariable Long postId, + @RequestBody CommentContentReq comment){ + commentService.createComment(token, postId, comment.getContent()); + return new BaseResponse<>("postId가 "+postId+"인 게시글에 댓글이 작성되었습니다."); + } + + @Operation(summary = "게시글의 댓글 조회", description = "postId로 게시글의 댓글을 조회합니다.") + @GetMapping("/comments/{postId}") + public BaseResponse> getComments(@RequestHeader("Authorization") String token, @PathVariable Long postId){ + return new BaseResponse<>(commentService.getComments(token, postId)); + } +} diff --git a/src/main/java/porori/backend/community/controller/PostController.java b/src/main/java/porori/backend/community/controller/PostController.java index 7ca5be9..49d6b41 100644 --- a/src/main/java/porori/backend/community/controller/PostController.java +++ b/src/main/java/porori/backend/community/controller/PostController.java @@ -45,8 +45,8 @@ public BaseResponse> getPostsOnSwipe(@RequestHeade return new BaseResponse<>(postService.getPostsOnSwipe(token, postIdList.getPostIdList())); } - @Operation(summary = "게시글 상세 보기", description = "postId로 게시글을 조회합니다. (댓글 조회 주후 추가될 예정)") - @PostMapping("/post/{postId}") + @Operation(summary = "게시글 상세 보기", description = "postId로 게시글을 조회합니다.") + @GetMapping("/post/{postId}") public BaseResponse getPostDetail(@RequestHeader("Authorization") String token, @PathVariable Long postId){ return new BaseResponse<>(postService.getPostDetail(token, postId)); } diff --git a/src/main/java/porori/backend/community/dto/CommentReqDto.java b/src/main/java/porori/backend/community/dto/CommentReqDto.java new file mode 100644 index 0000000..e475da9 --- /dev/null +++ b/src/main/java/porori/backend/community/dto/CommentReqDto.java @@ -0,0 +1,12 @@ +package porori.backend.community.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +public class CommentReqDto { + @Getter + public static class CommentContentReq{ + String content; + } +} diff --git a/src/main/java/porori/backend/community/dto/PostResDto.java b/src/main/java/porori/backend/community/dto/PostResDto.java index 6140077..826deb2 100644 --- a/src/main/java/porori/backend/community/dto/PostResDto.java +++ b/src/main/java/porori/backend/community/dto/PostResDto.java @@ -88,10 +88,10 @@ public static class PostDetailRes { private String nickName; private String imageUrl; private String backgroundColor; - private List commentList; + @Builder - public PostDetailRes(Post post, CommunityUserInfo user, List commentList) { + public PostDetailRes(Post post, CommunityUserInfo user) { this.title = post.getTitle(); this.content = post.getContent(); this.latitude = post.getLatitude(); @@ -102,7 +102,6 @@ public PostDetailRes(Post post, CommunityUserInfo user, List userIdList; - } -} diff --git a/src/main/java/porori/backend/community/service/BookmarkService.java b/src/main/java/porori/backend/community/service/BookmarkService.java index e9b229e..88665da 100644 --- a/src/main/java/porori/backend/community/service/BookmarkService.java +++ b/src/main/java/porori/backend/community/service/BookmarkService.java @@ -8,7 +8,7 @@ import porori.backend.community.config.exception.post.NotFoundPostIdException; import porori.backend.community.domain.Bookmark; import porori.backend.community.domain.Post; -import porori.backend.community.dto.PostResDto; +import porori.backend.community.dto.PostResDto.*; import porori.backend.community.repository.BookmarkRepository; import porori.backend.community.repository.PostRepository; @@ -26,7 +26,7 @@ public class BookmarkService { private final UserService userService; - public PostResDto.PostContentRes createBookmark(String token, Long postId){ + public PostContentRes createBookmark(String token, Long postId){ //토큰 유효 확인 userService.sendTestJwtRequest(token); @@ -48,7 +48,7 @@ public PostResDto.PostContentRes createBookmark(String token, Long postId){ .postId(post) .build()); - return new PostResDto.PostContentRes(post); + return new PostContentRes(post); } } diff --git a/src/main/java/porori/backend/community/service/CommentService.java b/src/main/java/porori/backend/community/service/CommentService.java new file mode 100644 index 0000000..302539d --- /dev/null +++ b/src/main/java/porori/backend/community/service/CommentService.java @@ -0,0 +1,58 @@ +package porori.backend.community.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import porori.backend.community.config.exception.post.NotFoundPostIdException; +import porori.backend.community.domain.Comment; +import porori.backend.community.domain.Post; +import porori.backend.community.dto.CommentResDto; +import porori.backend.community.dto.CommentResDto.*; +import porori.backend.community.dto.UserResDto; +import porori.backend.community.repository.CommentRepository; +import porori.backend.community.repository.PostRepository; + +import javax.transaction.Transactional; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Transactional +public class CommentService { + private final PostRepository postRepository; + private final CommentRepository commentRepository; + + private final UserService userService; + + //게시글에 댓글 달기 + public void createComment(String token, Long postId, String content) { + Long userId = userService.getUserId(token); + + Post post = postRepository.findByPostIdAndStatus(postId, "ACTIVE").orElseThrow(NotFoundPostIdException::new); + + Comment comment = Comment.builder().userId(userId).postId(post).content(content).build(); + + commentRepository.save(comment); + } + + //게시글 댓글 조회 (분리) + public List getComments(String token, Long postId) { + Post post = postRepository.findByPostIdAndStatus(postId, "ACTIVE").orElseThrow(NotFoundPostIdException::new); + + List commentList = commentRepository.findAllByPostIdOrderByCreatedAt(post); + List userIdList = commentList.stream().map(Comment::getUserId).collect(Collectors.toList()); + + List commentUserInfoBlocks = userService.sendCommunitiesInfoRequest(token, userIdList); + + HashMap commentUserInfoHashMap = new HashMap<>(); + commentUserInfoBlocks.forEach(communityUserInfo -> { + commentUserInfoHashMap.put(communityUserInfo.getUserId(), communityUserInfo); + }); + + return commentList.stream().map(comment -> CommentResDto.CommentDetailRes.builder() + .comment(comment) + .userInfo(commentUserInfoHashMap.get(comment.getUserId())).build()).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/porori/backend/community/service/PostService.java b/src/main/java/porori/backend/community/service/PostService.java index ef34156..73a568e 100644 --- a/src/main/java/porori/backend/community/service/PostService.java +++ b/src/main/java/porori/backend/community/service/PostService.java @@ -4,11 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import porori.backend.community.domain.*; -import porori.backend.community.dto.CommentResDto; -import porori.backend.community.dto.PostReqDto; -import porori.backend.community.dto.PostResDto; -import porori.backend.community.dto.UserReqDto; -import porori.backend.community.dto.UserResDto.CommunityUserInfo; +import porori.backend.community.dto.PostReqDto.*; +import porori.backend.community.dto.PostResDto.*; +import porori.backend.community.dto.UserResDto.*; import porori.backend.community.repository.*; import porori.backend.community.config.exception.post.NotFoundPostIdException; @@ -28,7 +26,6 @@ @Transactional public class PostService { private final PostRepository postRepository; - private final CommentRepository commentRepository; private final PostAttachService postAttachService; private final TagService tagService; @@ -36,7 +33,7 @@ public class PostService { private final UserService userService; - public PostResDto.PostContentRes createPost(String token, PostReqDto.PostContentReq postContent) { + public PostContentRes createPost(String token, PostContentReq postContent) { //토큰 유효 확인 userService.sendTestJwtRequest(token); @@ -65,38 +62,36 @@ public PostResDto.PostContentRes createPost(String token, PostReqDto.PostContent //Post 저장 Post post = postRepository.save(postEntity); - return new PostResDto.PostContentRes(post); + return new PostContentRes(post); } //게시글 지도에서 보기 - public List getPostsOnMap(String token, PostReqDto.CurrentLocationReq currentLocation) { + public List getPostsOnMap(String token, CurrentLocationReq currentLocation) { //토큰 유효 확인 userService.sendTestJwtRequest(token); LocalDateTime yesterday = LocalDateTime.now().minusDays(1); //주변 게시글 목록 가져오기 - List nearByPosts = postRepository.findNearByPosts(currentLocation.getLatitude(), - currentLocation.getLongitude(), yesterday); + List nearByPosts = postRepository.findNearByPosts( + currentLocation.getLatitude(), currentLocation.getLongitude(), yesterday); //주변 게시글 목록에서 userId 추출 List userIdList = nearByPosts.stream().map(Post::getUserId).collect(Collectors.toList()); //userId로 communityUser 정보 가져오기 - List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, - UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); + List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, userIdList); HashMap communityUserInfoHashMap = new HashMap<>(); userInfoBlocks.forEach(communityUserInfo -> { communityUserInfoHashMap.put(communityUserInfo.getUserId(), communityUserInfo); }); - List postOnMapList = new ArrayList<>(); + List postOnMapList = new ArrayList<>(); for (Post post : nearByPosts) { - PostResDto.PostOnMapRes postOnMap = PostResDto.PostOnMapRes.builder() + PostOnMapRes postOnMap = PostOnMapRes.builder() .post(post) - .user(communityUserInfoHashMap.get(post.getUserId())) - .build(); + .user(communityUserInfoHashMap.get(post.getUserId())).build(); postOnMapList.add(postOnMap); } @@ -104,71 +99,41 @@ public List getPostsOnMap(String token, PostReqDto.Curr } //게시글 스와이프 보기 - public List getPostsOnSwipe(String token, List postIdList) { + public List getPostsOnSwipe(String token, List postIdList) { //토큰 유효 확인 userService.sendTestJwtRequest(token); //postId로 게시글 목록 가져오기 List postsOnSwipe = new ArrayList<>(); postIdList.forEach(postId -> { - postsOnSwipe.add - (postRepository.findByPostIdAndStatusWithImageList(postId) - .orElseThrow(NotFoundPostIdException::new) - ); + postsOnSwipe.add( + postRepository.findByPostIdAndStatusWithImageList(postId).orElseThrow(NotFoundPostIdException::new)); }); //게시글 목록에서 userId 추출 List userIdList = postsOnSwipe.stream().map(Post::getUserId).collect(Collectors.toList()); //userId로 communityUser 정보 가져오기 - List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, - UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); + List userInfoBlocks = userService.sendCommunitiesInfoRequest(token, userIdList); HashMap communityUserInfoHashMap = new HashMap<>(); userInfoBlocks.forEach(communityUserInfo -> { communityUserInfoHashMap.put(communityUserInfo.getUserId(), communityUserInfo); }); - return postsOnSwipe.stream() - .map(post -> PostResDto.PostSwipeRes.builder() - .post(post) - .user(communityUserInfoHashMap.get(post.getUserId())) - .build()) - .collect(Collectors.toList()); + return postsOnSwipe.stream().map(post -> PostSwipeRes.builder() + .post(post). + user(communityUserInfoHashMap.get(post.getUserId())).build()).collect(Collectors.toList()); } //게시글 상세보기 - public PostResDto.PostDetailRes getPostDetail(String token, Long postId) { - Post post = postRepository.findByPostIdAndStatus(postId, "ACTIVE") - .orElseThrow(NotFoundPostIdException::new); + public PostDetailRes getPostDetail(String token, Long postId) { + Post post = postRepository.findByPostIdAndStatus(postId, "ACTIVE").orElseThrow(NotFoundPostIdException::new); - List userInfoBlock = userService.sendCommunitiesInfoRequest(token, - UserReqDto.UserIdListReq.builder().userIdList(Collections.singletonList(post.getUserId())).build()); + List userInfoBlock = userService.sendCommunitiesInfoRequest( + token, Collections.singletonList(post.getUserId())); - List commentList = commentRepository.findAllByPostIdOrderByCreatedAt(post); - - List userIdList = commentList.stream().map(Comment::getUserId).collect(Collectors.toList()); - - List commentUserInfoBlocks = userService.sendCommunitiesInfoRequest(token, - UserReqDto.UserIdListReq.builder().userIdList(userIdList).build()); - - HashMap commentUserInfoHashMap = new HashMap<>(); - commentUserInfoBlocks.forEach(communityUserInfo -> { - commentUserInfoHashMap.put(communityUserInfo.getUserId(), communityUserInfo); - }); - - List commentDetailList = commentList.stream().map(comment -> - CommentResDto.CommentDetailRes.builder() - .comment(comment) - .userInfo(commentUserInfoHashMap.get(comment.getUserId())) - .build()) - .collect(Collectors.toList()); - - return PostResDto.PostDetailRes.builder() - .post(post) - .user(userInfoBlock.get(0)) - .commentList(commentDetailList) - .build(); + return PostDetailRes.builder().post(post).user(userInfoBlock.get(0)).build(); } } diff --git a/src/main/java/porori/backend/community/service/UserService.java b/src/main/java/porori/backend/community/service/UserService.java index d8a76cf..59f95f5 100644 --- a/src/main/java/porori/backend/community/service/UserService.java +++ b/src/main/java/porori/backend/community/service/UserService.java @@ -9,7 +9,6 @@ import porori.backend.community.config.BaseResponse; import porori.backend.community.config.exception.user.TokenException; import porori.backend.community.config.exception.user.UserBadGateWayException; -import porori.backend.community.dto.UserReqDto.UserIdListReq; import porori.backend.community.dto.UserResDto.UserInfo; import porori.backend.community.dto.UserResDto.CommunityUserInfo; import reactor.core.publisher.Mono; @@ -30,16 +29,16 @@ public Long getUserId(String token) { } private UserInfo sendTokenMeRequest(String token) { - return webClient.get() - .uri("/token/me") - .header("Authorization", token) - .retrieve() - .onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new TokenException())) - .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new UserBadGateWayException())) - .bodyToMono((new ParameterizedTypeReference>() { - })) - .map(BaseResponse::getData) - .block(); + return webClient.get() + .uri("/token/me") + .header("Authorization", token) + .retrieve() + .onStatus(HttpStatus::is4xxClientError, clientResponse -> Mono.error(new TokenException())) + .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new UserBadGateWayException())) + .bodyToMono((new ParameterizedTypeReference>() { + })) + .map(BaseResponse::getData) + .block(); } //(테스트) 토큰 유효성 검증 @@ -51,14 +50,14 @@ public void sendTestJwtRequest(String token) { .retrieve() .toBodilessEntity() .block(); - } catch (Exception e){ + } catch (Exception e) { log.warn(LOG_FORMAT, "sendTestJwtRequest"); throw new TokenException(); } } - public List sendCommunitiesInfoRequest(String token, UserIdListReq userIdList) { - String param = userIdList.getUserIdList().stream() + public List sendCommunitiesInfoRequest(String token, List userIdList) { + String param = userIdList.stream() .map(String::valueOf) .collect(Collectors.joining(",")); log.warn(LOG_FORMAT, param); @@ -71,7 +70,7 @@ public List sendCommunitiesInfoRequest(String token, UserIdLi .onStatus(HttpStatus::is5xxServerError, clientResponse -> Mono.error(new UserBadGateWayException())) .bodyToMono((new ParameterizedTypeReference>>>() { })) - .map(response->response.getData().get("communityUserInfoBlocks")) + .map(response -> response.getData().get("communityUserInfoBlocks")) .block(); } From 372e63640591a011c74d41ff08cbf49304771cd9 Mon Sep 17 00:00:00 2001 From: jiyoon <95969941+jjunjji@users.noreply.github.com> Date: Tue, 5 Sep 2023 19:28:40 +0900 Subject: [PATCH 4/5] Update github-actions.yml --- .github/workflows/github-actions.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 759513a..00de830 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -3,8 +3,6 @@ name: Java CI with Gradle on: push: branches: [ "main" ] - pull_request: - branches: [ "main" ] permissions: contents: read From a49e631e1688ce470a868bd08223d0ff1ae1f96a Mon Sep 17 00:00:00 2001 From: jiyoon <95969941+jjunjji@users.noreply.github.com> Date: Tue, 5 Sep 2023 21:15:24 +0900 Subject: [PATCH 5/5] Create PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..176db38 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,14 @@ +## 🔥 Summary + +- line1 +- line2 + + + +## ✏️ Describe your changes + + + + +## 📖 Review Point + \ No newline at end of file