From 668e4e023291a09e32b593bb3788a0355fb1e5e6 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:06:31 +0900 Subject: [PATCH 01/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80(PlaceReviewComment)=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/PlaceReviewComment.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/entity/PlaceReviewComment.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/entity/PlaceReviewComment.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/entity/PlaceReviewComment.java new file mode 100644 index 00000000..eb0c08d0 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/entity/PlaceReviewComment.java @@ -0,0 +1,53 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.entity; + +import com.haejwo.tripcometrue.domain.member.entity.Member; +import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; +import com.haejwo.tripcometrue.global.entity.BaseTimeEntity; +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +import static jakarta.persistence.CascadeType.REMOVE; +import static jakarta.persistence.FetchType.LAZY; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class PlaceReviewComment extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "place_review_comment_id") + private Long id; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "place_review_id") + private PlaceReview placeReview; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "parent_comment_id") + private PlaceReviewComment parentComment; + + @OneToMany(mappedBy = "parentComment", cascade = REMOVE, orphanRemoval = true) + private List childComments = new ArrayList<>(); + + @Column(nullable = false) + private String content; + + @Builder + public PlaceReviewComment(Member member, PlaceReview placeReview, PlaceReviewComment parentComment, String content) { + this.member = member; + this.placeReview = placeReview; + this.parentComment = parentComment; + this.content = content; + } +} From 806aaa6a6e521db01e7eef15e6ecac884194796d Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:10:38 +0900 Subject: [PATCH 02/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80=20=EC=9A=94=EC=B2=AD=20?= =?UTF-8?q?DTO(PlaceReviewCommentRequestDto)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/PlaceReviewCommentRequestDto.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/request/PlaceReviewCommentRequestDto.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/request/PlaceReviewCommentRequestDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/request/PlaceReviewCommentRequestDto.java new file mode 100644 index 00000000..ee7f37b1 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/request/PlaceReviewCommentRequestDto.java @@ -0,0 +1,39 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.dto.request; + +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.member.entity.Member; +import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; +import jakarta.validation.constraints.NotNull; +import org.hibernate.validator.constraints.Length; + +public record PlaceReviewCommentRequestDto( + + @NotNull(message = "본문은 필수로 입력해야 합니다.") + @Length(min = 1, max = 500, message = "작성 허용 범위는 최소 1자 또는 최대 500자 입니다.") + String content + +) { + + public static PlaceReviewComment toComment(Member member, PlaceReview placeReview, PlaceReviewCommentRequestDto requestDto) { + return PlaceReviewComment.builder() + .member(member) + .placeReview(placeReview) + .content(requestDto.content) + .build(); + } + + public static PlaceReviewComment toReplyComment( + Member member, + PlaceReview placeReview, + PlaceReviewComment placeReviewComment, + PlaceReviewCommentRequestDto requestDto + ) { + + return PlaceReviewComment.builder() + .member(member) + .placeReview(placeReview) + .parentComment(placeReviewComment) + .content(requestDto.content) + .build(); + } +} From 8a726be483b34c4cf10c75babc576c9192979c97 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:13:52 +0900 Subject: [PATCH 03/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?DTO(PlaceReviewCommentResponseDto,=20PlaceReviewCommentListResp?= =?UTF-8?q?onseDto)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentListResponseDto.java | 30 +++++++++++ .../PlaceReviewCommentResponseDto.java | 52 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentListResponseDto.java create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentListResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentListResponseDto.java new file mode 100644 index 00000000..6bb7b81d --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentListResponseDto.java @@ -0,0 +1,30 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.dto.response; + +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.member.entity.Member; +import org.springframework.data.domain.Slice; + +import java.util.List; +import java.util.Objects; + +public record PlaceReviewCommentListResponseDto( + + int totalCount, + List comments + +) { + + public static PlaceReviewCommentListResponseDto fromData(int totalCount, Slice placeReviewComments, Member loginMember) { + return new PlaceReviewCommentListResponseDto( + totalCount, + placeReviewComments.map(placeReviewComment -> { + if (placeReviewComment.getParentComment() == null) { //최상위 댓글만 포함 + return PlaceReviewCommentResponseDto.fromEntity(placeReviewComment, loginMember); + } + return null; + }) + .filter(Objects::nonNull) + .toList() + ); + } +} diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java new file mode 100644 index 00000000..938b38c6 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java @@ -0,0 +1,52 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.member.entity.Member; + +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; + +public record PlaceReviewCommentResponseDto( + + Long commentId, + Long memberId, + String profileUrl, + String nickname, + boolean isWriter, + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH-mm-ss") + LocalDateTime createdAt, + + List replyComments + +) { + + public static PlaceReviewCommentResponseDto fromEntity(PlaceReviewComment placeReviewComment, Member loginMember) { + return new PlaceReviewCommentResponseDto( + placeReviewComment.getId(), + placeReviewComment.getMember().getId(), + placeReviewComment.getMember().getProfileImage(), + placeReviewComment.getMember().getMemberBase().getNickname(), + isWriter(placeReviewComment, loginMember), + placeReviewComment.getCreatedAt(), + getReplyComments(placeReviewComment, loginMember) //자식 댓글 리스트에 담기 + ); + } + + private static boolean isWriter(PlaceReviewComment placeReviewComment, Member loginMember) { + return Objects.equals(placeReviewComment.getMember(), loginMember); + } + + private static List getReplyComments(PlaceReviewComment placeReviewComment, Member loginMember) { + if (placeReviewComment.getParentComment() == null) { + return placeReviewComment.getChildComments().stream() + .map(comment -> PlaceReviewCommentResponseDto.fromEntity(comment, loginMember)) + .sorted(Comparator.comparing(PlaceReviewCommentResponseDto::createdAt).reversed()) + .toList(); + } + return null; + } +} From a251decd5867a9f32cbb7f4f050ffc91376ee65f Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:16:22 +0900 Subject: [PATCH 04/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80=20=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=EC=A7=80=ED=86=A0=EB=A6=AC(PlaceReviewCommentRepository)=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentRepository.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java new file mode 100644 index 00000000..96bbb95e --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java @@ -0,0 +1,23 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.repository; + +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; +import io.lettuce.core.dynamic.annotation.Param; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +public interface PlaceReviewCommentRepository extends JpaRepository { + + Slice findByPlaceReview(PlaceReview placeReview, Pageable pageable); + + @Modifying + @Query("delete from PlaceReviewComment prc where prc.parentComment.id = :placeReviewCommentId") + int deleteChildrenByPlaceReviewCommentId(@Param("placeReviewCommentId") Long placeReviewCommentId); + + @Modifying + @Query("delete from PlaceReviewComment prc where prc.id = :placeReviewCommentId") + int deleteParentByPlaceReviewCommentId(@Param("placeReviewCommentId") Long placeReviewCommentId); +} From 62d0696ea502df814039bd9abf719a1fdb3252c1 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:17:26 +0900 Subject: [PATCH 05/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4(PlaceReviewCommentService)=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EB=8C=93=EA=B8=80=20=EB=93=B1=EB=A1=9D=201?= =?UTF-8?q?=EC=B0=A8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentControllerAdvice.java | 21 +++ .../PlaceReviewCommentNotFoundException.java | 12 ++ .../service/PlaceReviewCommentService.java | 124 ++++++++++++++++++ .../global/exception/ErrorCode.java | 1 + 4 files changed, 158 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentControllerAdvice.java create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/exception/PlaceReviewCommentNotFoundException.java create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentControllerAdvice.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentControllerAdvice.java new file mode 100644 index 00000000..35553e16 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentControllerAdvice.java @@ -0,0 +1,21 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.controller; + +import com.haejwo.tripcometrue.domain.comment.placereview.exception.PlaceReviewCommentNotFoundException; +import com.haejwo.tripcometrue.global.util.ResponseDTO; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PlaceReviewCommentControllerAdvice { + + @ExceptionHandler(PlaceReviewCommentNotFoundException.class) + public ResponseEntity> handlePlaceReviewCommentNotFoundException(PlaceReviewCommentNotFoundException e) { + HttpStatus status = e.getErrorCode().getHttpStatus(); + + return ResponseEntity + .status(status) + .body(ResponseDTO.errorWithMessage(status, e.getMessage())); + } +} diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/exception/PlaceReviewCommentNotFoundException.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/exception/PlaceReviewCommentNotFoundException.java new file mode 100644 index 00000000..8fdb9fa2 --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/exception/PlaceReviewCommentNotFoundException.java @@ -0,0 +1,12 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.exception; + +import com.haejwo.tripcometrue.global.exception.ApplicationException; +import com.haejwo.tripcometrue.global.exception.ErrorCode; + +public class PlaceReviewCommentNotFoundException extends ApplicationException { + private static final ErrorCode ERROR_CODE = ErrorCode.PLACE_REVIEW_COMMENT_NOT_FOUND; + + public PlaceReviewCommentNotFoundException() { + super(ERROR_CODE); + } +} diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java new file mode 100644 index 00000000..307133bc --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java @@ -0,0 +1,124 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.service; + +import com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.comment.placereview.repository.PlaceReviewCommentRepository; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; +import com.haejwo.tripcometrue.domain.comment.triprecord.entity.TripRecordComment; +import com.haejwo.tripcometrue.domain.comment.triprecord.exception.TripRecordCommentNotFoundException; +import com.haejwo.tripcometrue.domain.member.entity.Member; +import com.haejwo.tripcometrue.domain.member.exception.UserInvalidAccessException; +import com.haejwo.tripcometrue.domain.member.exception.UserNotFoundException; +import com.haejwo.tripcometrue.domain.member.repository.MemberRepository; +import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; +import com.haejwo.tripcometrue.domain.review.placereview.exception.PlaceReviewNotFoundException; +import com.haejwo.tripcometrue.domain.review.placereview.repository.PlaceReviewRepository; +import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecord; +import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +@Slf4j +@Service +@RequiredArgsConstructor +@Transactional +public class PlaceReviewCommentService { + + private final MemberRepository memberRepository; + private final PlaceReviewRepository placeReviewRepository; + private final PlaceReviewCommentRepository placeReviewCommentRepository; + + public void saveComment( + PrincipalDetails principalDetails, + Long placeReviewId, + PlaceReviewCommentRequestDto requestDto + ) { + + Member loginMember = getMember(principalDetails); + PlaceReview placeReview = getPlaceReviewById(placeReviewId); + + PlaceReviewComment comment = PlaceReviewCommentRequestDto.toComment(loginMember, placeReview, requestDto); + placeReviewCommentRepository.save(comment); + placeReview.increaseCommentCount(); + } + + private Member getMember(PrincipalDetails principalDetails) { + return memberRepository.findById(principalDetails.getMember().getId()) + .orElseThrow(UserNotFoundException::new); + } + + private PlaceReview getPlaceReviewById(Long placeReviewId) { + return placeReviewRepository.findById(placeReviewId) + .orElseThrow(PlaceReviewNotFoundException::new); + } + +// public void saveReplyComment( +// PrincipalDetails principalDetails, +// Long tripRecordCommentId, +// TripRecordCommentRequestDto requestDto +// ) { +// +// Member loginMember = getMember(principalDetails); +// TripRecordComment tripRecordComment = getTripRecordCommentById(tripRecordCommentId); +// TripRecord tripRecord = tripRecordComment.getTripRecord(); +// +// TripRecordComment comment = TripRecordCommentRequestDto.toReplyComment(loginMember, tripRecord, tripRecordComment, requestDto); +// tripRecordCommentRepository.save(comment); +// tripRecord.incrementCommentCount(); +// } +// +// private TripRecordComment getTripRecordCommentById(Long tripRecordCommentId) { +// return tripRecordCommentRepository.findById(tripRecordCommentId) +// .orElseThrow(TripRecordCommentNotFoundException::new); +// } +// +// @Transactional(readOnly = true) +// public TripRecordCommentListResponseDto getCommentList( +// PrincipalDetails principalDetails, +// Long tripRecordId, +// Pageable pageable +// ) { +// +// Member loginMember = getMember(principalDetails); +// TripRecord tripRecord = getPlaceReviewById(tripRecordId); +// +// Slice tripRecordComments = tripRecordCommentRepository.findByTripRecord(tripRecord, pageable); +// return TripRecordCommentListResponseDto.fromData(tripRecord.getCommentCount(), tripRecordComments, loginMember); +// } +// +// public void removeComment(PrincipalDetails principalDetails, Long tripRecordCommentId) { +// +// Member loginMember = getMember(principalDetails); +// TripRecordComment tripRecordComment = getTripRecordComment(tripRecordCommentId); +// TripRecord tripRecord = tripRecordComment.getTripRecord(); +// +// validateRightMemberAccess(loginMember, tripRecordComment); +// +// int removedCount = getRemovedCount(tripRecordCommentId, tripRecordComment); +// tripRecord.decreaseCommentCount(removedCount); +// } +// +// private int getRemovedCount(Long tripRecordCommentId, TripRecordComment tripRecordComment) { +// int childrenCount = tripRecordCommentRepository.deleteChildrenByTripRecordCommentId(tripRecordComment.getId()); +// int parentCount = tripRecordCommentRepository.deleteParentByTripRecordCommentId(tripRecordCommentId); +// return childrenCount + parentCount; +// } +// +// private TripRecordComment getTripRecordComment(Long tripRecordCommentId) { +// return tripRecordCommentRepository.findById(tripRecordCommentId) +// .orElseThrow(TripRecordCommentNotFoundException::new); +// } +// +// private void validateRightMemberAccess(Member member, TripRecordComment tripRecordComment) { +// if (!Objects.equals(tripRecordComment.getMember().getId(), member.getId())) { +// throw new UserInvalidAccessException(); +// } +// } +} diff --git a/src/main/java/com/haejwo/tripcometrue/global/exception/ErrorCode.java b/src/main/java/com/haejwo/tripcometrue/global/exception/ErrorCode.java index f0c65b85..f5b35b36 100644 --- a/src/main/java/com/haejwo/tripcometrue/global/exception/ErrorCode.java +++ b/src/main/java/com/haejwo/tripcometrue/global/exception/ErrorCode.java @@ -80,6 +80,7 @@ public enum ErrorCode { // COMMENT TRIP_RECORD_COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 여행 후기 댓글입니다."), + PLACE_REVIEW_COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 여행지 리뷰 댓글입니다."), // 5xx INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 에러"); From 874108597352960b8fadb0b6c0af71d2448c75af Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:17:48 +0900 Subject: [PATCH 06/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20(Pl?= =?UTF-8?q?aceReviewCommentController)=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EB=93=B1=EB=A1=9D=201=EC=B0=A8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentController.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java new file mode 100644 index 00000000..10c64efc --- /dev/null +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java @@ -0,0 +1,69 @@ +package com.haejwo.tripcometrue.domain.comment.placereview.controller; + +import com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.placereview.service.PlaceReviewCommentService; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; +import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; +import com.haejwo.tripcometrue.global.util.ResponseDTO; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +import static org.springframework.data.domain.Sort.Direction; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/places/reviews") +public class PlaceReviewCommentController { + + private final PlaceReviewCommentService commentService; + + @PostMapping("/{placeReviewId}/comments") + public ResponseEntity> registerComment( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable Long placeReviewId, + @RequestBody @Valid PlaceReviewCommentRequestDto requestDto + ) { + + commentService.saveComment(principalDetails, placeReviewId, requestDto); + return ResponseEntity.ok(ResponseDTO.ok()); + } + +// @PostMapping("/comments/{tripRecordCommentId}/reply-comments") +// public ResponseEntity> registerReplyComment( +// @AuthenticationPrincipal PrincipalDetails principalDetails, +// @PathVariable Long tripRecordCommentId, +// @RequestBody @Valid TripRecordCommentRequestDto requestDto +// ) { +// +// commentService.saveReplyComment(principalDetails, tripRecordCommentId, requestDto); +// return ResponseEntity.ok(ResponseDTO.ok()); +// } +// +// @GetMapping("/{tripRecordId}/comments") +// public ResponseEntity> getCommentList( +// @AuthenticationPrincipal PrincipalDetails principalDetails, +// @PathVariable Long tripRecordId, +// @PageableDefault(sort = "createdAt", direction = Direction.DESC) Pageable pageable +// ) { +// +// TripRecordCommentListResponseDto responseDto = +// commentService.getCommentList(principalDetails, tripRecordId, pageable); +// return ResponseEntity.ok(ResponseDTO.okWithData(responseDto)); +// } +// +// @DeleteMapping("/comments/{tripRecordCommentId}") +// public ResponseEntity> deleteComment( +// @AuthenticationPrincipal PrincipalDetails principalDetails, +// @PathVariable Long tripRecordCommentId +// ) { +// +// commentService.removeComment(principalDetails, tripRecordCommentId); +// return ResponseEntity.ok(ResponseDTO.ok()); +// } +} From 9b63c9c471f086f670652cd4209fd040b7f640af Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 16:19:29 +0900 Subject: [PATCH 07/18] =?UTF-8?q?[refactor]=20=EC=97=AC=ED=96=89=20?= =?UTF-8?q?=ED=9B=84=EA=B8=B0=20=EB=8C=93=EA=B8=80(TripRecordComment)=20Dt?= =?UTF-8?q?o=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20->=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=95=9E=EC=97=90=20TripRecord=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TripRecordCommentController.java | 6 +++--- ...equestDto.java => TripRecordCommentRequestDto.java} | 6 +++--- .../triprecord/service/TripRecordCommentService.java | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) rename src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/{CommentRequestDto.java => TripRecordCommentRequestDto.java} (89%) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/controller/TripRecordCommentController.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/controller/TripRecordCommentController.java index 4b56353c..2f25d36e 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/controller/TripRecordCommentController.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/controller/TripRecordCommentController.java @@ -1,6 +1,6 @@ package com.haejwo.tripcometrue.domain.comment.triprecord.controller; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.CommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; import com.haejwo.tripcometrue.domain.comment.triprecord.service.TripRecordCommentService; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; @@ -26,7 +26,7 @@ public class TripRecordCommentController { public ResponseEntity> registerComment( @AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable Long tripRecordId, - @RequestBody @Valid CommentRequestDto requestDto + @RequestBody @Valid TripRecordCommentRequestDto requestDto ) { commentService.saveComment(principalDetails, tripRecordId, requestDto); @@ -37,7 +37,7 @@ public ResponseEntity> registerComment( public ResponseEntity> registerReplyComment( @AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable Long tripRecordCommentId, - @RequestBody @Valid CommentRequestDto requestDto + @RequestBody @Valid TripRecordCommentRequestDto requestDto ) { commentService.saveReplyComment(principalDetails, tripRecordCommentId, requestDto); diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/CommentRequestDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/TripRecordCommentRequestDto.java similarity index 89% rename from src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/CommentRequestDto.java rename to src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/TripRecordCommentRequestDto.java index 3bb22d01..81a0a40b 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/CommentRequestDto.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/request/TripRecordCommentRequestDto.java @@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull; import org.hibernate.validator.constraints.Length; -public record CommentRequestDto( +public record TripRecordCommentRequestDto( @NotNull(message = "본문은 필수로 입력해야 합니다.") @Length(min = 1, max = 500, message = "작성 허용 범위는 최소 1자 또는 최대 500자 입니다.") @@ -14,7 +14,7 @@ public record CommentRequestDto( ) { - public static TripRecordComment toComment(Member member, TripRecord tripRecord, CommentRequestDto requestDto) { + public static TripRecordComment toComment(Member member, TripRecord tripRecord, TripRecordCommentRequestDto requestDto) { return TripRecordComment.builder() .member(member) .tripRecord(tripRecord) @@ -26,7 +26,7 @@ public static TripRecordComment toReplyComment( Member member, TripRecord tripRecord, TripRecordComment tripRecordComment, - CommentRequestDto requestDto + TripRecordCommentRequestDto requestDto ) { return TripRecordComment.builder() diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/service/TripRecordCommentService.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/service/TripRecordCommentService.java index ead790f1..712f94a3 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/service/TripRecordCommentService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/service/TripRecordCommentService.java @@ -1,6 +1,6 @@ package com.haejwo.tripcometrue.domain.comment.triprecord.service; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.CommentRequestDto; +import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; import com.haejwo.tripcometrue.domain.comment.triprecord.entity.TripRecordComment; import com.haejwo.tripcometrue.domain.comment.triprecord.exception.TripRecordCommentNotFoundException; @@ -35,13 +35,13 @@ public class TripRecordCommentService { public void saveComment( PrincipalDetails principalDetails, Long tripRecordId, - CommentRequestDto requestDto + TripRecordCommentRequestDto requestDto ) { Member loginMember = getMember(principalDetails); TripRecord tripRecord = getTripRecordById(tripRecordId); - TripRecordComment comment = CommentRequestDto.toComment(loginMember, tripRecord, requestDto); + TripRecordComment comment = TripRecordCommentRequestDto.toComment(loginMember, tripRecord, requestDto); tripRecordCommentRepository.save(comment); tripRecord.incrementCommentCount(); } @@ -54,14 +54,14 @@ private Member getMember(PrincipalDetails principalDetails) { public void saveReplyComment( PrincipalDetails principalDetails, Long tripRecordCommentId, - CommentRequestDto requestDto + TripRecordCommentRequestDto requestDto ) { Member loginMember = getMember(principalDetails); TripRecordComment tripRecordComment = getTripRecordCommentById(tripRecordCommentId); TripRecord tripRecord = tripRecordComment.getTripRecord(); - TripRecordComment comment = CommentRequestDto.toReplyComment(loginMember, tripRecord, tripRecordComment, requestDto); + TripRecordComment comment = TripRecordCommentRequestDto.toReplyComment(loginMember, tripRecord, tripRecordComment, requestDto); tripRecordCommentRepository.save(comment); tripRecord.incrementCommentCount(); } From 0b9b23d7848885d4334fdcf87179c8afd664628c Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 19:41:03 +0900 Subject: [PATCH 08/18] =?UTF-8?q?[refactor]=20=EC=97=AC=ED=96=89=20?= =?UTF-8?q?=ED=9B=84=EA=B8=B0=20=EB=8C=93=EA=B8=80(TripRecordComment)=20DB?= =?UTF-8?q?=20=ED=85=8C=EC=9D=B4=EB=B8=94=20id=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.=20comment=5Fid=20->=20trip=5Frecord=5Fcomment=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/comment/triprecord/entity/TripRecordComment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/entity/TripRecordComment.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/entity/TripRecordComment.java index 6fea0f28..ae1afeaf 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/entity/TripRecordComment.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/entity/TripRecordComment.java @@ -22,7 +22,7 @@ public class TripRecordComment extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "comment_id") + @Column(name = "trip_record_comment_id") private Long id; @ManyToOne(fetch = LAZY) From 9635f191282700eb49b816d810eabb0fbde7c1c0 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 19:41:57 +0900 Subject: [PATCH 09/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=97=B9=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80(PlaceRev=ED=98=84ewComm?= =?UTF-8?q?ent)=20=EB=8C=80=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentController.java | 27 ++++------ .../service/PlaceReviewCommentService.java | 51 ++++++++----------- 2 files changed, 33 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java index 10c64efc..a46e8cb0 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java @@ -3,19 +3,14 @@ import com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto; import com.haejwo.tripcometrue.domain.comment.placereview.service.PlaceReviewCommentService; import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; import com.haejwo.tripcometrue.global.util.ResponseDTO; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import static org.springframework.data.domain.Sort.Direction; - @RestController @RequiredArgsConstructor @RequestMapping("/v1/places/reviews") @@ -27,23 +22,23 @@ public class PlaceReviewCommentController { public ResponseEntity> registerComment( @AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable Long placeReviewId, - @RequestBody @Valid PlaceReviewCommentRequestDto requestDto + @RequestBody @Valid com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto requestDto ) { commentService.saveComment(principalDetails, placeReviewId, requestDto); return ResponseEntity.ok(ResponseDTO.ok()); } -// @PostMapping("/comments/{tripRecordCommentId}/reply-comments") -// public ResponseEntity> registerReplyComment( -// @AuthenticationPrincipal PrincipalDetails principalDetails, -// @PathVariable Long tripRecordCommentId, -// @RequestBody @Valid TripRecordCommentRequestDto requestDto -// ) { -// -// commentService.saveReplyComment(principalDetails, tripRecordCommentId, requestDto); -// return ResponseEntity.ok(ResponseDTO.ok()); -// } + @PostMapping("/comments/{placeReviewCommentId}/reply-comments") + public ResponseEntity> registerReplyComment( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable Long placeReviewCommentId, + @RequestBody @Valid PlaceReviewCommentRequestDto requestDto + ) { + + commentService.saveReplyComment(principalDetails, placeReviewCommentId, requestDto); + return ResponseEntity.ok(ResponseDTO.ok()); + } // // @GetMapping("/{tripRecordId}/comments") // public ResponseEntity> getCommentList( diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java index 307133bc..2be6f9fe 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java @@ -2,29 +2,22 @@ import com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto; import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.comment.placereview.exception.PlaceReviewCommentNotFoundException; import com.haejwo.tripcometrue.domain.comment.placereview.repository.PlaceReviewCommentRepository; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.response.TripRecordCommentListResponseDto; import com.haejwo.tripcometrue.domain.comment.triprecord.entity.TripRecordComment; import com.haejwo.tripcometrue.domain.comment.triprecord.exception.TripRecordCommentNotFoundException; import com.haejwo.tripcometrue.domain.member.entity.Member; -import com.haejwo.tripcometrue.domain.member.exception.UserInvalidAccessException; import com.haejwo.tripcometrue.domain.member.exception.UserNotFoundException; import com.haejwo.tripcometrue.domain.member.repository.MemberRepository; import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; import com.haejwo.tripcometrue.domain.review.placereview.exception.PlaceReviewNotFoundException; import com.haejwo.tripcometrue.domain.review.placereview.repository.PlaceReviewRepository; -import com.haejwo.tripcometrue.domain.triprecord.entity.TripRecord; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Objects; - @Slf4j @Service @RequiredArgsConstructor @@ -38,13 +31,13 @@ public class PlaceReviewCommentService { public void saveComment( PrincipalDetails principalDetails, Long placeReviewId, - PlaceReviewCommentRequestDto requestDto + com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto requestDto ) { Member loginMember = getMember(principalDetails); PlaceReview placeReview = getPlaceReviewById(placeReviewId); - PlaceReviewComment comment = PlaceReviewCommentRequestDto.toComment(loginMember, placeReview, requestDto); + PlaceReviewComment comment = com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto.toComment(loginMember, placeReview, requestDto); placeReviewCommentRepository.save(comment); placeReview.increaseCommentCount(); } @@ -59,25 +52,25 @@ private PlaceReview getPlaceReviewById(Long placeReviewId) { .orElseThrow(PlaceReviewNotFoundException::new); } -// public void saveReplyComment( -// PrincipalDetails principalDetails, -// Long tripRecordCommentId, -// TripRecordCommentRequestDto requestDto -// ) { -// -// Member loginMember = getMember(principalDetails); -// TripRecordComment tripRecordComment = getTripRecordCommentById(tripRecordCommentId); -// TripRecord tripRecord = tripRecordComment.getTripRecord(); -// -// TripRecordComment comment = TripRecordCommentRequestDto.toReplyComment(loginMember, tripRecord, tripRecordComment, requestDto); -// tripRecordCommentRepository.save(comment); -// tripRecord.incrementCommentCount(); -// } -// -// private TripRecordComment getTripRecordCommentById(Long tripRecordCommentId) { -// return tripRecordCommentRepository.findById(tripRecordCommentId) -// .orElseThrow(TripRecordCommentNotFoundException::new); -// } + public void saveReplyComment( + PrincipalDetails principalDetails, + Long placeReviewCommentId, + PlaceReviewCommentRequestDto requestDto + ) { + + Member loginMember = getMember(principalDetails); + PlaceReviewComment placeReviewComment = getPlaceReviewCommentById(placeReviewCommentId); + PlaceReview placeReview = placeReviewComment.getPlaceReview(); + + PlaceReviewComment comment = PlaceReviewCommentRequestDto.toReplyComment(loginMember, placeReview, placeReviewComment, requestDto); + placeReviewCommentRepository.save(comment); + placeReview.increaseCommentCount(); + } + + private PlaceReviewComment getPlaceReviewCommentById(Long tripRecordCommentId) { + return placeReviewCommentRepository.findById(tripRecordCommentId) + .orElseThrow(PlaceReviewCommentNotFoundException::new); + } // // @Transactional(readOnly = true) // public TripRecordCommentListResponseDto getCommentList( From 04a59a54a17a29c8d2d3f151a5d4e416b86921da Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Wed, 24 Jan 2024 20:00:24 +0900 Subject: [PATCH 10/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=97=B9=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80/=EB=8C=80=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentController.java | 20 +++--- .../service/PlaceReviewCommentService.java | 65 ++++++++++--------- .../placereview/entity/PlaceReview.java | 4 +- 3 files changed, 46 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java index a46e8cb0..8133485c 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java @@ -51,14 +51,14 @@ public ResponseEntity> registerReplyComment( // commentService.getCommentList(principalDetails, tripRecordId, pageable); // return ResponseEntity.ok(ResponseDTO.okWithData(responseDto)); // } -// -// @DeleteMapping("/comments/{tripRecordCommentId}") -// public ResponseEntity> deleteComment( -// @AuthenticationPrincipal PrincipalDetails principalDetails, -// @PathVariable Long tripRecordCommentId -// ) { -// -// commentService.removeComment(principalDetails, tripRecordCommentId); -// return ResponseEntity.ok(ResponseDTO.ok()); -// } + + @DeleteMapping("/comments/{placeReviewCommentId}") + public ResponseEntity> deleteComment( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable Long placeReviewCommentId + ) { + + commentService.removeComment(principalDetails, placeReviewCommentId); + return ResponseEntity.ok(ResponseDTO.ok()); + } } diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java index 2be6f9fe..d525895a 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java @@ -7,6 +7,7 @@ import com.haejwo.tripcometrue.domain.comment.triprecord.entity.TripRecordComment; import com.haejwo.tripcometrue.domain.comment.triprecord.exception.TripRecordCommentNotFoundException; import com.haejwo.tripcometrue.domain.member.entity.Member; +import com.haejwo.tripcometrue.domain.member.exception.UserInvalidAccessException; import com.haejwo.tripcometrue.domain.member.exception.UserNotFoundException; import com.haejwo.tripcometrue.domain.member.repository.MemberRepository; import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; @@ -18,6 +19,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Objects; + @Slf4j @Service @RequiredArgsConstructor @@ -67,8 +70,8 @@ public void saveReplyComment( placeReview.increaseCommentCount(); } - private PlaceReviewComment getPlaceReviewCommentById(Long tripRecordCommentId) { - return placeReviewCommentRepository.findById(tripRecordCommentId) + private PlaceReviewComment getPlaceReviewCommentById(Long placeReviewCommentId) { + return placeReviewCommentRepository.findById(placeReviewCommentId) .orElseThrow(PlaceReviewCommentNotFoundException::new); } // @@ -85,33 +88,33 @@ private PlaceReviewComment getPlaceReviewCommentById(Long tripRecordCommentId) { // Slice tripRecordComments = tripRecordCommentRepository.findByTripRecord(tripRecord, pageable); // return TripRecordCommentListResponseDto.fromData(tripRecord.getCommentCount(), tripRecordComments, loginMember); // } -// -// public void removeComment(PrincipalDetails principalDetails, Long tripRecordCommentId) { -// -// Member loginMember = getMember(principalDetails); -// TripRecordComment tripRecordComment = getTripRecordComment(tripRecordCommentId); -// TripRecord tripRecord = tripRecordComment.getTripRecord(); -// -// validateRightMemberAccess(loginMember, tripRecordComment); -// -// int removedCount = getRemovedCount(tripRecordCommentId, tripRecordComment); -// tripRecord.decreaseCommentCount(removedCount); -// } -// -// private int getRemovedCount(Long tripRecordCommentId, TripRecordComment tripRecordComment) { -// int childrenCount = tripRecordCommentRepository.deleteChildrenByTripRecordCommentId(tripRecordComment.getId()); -// int parentCount = tripRecordCommentRepository.deleteParentByTripRecordCommentId(tripRecordCommentId); -// return childrenCount + parentCount; -// } -// -// private TripRecordComment getTripRecordComment(Long tripRecordCommentId) { -// return tripRecordCommentRepository.findById(tripRecordCommentId) -// .orElseThrow(TripRecordCommentNotFoundException::new); -// } -// -// private void validateRightMemberAccess(Member member, TripRecordComment tripRecordComment) { -// if (!Objects.equals(tripRecordComment.getMember().getId(), member.getId())) { -// throw new UserInvalidAccessException(); -// } -// } + + public void removeComment(PrincipalDetails principalDetails, Long placeReviewCommentId) { + + Member loginMember = getMember(principalDetails); + PlaceReviewComment placeReviewComment = getPlaceReviewComment(placeReviewCommentId); + PlaceReview placeReview = placeReviewComment.getPlaceReview(); + + validateRightMemberAccess(loginMember, placeReviewComment); + + int removedCount = getRemovedCount(placeReviewCommentId, placeReviewComment); + placeReview.decreaseCommentCount(removedCount); + } + + private PlaceReviewComment getPlaceReviewComment(Long placeReviewCommentId) { + return placeReviewCommentRepository.findById(placeReviewCommentId) + .orElseThrow(PlaceReviewCommentNotFoundException::new); + } + + private int getRemovedCount(Long placeReviewCommentId, PlaceReviewComment placeReviewComment) { + int childrenCount = placeReviewCommentRepository.deleteChildrenByPlaceReviewCommentId(placeReviewComment.getId()); + int parentCount = placeReviewCommentRepository.deleteParentByPlaceReviewCommentId(placeReviewCommentId); + return childrenCount + parentCount; + } + + private void validateRightMemberAccess(Member member, PlaceReviewComment placeReviewComment) { + if (!Objects.equals(placeReviewComment.getMember().getId(), member.getId())) { + throw new UserInvalidAccessException(); + } + } } diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java index ed7069cf..ac3a2668 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java @@ -87,8 +87,8 @@ public void increaseCommentCount() { commentCount += 1; } - public void decreaseCommentCount() { - commentCount -= 1; + public void decreaseCommentCount(int count) { + this.commentCount -= count; } @PrePersist From f7fadb84be10dc2c2a3df869cbb0fe8279f34dd8 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 01:04:18 +0900 Subject: [PATCH 11/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=20=ED=9B=84?= =?UTF-8?q?=EA=B8=B0=20=EB=A6=AC=EB=B7=B0=20=EB=8C=93=EA=B8=80,=20?= =?UTF-8?q?=EC=97=AC=ED=96=89=EC=A7=80=20=EB=A6=AC=EB=B7=B0=20=EB=8C=93?= =?UTF-8?q?=EA=B8=80=20=EB=B0=98=ED=99=98=20DTO=EC=97=90=20content=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../placereview/dto/response/PlaceReviewCommentResponseDto.java | 2 ++ .../triprecord/dto/response/TripRecordCommentResponseDto.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java index 938b38c6..bc8e21f9 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/dto/response/PlaceReviewCommentResponseDto.java @@ -16,6 +16,7 @@ public record PlaceReviewCommentResponseDto( String profileUrl, String nickname, boolean isWriter, + String content, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH-mm-ss") LocalDateTime createdAt, @@ -31,6 +32,7 @@ public static PlaceReviewCommentResponseDto fromEntity(PlaceReviewComment placeR placeReviewComment.getMember().getProfileImage(), placeReviewComment.getMember().getMemberBase().getNickname(), isWriter(placeReviewComment, loginMember), + placeReviewComment.getContent(), placeReviewComment.getCreatedAt(), getReplyComments(placeReviewComment, loginMember) //자식 댓글 리스트에 담기 ); diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/response/TripRecordCommentResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/response/TripRecordCommentResponseDto.java index 63e5eee7..01ea4e73 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/response/TripRecordCommentResponseDto.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/triprecord/dto/response/TripRecordCommentResponseDto.java @@ -15,6 +15,7 @@ public record TripRecordCommentResponseDto( Long memberId, String profileUrl, String nickname, + String content, boolean isWriter, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH-mm-ss") @@ -30,6 +31,7 @@ public static TripRecordCommentResponseDto fromEntity(TripRecordComment tripReco tripRecordComment.getMember().getId(), tripRecordComment.getMember().getProfileImage(), tripRecordComment.getMember().getMemberBase().getNickname(), + tripRecordComment.getContent(), isWriter(tripRecordComment, loginMember), tripRecordComment.getCreatedAt(), getReplyComments(tripRecordComment, loginMember) //자식 댓글 리스트에 담기 From 88acda5647de52fbe9210ca782d5e6e6020fa5e2 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:21:26 +0900 Subject: [PATCH 12/18] =?UTF-8?q?[refactor]=20=EC=97=AC=ED=96=89=EC=A7=80?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0(PlaceReview)=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=EC=9D=98=20OneToMany=20=EC=97=B0=EA=B4=80=EA=B4=80?= =?UTF-8?q?=EA=B3=84=EC=97=90=20cascade.REMOVE=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/review/placereview/entity/PlaceReview.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java index ac3a2668..e893a3bb 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java @@ -16,6 +16,7 @@ import static com.haejwo.tripcometrue.domain.review.global.PointType.ONLY_ONE_POINT; import static com.haejwo.tripcometrue.domain.review.global.PointType.TWO_POINTS; +import static jakarta.persistence.CascadeType.*; import static jakarta.persistence.FetchType.LAZY; @Getter @@ -36,7 +37,7 @@ public class PlaceReview extends BaseTimeEntity { @JoinColumn(name = "place_id") private Place place; - @OneToMany(mappedBy = "placeReview") + @OneToMany(mappedBy = "placeReview", cascade = REMOVE, orphanRemoval = true) private List placeReviewLikeses = new ArrayList<>(); @Column(nullable = false) From 0b52b2bf7236c4f2099c1a3627abc4a8e49057dc Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:25:18 +0900 Subject: [PATCH 13/18] =?UTF-8?q?[feat]=20=EC=97=AC=ED=96=89=EC=A7=80=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0(PlaceReivew)=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95=EC=8B=9C=20=EB=8C=93=EA=B8=80(Pl?= =?UTF-8?q?aceReviewComment)=EB=8F=84=20=ED=95=A8=EA=BB=98=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PlaceReviewCommentController.java | 13 ---- .../PlaceReviewCommentRepository.java | 2 +- .../service/PlaceReviewCommentService.java | 16 ----- .../dto/response/PlaceReviewResponseDto.java | 72 +++++++++++++++---- .../service/PlaceReviewService.java | 40 +++++++---- 5 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java index 8133485c..794cb2b4 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/controller/PlaceReviewCommentController.java @@ -2,7 +2,6 @@ import com.haejwo.tripcometrue.domain.comment.placereview.dto.request.PlaceReviewCommentRequestDto; import com.haejwo.tripcometrue.domain.comment.placereview.service.PlaceReviewCommentService; -import com.haejwo.tripcometrue.domain.comment.triprecord.dto.request.TripRecordCommentRequestDto; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; import com.haejwo.tripcometrue.global.util.ResponseDTO; import jakarta.validation.Valid; @@ -39,18 +38,6 @@ public ResponseEntity> registerReplyComment( commentService.saveReplyComment(principalDetails, placeReviewCommentId, requestDto); return ResponseEntity.ok(ResponseDTO.ok()); } -// -// @GetMapping("/{tripRecordId}/comments") -// public ResponseEntity> getCommentList( -// @AuthenticationPrincipal PrincipalDetails principalDetails, -// @PathVariable Long tripRecordId, -// @PageableDefault(sort = "createdAt", direction = Direction.DESC) Pageable pageable -// ) { -// -// TripRecordCommentListResponseDto responseDto = -// commentService.getCommentList(principalDetails, tripRecordId, pageable); -// return ResponseEntity.ok(ResponseDTO.okWithData(responseDto)); -// } @DeleteMapping("/comments/{placeReviewCommentId}") public ResponseEntity> deleteComment( diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java index 96bbb95e..816dcf03 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/repository/PlaceReviewCommentRepository.java @@ -11,7 +11,7 @@ public interface PlaceReviewCommentRepository extends JpaRepository { - Slice findByPlaceReview(PlaceReview placeReview, Pageable pageable); + Slice findByPlaceReviewOrderByCreatedAtDesc(PlaceReview placeReview, Pageable pageable); @Modifying @Query("delete from PlaceReviewComment prc where prc.parentComment.id = :placeReviewCommentId") diff --git a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java index d525895a..91e97e7f 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/comment/placereview/service/PlaceReviewCommentService.java @@ -4,8 +4,6 @@ import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; import com.haejwo.tripcometrue.domain.comment.placereview.exception.PlaceReviewCommentNotFoundException; import com.haejwo.tripcometrue.domain.comment.placereview.repository.PlaceReviewCommentRepository; -import com.haejwo.tripcometrue.domain.comment.triprecord.entity.TripRecordComment; -import com.haejwo.tripcometrue.domain.comment.triprecord.exception.TripRecordCommentNotFoundException; import com.haejwo.tripcometrue.domain.member.entity.Member; import com.haejwo.tripcometrue.domain.member.exception.UserInvalidAccessException; import com.haejwo.tripcometrue.domain.member.exception.UserNotFoundException; @@ -74,20 +72,6 @@ private PlaceReviewComment getPlaceReviewCommentById(Long placeReviewCommentId) return placeReviewCommentRepository.findById(placeReviewCommentId) .orElseThrow(PlaceReviewCommentNotFoundException::new); } -// -// @Transactional(readOnly = true) -// public TripRecordCommentListResponseDto getCommentList( -// PrincipalDetails principalDetails, -// Long tripRecordId, -// Pageable pageable -// ) { -// -// Member loginMember = getMember(principalDetails); -// TripRecord tripRecord = getPlaceReviewById(tripRecordId); -// -// Slice tripRecordComments = tripRecordCommentRepository.findByTripRecord(tripRecord, pageable); -// return TripRecordCommentListResponseDto.fromData(tripRecord.getCommentCount(), tripRecordComments, loginMember); -// } public void removeComment(PrincipalDetails principalDetails, Long placeReviewCommentId) { diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewResponseDto.java index 18858fd1..8150377c 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewResponseDto.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewResponseDto.java @@ -1,9 +1,15 @@ package com.haejwo.tripcometrue.domain.review.placereview.dto.response; import com.fasterxml.jackson.annotation.JsonFormat; +import com.haejwo.tripcometrue.domain.comment.placereview.dto.response.PlaceReviewCommentResponseDto; +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.member.entity.Member; import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; +import org.springframework.data.domain.Slice; import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; public record PlaceReviewResponseDto( @@ -19,21 +25,57 @@ public record PlaceReviewResponseDto( LocalDateTime createdAt, boolean amILike, - Integer commentCount + Integer commentCount, + List comments ) { - public static PlaceReviewResponseDto fromEntity(PlaceReview placeReview, boolean amILike) { - return new PlaceReviewResponseDto( - placeReview.getId(), - placeReview.getMember().getId(), - placeReview.getMember().getMemberBase().getNickname(), - placeReview.getMember().getProfileImage(), - placeReview.getImageUrl(), - placeReview.getContent(), - placeReview.getLikeCount(), - placeReview.getCreatedAt(), - amILike, - placeReview.getCommentCount() - ); - } + + public static PlaceReviewResponseDto fromEntityWithComment( + PlaceReview placeReview, + boolean amILike, + Slice placeReviewComments, + Member member + ) { + + return new PlaceReviewResponseDto( + placeReview.getId(), + placeReview.getMember().getId(), + placeReview.getMember().getMemberBase().getNickname(), + placeReview.getMember().getProfileImage(), + placeReview.getImageUrl(), + placeReview.getContent(), + placeReview.getLikeCount(), + placeReview.getCreatedAt(), + amILike, + placeReview.getCommentCount(), + placeReviewComments.map(placeReviewComment -> { + if (placeReviewComment.getParentComment() == null) { + return PlaceReviewCommentResponseDto.fromEntity(placeReviewComment, member); + } + return null; + }) + .filter(Objects::nonNull) + .toList() + ); + } + + public static PlaceReviewResponseDto fromEntity( + PlaceReview placeReview, + boolean amILike + ) { + + return new PlaceReviewResponseDto( + placeReview.getId(), + placeReview.getMember().getId(), + placeReview.getMember().getMemberBase().getNickname(), + placeReview.getMember().getProfileImage(), + placeReview.getImageUrl(), + placeReview.getContent(), + placeReview.getLikeCount(), + placeReview.getCreatedAt(), + amILike, + placeReview.getCommentCount(), + null + ); + } } diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/service/PlaceReviewService.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/service/PlaceReviewService.java index 52f6fc98..14988644 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/service/PlaceReviewService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/service/PlaceReviewService.java @@ -1,5 +1,7 @@ package com.haejwo.tripcometrue.domain.review.placereview.service; +import com.haejwo.tripcometrue.domain.comment.placereview.entity.PlaceReviewComment; +import com.haejwo.tripcometrue.domain.comment.placereview.repository.PlaceReviewCommentRepository; import com.haejwo.tripcometrue.domain.likes.entity.PlaceReviewLikes; import com.haejwo.tripcometrue.domain.member.entity.Member; import com.haejwo.tripcometrue.domain.member.exception.UserInvalidAccessException; @@ -22,15 +24,11 @@ import com.haejwo.tripcometrue.domain.review.placereview.exception.PlaceReviewNotFoundException; import com.haejwo.tripcometrue.domain.review.placereview.repository.PlaceReviewRepository; import com.haejwo.tripcometrue.global.springsecurity.PrincipalDetails; - -import jakarta.persistence.EntityManager; -import java.util.ArrayList; -import java.util.List; - import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +45,7 @@ public class PlaceReviewService { private final PlaceReviewRepository placeReviewRepository; private final PlaceRepository placeRepository; private final MemberRepository memberRepository; + private final PlaceReviewCommentRepository placeReviewCommentRepository; @Transactional public RegisterPlaceReviewResponseDto savePlaceReview( @@ -63,11 +62,13 @@ public RegisterPlaceReviewResponseDto savePlaceReview( PlaceReview placeReview = PlaceReviewRequestDto.toEntity(loginMember, place, requestDto); placeReview.save(requestDto, loginMember); - return RegisterPlaceReviewResponseDto - .fromEntity(placeReviewRepository.save(placeReview)); + return RegisterPlaceReviewResponseDto.fromEntity(placeReviewRepository.save(placeReview)); } private Member getMember(PrincipalDetails principalDetails) { + if (principalDetails == null) { + return null; + } return memberRepository.findById(principalDetails.getMember().getId()) .orElseThrow(UserNotFoundException::new); } @@ -92,7 +93,10 @@ public PlaceReviewResponseDto getPlaceReview(PrincipalDetails principalDetails, hasLiked = hasLikedPlaceReview(principalDetails, placeReview); } - return PlaceReviewResponseDto.fromEntity(placeReview, hasLiked); + Member loginMember = getMember(principalDetails); + Slice comments = getPlaceReviewSlice(placeReview); + + return PlaceReviewResponseDto.fromEntityWithComment(placeReview, hasLiked, comments, loginMember); } private PlaceReview getPlaceReviewById(Long placeReviewId) { @@ -112,6 +116,10 @@ private boolean hasLikedPlaceReview(PrincipalDetails principalDetails, PlaceRevi return memberIds.contains(principalDetails.getMember().getId()); } + private Slice getPlaceReviewSlice(PlaceReview placeReview) { + return placeReviewCommentRepository.findByPlaceReviewOrderByCreatedAtDesc(placeReview, null); + } + @Transactional public PlaceReviewResponseDto modifyPlaceReview( PrincipalDetails principalDetails, @@ -124,9 +132,10 @@ public PlaceReviewResponseDto modifyPlaceReview( validateRightMemberAccess(loginMember, placeReview); placeReview.update(requestDto, loginMember); + Slice comments = getPlaceReviewSlice(placeReview); return PlaceReviewResponseDto - .fromEntity(placeReview, hasLikedPlaceReview(principalDetails, placeReview)); + .fromEntityWithComment(placeReview, hasLikedPlaceReview(principalDetails, placeReview), comments, loginMember); } private void validateRightMemberAccess(Member member, PlaceReview placeReview) { @@ -177,9 +186,16 @@ public PlaceReviewListResponseDto getPlaceReviewList( return PlaceReviewListResponseDto.fromResponseDtos( reviews, - reviews.map(placeReview -> PlaceReviewResponseDto.fromEntity( - placeReview, - hasLikedPlaceReview(principalDetails, placeReview)) + reviews.map(placeReview -> { + boolean hasLiked = false; + if (principalDetails != null) { + hasLiked = hasLikedPlaceReview(principalDetails, placeReview); + } + return PlaceReviewResponseDto.fromEntity( + placeReview, + hasLiked + ); + } ).toList()); } From 45b4d73061a94ccb71dcf4ce874929a4e5ed178c Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:26:12 +0900 Subject: [PATCH 14/18] =?UTF-8?q?[refactor]=20=EC=97=AC=ED=96=89=20?= =?UTF-8?q?=ED=9B=84=EA=B8=B0=20=EB=A6=AC=EB=B7=B0(TripRecordReview)=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=9D=98=20OneToMany=20=EC=97=B0?= =?UTF-8?q?=EA=B4=80=EA=B4=80=EA=B3=84=EC=97=90=20cascade.REMOVE=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../review/triprecordreview/entity/TripRecordReview.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java index 25f99358..b4e67339 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java @@ -18,6 +18,7 @@ import static com.haejwo.tripcometrue.domain.review.global.PointType.ONLY_ONE_POINT; import static com.haejwo.tripcometrue.domain.review.global.PointType.TWO_POINTS; +import static jakarta.persistence.CascadeType.*; @Getter @Entity @@ -37,7 +38,7 @@ public class TripRecordReview extends BaseTimeEntity { @JoinColumn(name = "trip_record_id") private TripRecord tripRecord; - @OneToMany(mappedBy = "tripRecordReview") + @OneToMany(mappedBy = "tripRecordReview", cascade = REMOVE, orphanRemoval = true) private List tripRecordReviewLikeses = new ArrayList<>(); @NotNull From 766efd4170ef1fc0f2d842264ededec923a9ba74 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:27:23 +0900 Subject: [PATCH 15/18] =?UTF-8?q?[fix]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=8F=84=20=EC=97=AC=ED=96=89=20=ED=9B=84=EA=B8=B0=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0(TripRecordReview)=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TripRecordReviewService.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java index 67bf3c63..f494b71d 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java @@ -215,9 +215,17 @@ public TripRecordReviewListResponseDto getTripRecordReviewList( return TripRecordReviewListResponseDto.fromResponseDtos( reviews, - reviews.map(tripRecordReview -> TripRecordReviewResponseDto.fromEntity( - tripRecordReview, - hasLikedTripRecordReview(principalDetails, tripRecordReview)) + reviews.map(tripRecordReview -> { + boolean hasLiked = false; + if (principalDetails != null) { + hasLiked = hasLikedTripRecordReview(principalDetails, tripRecordReview); + } + return TripRecordReviewResponseDto.fromEntity( + tripRecordReview, + hasLiked + + ); + } ).toList()); } From ecabc81933aa592675018cd1b3aff392844ca882 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:31:09 +0900 Subject: [PATCH 16/18] =?UTF-8?q?[fix]=20=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=8F=84=20=EC=B5=9C=EC=8B=A0=201=EA=B1=B4=EC=9D=98=20?= =?UTF-8?q?=EC=97=AC=ED=96=89=20=ED=9B=84=EA=B8=B0=20=EB=A6=AC=EB=B7=B0(Tr?= =?UTF-8?q?ipRecordReview)=20=EC=A1=B0=ED=9A=8C=EA=B0=80=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../triprecordreview/service/TripRecordReviewService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java index f494b71d..5d94ba13 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/service/TripRecordReviewService.java @@ -64,6 +64,9 @@ public EvaluateTripRecordReviewResponseDto saveRatingScore( } private Member getMember(PrincipalDetails principalDetails) { + if (principalDetails == null) { + return null; + } return memberRepository.findById(principalDetails.getMember().getId()) .orElseThrow(UserNotFoundException::new); } From 31bfdf6031f622671e7e0eaf12005972c30a6cd8 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 02:38:36 +0900 Subject: [PATCH 17/18] =?UTF-8?q?[refactor]=20=EC=97=AC=ED=96=89=EC=A7=80?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0,=20=EC=97=AC=ED=96=89=20=ED=9B=84?= =?UTF-8?q?=EA=B8=B0=20=EB=A6=AC=EB=B7=B0=20=EC=BD=94=EB=93=9C=20import=20?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=95=EB=A6=AC=20=EB=B0=8F=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PlaceReviewController.java | 3 --- .../dto/response/PlaceReviewListResponseDto.java | 1 - .../review/placereview/entity/PlaceReview.java | 2 +- .../entity/TripRecordReview.java | 2 +- .../repository/TripRecordReviewRepository.java | 16 ++++++++-------- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/controller/PlaceReviewController.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/controller/PlaceReviewController.java index 880bfa6a..6cabddfa 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/controller/PlaceReviewController.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/controller/PlaceReviewController.java @@ -1,8 +1,5 @@ package com.haejwo.tripcometrue.domain.review.placereview.controller; -import static org.springframework.http.HttpStatus.CREATED; -import static org.springframework.http.HttpStatus.MULTI_STATUS; - import com.haejwo.tripcometrue.domain.review.placereview.dto.request.DeletePlaceReviewRequestDto; import com.haejwo.tripcometrue.domain.review.placereview.dto.request.PlaceReviewRequestDto; import com.haejwo.tripcometrue.domain.review.placereview.dto.response.PlaceReviewListResponseDto; diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewListResponseDto.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewListResponseDto.java index 7602abcf..df42fdaa 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewListResponseDto.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/dto/response/PlaceReviewListResponseDto.java @@ -1,6 +1,5 @@ package com.haejwo.tripcometrue.domain.review.placereview.dto.response; -import com.fasterxml.jackson.annotation.JsonFormat; import com.haejwo.tripcometrue.domain.review.placereview.entity.PlaceReview; import org.springframework.data.domain.Page; diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java index e893a3bb..b710fae5 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/placereview/entity/PlaceReview.java @@ -16,7 +16,7 @@ import static com.haejwo.tripcometrue.domain.review.global.PointType.ONLY_ONE_POINT; import static com.haejwo.tripcometrue.domain.review.global.PointType.TWO_POINTS; -import static jakarta.persistence.CascadeType.*; +import static jakarta.persistence.CascadeType.REMOVE; import static jakarta.persistence.FetchType.LAZY; @Getter diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java index b4e67339..846ee42f 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/entity/TripRecordReview.java @@ -18,7 +18,7 @@ import static com.haejwo.tripcometrue.domain.review.global.PointType.ONLY_ONE_POINT; import static com.haejwo.tripcometrue.domain.review.global.PointType.TWO_POINTS; -import static jakarta.persistence.CascadeType.*; +import static jakarta.persistence.CascadeType.REMOVE; @Getter @Entity diff --git a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/repository/TripRecordReviewRepository.java b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/repository/TripRecordReviewRepository.java index d53fb17b..da3da156 100644 --- a/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/repository/TripRecordReviewRepository.java +++ b/src/main/java/com/haejwo/tripcometrue/domain/review/triprecordreview/repository/TripRecordReviewRepository.java @@ -15,16 +15,16 @@ @Repository public interface TripRecordReviewRepository extends JpaRepository, TripRecordReviewRepositoryCustom { - @Query("select trr from TripRecordReview trr join fetch trr.member m where trr.member = :member and trr.content is not null order by trr.createdAt desc") - Page findByMember(@Param("member") Member member, Pageable pageable); + @Query("select trr from TripRecordReview trr join fetch trr.member m where trr.member = :member and trr.content is not null order by trr.createdAt desc") + Page findByMember(@Param("member") Member member, Pageable pageable); - @Query("select trr.ratingScore from TripRecordReview trr where trr.member = :member and trr.tripRecord.id = :tripRecordId") - Optional findMyScoreByMemberAndTripRecordId(@Param("member") Member member, @Param("tripRecordId") Long tripRecordId); + @Query("select trr.ratingScore from TripRecordReview trr where trr.member = :member and trr.tripRecord.id = :tripRecordId") + Optional findMyScoreByMemberAndTripRecordId(@Param("member") Member member, @Param("tripRecordId") Long tripRecordId); - @Query("select trr from TripRecordReview trr where trr.tripRecord.id = :tripRecordId and trr.content is not null order by trr.createdAt desc limit 1") - Optional findTopByTripRecordIdOrderByCreatedAtDesc(@Param("tripRecordId") Long tripRecordId); + @Query("select trr from TripRecordReview trr where trr.tripRecord.id = :tripRecordId and trr.content is not null order by trr.createdAt desc limit 1") + Optional findTopByTripRecordIdOrderByCreatedAtDesc(@Param("tripRecordId") Long tripRecordId); - boolean existsByMemberAndTripRecord(Member member, TripRecord tripRecord); + boolean existsByMemberAndTripRecord(Member member, TripRecord tripRecord); - Long countByTripRecordId(Long tripRecordId); + Long countByTripRecordId(Long tripRecordId); } From d974c626890b98be2ca744127749584d88b49459 Mon Sep 17 00:00:00 2001 From: kimdongmin Date: Thu, 25 Jan 2024 11:23:39 +0900 Subject: [PATCH 18/18] =?UTF-8?q?[docs]=20place=5Freview=5Fcomment.http=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/comment/place_review_comment.http | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/http/comment/place_review_comment.http diff --git a/src/test/http/comment/place_review_comment.http b/src/test/http/comment/place_review_comment.http new file mode 100644 index 00000000..739ac2f3 --- /dev/null +++ b/src/test/http/comment/place_review_comment.http @@ -0,0 +1,20 @@ +### 여행지 리뷰 댓글 달기 +POST localhost:8080/v1/places/reviews/1/comments +Content-Type: application/json + +{ + "content": "첫 댓글입니다 ㅎㅎ" +} + + +### 여행지 리뷰 대댓글 달기 +POST localhost:8080/v1/places/reviews/comments/1/reply-comments +Content-Type: application/json + +{ + "content": "대댓글 입니다! ㅎㅎ" +} + + +### 여행지 리뷰 댓글 / 대댓글 삭제 +DELETE localhost:8080/v1/places/reviews/comments/1 \ No newline at end of file