From ef149ae2f3d6f3b6444dc616a58a8c5b6bac9be9 Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 7 Aug 2023 17:20:19 +0900 Subject: [PATCH 1/2] =?UTF-8?q?#102=20[Feat]=20=EC=9C=84=EB=8B=88=20?= =?UTF-8?q?=ED=94=BC=EB=93=9C=20=EB=94=94=ED=85=8C=EC=9D=BC=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20HttpStatu?= =?UTF-8?q?s.created=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/CommentController.java | 2 +- .../server/controller/FeedController.java | 7 ++++ .../comment/GetCommentResponseDto.java | 23 +++++++++++ .../feed/GetFeedDetailResponseDto.java | 25 ++++++++++++ .../org/winey/server/exception/Success.java | 2 + .../infrastructure/CommentRepository.java | 6 +++ .../org/winey/server/service/FeedService.java | 39 +++++++++++++++++-- 7 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java create mode 100644 src/main/java/org/winey/server/controller/response/feed/GetFeedDetailResponseDto.java diff --git a/src/main/java/org/winey/server/controller/CommentController.java b/src/main/java/org/winey/server/controller/CommentController.java index cd27497..9ee4511 100644 --- a/src/main/java/org/winey/server/controller/CommentController.java +++ b/src/main/java/org/winey/server/controller/CommentController.java @@ -25,7 +25,7 @@ public class CommentController { private final CommentService commentService; @PostMapping(value = "/{feedId}") - @ResponseStatus(HttpStatus.OK) + @ResponseStatus(HttpStatus.CREATED) @Operation(summary = "댓글을 만드는 API", description = "피드의 댓글을 생성합니다.") public ApiResponse createComment( @UserId Long userId, diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index 82c0d5a..ff92d81 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -13,6 +13,7 @@ import org.winey.server.controller.request.CreateFeedRequestDto; import org.winey.server.controller.response.feed.CreateFeedResponseDto; import org.winey.server.controller.response.feed.GetAllFeedResponseDto; +import org.winey.server.controller.response.feed.GetFeedDetailResponseDto; import org.winey.server.exception.Error; import org.winey.server.exception.Success; import org.winey.server.external.client.aws.S3Service; @@ -75,4 +76,10 @@ public ApiResponse getMyFeed(@RequestParam int page, @Use return ApiResponse.error(Error.PAGE_REQUEST_VALIDATION_EXCEPTION, Error.PAGE_REQUEST_VALIDATION_EXCEPTION.getMessage()); return ApiResponse.success(Success.GET_MYFEED_SUCCESS, feedService.getMyFeed(page, userId)); } + @GetMapping("/detail") + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "피드 detail 조회 API", description = "피드 detail을 조회합니다.") + public ApiResponse getFeedDetail(@PathVariable Long feedId, @UserId Long userId) { + return ApiResponse.success(Success.GET_DETAIL_SUCCESS, feedService.getFeedDetail(feedId, userId)); + } } diff --git a/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java b/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java new file mode 100644 index 0000000..8edfeeb --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java @@ -0,0 +1,23 @@ +package org.winey.server.controller.response.comment; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.winey.server.domain.user.User; + +import java.time.LocalDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GetCommentResponseDto { + private Long commentId; + private User author; + private String content; + private LocalDate createdAt; + + public static GetCommentResponseDto of(Long commentId,User author, String content, LocalDate createdAt) { + return new GetCommentResponseDto(commentId, author, content, createdAt); + } +} diff --git a/src/main/java/org/winey/server/controller/response/feed/GetFeedDetailResponseDto.java b/src/main/java/org/winey/server/controller/response/feed/GetFeedDetailResponseDto.java new file mode 100644 index 0000000..c3c04fb --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/feed/GetFeedDetailResponseDto.java @@ -0,0 +1,25 @@ +package org.winey.server.controller.response.feed; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.winey.server.controller.response.PageResponseDto; +import org.winey.server.controller.response.comment.CreateCommentResponseDto; +import org.winey.server.controller.response.comment.GetCommentResponseDto; + +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GetFeedDetailResponseDto { + + private GetFeedResponseDto getFeedResponseDto; + private List getCommentResponseList; + + public static GetFeedDetailResponseDto of(GetFeedResponseDto getFeedResponseDto, List getCommentResponseList) { + return new GetFeedDetailResponseDto(getFeedResponseDto,getCommentResponseList); + } +} + diff --git a/src/main/java/org/winey/server/exception/Success.java b/src/main/java/org/winey/server/exception/Success.java index a5c6195..c90042b 100644 --- a/src/main/java/org/winey/server/exception/Success.java +++ b/src/main/java/org/winey/server/exception/Success.java @@ -17,6 +17,8 @@ public enum Success { GET_USER_SUCCESS(HttpStatus.OK, "유저 조회 성공"), GET_MYFEED_SUCCESS(HttpStatus.OK, "마이 피드 조회 성공"), + GET_DETAIL_SUCCESS(HttpStatus.OK, "피드 디테일 페이지 조회 성공"), + RE_ISSUE_TOKEN_SUCCESS(HttpStatus.OK, "토큰 재발급 성공"), UPDATE_NICKNAME_SUCCESS(HttpStatus.OK, "닉네임 변경 성공"), CHECK_NICKNAME_DUPLICATE_SUCCESS(HttpStatus.OK, "닉네임 중복 확인 성공"), diff --git a/src/main/java/org/winey/server/infrastructure/CommentRepository.java b/src/main/java/org/winey/server/infrastructure/CommentRepository.java index f763933..e070427 100644 --- a/src/main/java/org/winey/server/infrastructure/CommentRepository.java +++ b/src/main/java/org/winey/server/infrastructure/CommentRepository.java @@ -1,10 +1,14 @@ package org.winey.server.infrastructure; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.repository.Repository; import org.winey.server.domain.comment.Comment; import org.winey.server.domain.feed.Feed; import org.winey.server.domain.feed.FeedLike; +import org.winey.server.domain.user.User; +import java.util.List; import java.util.Optional; public interface CommentRepository extends Repository { @@ -16,5 +20,7 @@ public interface CommentRepository extends Repository { Long deleteByCommentId(Long commentId); + List findAllByFeedOrderByCreatedAtDesc(Feed feed); + } diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index 182bd3e..c414bc0 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -8,8 +8,11 @@ import org.winey.server.common.dto.ApiResponse; import org.winey.server.controller.request.CreateFeedRequestDto; import org.winey.server.controller.response.PageResponseDto; +import org.winey.server.controller.response.comment.CreateCommentResponseDto; +import org.winey.server.controller.response.comment.GetCommentResponseDto; import org.winey.server.controller.response.feed.*; import org.winey.server.controller.response.recommend.RecommendResponseDto; +import org.winey.server.domain.comment.Comment; import org.winey.server.domain.feed.Feed; import org.winey.server.domain.goal.Goal; import org.winey.server.domain.user.User; @@ -19,10 +22,7 @@ import org.winey.server.exception.model.ForbiddenException; import org.winey.server.exception.model.NotFoundException; import org.winey.server.exception.model.UnauthorizedException; -import org.winey.server.infrastructure.FeedLikeRepository; -import org.winey.server.infrastructure.FeedRepository; -import org.winey.server.infrastructure.GoalRepository; -import org.winey.server.infrastructure.UserRepository; +import org.winey.server.infrastructure.*; import java.time.LocalDate; import java.util.List; @@ -36,6 +36,7 @@ public class FeedService { private final GoalRepository goalRepository; private final FeedLikeRepository feedLikeRepository; + private final CommentRepository commentRepository; @Transactional public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userId, String imageUrl) { @@ -144,6 +145,36 @@ public GetAllFeedResponseDto getMyFeed(int page, Long userId) { myFeed.getCreatedAt().toLocalDate() //해당 피드 만든 날짜 localdate로 바꿔서 주기. )).collect(Collectors.toList()); return GetAllFeedResponseDto.of(pageInfo, feeds); + } + + @Transactional(readOnly = true) + public GetFeedDetailResponseDto getFeedDetail(Long feedId, Long userId) { + Feed detailFeed = feedRepository.findByFeedId(feedId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_FEED_EXCEPTION, Error.NOT_FOUND_FEED_EXCEPTION.getMessage())); + User connectedUser = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + List comments = commentRepository.findAllByFeedOrderByCreatedAtDesc(detailFeed) + .stream().map(comment -> GetCommentResponseDto.of( + comment.getCommentId(), + comment.getUser(), + comment.getContent(), + comment.getCreatedAt().toLocalDate() + )).collect(Collectors.toList()); + + GetFeedResponseDto detailResponse = GetFeedResponseDto.of( + detailFeed.getFeedId(), + detailFeed.getUser().getUserId(), + detailFeed.getUser().getNickname(), + detailFeed.getUser().getUserLevel().getLevelNumber(), + detailFeed.getFeedTitle(), + detailFeed.getFeedImage(), + detailFeed.getFeedMoney(), + feedLikeRepository.existsByFeedAndUser(detailFeed, connectedUser), //현재 접속한 유저가 detail feed에 좋아요 눌렀는지 + (long) feedLikeRepository.countByFeed(detailFeed), //해당 피드의 좋아요 개수 세기. + detailFeed.getCreatedAt().toLocalDate() //해당 피드 만든 날짜 localdate로 바꿔서 주기. + ); + + return GetFeedDetailResponseDto.of(detailResponse, comments); } } From 56cacbfd673dda86454808f334d93655b836973e Mon Sep 17 00:00:00 2001 From: soohyun Date: Thu, 10 Aug 2023 17:43:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?#102=20[Feat]=20detail=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20createdAt=20?= =?UTF-8?q?=ED=94=BC=EB=93=9Clocaldatetime=EC=9C=BC=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/controller/FeedController.java | 4 ++-- .../response/comment/GetCommentResponseDto.java | 10 ++++++---- .../controller/response/feed/GetFeedResponseDto.java | 4 ++-- .../java/org/winey/server/service/FeedService.java | 11 ++++++----- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index ff92d81..7c7aacd 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -76,10 +76,10 @@ public ApiResponse getMyFeed(@RequestParam int page, @Use return ApiResponse.error(Error.PAGE_REQUEST_VALIDATION_EXCEPTION, Error.PAGE_REQUEST_VALIDATION_EXCEPTION.getMessage()); return ApiResponse.success(Success.GET_MYFEED_SUCCESS, feedService.getMyFeed(page, userId)); } - @GetMapping("/detail") + @GetMapping(value = "/{feedId}") @ResponseStatus(HttpStatus.OK) @Operation(summary = "피드 detail 조회 API", description = "피드 detail을 조회합니다.") - public ApiResponse getFeedDetail(@PathVariable Long feedId, @UserId Long userId) { + public ApiResponse getFeedDetail(@UserId Long userId, @PathVariable Long feedId) { return ApiResponse.success(Success.GET_DETAIL_SUCCESS, feedService.getFeedDetail(feedId, userId)); } } diff --git a/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java b/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java index 8edfeeb..dc8cf33 100644 --- a/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/comment/GetCommentResponseDto.java @@ -7,17 +7,19 @@ import org.winey.server.domain.user.User; import java.time.LocalDate; +import java.time.LocalDateTime; @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class GetCommentResponseDto { private Long commentId; - private User author; + private String author; private String content; - private LocalDate createdAt; + private int authorLevel; + private LocalDateTime createdAt; - public static GetCommentResponseDto of(Long commentId,User author, String content, LocalDate createdAt) { - return new GetCommentResponseDto(commentId, author, content, createdAt); + public static GetCommentResponseDto of(Long commentId,String author, String content, int authorLevel, LocalDateTime createdAt) { + return new GetCommentResponseDto(commentId, author, content, authorLevel, createdAt); } } diff --git a/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java b/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java index f35d3d6..d77579a 100644 --- a/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java @@ -25,11 +25,11 @@ public class GetFeedResponseDto { private Long feedMoney; private Boolean isLiked; private Long likes; - private LocalDate createdAt; + private LocalDateTime createdAt; public static GetFeedResponseDto of(Long feedId,Long userId, String nickName, int writerLevel,String feedTitle, String feedImage, - Long feedMoney, Boolean isLiked, Long likes, LocalDate createdAt){ + Long feedMoney, Boolean isLiked, Long likes, LocalDateTime createdAt){ return new GetFeedResponseDto(feedId,userId,nickName,writerLevel, feedTitle, feedImage, feedMoney, isLiked, likes, createdAt); } } diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index c414bc0..d016f58 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -120,7 +120,7 @@ public GetAllFeedResponseDto getAllFeed(int page, Long userId) { feed.getFeedMoney(), feedLikeRepository.existsByFeedAndUser(feed, user), //현재 접속한 유저가 좋아요 눌렀는지 (long) feedLikeRepository.countByFeed(feed), //해당 피드의 좋아요 개수 세기. - feed.getCreatedAt().toLocalDate() //해당 피드 만든 날짜 localdate로 바꿔서 주기. + feed.getCreatedAt() //해당 피드 만든 날짜 localdate로 바꿔서 주기. )).collect(Collectors.toList()); return GetAllFeedResponseDto.of(pageInfo, feeds); } @@ -142,7 +142,7 @@ public GetAllFeedResponseDto getMyFeed(int page, Long userId) { myFeed.getFeedMoney(), feedLikeRepository.existsByFeedAndUser(myFeed, myUser), //현재 접속한 유저가 좋아요 눌렀는지 (long) feedLikeRepository.countByFeed(myFeed), //해당 피드의 좋아요 개수 세기. - myFeed.getCreatedAt().toLocalDate() //해당 피드 만든 날짜 localdate로 바꿔서 주기. + myFeed.getCreatedAt() //해당 피드 만든 날짜 localdate로 바꿔서 주기. )).collect(Collectors.toList()); return GetAllFeedResponseDto.of(pageInfo, feeds); } @@ -156,9 +156,10 @@ public GetFeedDetailResponseDto getFeedDetail(Long feedId, Long userId) { List comments = commentRepository.findAllByFeedOrderByCreatedAtDesc(detailFeed) .stream().map(comment -> GetCommentResponseDto.of( comment.getCommentId(), - comment.getUser(), + comment.getUser().getNickname(), comment.getContent(), - comment.getCreatedAt().toLocalDate() + comment.getUser().getUserLevel().getLevelNumber(), + comment.getCreatedAt() )).collect(Collectors.toList()); GetFeedResponseDto detailResponse = GetFeedResponseDto.of( @@ -171,7 +172,7 @@ public GetFeedDetailResponseDto getFeedDetail(Long feedId, Long userId) { detailFeed.getFeedMoney(), feedLikeRepository.existsByFeedAndUser(detailFeed, connectedUser), //현재 접속한 유저가 detail feed에 좋아요 눌렀는지 (long) feedLikeRepository.countByFeed(detailFeed), //해당 피드의 좋아요 개수 세기. - detailFeed.getCreatedAt().toLocalDate() //해당 피드 만든 날짜 localdate로 바꿔서 주기. + detailFeed.getCreatedAt() //해당 피드 만든 날짜 localdate로 바꿔서 주기. ); return GetFeedDetailResponseDto.of(detailResponse, comments);