From 9924ac3fd07a64d1afe67c970f4d149c3b94c3ed Mon Sep 17 00:00:00 2001 From: issuejong Date: Fri, 29 May 2026 23:08:20 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[Fix]=20=EB=8C=93=EA=B8=80=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20=EC=9D=91=EB=8B=B5=EC=97=90=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EC=A7=88=EB=AC=B8=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Piroin/project/domain/question/dto/QuestionResDTO.java | 1 + .../project/domain/question/service/QuestionService.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java index 5b49df7..98e4335 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java @@ -37,6 +37,7 @@ public record CommentCreateRes( Long questionId, String displayName, String content, + Boolean isResolved, LocalDateTime createdAt ) { } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java index f877bf0..c555d77 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java @@ -150,7 +150,8 @@ public QuestionResDTO.CommentCreateRes createComment( String displayName = assignAnonymousIdentity(question, loginUser); QuestionResDTO.CommentCreateRes response = new QuestionResDTO.CommentCreateRes( - comment.getId(), question.getId(), displayName, comment.getContent(), comment.getCreatedAt() + comment.getId(), question.getId(), displayName, + comment.getContent(), question.getIsResolved(), comment.getCreatedAt() ); // DB 반영이 끝난 뒤 같은 질문방 구독자들이 목록 댓글 미리보기를 갱신하도록 알린다. From 99e2df209d97484bf57ebe9fbe244c9e4bcef316 Mon Sep 17 00:00:00 2001 From: issuejong Date: Fri, 29 May 2026 23:10:34 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[Feat]=20=EB=8C=93=EA=B8=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20SSE=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=97=90=EB=8F=84?= =?UTF-8?q?=20=EC=B5=9C=EC=8B=A0=20=EC=A7=88=EB=AC=B8=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Piroin/project/domain/question/dto/QuestionResDTO.java | 2 ++ .../Piroin/project/domain/question/service/QuestionService.java | 1 + 2 files changed, 3 insertions(+) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java index 98e4335..7b15643 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java @@ -187,6 +187,8 @@ public record CommentCreatedEvent( String type, Long sessionId, Long questionId, + // 댓글 작성 후 서버 내부 규칙까지 반영된 최신 해결 상태 + Boolean isResolved, Integer commentCount, List previewComments ) { diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java index c555d77..57c5ca9 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java @@ -661,6 +661,7 @@ private void publishCommentCreatedEventAfterCommit(Question question) { "COMMENT_CREATED", sessionId, questionId, + question.getIsResolved(), summaryContext.commentCounts().getOrDefault(questionId, 0), summaryContext.previewComments().getOrDefault(questionId, List.of()) ); From 6d932c27387d8438c94388afa0003ccc3ef50c83 Mon Sep 17 00:00:00 2001 From: issuejong Date: Fri, 29 May 2026 23:12:23 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[Docs]=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/question/controller/QuestionController.java | 1 + .../project/domain/question/service/QuestionService.java | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/controller/QuestionController.java b/backend/src/main/java/com/example/Piroin/project/domain/question/controller/QuestionController.java index 543f41d..3cd0b8a 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/controller/QuestionController.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/controller/QuestionController.java @@ -109,6 +109,7 @@ public ResponseEntity> deleteQuestio } // 질문 상태 완료 전환 (관리자 전용) + // 부원이 댓글을 달아 미해결로 자동 전환되는 흐름은 댓글 등록 서비스 내부에서만 처리한다. // PATCH /api/questions/{questionId}/status @PatchMapping("/api/questions/{questionId}/status") public ResponseEntity> updateQuestionStatus( diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java index 57c5ca9..5847017 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java @@ -141,7 +141,8 @@ public QuestionResDTO.CommentCreateRes createComment( .build(); questionCommentRepository.save(comment); - // 3. 해결된 질문에 댓글이 달리면 미해결로 자동 전환 + // 수동 해결/미해결 변경은 운영진 권한이 필요하지만, + // 댓글 작성으로 인한 미해결 전환은 권한 API가 아니라 서버 내부 도메인 규칙이다. if (question.getIsResolved()) { question.markUnresolved(); } @@ -338,7 +339,8 @@ public QuestionResDTO.CommentUpdateDeleteRes deleteComment(Long commentId, Long @Transactional public QuestionResDTO.StatusUpdateRes updateQuestionStatus(Long questionId, Long userId) { User loginUser = findLoginUser(userId); - validateAdmin(loginUser); // 관리자만 호출 가능 + // 사용자가 직접 상태를 바꾸는 수동 해결 처리는 운영진만 가능하다. + validateAdmin(loginUser); Question question = findQuestion(questionId); question.markResolved(); From 30b8abd62aa1ec59a056007b1b055cea50696857 Mon Sep 17 00:00:00 2001 From: issuejong Date: Fri, 29 May 2026 23:16:04 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[Feat]=20comments=EC=97=90=20isMine=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 --- .../domain/question/dto/QuestionResDTO.java | 1 + .../domain/question/service/QuestionService.java | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java index 7b15643..0347795 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/dto/QuestionResDTO.java @@ -92,6 +92,7 @@ public record CommentResponse( String displayName, String content, String imageUrl, + Boolean isMine, LocalDateTime createdAt, List replies ) { diff --git a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java index 5847017..0d47992 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/question/service/QuestionService.java @@ -86,7 +86,7 @@ private QuestionResDTO.QuestionDetailResponse toDetailResponse(Question question questionCommentRepository.findByQuestionAndParentCommentIsNullAndDeletedAtIsNullOrderByCreatedAtAsc(question); List commentResponses = topComments.stream() - .map(comment -> toCommentResponse(question, comment)) + .map(comment -> toCommentResponse(question, comment, loginUser)) .toList(); return new QuestionResDTO.QuestionDetailResponse( @@ -97,23 +97,29 @@ private QuestionResDTO.QuestionDetailResponse toDetailResponse(Question question ); } - private QuestionResDTO.CommentResponse toCommentResponse(Question question, QuestionComment comment) { + private QuestionResDTO.CommentResponse toCommentResponse(Question question, QuestionComment comment, User loginUser) { List replies = questionCommentRepository.findByParentCommentAndDeletedAtIsNullOrderByCreatedAtAsc(comment); List replyResponses = replies.stream() .map(reply -> new QuestionResDTO.CommentResponse( reply.getId(), getDisplayName(question, reply.getUser()), - reply.getContent(), reply.getImageUrl(), reply.getCreatedAt(), List.of() + reply.getContent(), reply.getImageUrl(), isCommentMine(reply, loginUser), + reply.getCreatedAt(), List.of() )) .toList(); return new QuestionResDTO.CommentResponse( comment.getId(), getDisplayName(question, comment.getUser()), - comment.getContent(), comment.getImageUrl(), comment.getCreatedAt(), replyResponses + comment.getContent(), comment.getImageUrl(), isCommentMine(comment, loginUser), + comment.getCreatedAt(), replyResponses ); } + private boolean isCommentMine(QuestionComment comment, User loginUser) { + return comment.getUser().getId().equals(loginUser.getId()); + } + // 댓글 등록 // POST /api/questions/{questionId}/comments @Transactional