diff --git a/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomRepository.java b/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomRepository.java index 7d6ec636..865ba7c7 100644 --- a/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/gg/agit/konect/domain/chat/repository/ChatRoomRepository.java @@ -170,13 +170,16 @@ List findAllSystemAdminDirectRooms( FROM ChatRoom cr JOIN ChatRoomMember crm ON crm.id.chatRoomId = cr.id JOIN User u ON u.id = crm.id.userId - JOIN ChatRoomMember adminCrm ON adminCrm.id.chatRoomId = cr.id - AND adminCrm.id.userId = :systemAdminId + JOIN ChatRoomMember systemAdminCrm ON systemAdminCrm.id.chatRoomId = cr.id + AND systemAdminCrm.id.userId = :systemAdminId + LEFT JOIN ChatRoomMember viewerAdminCrm ON viewerAdminCrm.id.chatRoomId = cr.id + AND viewerAdminCrm.id.userId = :viewerAdminId LEFT JOIN ChatMessage cm ON cm.chatRoom.id = cr.id AND cm.sender.id <> :systemAdminId - AND cm.createdAt > adminCrm.lastReadAt + AND cm.createdAt > systemAdminCrm.lastReadAt WHERE cr.roomType = :roomType AND u.role != :adminRole + AND (viewerAdminCrm.leftAt IS NULL OR viewerAdminCrm.id.userId IS NULL) AND EXISTS ( SELECT 1 FROM ChatMessage userReply JOIN userReply.sender userSender @@ -188,6 +191,7 @@ ORDER BY COALESCE(cr.lastMessageSentAt, cr.createdAt) DESC """) List findAdminChatRoomsOptimized( @Param("systemAdminId") Integer systemAdminId, + @Param("viewerAdminId") Integer viewerAdminId, @Param("adminRole") UserRole adminRole, @Param("roomType") ChatType roomType ); 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 2fec8e6f..fd4991f4 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 @@ -482,7 +482,7 @@ private List getDirectChatRooms(Integer userId) { User user = userRepository.getById(userId); if (user.getRole() == UserRole.ADMIN) { - return getAdminDirectChatRooms(); + return getAdminDirectChatRooms(userId); } List roomSummaries = new ArrayList<>(); @@ -525,9 +525,9 @@ private List getDirectChatRooms(Integer userId) { return roomSummaries; } - private List getAdminDirectChatRooms() { + private List getAdminDirectChatRooms(Integer adminUserId) { List projections = chatRoomRepository.findAdminChatRoomsOptimized( - SYSTEM_ADMIN_ID, UserRole.ADMIN, ChatType.DIRECT + SYSTEM_ADMIN_ID, adminUserId, UserRole.ADMIN, ChatType.DIRECT ); return projections.stream()