diff --git a/src/main/java/com/jisungin/api/comment/CommentController.java b/src/main/java/com/jisungin/api/comment/CommentController.java index 39f8e67..a6061cf 100644 --- a/src/main/java/com/jisungin/api/comment/CommentController.java +++ b/src/main/java/com/jisungin/api/comment/CommentController.java @@ -2,12 +2,14 @@ import com.jisungin.api.ApiResponse; import com.jisungin.api.comment.request.CommentCreateRequest; +import com.jisungin.api.comment.request.CommentEditRequest; import com.jisungin.api.oauth.Auth; import com.jisungin.api.oauth.AuthContext; import com.jisungin.application.comment.CommentService; import com.jisungin.application.comment.response.CommentResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -28,4 +30,11 @@ public ApiResponse writeComment(@PathVariable Long talkRoomId, return ApiResponse.ok(commentService.writeComment(request.toService(), talkRoomId, authContext.getUserId())); } + @PatchMapping("/talk-rooms/comments/{commentId}") + public ApiResponse editComment(@PathVariable Long commentId, + @Valid @RequestBody CommentEditRequest request, + @Auth AuthContext authContext) { + return ApiResponse.ok(commentService.editComment(commentId, request.toService(), authContext.getUserId())); + } + } diff --git a/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java b/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java new file mode 100644 index 0000000..f6c816f --- /dev/null +++ b/src/main/java/com/jisungin/api/comment/request/CommentEditRequest.java @@ -0,0 +1,25 @@ +package com.jisungin.api.comment.request; + +import com.jisungin.application.comment.request.CommentEditServiceRequest; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CommentEditRequest { + + private String content; + + @Builder + private CommentEditRequest(String content) { + this.content = content; + } + + public CommentEditServiceRequest toService() { + return CommentEditServiceRequest.builder() + .content(content) + .build(); + } + +} diff --git a/src/main/java/com/jisungin/application/comment/CommentService.java b/src/main/java/com/jisungin/application/comment/CommentService.java index cb4e1b8..124230f 100644 --- a/src/main/java/com/jisungin/application/comment/CommentService.java +++ b/src/main/java/com/jisungin/application/comment/CommentService.java @@ -1,6 +1,7 @@ package com.jisungin.application.comment; import com.jisungin.application.comment.request.CommentCreateServiceRequest; +import com.jisungin.application.comment.request.CommentEditServiceRequest; import com.jisungin.application.comment.response.CommentResponse; import com.jisungin.domain.comment.Comment; import com.jisungin.domain.comment.repository.CommentRepository; @@ -12,7 +13,9 @@ import com.jisungin.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +@Transactional(readOnly = true) @RequiredArgsConstructor @Service public class CommentService { @@ -21,6 +24,7 @@ public class CommentService { private final TalkRoomRepository talkRoomRepository; private final UserRepository userRepository; + @Transactional public CommentResponse writeComment(CommentCreateServiceRequest request, Long talkRoomId, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); @@ -35,4 +39,19 @@ public CommentResponse writeComment(CommentCreateServiceRequest request, Long ta return CommentResponse.of(comment.getContent(), user.getName()); } + @Transactional + public CommentResponse editComment(Long commentId, CommentEditServiceRequest request, Long userId) { + Comment comment = commentRepository.findById(commentId) + .orElseThrow(() -> new BusinessException(ErrorCode.COMMENT_NOT_FOUND)); + + User user = userRepository.findById(userId).orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + + if (!comment.isCommentOwner(user.getId())) { + throw new BusinessException(ErrorCode.UNAUTHORIZED_REQUEST); + } + + comment.edit(request.getContent()); + + return CommentResponse.of(comment.getContent(), user.getName()); + } } diff --git a/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java b/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java new file mode 100644 index 0000000..827a044 --- /dev/null +++ b/src/main/java/com/jisungin/application/comment/request/CommentEditServiceRequest.java @@ -0,0 +1,18 @@ +package com.jisungin.application.comment.request; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CommentEditServiceRequest { + + private String content; + + @Builder + private CommentEditServiceRequest(String content) { + this.content = content; + } + +} diff --git a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java index 19261ac..1d2780c 100644 --- a/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java +++ b/src/main/java/com/jisungin/application/talkroom/TalkRoomService.java @@ -77,7 +77,7 @@ public TalkRoomResponse editTalkRoom(TalkRoomEditServiceRequest request, Long us throw new BusinessException(ErrorCode.UNAUTHORIZED_REQUEST); } - talkRoom.edit(request); + talkRoom.edit(request.getTitle(), request.getContent()); talkRoomRoleRepository.deleteAllByTalkRoom(talkRoom); diff --git a/src/main/java/com/jisungin/domain/comment/Comment.java b/src/main/java/com/jisungin/domain/comment/Comment.java index 54b3a70..14fed2a 100644 --- a/src/main/java/com/jisungin/domain/comment/Comment.java +++ b/src/main/java/com/jisungin/domain/comment/Comment.java @@ -4,7 +4,15 @@ import com.jisungin.domain.BaseEntity; import com.jisungin.domain.talkroom.TalkRoom; import com.jisungin.domain.user.User; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -47,4 +55,12 @@ public static Comment create(CommentCreateServiceRequest request, User user, Tal .build(); } + public boolean isCommentOwner(Long userId) { + return user.isMe(userId); + } + + public void edit(String requestContent) { + this.content = requestContent != null ? requestContent : content; + } + } diff --git a/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java b/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java index 54392ba..e05b69e 100644 --- a/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java +++ b/src/main/java/com/jisungin/domain/talkroom/TalkRoom.java @@ -1,6 +1,5 @@ package com.jisungin.domain.talkroom; -import com.jisungin.application.talkroom.request.TalkRoomEditServiceRequest; import com.jisungin.domain.BaseEntity; import com.jisungin.domain.book.Book; import com.jisungin.domain.user.User; @@ -60,9 +59,9 @@ public static TalkRoom create(String title, String content, Book book, User user .build(); } - public void edit(TalkRoomEditServiceRequest request) { - this.title = request.getTitle() != null ? request.getTitle() : title; - this.content = request.getContent() != null ? request.getContent() : content; + public void edit(String requestTitle, String requestContent) { + this.title = requestTitle != null ? requestTitle : title; + this.content = requestContent != null ? requestContent : content; } public boolean isTalkRoomOwner(Long userId) { diff --git a/src/main/java/com/jisungin/exception/ErrorCode.java b/src/main/java/com/jisungin/exception/ErrorCode.java index c76938d..35b14b8 100644 --- a/src/main/java/com/jisungin/exception/ErrorCode.java +++ b/src/main/java/com/jisungin/exception/ErrorCode.java @@ -14,7 +14,8 @@ public enum ErrorCode { PARTICIPATION_CONDITION_ERROR(400, "참가 조건은 1개 이상이어야 합니다."), OAUTH_TYPE_NOT_FOUND(404, "지원하지 않는 소셜 로그인입니다."), TALK_ROOM_NOT_FOUND(400, "토크방을 찾을 수 없습니다."), - UNAUTHORIZED_REQUEST(400, "권한이 없는 사용자입니다."); + UNAUTHORIZED_REQUEST(400, "권한이 없는 사용자입니다."), + COMMENT_NOT_FOUND(404, "의견을 찾을 수 없습니다."); private final int code;