Conversation
|
Warning Rate limit exceeded
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 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 configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthrough
Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Review rate limit: 0/1 reviews remaining, refill in 38 minutes and 11 seconds.Comment |
🧪 JaCoCo Coverage Report (Changed Files)Summary
Coverage by File
|
a9c72fd to
91c8547
Compare
There was a problem hiding this comment.
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 | 어드민/일반 사용자 조회 시 isMine 및 senderId 마스킹 동작 회귀 테스트 추가 |
| private boolean isOwnDirectMessage(User user, ChatMessage message, boolean isAdminViewingSystemRoom) { | ||
| if (isAdminViewingSystemRoom && user.isAdmin()) { | ||
| return message.getSender().isAdmin(); | ||
| } | ||
| return message.isSentBy(user.getId()); |
There was a problem hiding this comment.
SYSTEM_ADMIN 문의방에서 admin 조회 시 isMine이 senderId != viewerId인 경우에도 true가 될 수 있어, ChatMessageDetailResponse의 스키마 설명(내가 보낸 메시지 여부)과 의미가 달라집니다. 이 케이스를 API 문서/주석에 명시하거나(예: “문의방 admin 조회 시 admin 발신 메시지는 모두 isMine=true”), 클라이언트 혼선을 막을 수 있게 계약을 정리해 주세요.
| @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() { |
There was a problem hiding this comment.
이 패키지의 다른 테스트들은 @DisplayName을 한글로 작성하고 있어서(예: ChatMessagePageResolverTest 등), 여기만 영어로 남아 있으면 테스트 리포팅/검색 시 일관성이 깨집니다. @DisplayName을 한글로 맞춰 주세요.
🔍 개요
isMine응답 계산을 수정했습니다.senderId는SYSTEM_ADMIN_ID로 마스킹되도록 유지했습니다.🚀 주요 변경 내용
ChatMessageReadServiceisMine=true로 응답합니다.senderId마스킹 및isMine계산은 유지했습니다.ChatMessageReadServiceTestisMine=true로 받는 회귀 테스트를 추가했습니다.isMine=false,senderId=SYSTEM_ADMIN_ID로 받는 회귀 테스트를 추가했습니다.💬 참고 사항
DIRECT방의 특수 케이스로 유지됩니다.✅Checklist (완료 조건)