Skip to content

fix: 어드민 문의방 메시지 표시 방향 수정#622

Merged
JanooGwan merged 2 commits intodevelopfrom
fix/admin-inquiry-message-is-mine
Apr 30, 2026
Merged

fix: 어드민 문의방 메시지 표시 방향 수정#622
JanooGwan merged 2 commits intodevelopfrom
fix/admin-inquiry-message-is-mine

Conversation

@JanooGwan
Copy link
Copy Markdown
Contributor

@JanooGwan JanooGwan commented Apr 30, 2026

🔍 개요

  • 어드민이 SYSTEM_ADMIN 문의방을 조회할 때 다른 어드민이 보낸 메시지도 내가 보낸 메시지처럼 오른쪽에 표시되도록 isMine 응답 계산을 수정했습니다.
  • 일반 사용자가 같은 문의방을 조회할 때는 기존처럼 어드민 메시지를 상대 메시지로 보고, senderIdSYSTEM_ADMIN_ID로 마스킹되도록 유지했습니다.

🚀 주요 변경 내용

  • ChatMessageReadService
    • direct 메시지 응답 조립 시 문의방 어드민 조회 여부를 전달하도록 변경했습니다.
    • 어드민이 SYSTEM_ADMIN 문의방을 조회하는 경우, 발신자가 admin이면 isMine=true로 응답합니다.
    • 일반 direct 조회와 일반 사용자 조회의 기존 senderId 마스킹 및 isMine 계산은 유지했습니다.
  • ChatMessageReadServiceTest
    • 어드민 조회자가 다른 어드민 메시지를 isMine=true로 받는 회귀 테스트를 추가했습니다.
    • 일반 사용자는 어드민 메시지를 isMine=false, senderId=SYSTEM_ADMIN_ID로 받는 회귀 테스트를 추가했습니다.

💬 참고 사항

  • 채팅방 타입 enum 자체는 변경하지 않았습니다. SYSTEM_ADMIN 문의방은 기존 정책처럼 DIRECT 방의 특수 케이스로 유지됩니다.

✅Checklist (완료 조건)

  • 코드 스타일 가이드 준수
  • 테스트 코드 포함
  • Reviewers / Assignees / Labels 지정 완료
  • 보안 및 민감 정보 검증(API 키, 환경 변수, 개인정보 등)

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 30, 2026

Warning

Rate limit exceeded

@JanooGwan has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 38 minutes and 11 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: f764fd0f-e0ed-4a79-a27d-0e16a8b46bbe

📥 Commits

Reviewing files that changed from the base of the PR and between a9c72fd and 3903a53.

📒 Files selected for processing (4)
  • src/main/java/gg/agit/konect/domain/chat/controller/ChatApi.java
  • src/main/java/gg/agit/konect/domain/chat/dto/ChatMessageDetailResponse.java
  • src/main/java/gg/agit/konect/domain/chat/service/ChatMessageReadService.java
  • src/test/java/gg/agit/konect/unit/domain/chat/service/ChatMessageReadServiceTest.java
📝 Walkthrough

Walkthrough

ChatMessageReadService에서 메시지 소유권(isMine) 계산 로직을 수정합니다. 관리자가 시스템 직접 채팅방을 볼 때, 메시지 발신자가 관리자인 경우 해당 메시지를 자신의 것으로 표시하도록 변경했습니다.

Changes

Cohort / File(s) Summary
메시지 서비스 로직 개선
src/main/java/gg/agit/konect/domain/chat/service/ChatMessageReadService.java
buildDirectChatRoomMessages 메서드에 isAdminViewingSystemRoom 플래그 추가. 메시지 소유권 판단 로직을 변경하여 관리자가 시스템 직접방을 볼 때 다른 관리자의 메시지를 isMine=true로 표시.
단위 테스트 추가
src/test/java/gg/agit/konect/unit/domain/chat/service/ChatMessageReadServiceTest.java
관리자와 일반 사용자가 시스템 관리자가 포함된 직접방 메시지를 조회할 때의 isMine 필드 값을 검증하는 두 가지 시나리오 테스트 추가.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

버그

Poem

🐰 관리자의 눈으로 보는 방엔
같은 관리자 메시지도 내것이 되고
플래그 하나로 진실이 바뀌니
버그를 잡아내는 우리의 손길이여 🌟

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 변경 사항의 핵심을 명확히 반영하고 있습니다: 어드민이 문의방 메시지를 조회할 때 메시지 소유권(isMine) 판단 방식을 수정했다는 내용이 직관적으로 드러납니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description check ✅ Passed PR 설명이 변경 사항과 관련이 있습니다. 어드민 문의방 메시지의 isMine 응답 계산 수정에 대해 명확하게 설명되어 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/admin-inquiry-message-is-mine

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
Review rate limit: 0/1 reviews remaining, refill in 38 minutes and 11 seconds.

Comment @coderabbitai help to get the list of available commands and usage tips.

@JanooGwan JanooGwan self-assigned this Apr 30, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 30, 2026

🧪 JaCoCo Coverage Report (Changed Files)

Summary

  • Overall Coverage: 99.3% ✅
  • Covered Lines: 134 / 135
  • Changed Files: 3

Coverage by File

Class Coverage Lines Status
ChatMessageReadService
gg.agit.konect.domain.chat.service
99.3% 134/135

📊 View Workflow Run

@JanooGwan JanooGwan added the 버그 정상적으로 동작하지 않는 문제 상황 관련 이슈입니다. label Apr 30, 2026
@JanooGwan JanooGwan requested a review from Copilot April 30, 2026 02:38
@JanooGwan JanooGwan force-pushed the fix/admin-inquiry-message-is-mine branch from a9c72fd to 91c8547 Compare April 30, 2026 02:40
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

어드민이 SYSTEM_ADMIN 문의방(DIRECT 특수 케이스)을 조회할 때, 다른 어드민이 보낸 메시지도 “내가 보낸 메시지”처럼 처리되어 UI에서 오른쪽 정렬되도록 isMine 계산 로직을 수정한 PR입니다. 일반 사용자의 문의방 조회에서는 기존처럼 어드민 발신 메시지를 상대 메시지로 보고 senderId 마스킹을 유지합니다.

Changes:

  • direct 메시지 응답 조립 시 “어드민이 SYSTEM_ADMIN 문의방을 조회 중인지” 플래그를 전달하도록 ChatMessageReadService 내부 로직을 확장
  • 문의방 어드민 조회 케이스에서 발신자가 admin이면 isMine=true로 계산하도록 분기 추가
  • 위 동작(및 일반 사용자 마스킹 유지)을 검증하는 단위 테스트 추가

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

File Description
src/main/java/gg/agit/konect/domain/chat/service/ChatMessageReadService.java 문의방 어드민 조회 시 isMine 계산을 admin 발신 기준으로 변경하도록 분기 추가
src/test/java/gg/agit/konect/unit/domain/chat/service/ChatMessageReadServiceTest.java 어드민/일반 사용자 조회 시 isMinesenderId 마스킹 동작 회귀 테스트 추가

Comment on lines +199 to +203
private boolean isOwnDirectMessage(User user, ChatMessage message, boolean isAdminViewingSystemRoom) {
if (isAdminViewingSystemRoom && user.isAdmin()) {
return message.getSender().isAdmin();
}
return message.isSentBy(user.getId());
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SYSTEM_ADMIN 문의방에서 admin 조회 시 isMinesenderId != viewerId인 경우에도 true가 될 수 있어, ChatMessageDetailResponse의 스키마 설명(내가 보낸 메시지 여부)과 의미가 달라집니다. 이 케이스를 API 문서/주석에 명시하거나(예: “문의방 admin 조회 시 admin 발신 메시지는 모두 isMine=true”), 클라이언트 혼선을 막을 수 있게 계약을 정리해 주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +65 to +110
@DisplayName("Admin viewer sees other admin messages in a system admin room as mine")
void getAdminSystemDirectChatRoomMessagesMarksOtherAdminMessagesAsMine() {
// given
User viewerAdmin = createUser(99, "viewer admin", UserRole.ADMIN);
User otherAdmin = createUser(88, "other admin", UserRole.ADMIN);
User systemAdmin = createUser(SYSTEM_ADMIN_ID, "system admin", UserRole.ADMIN);
User normalUser = createUser(20, "normal user", UserRole.USER);

ChatRoom room = createRoom(1, ChatType.DIRECT, LocalDateTime.of(2026, 4, 11, 10, 0));
ChatRoomMember systemAdminMember = createRoomMember(room, systemAdmin, LocalDateTime.of(2026, 4, 11, 10, 0));
ChatRoomMember normalUserMember = createRoomMember(room, normalUser, LocalDateTime.of(2026, 4, 11, 10, 0));
ChatMessage otherAdminMessage = createMessage(
100,
room,
otherAdmin,
"reply",
LocalDateTime.of(2026, 4, 11, 10, 1)
);
PageRequest pageable = PageRequest.of(0, 20);

given(chatRoomMemberRepository.findByChatRoomId(room.getId()))
.willReturn(List.of(systemAdminMember, normalUserMember));
given(chatRoomSystemAdminService.findSystemAdminMember(List.of(systemAdminMember, normalUserMember)))
.willReturn(systemAdminMember);
given(chatMessageRepository.findByChatRoomId(eq(room.getId()), nullable(LocalDateTime.class), eq(pageable)))
.willReturn(new PageImpl<>(List.of(otherAdminMessage), pageable, 1));

// when
ChatMessagePageResponse response = chatMessageReadService.getAdminSystemDirectChatRoomMessages(
viewerAdmin,
room,
1,
20,
LocalDateTime.of(2026, 4, 11, 10, 2)
);

// then
ChatMessageDetailResponse message = response.messages().getFirst();
assertThat(message.senderId()).isEqualTo(otherAdmin.getId());
assertThat(message.isMine()).isTrue();
assertThat(message.isRead()).isTrue();
}

@Test
@DisplayName("Normal user still sees admin messages in a direct room as opponent messages")
void getDirectChatRoomMessagesKeepsAdminMessagesAsOpponentForNormalUser() {
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 패키지의 다른 테스트들은 @DisplayName을 한글로 작성하고 있어서(예: ChatMessagePageResolverTest 등), 여기만 영어로 남아 있으면 테스트 리포팅/검색 시 일관성이 깨집니다. @DisplayName을 한글로 맞춰 주세요.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

@JanooGwan JanooGwan merged commit 1b41743 into develop Apr 30, 2026
9 checks passed
@JanooGwan JanooGwan deleted the fix/admin-inquiry-message-is-mine branch April 30, 2026 12:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

버그 정상적으로 동작하지 않는 문제 상황 관련 이슈입니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants