diff --git a/src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeCommandApiV2.java b/src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeCommandApiV2.java index 473a3d04..a8ffd29d 100644 --- a/src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeCommandApiV2.java +++ b/src/main/java/com/kustacks/kuring/notice/adapter/in/web/NoticeCommandApiV2.java @@ -3,6 +3,8 @@ import com.kustacks.kuring.common.annotation.RestWebAdapter; import com.kustacks.kuring.common.dto.BaseResponse; import com.kustacks.kuring.notice.adapter.in.web.dto.NoticeCommentCreateRequest; +import com.kustacks.kuring.notice.adapter.in.web.dto.NoticeCommentEditRequest; +import com.kustacks.kuring.notice.application.port.in.NoticeCommentEditingUseCase; import com.kustacks.kuring.notice.application.port.in.NoticeCommentWritingUseCase; import com.kustacks.kuring.notice.application.port.in.NoticeCommentWritingUseCase.WriteCommentCommand; import com.kustacks.kuring.notice.application.port.in.NoticeCommentWritingUseCase.WriteReplyCommand; @@ -28,6 +30,7 @@ public class NoticeCommandApiV2 { private static final String USER_TOKEN_HEADER_KEY = "User-Token"; private final NoticeCommentWritingUseCase noticeCommentWritingUseCase; + private final NoticeCommentEditingUseCase noticeCommentEditingUseCase; @Operation(summary = "공지 댓글 추가", description = "공지에 댓글을 추가합니다") @SecurityRequirement(name = USER_TOKEN_HEADER_KEY) @@ -58,4 +61,20 @@ public ResponseEntity createComment( return ResponseEntity.ok().body(new BaseResponse<>(NOTICE_COMMENT_SAVE_SUCCESS, null)); } + + @Operation(summary = "공지 댓글 편집", description = "공지에 있는 기존의 댓글을 수정합니다") + @SecurityRequirement(name = USER_TOKEN_HEADER_KEY) + @PostMapping("/{id}/comments/{commentId}") + public ResponseEntity getSupportedCategories( + @PathVariable("id") Long id, + @PathVariable("commentId") Long commentId, + @RequestHeader(USER_TOKEN_HEADER_KEY) String userToken, + @RequestBody NoticeCommentEditRequest request + ) { + var command = new NoticeCommentEditingUseCase.EditCommentCommand(userToken, id, commentId, request.content()); + + noticeCommentEditingUseCase.process(command); + + return ResponseEntity.ok().body(new BaseResponse<>(NOTICE_COMMENT_SAVE_SUCCESS, null)); + } } diff --git a/src/main/java/com/kustacks/kuring/notice/adapter/in/web/dto/NoticeCommentEditRequest.java b/src/main/java/com/kustacks/kuring/notice/adapter/in/web/dto/NoticeCommentEditRequest.java new file mode 100644 index 00000000..bae564b4 --- /dev/null +++ b/src/main/java/com/kustacks/kuring/notice/adapter/in/web/dto/NoticeCommentEditRequest.java @@ -0,0 +1,6 @@ +package com.kustacks.kuring.notice.adapter.in.web.dto; + +public record NoticeCommentEditRequest( + String content +) { +} diff --git a/src/main/java/com/kustacks/kuring/notice/adapter/out/persistence/CommentPersistenceAdapter.java b/src/main/java/com/kustacks/kuring/notice/adapter/out/persistence/CommentPersistenceAdapter.java index ad279177..faf96619 100644 --- a/src/main/java/com/kustacks/kuring/notice/adapter/out/persistence/CommentPersistenceAdapter.java +++ b/src/main/java/com/kustacks/kuring/notice/adapter/out/persistence/CommentPersistenceAdapter.java @@ -34,6 +34,11 @@ public Optional findComment(Long id) { return commentRepository.findReadModelById(id); } + @Override + public Optional findById(Long id) { + return commentRepository.findById(id); + } + @Override public List findExcludeSubCommentByCursor(Long noticeId, String cursor, int size) { return commentRepository.findExcludeSubCommentByCursor(noticeId, cursor, size); diff --git a/src/main/java/com/kustacks/kuring/notice/application/port/in/NoticeCommentEditingUseCase.java b/src/main/java/com/kustacks/kuring/notice/application/port/in/NoticeCommentEditingUseCase.java new file mode 100644 index 00000000..3c349c46 --- /dev/null +++ b/src/main/java/com/kustacks/kuring/notice/application/port/in/NoticeCommentEditingUseCase.java @@ -0,0 +1,14 @@ +package com.kustacks.kuring.notice.application.port.in; + +public interface NoticeCommentEditingUseCase { + + void process(EditCommentCommand command); + + record EditCommentCommand( + String userToken, + Long noticeId, + Long commentId, + String content + ) { + } +} diff --git a/src/main/java/com/kustacks/kuring/notice/application/port/out/CommentQueryPort.java b/src/main/java/com/kustacks/kuring/notice/application/port/out/CommentQueryPort.java index b9e2ef51..53e3b4b8 100644 --- a/src/main/java/com/kustacks/kuring/notice/application/port/out/CommentQueryPort.java +++ b/src/main/java/com/kustacks/kuring/notice/application/port/out/CommentQueryPort.java @@ -1,6 +1,7 @@ package com.kustacks.kuring.notice.application.port.out; import com.kustacks.kuring.notice.application.port.out.dto.CommentReadModel; +import com.kustacks.kuring.notice.domain.Comment; import java.util.List; import java.util.Optional; @@ -10,6 +11,8 @@ public interface CommentQueryPort { Optional findComment(Long id); + Optional findById(Long id); + List findExcludeSubCommentByCursor(Long noticeId, String cursor, int size); List findSubCommentByIds(Set parentCommentIds); diff --git a/src/main/java/com/kustacks/kuring/notice/application/service/NoticeCommandService.java b/src/main/java/com/kustacks/kuring/notice/application/service/NoticeCommandService.java index 300b8107..9f18cb5a 100644 --- a/src/main/java/com/kustacks/kuring/notice/application/service/NoticeCommandService.java +++ b/src/main/java/com/kustacks/kuring/notice/application/service/NoticeCommandService.java @@ -3,23 +3,27 @@ import com.kustacks.kuring.common.annotation.UseCase; import com.kustacks.kuring.common.exception.NotFoundException; import com.kustacks.kuring.common.exception.code.ErrorCode; +import com.kustacks.kuring.notice.application.port.in.NoticeCommentEditingUseCase; import com.kustacks.kuring.notice.application.port.in.NoticeCommentWritingUseCase; import com.kustacks.kuring.notice.application.port.out.CommentCommandPort; import com.kustacks.kuring.notice.application.port.out.CommentQueryPort; import com.kustacks.kuring.notice.application.port.out.NoticeQueryPort; import com.kustacks.kuring.notice.application.port.out.dto.CommentReadModel; import com.kustacks.kuring.notice.application.port.out.dto.NoticeDto; +import com.kustacks.kuring.notice.domain.Comment; import com.kustacks.kuring.user.application.port.out.UserQueryPort; import com.kustacks.kuring.user.domain.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; +import java.util.Objects; + @Slf4j @UseCase @Transactional @RequiredArgsConstructor -public class NoticeCommandService implements NoticeCommentWritingUseCase { +public class NoticeCommandService implements NoticeCommentWritingUseCase, NoticeCommentEditingUseCase { private final NoticeQueryPort noticeQueryPort; private final CommentCommandPort commentCommandPort; @@ -54,4 +58,24 @@ public void process(WriteReplyCommand command) { commentCommandPort.createReply(findUser.getId(), findNotice.getId(), command.parentId(), command.content()); } + + @Override + public void process(EditCommentCommand command) { + User findUser = userQueryPort.findByToken(command.userToken()) + .orElseThrow(() -> new NotFoundException(ErrorCode.USER_NOT_FOUND)); + + NoticeDto findNotice = noticeQueryPort.findNoticeById(command.noticeId()) + .orElseThrow(() -> new NotFoundException(ErrorCode.NOTICE_NOT_FOUND)); + + Comment findComment = commentQueryPort.findById(command.commentId()) + .orElseThrow(() -> new NotFoundException(ErrorCode.COMMENT_NOT_FOUND)); + + if (!Objects.equals(findComment.getUserId(), findUser.getId()) + || !Objects.equals(findComment.getNoticeId(), findNotice.getId()) + || findComment.getDestroyedAt() != null) { + throw new NotFoundException(ErrorCode.COMMENT_NOT_FOUND); + } + + findComment.editContent(command.content()); + } } diff --git a/src/main/java/com/kustacks/kuring/notice/domain/Comment.java b/src/main/java/com/kustacks/kuring/notice/domain/Comment.java index e9e38ba9..0c790d54 100644 --- a/src/main/java/com/kustacks/kuring/notice/domain/Comment.java +++ b/src/main/java/com/kustacks/kuring/notice/domain/Comment.java @@ -52,6 +52,10 @@ public String getContent() { return content.getValue(); } + public void editContent(String content) { + this.content = new Content(content); + } + @Override public boolean equals(Object o) { if (this == o) return true;