From 9574a53f8edc15c051540a39550aa93e5fa4d4a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 12:34:05 +0900 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20user.isAdmin()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=96=B4=EB=93=9C=EB=AF=BC=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - User.getRole() == UserRole.ADMIN 패턴을 user.isAdmin()으로 일괄 변경 - ChatService.java 16개 위치, ChatRoomMembershipService.java 2개 위치 수정 - 불필요한 UserRole import 제거 --- .../service/ChatRoomMembershipService.java | 5 ++- .../domain/chat/service/ChatService.java | 32 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java index 8b94b854e..0be8f899b 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java @@ -20,7 +20,6 @@ import gg.agit.konect.domain.club.model.Club; import gg.agit.konect.domain.club.model.ClubMember; import gg.agit.konect.domain.club.repository.ClubMemberRepository; -import gg.agit.konect.domain.user.enums.UserRole; import gg.agit.konect.domain.user.model.User; import gg.agit.konect.domain.user.repository.UserRepository; import gg.agit.konect.global.exception.CustomException; @@ -68,7 +67,7 @@ public void updateLastReadAt(Integer roomId, Integer userId, LocalDateTime readA @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateDirectRoomLastReadAt(Integer roomId, User user, LocalDateTime readAt, ChatRoom room) { // 어드민이 SYSTEM_ADMIN 방의 메시지를 읽으면 SYSTEM_ADMIN의 lastReadAt을 업데이트 - if (user.getRole() == UserRole.ADMIN && isSystemAdminRoom(roomId)) { + if (user.isAdmin() && isSystemAdminRoom(roomId)) { chatRoomMemberRepository.updateLastReadAtIfOlder(roomId, SYSTEM_ADMIN_ID, readAt); return; } @@ -134,7 +133,7 @@ private void ensureDirectRoomMemberExists(ChatRoom room, User user, LocalDateTim // 어드민은 SYSTEM_ADMIN 방의 메시지를 조회할 수 있지만, 멤버로 추가되지는 않는다 // (멤버가 추가되면 findByTwoUsers에서 해당 방을 찾지 못해 채팅방이 중복 생성됨) - if (user.getRole() == UserRole.ADMIN && isSystemAdminRoom(room.getId())) { + if (user.isAdmin() && isSystemAdminRoom(room.getId())) { return; } diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 794c114ae..287d00f9e 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -94,7 +94,7 @@ public ChatRoomResponse createOrGetChatRoom(Integer currentUserId, ChatRoomCreat throw CustomException.of(CANNOT_CREATE_CHAT_ROOM_WITH_SELF); } - if (currentUser.getRole() == UserRole.ADMIN && targetUser.getRole() != UserRole.ADMIN) { + if (currentUser.isAdmin() && !targetUser.isAdmin()) { return getOrCreateSystemAdminChatRoomForUser(targetUser, currentUser); } @@ -396,7 +396,7 @@ public ChatMessagePageResponse getMessages(Integer userId, Integer roomId, Integ LocalDateTime readAt = LocalDateTime.now(); if (room.isDirectRoom()) { - boolean isAdminViewingSystemRoom = user.getRole() == UserRole.ADMIN && isSystemAdminRoom(room); + boolean isAdminViewingSystemRoom = user.isAdmin() && isSystemAdminRoom(room); if (isAdminViewingSystemRoom) { chatRoomMembershipService.updateLastReadAt(roomId, SYSTEM_ADMIN_ID, readAt); recordPresenceSafely(roomId, userId); @@ -448,7 +448,7 @@ public ChatMuteResponse toggleMute(Integer userId, Integer roomId) { ensureRoomMember(room, member.getUser(), member.getCreatedAt()); } else if (room.isDirectRoom()) { // 어드민이 SYSTEM_ADMIN 방에 접근하는 경우는 멤버십 체크를 건너뜀 - boolean isAdminAccessingSystemAdminRoom = user.getRole() == UserRole.ADMIN + boolean isAdminAccessingSystemAdminRoom = user.isAdmin() && isSystemAdminRoom(room); if (!isAdminAccessingSystemAdminRoom) { getAccessibleDirectRoomMember(room, user); @@ -491,7 +491,7 @@ public void updateChatRoomName(Integer userId, Integer roomId, ChatRoomNameUpdat private List getDirectChatRooms(Integer userId) { User user = userRepository.getById(userId); - if (user.getRole() == UserRole.ADMIN) { + if (user.isAdmin()) { return getAdminDirectChatRooms(userId); } @@ -720,7 +720,7 @@ private ChatMessageDetailResponse sendDirectMessage( User sender = userRepository.getById(userId); // 어드민이 SYSTEM_ADMIN 방에 메시지를 보내는 경우 - boolean isAdminSendingToSystemAdminRoom = sender.getRole() == UserRole.ADMIN + boolean isAdminSendingToSystemAdminRoom = sender.isAdmin() && isSystemAdminRoom(chatRoom); ChatRoomMember senderMember = null; @@ -1175,7 +1175,7 @@ private Map getUnreadCountMap(List chatRoomIds, Integ } private Integer getMaskedAdminId(User user, ChatRoom chatRoom) { - if (user.getRole() == UserRole.ADMIN) { + if (user.isAdmin()) { return null; } @@ -1197,7 +1197,7 @@ private Integer getMaskedAdminId(User user, ChatRoom chatRoom) { } private void publishAdminChatEventIfNeeded(boolean isSystemAdminRoom, User sender, String content) { - if (isSystemAdminRoom && sender.getRole() != UserRole.ADMIN) { + if (isSystemAdminRoom && !sender.isAdmin()) { eventPublisher.publishEvent(AdminChatReceivedEvent.of(sender.getId(), sender.getName(), content)); } } @@ -1260,7 +1260,7 @@ private void ensureDirectRoomRequester(ChatRoom room, User user, LocalDateTime j private boolean shouldSkipSystemAdminMembership(ChatRoom room, User user) { // 문의방은 SYSTEM_ADMIN + 일반 사용자 2인 구조를 전제로 재사용(findByTwoUsers)되므로, // 생성/재오픈 경로에서도 일반 ADMIN을 멤버로 추가하면 안 된다. - return user.getRole() == UserRole.ADMIN && isSystemAdminRoom(room); + return user.isAdmin() && isSystemAdminRoom(room); } private String normalizeCustomRoomName(String roomName) { @@ -1308,7 +1308,7 @@ private List toAdminChatReadBaselines(List member LocalDateTime userLastReadAt = null; for (ChatRoomMember member : members) { - if (member.getUser().getRole() == UserRole.ADMIN) { + if (member.getUser().isAdmin()) { if (adminLastReadAt == null || member.getLastReadAt().isAfter(adminLastReadAt)) { adminLastReadAt = member.getLastReadAt(); } @@ -1383,7 +1383,7 @@ private ChatRoomMember getOrCreateDirectRoomMember(ChatRoom chatRoom, User user) return chatRoomMemberRepository.findByChatRoomIdAndUserId(chatRoom.getId(), user.getId()) .orElseGet(() -> { // 어드민은 SYSTEM_ADMIN 방에 멤버로 추가되지 않음 - if (user.getRole() == UserRole.ADMIN && isSystemAdminRoom(chatRoom)) { + if (user.isAdmin() && isSystemAdminRoom(chatRoom)) { throw CustomException.of(FORBIDDEN_CHAT_ROOM_ACCESS); } throw CustomException.of(FORBIDDEN_CHAT_ROOM_ACCESS); @@ -1440,13 +1440,13 @@ private boolean shouldDisplayAsOwnMessage( boolean isAdminViewingSystemRoom ) { if (isAdminViewingSystemRoom) { - return message.getSender().getRole() == UserRole.ADMIN; + return message.getSender().isAdmin(); } return message.isSentBy(currentUser.getId()); } private Integer resolveDirectSenderId(ChatMessage message, Integer maskedAdminId) { - if (maskedAdminId != null && message.getSender().getRole() == UserRole.ADMIN) { + if (maskedAdminId != null && message.getSender().isAdmin()) { return maskedAdminId; } return message.getSender().getId(); @@ -1533,13 +1533,13 @@ private User resolveDirectChatPartner(List members, Integer user private User findNonAdminUser(List members) { return members.stream() .map(ChatRoomMember::getUser) - .filter(memberUser -> memberUser.getRole() != UserRole.ADMIN) + .filter(memberUser -> !memberUser.isAdmin()) .findFirst() .orElse(null); } private User resolveDirectMessageReceiver(List members, User sender) { - if (sender.getRole() == UserRole.ADMIN) { + if (sender.isAdmin()) { User nonAdminUser = findNonAdminUser(members); if (nonAdminUser != null) { return nonAdminUser; @@ -1585,7 +1585,7 @@ private User findNonAdminUserFromMemberInfo(List memberInfos, Map userMap.get(info.userId())) .filter(Objects::nonNull) - .filter(user -> user.getRole() != UserRole.ADMIN) + .filter(user -> !user.isAdmin()) .findFirst() .orElse(null); } @@ -1595,7 +1595,7 @@ private User resolveMessageReceiverFromMemberInfo( List memberInfos, Map userMap ) { - if (sender.getRole() == UserRole.ADMIN) { + if (sender.isAdmin()) { User nonAdminUser = findNonAdminUserFromMemberInfo(memberInfos, userMap); if (nonAdminUser != null) { return nonAdminUser; From a2ccfa47910f5967282772114671819d8e1fcda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 14:16:23 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20SYSTEM=5FADMIN=5FID=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ChatRoomMembershipService.SYSTEM_ADMIN_ID를 public으로 변경 - ChatService의 중복 상수 정의 제거 - ChatService에서 static import로 참조하도록 변경 --- .../konect/domain/chat/service/ChatRoomMembershipService.java | 2 +- .../java/gg/agit/konect/domain/chat/service/ChatService.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java index 0be8f899b..3dd25d68c 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatRoomMembershipService.java @@ -32,7 +32,7 @@ @Transactional(readOnly = true) public class ChatRoomMembershipService { - private static final int SYSTEM_ADMIN_ID = 1; + public static final int SYSTEM_ADMIN_ID = 1; private final ChatRoomRepository chatRoomRepository; private final ChatRoomMemberRepository chatRoomMemberRepository; diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 287d00f9e..0c3ba5b6c 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -1,5 +1,6 @@ package gg.agit.konect.domain.chat.service; +import static gg.agit.konect.domain.chat.service.ChatRoomMembershipService.SYSTEM_ADMIN_ID; import static gg.agit.konect.global.code.ApiResponseCode.*; import java.time.LocalDateTime; @@ -34,6 +35,7 @@ import gg.agit.konect.domain.chat.dto.ChatRoomMatchesResponse; import gg.agit.konect.domain.chat.dto.ChatRoomNameUpdateRequest; import gg.agit.konect.domain.chat.dto.ChatRoomResponse; +import static gg.agit.konect.domain.chat.service.ChatRoomMembershipService.SYSTEM_ADMIN_ID; import gg.agit.konect.domain.chat.dto.ChatRoomSummaryResponse; import gg.agit.konect.domain.chat.dto.ChatRoomsSummaryResponse; import gg.agit.konect.domain.chat.dto.ChatSearchResponse; @@ -69,7 +71,6 @@ @Transactional(readOnly = true) public class ChatService { - private static final int SYSTEM_ADMIN_ID = 1; private static final String ETC_SECTION_NAME = "기타"; private static final String DEFAULT_GROUP_ROOM_NAME = "그룹 채팅"; From e6cab8c67c1da48b17416b662f363b2b064697c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 14:40:31 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20toSortedReadBaselines=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 불필요한 지역 변수 제거하고 바로 반환하도록 변경 --- .../java/gg/agit/konect/domain/chat/service/ChatService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 0c3ba5b6c..b1e305aa7 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -1297,11 +1297,10 @@ private void updateClubMessageLastReadAt(Integer roomId, Integer userId, LocalDa } private List toSortedReadBaselines(List members) { - List baselines = members.stream() + return members.stream() .map(ChatRoomMember::getLastReadAt) .sorted() .toList(); - return baselines; } private List toAdminChatReadBaselines(List members) { From 39b684583a7d1bfee6008db54d862866f6d7cdec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 14:44:53 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20findNonAdminUser=EB=A5=BC=20fin?= =?UTF-8?q?dNonAdminUserFromMemberInfo=EB=A1=9C=20=EC=9C=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - findNonAdminUser에서 MemberInfo로 변환 후 통합된 메서드 호출 - 중복된 필터링 로직 제거 --- .../konect/domain/chat/service/ChatService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index b1e305aa7..90469de36 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -1531,11 +1531,16 @@ private User resolveDirectChatPartner(List members, Integer user } private User findNonAdminUser(List members) { - return members.stream() - .map(ChatRoomMember::getUser) - .filter(memberUser -> !memberUser.isAdmin()) - .findFirst() - .orElse(null); + Map userMap = members.stream() + .collect(Collectors.toMap( + ChatRoomMember::getUserId, + ChatRoomMember::getUser, + (existing, replacement) -> existing + )); + List memberInfos = members.stream() + .map(m -> new MemberInfo(m.getUserId(), m.getCreatedAt())) + .toList(); + return findNonAdminUserFromMemberInfo(memberInfos, userMap); } private User resolveDirectMessageReceiver(List members, User sender) { From afdacedca84fe626041c2566e78de80fae95542d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 14:48:21 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20getDirectChatRoomMessages=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - buildDirectChatRoomMessages 공통 메서드 추출 - getDirectChatRoomMessages와 getAdminSystemDirectChatRoomMessages가 공통 메서드를 호출하도록 변경 - 중복된 메시지 조회 및 매핑 로직 제거 --- .../domain/chat/service/ChatService.java | 81 +++++++++---------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 90469de36..17bc807fa 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -621,37 +621,39 @@ private List getGroupChatRooms(Integer userId) { .toList(); } - private ChatMessagePageResponse getDirectChatRoomMessages( - Integer userId, + private ChatMessagePageResponse buildDirectChatRoomMessages( + User user, + ChatRoom chatRoom, Integer roomId, Integer page, Integer limit, - LocalDateTime readAt + LocalDateTime readAt, + LocalDateTime visibleMessageFrom, + List sortedReadBaselines, + Integer maskedAdminId ) { - ChatRoom chatRoom = getDirectRoom(roomId); - User user = userRepository.getById(userId); - List members = chatRoomMemberRepository.findByChatRoomId(roomId); - LocalDateTime visibleMessageFrom = prepareDirectRoomAccess(getOrCreateDirectRoomMember(chatRoom, user), - chatRoom); - PageRequest pageable = PageRequest.of(page - 1, limit); Page messages = chatMessageRepository.findByChatRoomId(roomId, visibleMessageFrom, pageable); - List sortedReadBaselines = toSortedReadBaselines(members); - List responseMessages = messages.getContent().stream() .map(message -> { - boolean isRead = message.isSentBy(userId) || !message.getCreatedAt().isAfter(readAt); + Integer senderId = maskedAdminId != null + ? resolveDirectSenderId(message, maskedAdminId) + : message.getSender().getId(); + boolean isMine = maskedAdminId != null + ? shouldDisplayAsOwnMessage(user, message, true) + : message.isSentBy(user.getId()); + boolean isRead = isMine || !message.getCreatedAt().isAfter(readAt); int unreadCount = countUnreadSince(message.getCreatedAt(), sortedReadBaselines); return new ChatMessageDetailResponse( message.getId(), - message.getSender().getId(), + senderId, null, message.getContent(), message.getCreatedAt(), isRead, unreadCount, - message.isSentBy(userId) + isMine ); }) .toList(); @@ -666,6 +668,25 @@ private ChatMessagePageResponse getDirectChatRoomMessages( ); } + private ChatMessagePageResponse getDirectChatRoomMessages( + Integer userId, + Integer roomId, + Integer page, + Integer limit, + LocalDateTime readAt + ) { + ChatRoom chatRoom = getDirectRoom(roomId); + User user = userRepository.getById(userId); + List members = chatRoomMemberRepository.findByChatRoomId(roomId); + LocalDateTime visibleMessageFrom = prepareDirectRoomAccess(getOrCreateDirectRoomMember(chatRoom, user), + chatRoom); + + List sortedReadBaselines = toSortedReadBaselines(members); + + return buildDirectChatRoomMessages(user, chatRoom, roomId, page, limit, readAt, + visibleMessageFrom, sortedReadBaselines, null); + } + private ChatMessagePageResponse getAdminSystemDirectChatRoomMessages( User user, ChatRoom chatRoom, @@ -677,39 +698,11 @@ private ChatMessagePageResponse getAdminSystemDirectChatRoomMessages( List members = chatRoomMemberRepository.findByChatRoomId(roomId); LocalDateTime visibleMessageFrom = resolveAdminSystemRoomVisibleMessageFrom(members); - PageRequest pageable = PageRequest.of(page - 1, limit); - Page messages = chatMessageRepository.findByChatRoomId(roomId, visibleMessageFrom, pageable); - List sortedReadBaselines = toAdminChatReadBaselines(members); - Integer maskedAdminId = getMaskedAdminId(user, chatRoom); - List responseMessages = messages.getContent().stream() - .map(message -> { - Integer senderId = resolveDirectSenderId(message, maskedAdminId); - boolean isMine = shouldDisplayAsOwnMessage(user, message, true); - boolean isRead = isMine || !message.getCreatedAt().isAfter(readAt); - int unreadCount = countUnreadSince(message.getCreatedAt(), sortedReadBaselines); - return new ChatMessageDetailResponse( - message.getId(), - senderId, - null, - message.getContent(), - message.getCreatedAt(), - isRead, - unreadCount, - isMine - ); - }) - .toList(); - return new ChatMessagePageResponse( - messages.getTotalElements(), - messages.getNumberOfElements(), - messages.getTotalPages(), - messages.getNumber() + 1, - null, - responseMessages - ); + return buildDirectChatRoomMessages(user, chatRoom, roomId, page, limit, readAt, + visibleMessageFrom, sortedReadBaselines, maskedAdminId); } private ChatMessageDetailResponse sendDirectMessage( From b0f637ed928f7e0af9296c79c828d500d8684866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 14:55:00 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20resolveDirectMessageReceiver=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - resolveDirectMessageReceiver가 MemberInfo로 변환 후 resolveMessageReceiverFromMemberInfo 호출하도록 변경 - 중복된 수신자 결정 로직 제거 --- .../domain/chat/service/ChatService.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 17bc807fa..c88a6deb0 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -1537,18 +1537,16 @@ private User findNonAdminUser(List members) { } private User resolveDirectMessageReceiver(List members, User sender) { - if (sender.isAdmin()) { - User nonAdminUser = findNonAdminUser(members); - if (nonAdminUser != null) { - return nonAdminUser; - } - } - - User partner = resolveDirectChatPartner(members, sender.getId()); - if (partner == null) { - throw CustomException.of(FORBIDDEN_CHAT_ROOM_ACCESS); - } - return partner; + Map userMap = members.stream() + .collect(Collectors.toMap( + ChatRoomMember::getUserId, + ChatRoomMember::getUser, + (existing, replacement) -> existing + )); + List memberInfos = members.stream() + .map(m -> new MemberInfo(m.getUserId(), m.getCreatedAt())) + .toList(); + return resolveMessageReceiverFromMemberInfo(sender, memberInfos, userMap); } private User findDirectPartnerFromMemberInfo( From f3c72507a56c55d88f23197184949d74285b6fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 15:00:50 +0900 Subject: [PATCH 7/8] =?UTF-8?q?chore:=20SYSTEM=5FADMIN=5FID=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gg/agit/konect/domain/chat/service/ChatService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index c88a6deb0..0c3da7185 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -35,7 +35,6 @@ import gg.agit.konect.domain.chat.dto.ChatRoomMatchesResponse; import gg.agit.konect.domain.chat.dto.ChatRoomNameUpdateRequest; import gg.agit.konect.domain.chat.dto.ChatRoomResponse; -import static gg.agit.konect.domain.chat.service.ChatRoomMembershipService.SYSTEM_ADMIN_ID; import gg.agit.konect.domain.chat.dto.ChatRoomSummaryResponse; import gg.agit.konect.domain.chat.dto.ChatRoomsSummaryResponse; import gg.agit.konect.domain.chat.dto.ChatSearchResponse; From 3e1c5a6d3de6ba4f7fbc6c79bb030663de5814cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Tue, 7 Apr 2026 15:07:06 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20buildDirectChatRoomMessages=20?= =?UTF-8?q?=EB=AF=B8=EC=82=AC=EC=9A=A9=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 사용하지 않는 ChatRoom chatRoom 파라미터 제거 - 관련 호출 지점 업데이트 --- .../java/gg/agit/konect/domain/chat/service/ChatService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java index 0c3da7185..e5d52eb31 100644 --- a/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java +++ b/src/main/java/gg/agit/konect/domain/chat/service/ChatService.java @@ -622,7 +622,6 @@ private List getGroupChatRooms(Integer userId) { private ChatMessagePageResponse buildDirectChatRoomMessages( User user, - ChatRoom chatRoom, Integer roomId, Integer page, Integer limit, @@ -682,7 +681,7 @@ private ChatMessagePageResponse getDirectChatRoomMessages( List sortedReadBaselines = toSortedReadBaselines(members); - return buildDirectChatRoomMessages(user, chatRoom, roomId, page, limit, readAt, + return buildDirectChatRoomMessages(user, roomId, page, limit, readAt, visibleMessageFrom, sortedReadBaselines, null); } @@ -700,7 +699,7 @@ private ChatMessagePageResponse getAdminSystemDirectChatRoomMessages( List sortedReadBaselines = toAdminChatReadBaselines(members); Integer maskedAdminId = getMaskedAdminId(user, chatRoom); - return buildDirectChatRoomMessages(user, chatRoom, roomId, page, limit, readAt, + return buildDirectChatRoomMessages(user, roomId, page, limit, readAt, visibleMessageFrom, sortedReadBaselines, maskedAdminId); }